본문 바로가기
Java & Kotlin/Java

14. 접근제한자(public, protected, private, default), getter, setter

by heekng 2021. 1. 19.
반응형
 

JAVA에서 클래스, 필드, 생성자, 메소드를 접근할 수 있는 권한을 제한하는 키워드를 접근제한자라고 합니다.

접근제한자의 종류는 public, protected, private, default(없음)으로 키워드를 나눌 수 있습니다.

접근제한자 키워드

적용가능 범위

접근 불가능한 클래스

public

클래스, 필드, 생성자, 메소드

X

protected

필드, 생성자, 메소드

자식 클래스가 아닌 다른 패키지에 소속된 클래스

default

클래스, 필드, 생성자, 메소드

다른 패키지의 클래스

private

필드, 생성자, 메소드

모든 외부 클래스


1. public

public은 말 그대로 "공공"으로 사용할 수 있는 것을 뜻합니다.

public키워드를 이용한 모든 클래스, 필드, 생성자, 메소드는 메모리에 올라가 있다면 모두 접근할 수 있습니다.

제가 생각하기에 하나의 클래스에서 가장 접근성이 멀다고 생각하는 외부 패키지에서의 클래스를 예를 들어보겠습니다.

위와 같이 동일 프로젝트 속, 서로 다른 패키지에 각각 하나의 클래스를 생성했습니다.

1

2

3

4

5

package test;

 

public class Cafe {

String name = "세걸음";

}

test패키지의 Cafe클래스는 public키워드가 사용되었습니다.

blog패키지에 만들어져 있는 Blog클래스에서 Cafe클래스의 객체를 생성할 수 있습니다.

하지만 Cafe클래스의 접근제한자 public을 지운다면

위처럼 import도 불가능하며 Cafe클래스에 아예 접근할 수 없습니다.

접근제한자 public은 클래스, 필드, 생성자, 메소드에 모두 사용할 수 있으며 동일한 프로젝트의 모든 클래스에서 접근할 수 있게 해줍니다.

default 키워드는 따로 다루지 않지만, 접근제한자를 두지 않은 클래스는 default로 다른 패키지의 클래스에 접근하지 못합니다.


2. protected

접근제어자 protected는 메소드, 필드, 생성자에서 이용할 수 있습니다.

상속관계의 클래스에서만 접근할 수 있게 해줍니다.

위처럼 public으로 작성된 Cafe클래스의 hello메소드는 서로 다른 패키지의 Blog클래스에서 사용할 수 있습니다.

하지만 서로 다른 패키지에 있는 클래스의 메소드가 protected로 작성되었다면 메소드 사용이 불가능합니다.

위에서 말한 것과 같이 해당 클래스가 상속관계라면 메소드를 상속받아 사용할 수 있습니다.


3. private

접근제한자 private는 메소드, 필드, 생성자에서 이용합니다.

private는 protected와 비슷하면서도 더 좁은 범위로 접근을 제한합니다.

해당 클래스를 제외한 모든 클래스에서 접근을 제한하며, 필드의 경우 외부에서 접근하기 위하여 getter과 setter을 이용합니다.

public으로 선언된 멤버변수는 동일한 패키지의 서로 다른 클래스에서 접근할 수 있습니다.

하지만 private로 선언된 멤버변수는 같은 패키지에 있는 클래스더라도 접근이 불가합니다.

그렇다면 사용하는데에 효율이 없는 아무 의미없는 접근제한자라고 생각될 수 있는데, private는 직접접근을 제한하기 위하여 사용한다고 생각하면 이해가 쉽습니다.

보안을 위하여 private를 이용하고 private으로 선언된 내용에 간접적으로 접근하기 위하여 getter, setter메소드를 만들어 사용합니다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

package blog;

 

public class Cafe {

//private로 멤버변수 선언

private String name = "세걸음";

private int age = 26;

 

public String getName() { //name변수를 가져오는 메소드

return name;

}

public void setName(String name) { //name변수에 값을 넣는 메소드

this.name = name;

}

public int getAge() { //age변수를 가져오는 메소드

return age;

}

public void setAge(int age) { //age변수에 값을 넣는 메소드

this.age = age;

}

}

위처럼 public void set[변수명]()과 this를 이용하여 클래스 내부로 들어가 값을 변경하는 코드을 가진 메소드를 생성하며,

public [자료형] get[변수명]()과 return을 이용하여 해당하는 값을 받아올 수 있는 메소드를 생성합니다.

이를 getter, setter이라 하며, 통상적으로 메소드의 이름은 get[변수명], set[변수명]으로 작성합니다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

package blog;

 

public class Blog{

public static void main(String[] args) {

Cafe a = new Cafe();

 

String name = a.getName();

System.out.println(name);

 

a.setName("홍길동");

System.out.println(a.getName());

 

int age = a.getAge();

System.out.println(age);

 

a.setAge(100);

System.out.println(a.getAge());

}

}

반응형

'Java & Kotlin > Java' 카테고리의 다른 글

20.11.03 - 연산자 예제  (0) 2021.01.19
16. 상속 (extends, 오버라이드)  (0) 2021.01.19
15. 싱글톤 (Singleton)  (0) 2021.01.19
13. final  (0) 2021.01.19
12. Static  (0) 2021.01.19
11. 열거형 (Enum)  (0) 2021.01.19