자바(Java) public, private, protected, default 접근 제어자 차이점은

자바(JAVA)

자바(Java) public, private, protected, default 접근 제어자 차이점은

 

환경: Eclipse Mars

 

자바에는 변수와 함수, 클래스에 대한 접근을 제한하는 문법이 있습니다. 접근을 제한하는 이유는 객체가 가진 고유의 멤버 변수값들이 외부에서 잘못 변경되는 것을 막기 위해서입니다. 사전에 멤버 변수와 함수들의 성격을 규정하고 차단함으로써 의도치 않은 실수를 줄이기 위한 의도가 깔려 있습니다. 4가지가 있는데 public private 를 가장 많이 사용합니다.

 

접근 허용 가능 범위 순서는 다음과 같습니다. 접근 범위는 왼쪽부터 큽니다.

 

public > protected > default > private

 

l  public : 접근을 제한이 없음

l  protected : 동일한 패키지 내에 존재하거나 파생클래스에서만 접근 가능

l  default : 아무런 접근 제한자를 명시하지 않으면 default 값이 되며, 동일한 패키지 내에서만 접근이 가능

l  private : 자기 자신의 클래스 내에서만 접근이 가능

 

public, private

 

가장 많이 쓰이는 public private 입니다. main 함수에서 A 클래스에 대한 객체를 생성했습니다. 그리고 멤버 변수인 one 과 멤버 함수인 getOne() 을 접근했습니다. 이 소스는 정상적으로 작동하지 않겠죠

public class AccessModifier {
	public static void main(String[] args) {
		
		A a = new A();
		
		System.out.println(a.one);
		System.out.println(a.getOne());
	}
}

class A {
	private String one;
	public String getOne(){
		one = "one";
		return one;
	}
}

 

그림처럼 A 객체의 one 변수에 저장된 값을 가져오기 위한 getOne() 함수의 접근은 이상 없이 작동합니다. 왜냐하면 접근 제한제가 public 으로 되어 있기 때문입니다

자바(Java) public, private, protected, default 접근 제어자 차이점은

 

하지만 one 변수를 직접 접근하면 에러가 납니다. 접근 제한자가 private 로 되어 있기 때문에 A.one is not visible 에러가 나면서 컴파일이 되지 않습니다

자바(Java) public, private, protected, default 접근 제어자 차이점은

 

default

 

변수 앞에 아무것도 정의하지 않으면 default 접근 제한자가 붙습니다. default 는 같은 패키지 내에서만 접근이 가능합니다. One 클래스에 있는 멤버 변수와 함수의 public, private 를 모두 없앴습니다

자바(Java) public, private, protected, default 접근 제어자 차이점은

 


one 변수에 직접 접근했는데 에러가 나지 않네요. 이것은 같은 패키지 안에 있어서 접근이 가능하기 때문입니다

자바(Java) public, private, protected, default 접근 제어자 차이점은

 

protected

 

default 접근 제한자는 같은 패키지 내에서만 접근이 가능하다고 했습니다. protected 도 같은 패치지 내에서 접근이 가능하면서 default 보다 좀더 범위가 넓습니다. 다른 패키지에 있어도 접근이 가능하기 때문입니다. , 파생 클래스에서만 멤버를 접근할 수 있습니다

package front;

public class One {
	protected String one;
	protected String getOne(){
		one = "one";
		return one;
	}
}

package model;

import front.One;

public class Main {
	public static void main(String[] args) {
		
		One a = new One();
		
		System.out.println(a.one);
		System.out.println(a.getOne());
	}
}

 

그림처럼 One 클래스 의 내부 변수와 함수가 protected 로 선언된 경우 default 와 같이 다른 패키지에 있으면 접근할 수 없습니다. 그림처럼 에러가 납니다.  

자바(Java) public, private, protected, default 접근 제어자 차이점은

 

하지만 One 클래스를 상속받으면 다른 패키지에 있어서 에러가 나지 않습니다. 이상으로 4개의 접근 제한자가 어떤 차이점이 있는지 예를 들어 설명했습니다

자바(Java) public, private, protected, default 접근 제어자 차이점은

Posted by 녹두장군