티스토리 뷰
객체지향의 요소중에 정보은닉이 있습니다.
자바도 객체 지향언어이 때문에 정보은닉을 위한 멤버 필드나,메서드의 외부 노출을 대한 범위를 정할 수 있는
아래 표와 같은 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 |
'Java' 카테고리의 다른 글
MessageFormat with Java (0) | 2020.05.26 |
---|---|
Run vs Start in Java Thread (0) | 2020.05.22 |
[자바] 추상클래스와(abstract class) 와 인터페이스(interface) (0) | 2018.03.09 |
[자바]static(클래스) 메소드는 언제 쓰나 (0) | 2018.03.07 |
[자바] Guava 를 이용한 코드 작성 (0) | 2018.02.21 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크