본문 바로가기
Dev

Java 접근 제어자 public, protected, default, private 알아보기

by Day0404 2021. 10. 8.
728x90
반응형

 

저와 같이 사업을 함께 시작한 동업자분이 개발을 배우기 시작하여 미약하지만 조금이나마 도움이 되고자 하여 글을 작성하게 되었습니다.

HTML, CSS, JavaScript(아주 기초) 정도만 습득한 상태에서 Java를 가르쳐보기로 했습니다.

저는 처음 Java를 배웠을 때 점프 투 자바 글을 보며 배웠었는데 동업자분께도 이 글을 추천해드렸습니다.

기본 문법을 익히던 중 객체지향에 대한 내용이 나오는 부분부터는 어려워하시더군요. (저도 처음에 객체지향을 익힐 때 어려웠던 기억이 있습니다...)

그래서 Java 기본 문법들 중 어려워 할만한 부분들을 조금 캐치해서 글을 작성해보는 게 어떤가 해서 조금씩 작성할 예정입니다.

 

Java 접근 제어자 (Access Modifier)

자바에는 4가지 접근 제어자가 있습니다.

  1. public
  2. protected
  3. default
  4. private

접근 허용 범위는 public -> protected -> default -> private 순으로 public 이 가장 많은 접근을 허용합니다.

 

public

접근 제어자가 public 으로 선언이 되어 있다면, 선언된 변수나 메서드의 경우 다른 어떤 클래스에서도 해당 변수나 메서드에 접근이 가능합니다.

package study;

public class Person {
	public String name = "DaeHee";
}

Person 이라는 클래스를 정의하고 name 변수를 public 으로 선언했습니다.

package study;

public class Main {
	public static void main(String[] args) {
		Person person = new Person();

		System.out.println(person.name);  // 출력 결과 DaeHee
	}
}

name 변수는 public 으로 선언이 되어 있기 때문에 어느 클래스에서나 해당 변수에 접근이 가능합니다.

 

protected

protected 접근 제어자를 사용하여 변수나 메서드를 선언했다면, 해당 변수나 메서드의 경우 같은 패키지 내의 클래스나 해당 클래스를 상속받은 다른 외부 패키지의 클래스에서 접근이 가능합니다.

package study;

public class Person {
	protected String name = "DaeHee";
	
	protected void getValue() {
		System.out.println(this.name);
	}
}

Person 클래스에 protected 접근 제어자로 변수와 메서드를 선언했습니다.

package study;

public class Main {
	public static void main(String[] args) {
		Person person = new Person();

		System.out.println(person.name);  // 접근 가능
	}
}

같은 패키지내의 다른 클래스에서는 접근이 가능합니다.

package practice;

import study.Person;

public class Main {
	public static void main(String[] args) {
		Person person = new Person();

		System.out.println(person.name);  // 접근 불가
	}
}

위 코드 내용처럼 다른 패키지의 클래스에서 인스턴스 생성 후 name 변수에 접근하는 것은 불가능합니다.

 

package practice;

import study.Person;

public class People extends Person {
	public void protectedTest() {
		People people = new People();
		
		System.out.println(people.name); // 접근 가능
		people.protectedTest(); // 접근 가능
	}
}

위 코드처럼 다른 패키지의 People 이라는 클래스를 생성하고 protected 변수와 메서드를 선언했던 Person 클래스를 상속받습니다.

다른 패키지라고 하더라도 상속을 받았기 때문에 Person 클래스의 변수와 메서드에 접근이 가능합니다.

 

default

변수나 메서드에 접근 제어자를 별도로 선언하지 않는다면, 해당 변수나 메서드는 default 접근 제어자가 됩니다.

default 접근 제어자는 해당 패키지내에서만 접근이 가능합니다.

 

package study;

public class Person {
	String name = "DaeHee";

	void getValue() {
		System.out.println(this.name);
	}
}

아까와 비슷 예제로 이번엔 접근 제어자를 선언하지 않고 default 접근 제어자가 되도록 하였습니다.

package study;

public class Main {
	public static void main(String[] args) {
		Person person = new Person();

		System.out.println(person.name);  // 접근 가능
		person.getValue();  // 접근 가능
	}
}

위 코드처럼 같은 패키지내에서라면 모두 접근이 가능합니다.

 

private

private 접근 제어자로 선언한 변수나 메서드는 해당 클래스 내에서만 접근이 가능합니다.

private 접근 제어자를 사용한 변수나 메서드는 외부로 공개되지 않으며 객체지향에서 은닉화를 가능하게 합니다.

해당 변수나 메서드에 직접 접근은 불가능하며 해당 클래스의 public 메서드를 통해서만 접근할 수 있습니다.

package study;

public class Person {
	private String name = "DaeHee";

	public void getValue() {
		System.out.println(this.name);
	}
}

위 코드처럼 name 변수를 private 접근 제어자로 선언하고 getValue() 메서드에서 name 변수에 접근하여 출력하도록 했습니다.

package study;

public class Main {
	public static void main(String[] args) {
		Person person = new Person();

		System.out.println(person.name);  // 접근 불가
		person.getValue();  // 접근 가능
	}
}

private 접근 제어자이기 때문에 person.name 처럼 바로 직접적인 접근은 불가능하며 public 으로 선언한 getValue() 메서드를 통해서 name 변수에 접근할 수 있습니다.

 

앞으로 Java 기본 문법이나 기본적인 내용들도 조금 작성해보려 합니다.

혹시 틀린 부분이 있다면 댓글로 남겨주세요!

반응형

댓글