(12는 생략합니다 패키지 얘기라서...)
main() 메소드가 없는 대부분의 클래스는 외부 클래스에서 이용할 목적으로 설계된 라이브러리 클래스라고 한다. 때문에 라이브러리 클래스를 설계할 때는 외부 클래스에서 접근할 수 있는 멤버와 접근할 수 없는 멤버로 구분해서 필드, 생성자, 메소드를 설계하는 것이 바람직하다!
접근 가능 혹은 접근 불가의 기능을 구현하기 위해서 접근 제한자(Access Modifier) 사용
접근 제한 | 적용 대상 | 접근할 수 없는 클래스 |
---|---|---|
public | 클래스, 필드, 생성자, 메소드 | 없음 |
protected | 필드, 생성자, 메소드 | 자식 클래스가 아닌 다른 패키지에 소속된 클래스 |
dafault | 클래스, 필드, 생성자, 메소드 | 다른 패키지에 소속된 클래스 |
private | 필드, 생성자, 메소드 | 모든 외부 클래스 |
public: 공개한다! 외부 클래스가 자유롭게 사용할 수 있는 공개 멤버 만듦 (공공장소 생각하면 될 것 같음)
protected: 같은 패키지 혹은 자식 클래스에서 사용할 수 있는 멤버 만듦
private: 개인적인 것! 외부에 노출되지 않는 멤버 만듦 (프라이버시 존나 중요. 클래스를 하나의 개인으로 생각하자면 지 혼자만 다 해먹는 것임. 은둔형 외톨이라 남을 거부함)
default: 위 세 가지 접근 제한자 적용되지 않은 멤버는 default 접근 제한을 갖는다. 같은 패키지에 소속된 클래스에서만 사용할 수 있는 멤버를 만듦
같은 패키지 내에서만 사용할 것인지, 다른 패키지 내에서도 사용할 수 있도록 할 것인지 결정하기
클래스에 적용할 수 있는 접근 제한은 public, default 두 가지
class 선언 시 public을 생략하면 default 접근 제한을 갖게 된다.
- 같은 패키지 내에서는 제한 없이 사용이 가능하지만 다른 패키지에서는 사용 못하게 제한
- 같은 패키지뿐만 아니라 다른 패키지에서도 아무런 제한 없이 사용 가능
객체 생성: new
연산자로 생성자 호출
생성자가 어떤 접근 제한을 갖느냐에 따라서 호출 가능 여부가 결정된다.
접근 제한자 | 생성자 | 설명 |
---|---|---|
public | 클래스(...) |
모든 패키지에서 아무런 제한 없이 생성자 호출 가능! 클래스가 defaut 접근 제한을 갖는다면 클래스 사용이 같은 패키지로 한정되기 때문에 생성자가 public이어도 같은 패키지 내에서만 생성자 호출 가능 |
protected | 클래스(...) |
같은 패키지에 속하는 클래스에서 생성자 호출 가능! 다른 패키지에 속한 클래스가 해당 클래스의 자식(child) 클래스라면 생성자 호출 가능! |
dafault | 클래스(...) | 다른 패키지에서는 생성자 호출 불가 |
private | 클래스(...) | 오직 클래스 내부에서만 생성자를 호출하고 객체 생성 가능 |
필드와 메소드 선언 시에도 클래스 내부에서만 사용할 것인지, 패키지 내에서만 사용할 것인지, 아니면 다른 패키지에서도 사용할 수 있도록 할 것인지 결정해야 한다.
접근 제한자 | 생성자 | 설명 |
---|---|---|
public |
필드 메소드(...) |
모든 패키지에서 아무런 제한 없이 필드와 메소드 사용 가능
필드와 메소드가 public 접근 제한을 가질 경우 클래스도 동일해야 한다 |
protected |
필드 메소드(...) |
같은 패키지에 속하는 클래스에서 필드와 메소드를 사용할 수 있게 함
default와 비슷하지만 protected는 다른 패키지에 속한 클래스라도 해당 클래스의 자식 클래스일 경우 필드와 메소드 사용 가능! |
dafault |
필드 메소드(...) |
public이나 pirvate 생략했다면 default 접근 제한을 갖는다
같은 패키지에서는 제한 없이 필드 메소드 사용 가능하지만 다른 패키지에서는 사용 불가 |
private |
필드 메소드(...) |
패키지가 동일하든 동일하지 않든 상관 없이 필드 메소드 사용 불가
오직 클래스 내부에서만 사용 가능 |
이 부분... 잘 기억해 둡시다 ㅠ 코드 만들면서 자주 실수 한다 접근 제한자 쓰는거 까먹음 맨날 ㅠ