Download presentation
Presentation is loading. Please wait.
1
제 8 장 상속
2
상속(Inheritance) 상속은 재사용 가능한 클래스를 생성하고 조직하기 위한 기본적인 객체-지향 설계 기술이다.
상속은 재사용 가능한 클래스를 생성하고 조직하기 위한 기본적인 객체-지향 설계 기술이다. 8장 포커스 기존 클래스들로부터 새로운 클래스 유도 protected 가시성 조정자 클래스 계층구조 생성 추상 클래스 상속된 멤버의 간접 가시성 상속을 위한 설계 GUI 컴포넌트 클래스 계층구조 감청자 어댑터 클래스의 확장 Timer 클래스 © 2004 Pearson Addison-Wesley. All rights reserved
3
Outline 서브클래스 생성 메쏘드 재정의 클래스 계층구조 상속 및 가시성 상속을 위한 설계 상속 및 GUI
Timer 클래스 © 2004 Pearson Addison-Wesley. All rights reserved
4
상속(Inheritance) 상속이란 무엇인가? 기존의 클래스로부터 새로운 클래스를 유도하는 것
자식 클래스는 부모 클래스의 메쏘드와 데이터를 상속 자식 클래스에 새로운 변수나 메쏘드를 추가할 수 있다. 기존 클래스 부모 클래스(parent class), 수퍼 클래스(superclass), 기반 클래스(base class) 유도 클래스 자식 클래스(child class), 서브클래스(subclass) © 2004 Pearson Addison-Wesley. All rights reserved
5
상속 상속 관계 표시 is-a 관계(relationship) UML 클래스 다이어그램 자식으로부터 부모로의 화살표
Vehicle Car is-a 관계(relationship) 자식이 부모의 보다 구체적인 버전이다. the child is a more specific version of the parent © 2004 Pearson Addison-Wesley. All rights reserved
6
상속 상속은 왜 하나? 소프트웨어 재사용(Software reuse) 기존의 소프트웨어 컴포넌트를 사용해서 새로운 클래스 생성
기존 소프트웨어를 재사용함으로써 기존 소프트웨어에 들인 모든 노력을 재사용 © 2004 Pearson Addison-Wesley. All rights reserved
7
서브클래스 유도 예약어 extends를 사용한다. See Words.java (page 440)
class Car extends Vehicle { // class contents } See Words.java (page 440) See Book.java (page 441) See Dictionary.java (page 442) © 2004 Pearson Addison-Wesley. All rights reserved
8
Word.java © 2004 Pearson Addison-Wesley. All rights reserved
9
Book.java © 2004 Pearson Addison-Wesley. All rights reserved
10
Dictionary.java © 2004 Pearson Addison-Wesley. All rights reserved
11
protected 조정자 가시성 조정자 보호(Protected)가시성
부모 클래스 멤버가 자식 클래스에서 사용되는 방식에 영향을 미친다. 전용(private) 가시성을 갖는 멤버 자식 클래스 내에서 직접 접근할 수 없다. 공용(public) 가시성을 갖는 멤버 자식 클래스뿐만 아니라 어디서나 접근 가능 공용 변수는 캡슐화 원리를 위반 보호(Protected)가시성 상속 상황을 위한 제3의 가시성 © 2004 Pearson Addison-Wesley. All rights reserved
12
protected 조정자 protected 멤버 protected 멤버 표시 자식 클래스가 직접 접근할 수 있다.
공용 가시성보다는 더 캡슐화하고 전용보다는 덜 캡슐화 한다. 보호 멤버는 부모 클래스와 같은 패키지 내의 어떤 클래스에서도 사용가능 protected 멤버 표시 UML 다이어그램에서 # 기호로 표시 © 2004 Pearson Addison-Wesley. All rights reserved
13
Words를 위한 클래스 다이어그램 Book Words Dictionary # pages : int
+ pageMessage() : void Dictionary - definitions : int + definitionMessage() : void Words + main (args : String[]) : void © 2004 Pearson Addison-Wesley. All rights reserved
14
super 참조 구성자(constructor)는 상속되지 않는다.
자식 클래스에서 객체의 “부모 부분”을 설정하기 위해 부모의 구성자를 사용하고자 할 때 super( ) 사용 부모의 구성자 호출 필요하면 자식 구성자가 첫 줄에서 부모 구성자를 한다 See Words2.java (page 445) See Book2.java (page 446) See Dictionary2.java (page 447) © 2004 Pearson Addison-Wesley. All rights reserved
15
Word2.java © 2004 Pearson Addison-Wesley. All rights reserved
16
Book2.java © 2004 Pearson Addison-Wesley. All rights reserved
17
Dictionary2.java © 2004 Pearson Addison-Wesley. All rights reserved
18
다중 상속(Multiple Inheritance)
Java는 단일 상속(single inheritance)만 지원 자식 클래스는 하나의 부모만 가질 수 있다. 인터페이스를 사용하여 다중 상속과 비슷한 효과를 낼 수 있다. 다중 상속(Multiple inheritance) 자식 클래스가 두 개 이상의 부모 클래스를 갖는 경우 두 부모 내의 같은 이름의 변수 등과 같은 충돌을 해결해야 한다. 이 있을 수 있다. © 2004 Pearson Addison-Wesley. All rights reserved
19
Outline 서브클래스 생성 메쏘드 재정의 클래스 계층구조 상속 및 가시성 상속을 위한 설계 상속 및 GUI
Timer 클래스 © 2004 Pearson Addison-Wesley. All rights reserved
20
메쏘드 재정의(overriding) 메쏘드 재정의란 무엇인가? 메쏘드의 서명(signature) 재정의된 메쏘드 실행
자식 클래스가 상속된 메쏘드를 자신이 원하는 대로 재정의하는 것 새로운 메쏘드는 부모 메쏘드와 이름과 서명(signature)이 같아야 한다. 메쏘드의 서명(signature) 메쏘드의 매개변수 이름, 개수, 순서, 타입 재정의된 메쏘드 실행 그 메쏘드를 실행하는 객체의 타입에 따라 호출될 메쏘드가 결정된다. See Messages.java (page 450) See Thought.java (page 451) See Advice.java (page 452) © 2004 Pearson Addison-Wesley. All rights reserved
21
Message.java © 2004 Pearson Addison-Wesley. All rights reserved
22
Thought.java © 2004 Pearson Addison-Wesley. All rights reserved
23
Advice.java © 2004 Pearson Addison-Wesley. All rights reserved
24
재정의 재정의 당한 부모 클래스의 메쏘드 final로 선언된 메쏘드 변수 차단(shadowing variable)
자식 클래스에서 super 참조를 이용해서 명시적 호출 가능 final로 선언된 메쏘드 재정의될 수 없다. 변수 차단(shadowing variable) 재정의 개념을 변수에도 적용할 수 있다. 차단 변수는 불필요하게 코드를 혼란스럽게 함으로 피해야 한다. © 2004 Pearson Addison-Wesley. All rights reserved
25
중복 정의 vs. 재정의 중복정의 재정의 한 클래스 내에 같은 이름의 여러 개의 메쏘드로 서로 다른 서명을 갖는 경우
한 클래스 내에 같은 이름의 여러 개의 메쏘드로 서로 다른 서명을 갖는 경우 비슷한 연산을 다른 매개변수에 대해서 다른 방식으로 정의하는데 사용 재정의 부모 클래스와 자식 클래스에 있는 두 개의 메쏘드로 같은 서명을 갖는 경우 비슷한 연산을 다른 객체 타입에 대해서 다른 방식으로 정의하는데 사용 © 2004 Pearson Addison-Wesley. All rights reserved
26
Outline 서브클래스 생성 메쏘드 재정의 클래스 계층구조 상속 및 가시성 상속을 위한 설계 상속 및 GUI
Timer 클래스 © 2004 Pearson Addison-Wesley. All rights reserved
27
클래스 계층구조(Class Hierarchy)
한 부모의 자식 클래스가 다른 클래스의 부모 클래스가 되어 계층구조 형성 Business KMart Macys ServiceBusiness Kinkos RetailBusiness © 2004 Pearson Addison-Wesley. All rights reserved
28
클래스 계층구조 형제 클래스(siblings) 클래스 계층구조 어떻게 만들 것인가?
같은 부모의 자식 클래스들 클래스 계층구조 어떻게 만들 것인가? 클래스 계층구조에서 공통적인 기능들을 가능하면 높이 위치시킨다. 상속된 멤버들은 계속해서 아래로 상속된다. 따라서 자식 클래스는 모든 조상 클래스들로부터 상속 받는다. 모든 상황에 적절한 클래스 계층구조는 없다. © 2004 Pearson Addison-Wesley. All rights reserved
29
Object 클래스 Object 클래스 Object 클래스는 모든 클래스 계층구조에서 궁극적인 루트
Java 표준 라이브러리의 java.lang 패키지에 정의되어 있다. 모든 클래스는 Object 클래스로부터 상속받는다. 어떤 클래스의 자식 클래스로 명시적으로 정의되지 않으면 자동적으로 Object 클래스의 자식 클래스가 된다. © 2004 Pearson Addison-Wesley. All rights reserved
30
Object 클래스 Object 클래스가 포함하고 있는 유용한 메쏘드 toString 메쏘드 equals 메쏘드
객체의 클래스 이름과 다른 정보를 포함한 스트링 반환 toString 메쏘드를 정의할 때마다 사실은 재정의하는 것임 equals 메쏘드 두 참조가 같은 객체에 대한 이명(alias)이면 참(true) 반환 어떤 클래스에서도 적절하게 equals 메쏘드 재정의 가능 String 클래스의 equals 메쏘드 두 String 객체가 같은 문자들을 포함하면 참을 반환하도록 재정의 © 2004 Pearson Addison-Wesley. All rights reserved
31
추상 클래스(Abstract Class)
추상 클래스란 무엇인가? 포괄적인 개념을 표현하기 위한 클래스 추상 메쏘드를 포함한 클래스를 보통 추상 클래스로 정의한다. 추상 메쏘드가 아닌 완전히 구현된 메쏘드도 포함 가능 추상 클래스는 실체화될 수 없다. abstract 조정자 사용 public abstract class Product { abstract method1(); method2() { … } // contents } © 2004 Pearson Addison-Wesley. All rights reserved
32
추상 클래스 자식 클래스가 부모 클래스의 추상 메쏘드를 구현한다. 구현하지 않으면 자식 클래스도 여전히 추상 클래스가 된다.
추상 메쏘드는 final이나 static으로 선언하면 안됨 추상 클래스 사용은 소프트웨어 설계에서 중요한 요소 실체화하기에 너무 포괄적인 공통 요소들을 계층구조에 위치시킬 수 있도록 해준다. © 2004 Pearson Addison-Wesley. All rights reserved
33
인터페이스 계층구조 인터페이스 상속 자식 인터페이스를 구현한 클래스 상속은 클래스뿐만 아니라 인터페이스에도 적용 가능
한 인터페이스가 다른 인터페이스를 상속할 수 있다. 자식 인터페이스는 부모의 모든 추상 메쏘드들을 상속받는다. 클래스 계층구조와 인터페이스 계층구조는 별개임 자식 인터페이스를 구현한 클래스 자식 인터페이스뿐만 아니라 그 조상들의 메쏘드들도 구현해야 한다. © 2004 Pearson Addison-Wesley. All rights reserved
34
Outline 서브클래스 생성 메쏘드 재정의 클래스 계층구조 상속 및 가시성 상속을 위한 설계 상속 및 GUI
Timer 클래스 © 2004 Pearson Addison-Wesley. All rights reserved
35
가시성 재조명 상속과 가시성과 관련된 미묘한 문제 부모의 모든 멤버들은 전용(private)일지라도 자식에 상속된다.
상속된 전용 멤버는 자식이 이름으로 직접 참조할 수 없다. 상속된 전용 멤버는 존재하며 간접적으로 참조 가능하다. 부모가 전용 멤버를 참조할 수 있으므로 자식은 부모 메쏘드를 통해 간접적으로 접근할 수 있다. 부모의 객체가 없더라도 super 참조를 이용하여 부모 클래스를 참조할 수 잇다. © 2004 Pearson Addison-Wesley. All rights reserved
36
FoodAnalyzer.java © 2004 Pearson Addison-Wesley. All rights reserved
37
FoodItem.java © 2004 Pearson Addison-Wesley. All rights reserved
38
Pizza.java © 2004 Pearson Addison-Wesley. All rights reserved
39
Outline 서브클래스 생성 메쏘드 재정의 클래스 계층구조 상속 및 가시성 상속을 위한 설계 상속 및 GUI
Timer 클래스 © 2004 Pearson Addison-Wesley. All rights reserved
40
상속을 위한 설계 상속은 객체-지향 설계에서 중요한 부분이다
시간을 투자해서 좋은 소프트웨어 설계를 하면 장기적으로 득이 된다. 적절하게 설계된 상속 관계는 소프트웨어의 품격, 유지성, 재사용에 크게 기여할 수 있다. 좋은 소프트웨어 설계와 관련된 몇 가지 문제들을 요약해보자. © 2004 Pearson Addison-Wesley. All rights reserved
41
상속 설계 이슈 is-a 관계 클래스 계층구조 클래스의 공통 특성 자식 클래스 모든 상속은 is-a 관계이어야 한다.
잠재적인 미래에 대해서 생각해보고 클래스를 유연하고 재사용 가능하게 설계해라. 클래스의 공통 특성 가능하면 계층구조에서 높게 위치시켜라. 자식 클래스 자식의 기능에 맞게 적절하게 메쏘드를 재정의하라. 새로운 변수를 추가하라 그러나 상속된 변수를 재정의(차단) 말라. © 2004 Pearson Addison-Wesley. All rights reserved
42
상속 설계 이슈 각 클래스가 자신의 데이터 관리 일반적인 메쏘드를 정의 추상 클래스 가시성 조정자
각 클래스가 자신의 데이터를 관리하도록 하라. 부모의 데이터를 설정하려면 부모의 구성자를 호출하라. 일반적인 메쏘드를 정의 현재 사용하지 않더라도 toString, equals와 같은 일반적인 메쏘드를 적절히 정의해라. 추상 클래스 하위 클래스들이 공통적으로 갖고 있는 일반적인 개념은 추상 클래스로 표현해라. 가시성 조정자 캡슐화를 위반하지 않고 접근할 수 있도록 가시성 조정자를 주의 깊게 사용하라. © 2004 Pearson Addison-Wesley. All rights reserved
43
상속 제한 final 조정자를 이용해서 상속을 못하게 할 수 있다. 메쏘드에 final 조정자 클래스에 final 조정자
재정의 할 수 없다. 클래스에 final 조정자 클래스가 상속될 수 없다. 따라서 추상 클래스는 final로 선언하면 안됨. © 2004 Pearson Addison-Wesley. All rights reserved
44
Outline 서브클래스 생성 메쏘드 재정의 클래스 계층구조 상속 및 가시성 상속을 위한 설계 상속 및 GUI
Timer 클래스 © 2004 Pearson Addison-Wesley. All rights reserved
45
컴포넌트 클래스 계층구조 GUI 컴포넌트 Swing GUI 컴포넌트 GUI 컴포넌트를 구성하는 클래스들은 계층구조의 일부
JComponent 클래스로부터 유도 Jcomponent Container Component 많은 Swing 컴포넌트는 컨테이너 역할을 할 수 있다. © 2004 Pearson Addison-Wesley. All rights reserved
46
컴포넌트 클래스 계층구조 애플릿이 상속의 좋은 예 Applet, JApplet 클래스 paintComponent 메쏘드 정의
AppletClass extends Applet { … } AppletClass extends JApplet { … } 내가 작성한 애플릿이 해야 할 일만 정의하면 된다. Applet, JApplet 클래스 애플릿 생성, 실행 등에 관한 모든 세부사항을 정의함 Web browser와 상호작용 HTML를 통한 매개변수 전달 보안 제약 실행 paintComponent 메쏘드 정의 사실은 Jcomponent에서 정의되고 Japplet를 통해 상속된 것을 재정의 © 2004 Pearson Addison-Wesley. All rights reserved
47
Event Adapter Classes 상속을 이용한 감청자(listener) 클래스 작성
지금까지 MouseListener 같은 인터페이스 구현해서 생성 이벤트 어댑터 클래스 상속해서 감청자 구현 가능 각 감청자 인터페이스에 상응하는 어댑터 클래스가 존재 MouseAdapter 클래스 각 어댑터 클래스는 해당 인터페이스를 빈 메쏘드로 구현 어댑터 클래스로부터 감청자 클래스를 유도할 때 프로그램과 관련된 메쏘드만 재정의하면 된다. 사용하지 않는 이벤드 관련 메쏘드는 재정의할 필요 없음 © 2004 Pearson Addison-Wesley. All rights reserved
48
OffCenter.java © 2004 Pearson Addison-Wesley. All rights reserved
49
OffCenterPanel.java © 2004 Pearson Addison-Wesley. All rights reserved
50
OffCenterPanel.java © 2004 Pearson Addison-Wesley. All rights reserved
51
Outline 서브클래스 생성 메쏘드 재정의 클래스 계층구조 상속 및 가시성 상속을 위한 설계 상속 및 GUI
Timer 클래스 © 2004 Pearson Addison-Wesley. All rights reserved
52
Timer 클래스 javax.swing의 Timer 클래스 메쏘드 보이지 않는 GUI 컴포넌트
Timer 객체는 정해진 시간간격마다 action event 발생 애니메이션 등에서 시간간격에 따라 동작할 때 사용 가능 자연스런 움직임을 위해 적절한 시간간격 사용해야 한다. 메쏘드 start( ), stop( ) 메쏘드가 타이머를 시작하고 멈춘다 시간간격 설정 Timer 구성자 혹은 setDelay 메쏘드 © 2004 Pearson Addison-Wesley. All rights reserved
53
Rebound.java © 2004 Pearson Addison-Wesley. All rights reserved
54
ReboundPanel.java © 2004 Pearson Addison-Wesley. All rights reserved
55
ReboundPanel.java © 2004 Pearson Addison-Wesley. All rights reserved
56
요약 8장 포커스: 기존 클래스로부터 새로운 클래스 유도 protected 조정자 클래스 계층구조 생성 추상 클래스
상속된 멤버의 간접적 가시성 상속을 위한 설계 GUI 컴포넌트 클래스 계층구조 listener adapter 클래스 확장 Timer 클래스 © 2004 Pearson Addison-Wesley. All rights reserved
Similar presentations