* 접근 범위 제어
① private는 같은 클래스 멤버만 접근 가능하다.
② package private는 같은 패키지 멤버만 접근 가능하다.
③ protected는 같은 패키지 멤버 + 상속받은 패키지 멤버만 접근 가능하다.
④ public은 다른 패키지 멤버라도 접근 가능하다.
이해를 돕기위한 실제 예제 사용)
1. A클래스와 Test3은 같은 클래스 멤버가 아니다.
2. Test3은 A클래스를 상속받은 자식 클래스이다.
3. v1,v2,v3,v4은 각각 private, default, protected, public이다.
package bitcamp.test.p1;
public class A {
private int v1;
int v2;
protected int v3;
public int v4;
protected void m() {
this.v1 = 100;
this.v2 = 200;
this.v3 = 300;
this.v4 = 400;
}
}
package bitcamp.test;
import bitcamp.test.p1.A;
public class Test3 extends A {
public static void main(String[] args) {
A obj = new A();
// obj.v1 = 100; // private
// obj.v2 = 200; // default
// obj.v3 = 300; // obj는 A라는 설계도에 따라 만든 객체이므로 자식 클래스가 아니다.
// 따라서 protected에 접근할 수 없다.
// obj.v4 = 300; // public
obj.m(); // 접근불가 ! <== 상속받은 멤버가 아니다 ! 따라서 A클래스의 m 메서드에 접근 불가 !
Test3 obj2 = new Test3();
// obj2.v1 = 100; // private이기때문에 접근불가. 같은 클래스 멤버이어야 한다.
// obj2.v2 = 200; // test3가 상속받아서 만든 변수이지만, 접근불가. default는 같은 패키지이어야 한다.
obj2.v3 = 300; // test3가 상속받아서 만든 필드! 자식 클래스가 protected에 접근 가능하다.
obj2.m(); // 자식 클래스가 상속 받아서 사용하는 멤버이다 ! (A 클래스의 m이라는 메서드에 접근)
}
}
* Composite 패턴 구현
Menu 를 상속 받은 MenuGroup 클래스를 만든다.
1. 생성자는 각자 자신의 생성자를 각각 만들어야한다.
2. 모든 생성자는 첫 줄에는 수퍼 클래스의 기본 생성자를 호출해야한다.
3. 사용자가 명시해주지않으면 컴파일러가 자동으로 생성한다.
정답)
틀린 예시)
1. super 클래스는 반드시 생성자의 첫 줄에 와야한다.
2. super 클래스는 반드시 "super"이라고 명시해주어야한다.
* Composite 패턴 구현 (2)
Menu를 상속받는 MenuPrompt의 기능을 다시 리팩토링하여
메뉴를 메뉴안에 담는다.
MenuGroup 은 메뉴의 추가,출력,조회 등을 담는다.
MenuPrompt는 BreadcrumbPrompt 로 바꿔주고 메뉴의 경로에 대한 내용을 담는다.
* Observer 패턴
ㄴ 객체의 상태가 변경 됐을 때 보고받는 구조. 보고받아서 처리하는 경우
* command 패턴
한 명령어를 추가하는 것은 한 클래스가 처리한다.
클래스를 추가할 때 기존 코드를 손댈 필요가 없다.
* Specialization (특수화) vs Generalization (일반화)
Specialization (특수화)
클래스에 기능을 덧붙여 좀 더 특별한 일을 하는 서브 클래스를 정의
Generalization (일반화)
여러 클래스에 중복되는 기능을 추출하여 수퍼 클래스에 정의
* 상속 : Specialization (특수화) vs Generalization (일반화)
Specialization (특수화)
클래스에 기능을 덧붙여서 특별한 일을 하는
MenuPrompt와 MenuGroup 라는 서브클래스를 정의한다.
Generalization (일반화)
BoardAddListener , BoardDetailListener, BoardUpdateListener 에 모두 중복되는
BoardListener 이라는 수퍼클래스를 정의한다.
추가적으로, 수퍼클래스를 정의하고 Abstract를 적용한다면
Abstract Class 는 추상 클래스이며 서브 클래스에 기능을 제공할 목적으로
사용되며, 직접적으로 사용될 수는 없다.