Java/모두의 자바

Chapter 07-38 접근 제한자

계란💕 2022. 2. 8. 16:09

07-38.1 접근 제한자

  • 클래스는 필드와 메서드를 가진다. 
  • 수학과 관련된 클래스 -> 수학관련한 속성이나 메서드
  • 날짜와 관련한 클래스 -> 날짜와 관련한 속성이나 메서드를 가지고 있어야 한다.
  • 접근 제한자는 필드 뿐 아니라 메서드, 클래스 앞에 붙여 사용할 수도 있다. 

 

  Def) 캡슐화: 관련된 내용을 모아서 가지는 것

  • 그런데 캡슐화된 필드와 메서드 중에서 감추고 싶은 메서드 또는 속성이 있을 수 있다. 
  • 이런 경우 사용할 수 있는 것이 "접근제한자"다.

 

  Ex) 접근제한자의 범위

<hide/>

package javaStudy;

public class AccessObj {
	
	public int p = 3;
	protected int p2 = 4;
	private int i = 1;
	int k = 2;
}

  (1) public : 어떤 클래스도 접근할 수 있다. 

  (2) protected : 같은 패키지, 자손 클래스인 경우에만 접근을 허용한다. 

  (3) private : 이름 그대로 자기 자신 클래스만 접근 가능하다.

  (4) default : 같은 패키지 안에서만 접근을 허용

  - 접근제한자 없이 정수 k 선언

  - 이 경우에는 "default 접근 지정자"를 가졌다고 한다. 

 

 

07-38.2 접근제한자는 어떻게 이용되는가?

<hide/>

package javaStudy;
public class AccessObjExam {
	public static void main() {
		AccessObj Obj = new AccessObj();	
		System.out.println(Obj.p);
		System.out.println(Obj.p2)
		System.out.println(Obj.i)
		System.out.println(Obj.k)
	}	
}

  - 세 번째 문장 i출력 줄에서 에러가 난다. 

  - 접근제한자가 들어있는 패키지가 같은 패키지 않에 들어있기 때문에 private를 제외하고 모두 접근 가능하다. 

 

  (1) 만약 AccessObjExam클래스가 JavaStudy 가 아닌 다른 패키지 안에 들어있다면?

  - public을 제외한 모든 접근 제어자 2, 3, 4번 줄 모두 에러가 난다.

 

  (2) 그런데 AccessObjExam이 AccessObj을 상속 받고 있었다면?

  - protected의 p2는 에러가 나지 않는다.   

  - protected는 서로 다른 패키지라고 상속 받은 자식 클래스에서는 접근할 수 있기 때문이다. 

 

 

07-38.3 접근 제한자 실습

 

  Ex 1)  Car클래스의 name, number 필드를 private로 정의했다.  CarExam클래스의 main에서 Car클래스의 인스턴스를 하나 만들고 name, number를 출력하려고 하니 private한 필드라 에러가 난다. CarExam에서 Car의 인스턴스를 사용할 수 있도록 name, number 의 접근 제한자를 변경하라.

 

<hide/>
package javaStudy;
public class Car{
	
	private String name;
	private int number;
	
	public Car(String name, int number) {
		this.name = name;
		this.number = number;
	}
}
<hide/>
package javaStudy;
public class CarExam {
	public static void main(String[] args) {		
		Car car = new Car( "포니", 1234 );
		System.out.println("number : " + car.name);
		System.out.println("name : " + car.number);
	}	
}

 

  Note) Car클래스의 private 문장을 다음과 같이 바꾼다.

  - public String name; public int number;

  - protected String name; protected int number;

  - String name; int number; 

<hide/>
package javaStudy;
public class Car{
	
	public String name;
	public int number;
	
	public Car(String name, int number) {
		this.name = name;
		this.number = number;
	}
}

 

 

07-38.4 접근 제한자 실습

 

  Ex 2) Car클래스의 name, number 필드를 private로 정의했다. CarExam클래스의 main에서 Car클래스의 인스턴스를 만들고 name, number를 출력하려고 하니 private한 필드라 에러가 발생한다. CarExam에서 Car의 인스턴스를 사용하도록 name과 number의 접근 제한자를 변경하라.

 

<hide/>

package javaStudy;
public class Car{
	public void run() {
		System.out.println("차가 달립니다.");
	}
	private void stop() {
		System.out.println("차가 멈춥니다.");
	}
}
<hide/>
package javaStudy;
public class CarExam {
	public static void main(String[] args) {		
	Car car = new Car();
	car.run();
	car.stop();
	}
}

 

   Note) Car클래스의 private를 public 또는 protected(같은 패키지 일 때)로 바꾸면 컴파일 에러가 없어진다.

<hide/>
package javaStudy;
public class CarExam {
	public static void main(String[] args) {		
	Car car = new Car();
	car.run();
	car.stop();
	}
}

 

'Java > 모두의 자바' 카테고리의 다른 글

Chapter 07-40 super과 부모 생성자  (0) 2022.02.08
Chapter 07-39 추상 클래스  (0) 2022.02.08
Chapter 07-37 상속이란?  (0) 2022.02.08
Chapter 06-36 패키지  (0) 2022.02.07
Chapter 06-35 생성자 오버로딩과 this  (0) 2022.02.07