티스토리 뷰

Java

[자바] 접근 제어자(Access modifier)

§무명소졸§ 2018. 3. 19. 18:05

객체지향의 요소중에 정보은닉이 있습니다.

자바도 객체 지향언어이 때문에 정보은닉을 위한 멤버 필드나,메서드의 외부 노출을 대한 범위를 정할 수 있는

아래 표와 같은 4가지 접근 제어자를 제공합니다. 


접근 제어자 

클래스 

패키지 

상속 

패키지 외부 

 Private

 Y

 N

 N

 N

 Default

 Y

 Y

 N

 N

 Protected

 Y

 Y

 Y

 N

 Public

 Y

 Y

 Y

 Y


1.Private

private 은 멤버필드 나 메서들의 접근 범위를 클래스 내부로 제한합니다. 또한 클래스나 인터페이스는 private일 수 없고
인터페이스에 선언된 메서드 나 필드 역시 private 일 수 없습니다.

Person.java

1
2
3
4
5
6
7
8
9
10
11
12
package info.m2sj;
 
public class Person {
    private String serialNo;
 
    public Person(String serialNo) {
        this.serialNo = serialNo;
    }
    public String getSerialNo() {
        return this.serialNo;
    }
}
cs


Main.java

1
2
3
4
5
6
7
8
9
10
11
package info.m2sj;
 
public class Main {
    public static void main(String[] args) {
        Person p = new Person("1312033000000");
 
        System.out.println("시리얼 번호는 " + p.serialNo);//error 접근할수 없습니다.
        System.out.println("시리얼 번호는 " + p.getSerialNo());
    }
}
 
cs


Person 이라는 클래스는 주민번호를 멤버 필드로 가지고 있습니다. 접근 제어자를 private 선언했기 때문에

외부 클래스에서는 접근할수 없고 getSerialNo 이라는 public 메서드로 값을 가져오게 됩니다. 위에 시리얼 번호처럼

외부에서 직접수정 할 수 없기 위해 그리고 값을 수정함에 있어서 외부에 영향이 없다는 확실한 인식을 개발자에게

심어 줄 수 있습니다.


2.Default

default 는 package 내부로 접근을 제한 합니다. 그리고 접근 제어자를 생략하면 default 접근제어자를 선언한 것으로 봅니다.


Person.java

1
2
3
4
5
6
7
8
9
10
11
12
13
package info.m2sj;
 
public class Person {
    String serialNo; //== default String serialNo
 
    public Person(String serialNo) {
        this.serialNo = serialNo;
    }
    public String getSerialNo() {
        return this.serialNo;
    }
}
 
cs



Main.java (동일 Package)
1
2
3
4
5
6
7
8
9
package info.m2sj;
 
public class Main {
    public static void main(String[] args) {
        Person p = new Person("1312033000000");
        System.out.println("시리얼 번호는 " + p.serialNo);//접근가능
    }
}
 
cs


OtherMain.java (다른 Package)

1
2
3
4
5
6
7
8
9
10
11
package info.other;
 
import info.m2sj.Person;
 
public class OtherMain {
    public static void main(String[] args) {
        Person p = new Person("1312033000000");
        System.out.println("시리얼 번호는 " + p.serialNo);//접근 불가능
    }
}
 
cs


3.Protected

protected 는 default와 마찬가지로 package 내부로 접근 제한합니다. 하지만 상속을 할 경우 패키지 외부에서도 접근이 가능합니다.
또한 클래스와 인터페이스는 protected 로 선언할 수 없습니다. 인터페이스의 메서드와 필드 역시 protected 로 선언할 수 없습니다.


Person.java
1
2
3
4
5
6
7
8
9
10
11
12
package info.m2sj;
 
public class Person {
    protected String serialNo;
 
    public Person(String serialNo) {
        this.serialNo = serialNo;
    }
    public String getSerialNo() {
        return this.serialNo;
    }
}
cs


OtherMain.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package info.other;
 
import info.m2sj.Person;
 
public class OtherMain extends Person {
    public OtherMain(String serialNo) {
        super(serialNo);
    }
 
    private String getSuperSerialNo() {
        return super.serialNo;
 
    }
    public static void main(String[] args) {
        OtherMain o = new OtherMain("1312033000000");
        System.out.println("시리얼 번호는 " + o.getSuperSerialNo());
    }
}
 
cs


4.Public

public 는 상속이나 기타 조건에 상관없이 어느 곳에서든 접근 가능합니다.  인터페이스는 생략시 Public 접근 제어자가 됩니다. (생략을 권장 합니다.)

Bird.java
1
2
3
4
5
6
7
package info.m2sj;
 
 
public interface Bird {
    void fly(); // == public void fly()
}
 
cs


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크