구성, 위임 등은 headfirst OOA&D 에서 자주 상기되던 개념입니다.
구성이라는 것은 클래스가 다른 클래스를 인스턴스 변수로 가진다는 의미로 보실 수 있으며
위임은 클라이언트 코드에서 구성하고 있는 인스턴스 변수 객체(말이 어렵네요. 참조객체라고 하면 쉬울까요 ㅎㅎ;)
를 통하여 메소드 호출 등을 말하는 것입니다.
아마 수개월전에 headfirst OOA&D 학습하면서 끄적였던 것 같은데 이 주제를 다시 또 다루는 이유는
요즘 보고 있는 책에서 꽤 강하게 주장하고 있어서 적습니다.
서적 이름은 thinking in java라는 서적인데,
모두 읽은 것은 아니지만 headfirst java + OOA&D 느낌이 좀 있네요. headfirst 시리즈가 쉬운 용어들과 재밌는 사진들을
이용해서 거부감을 좀 줄였다면 이 서적은 상당히 전문용어들을 사용하면서 약간 무겁게 다가오네요.
두껍기도... 아주 두껍구요 ㅎㅎ;
OOA&D 에서도 기술되었듯이 상속보다는 구성을 이용하라고 하는데, 이 서적도 함께 요구하고 있습니다.
OOA&D에서는 그냥 '분리' 라고 표현하였다면 이 서적에서는 '완전한 분리' 라고 강하게 표현하네요.
thinking in java에서 다형성과 인터페이스(8, 9장) 에 대해서 이야기하면서 나오는 부분입니다.
"상속과 구성 중 어느 것을 사용할지 분명히 하지 않으면, 구성을 먼저 고려하는 것이 더 좋은 방법이다.
구성은 상속 구조의 설계가 수반되지는 않지만 실행시 동적으로 타입을 선택할 수 있으므로 유연하다
이에 반하여 상속은 컴파일할 때 정확한 타입을 알아야 한다."
예를 들자면 이러합니다.
class ABC { public void isABC() }
class A extends ABC{
public void isABC(){ print("a"); }
}
class B extends ABC{
public void isABC(){ print("b"); }
}
class Stage{
private ABC abc = new A();
public void change(){ abc = new B(); }
public void play(){ abc.isABC(); }
}
class Test{
public static viod main(String[] args){
Stage stage = new Stage();
stage.play();
stage.change();
stage.play();
}
}
서적의 예제를 ... 베껴놓았습니다 -_-;;;
Stage 클래스는 A, B의 부모클래스인 ABC클래스를 구성하고있습니다.
처음 Test에 의해서 객체가 생성이 될때 인스턴스 변수 abc는 A 객체가 생성되면서 초기화 되는군요.
그리고 play 메소드가 호출이 되는데 이때는 위임을 통해서 A 객체의 isABC() 메소드를 호출합니다.
그럼 당연히 a가 출력되겠네요.
하지만, 곧 stage 객체의 클라이언트가 change() 메소드를 호출하였고 인스턴스 변수는 B객체를 참조하게되었네요.
그리고 play() 메소드가 호출되면 B객체의 isABC() 메소드를 호출하게 됩니다.
예전에도, 요즘도, 그래서 뭐 어쩌라고.... 라는 생각을 사실 자주 했었드랬죠.
그런데 문득 이런 생각을 하게 되었습니다. (각종 서적에서 했던 말을 이제사.... 알겠습니다. 라고 답변했네요...)
처음에 A객체의 프린트를 위해서
class AA extends A{
public void isABC(){ print("a"); }
}
라고 AA 클래스를 또 상속을 통해서 작성하였다면 어떨까요.
나중에 클라이언트 코드에서 B가 필요할 경우엔? 다시 또 BB를 만들어주어야 하나요?
상당히 억지스럽지만 이러한 코드도 보일 뿐더러
아예 A, B 를 바로 가져다 쓰는 경우가 있다고 합니다.
편의상 가능한 말이지만.... C가 생기고 D가 생기고 하게되면 언젠가는 클라이언트 코드들을 죄다 찾아서
작업해줘야하는 번거로움이 생기게 됩니다.
흠.... 진정 구성과 상속, 위임 등에 대해 그 필요성과 철학을 이해하고 작성했나 모르겠네요.
thinking in java 의 도입부분에선 간단하게나마 C, C++, java에 대해 소개해줍니다.
프로그래밍언어구조론 나름 열심히 들었다고 생각했는데 얼떨떨했네요.
유명한 것은 알고 있었지만 책이 원체 두꺼워 손이 잘 안가고 있었는데 기회가 닿아 좀 읽어보니
프로그래밍 자체를 처음 접하는 분에게는 추천해드리기 별루고,
프로그래밍을 조금은 접해보셨던 분들께는 추천하고픈 책입니다.
적다보니 책얘기가 대부분같네요.
참, 위에 작성한 예제는 State 패턴이라고 합니다!
구성이라는 것은 클래스가 다른 클래스를 인스턴스 변수로 가진다는 의미로 보실 수 있으며
위임은 클라이언트 코드에서 구성하고 있는 인스턴스 변수 객체(말이 어렵네요. 참조객체라고 하면 쉬울까요 ㅎㅎ;)
를 통하여 메소드 호출 등을 말하는 것입니다.
아마 수개월전에 headfirst OOA&D 학습하면서 끄적였던 것 같은데 이 주제를 다시 또 다루는 이유는
요즘 보고 있는 책에서 꽤 강하게 주장하고 있어서 적습니다.
서적 이름은 thinking in java라는 서적인데,
모두 읽은 것은 아니지만 headfirst java + OOA&D 느낌이 좀 있네요. headfirst 시리즈가 쉬운 용어들과 재밌는 사진들을
이용해서 거부감을 좀 줄였다면 이 서적은 상당히 전문용어들을 사용하면서 약간 무겁게 다가오네요.
두껍기도... 아주 두껍구요 ㅎㅎ;
OOA&D 에서도 기술되었듯이 상속보다는 구성을 이용하라고 하는데, 이 서적도 함께 요구하고 있습니다.
OOA&D에서는 그냥 '분리' 라고 표현하였다면 이 서적에서는 '완전한 분리' 라고 강하게 표현하네요.
thinking in java에서 다형성과 인터페이스(8, 9장) 에 대해서 이야기하면서 나오는 부분입니다.
"상속과 구성 중 어느 것을 사용할지 분명히 하지 않으면, 구성을 먼저 고려하는 것이 더 좋은 방법이다.
구성은 상속 구조의 설계가 수반되지는 않지만 실행시 동적으로 타입을 선택할 수 있으므로 유연하다
이에 반하여 상속은 컴파일할 때 정확한 타입을 알아야 한다."
예를 들자면 이러합니다.
class ABC { public void isABC() }
class A extends ABC{
public void isABC(){ print("a"); }
}
class B extends ABC{
public void isABC(){ print("b"); }
}
class Stage{
private ABC abc = new A();
public void change(){ abc = new B(); }
public void play(){ abc.isABC(); }
}
class Test{
public static viod main(String[] args){
Stage stage = new Stage();
stage.play();
stage.change();
stage.play();
}
}
서적의 예제를 ... 베껴놓았습니다 -_-;;;
Stage 클래스는 A, B의 부모클래스인 ABC클래스를 구성하고있습니다.
처음 Test에 의해서 객체가 생성이 될때 인스턴스 변수 abc는 A 객체가 생성되면서 초기화 되는군요.
그리고 play 메소드가 호출이 되는데 이때는 위임을 통해서 A 객체의 isABC() 메소드를 호출합니다.
그럼 당연히 a가 출력되겠네요.
하지만, 곧 stage 객체의 클라이언트가 change() 메소드를 호출하였고 인스턴스 변수는 B객체를 참조하게되었네요.
그리고 play() 메소드가 호출되면 B객체의 isABC() 메소드를 호출하게 됩니다.
예전에도, 요즘도, 그래서 뭐 어쩌라고.... 라는 생각을 사실 자주 했었드랬죠.
그런데 문득 이런 생각을 하게 되었습니다. (각종 서적에서 했던 말을 이제사.... 알겠습니다. 라고 답변했네요...)
처음에 A객체의 프린트를 위해서
class AA extends A{
public void isABC(){ print("a"); }
}
라고 AA 클래스를 또 상속을 통해서 작성하였다면 어떨까요.
나중에 클라이언트 코드에서 B가 필요할 경우엔? 다시 또 BB를 만들어주어야 하나요?
상당히 억지스럽지만 이러한 코드도 보일 뿐더러
아예 A, B 를 바로 가져다 쓰는 경우가 있다고 합니다.
편의상 가능한 말이지만.... C가 생기고 D가 생기고 하게되면 언젠가는 클라이언트 코드들을 죄다 찾아서
작업해줘야하는 번거로움이 생기게 됩니다.
흠.... 진정 구성과 상속, 위임 등에 대해 그 필요성과 철학을 이해하고 작성했나 모르겠네요.
thinking in java 의 도입부분에선 간단하게나마 C, C++, java에 대해 소개해줍니다.
프로그래밍언어구조론 나름 열심히 들었다고 생각했는데 얼떨떨했네요.
유명한 것은 알고 있었지만 책이 원체 두꺼워 손이 잘 안가고 있었는데 기회가 닿아 좀 읽어보니
프로그래밍 자체를 처음 접하는 분에게는 추천해드리기 별루고,
프로그래밍을 조금은 접해보셨던 분들께는 추천하고픈 책입니다.
적다보니 책얘기가 대부분같네요.
참, 위에 작성한 예제는 State 패턴이라고 합니다!
'Programming > JAVA' 카테고리의 다른 글
java : 정규식 표현을 해야할 경우에는 정규식 표현을 사용하는 것이 좋습니다. :) (0) | 2012.02.21 |
---|---|
java : POJO란? (0) | 2011.12.19 |
java : JVM의 메모리 구조. (0) | 2011.10.06 |
java : Generic - 와일드카드 (2) | 2011.09.19 |
java : 강력한 형 안정성 기술. generic (0) | 2011.09.16 |