상속과 다형성
단원 06 상속과 다형성
❖ 객체지향의 특징인 상속에 대해 이해하고 프로그래밍에 활용할 수 있다.
▪
• 클래스 간의 상속 관계를 구현▪
• 키워드 this와 super,▪
• 상위 생성자의 호출 super()▪
• 접근 지정자 public protected default private의 활용❖ 객체지향의 특징인 다형성에 대해 이해하고 프로그래밍에 활용할 수 있다.
▪
• 참조형에서 변환 연산인 업 캐스팅과 다운 캐스팅▪
• 객체 확인 연산자 instanceof▪
• 하위 클래스에서 상위 클래스의 메소드를 재정의하는 메소드 오버라이딩의 이해▪
• 메소드 오버라이딩의 동적 바인딩 이해❖ 추상 클래스와 인터페이스를 이해하고 프로그래밍에 활용할 수 있다.
▪
• 추상 클래스의 의미와 구현▪
• 추상 메소드의 필요성과 구현▪
• 인터페이스의 의미와 구현▪
• 인터페이스의 필요성과 구현2
단원 06 상속과 다형성 3
1. 상속
단원 06 상속과 다형성
상속과 개념과 사례
❖ 상속(inheritance)
▪
하위 클래스는 상위 클래스의 특징인 필드와 메소드를 그대로 물려받을 수 있는 특 성▪
차량, 자전거, 자동차, 기차를 클래스로 표현•
이들 클래스 간의 계층 구조에서 상속이라는 특징을 파악•
하위인 자전거와 자동차 그리고 기차는 상위인 차량이라는 특성을 모두 물려 받을 수 있 음4
단원 06 상속과 다형성
키워드 extends(1)
❖ [A 는 B이다]는 [이다 관계(is-a relationship)]가 성립
▪ B는 상위클래스, A는 하위 클래스 관계로 규정
▪
하위 클래스는 상위 클래스의 필드와 메소드를 상속받을 수 있는 특징❖ 즉 [자동차는 차량이다]가 성립
▪
차량에 정의될 수 있는 필드와 메소드는 모두 자동차에서 상속받을 수 있음▪
상위 클래스•
슈퍼super 클래스 또는 부모parent 클래스, 기본base 클래스▪
하위 클래스•
서브sub 클래스 또는 자식child 클래스, 유도derived 클래스5
단원 06 상속과 다형성
키워드 extends(2)
❖ 하위_클래스이름 extends 상위_클래스이름
▪
모든 클래스의 최상위는 Object라는 클래스6
단원 06 상속과 다형성
상위 클래스의 필드와 메소드를 상속
❖ 하위 클래스
▪
상위 클래스의 멤버인 필드와 메소드를 다시 구현 없이 사용7
단원 06 상속과 다형성
실습예제 6-1, 6-2
❖ 차량을 위한 클래스
❖ 차량의 하위 클래스인 자동 차를 위한 클래스
8
단원 06 상속과 다형성
자기 자신과 상위 객체의 구분
❖ this 와 super
▪
this는 객체 자신을 의미하는 키워드▪
마찬가지로 super는 상위 객체를 의미하는 키워드9
단원 06 상속과 다형성
실습예제 6-3
❖ 차량의 하위 클래스인 자동차를 위한 클래스
10
단원 06 상속과 다형성
상위 생성자 호출
❖ 생성자 구현 첫 줄에서의 super( )
▪
super()는 상위 클래스의 기본 생성자를 호출하는 문장▪
생성자의 첫 줄에서•
상위 생성자를 호출하는 super() 또는 super(…)를 명시적으로 호출하지 않는다면•
첫 줄에서 무조건 자동으로 super()를 호출▪
자동으로 사용되는 기본 생성자의 첫 줄은 무조건 super()를 호출11
단원 06 상속과 다형성
상위 객체가 먼저 생성
❖ 생성자 호출에 의해 객체가 생성될 때
▪
항상 상위 객체를 위한 필드와 메소드가 먼저 생성된 후•
하위 객체가 생성12
단원 06 상속과 다형성
상위 클래스에서 기본 생성자 구현의 중요성
13
❖ 사용자가 직접 구현하는 생성 자에서 첫 줄
▪
상위 생성자의 호출인 super() 또는 super(인자) 가 아니면▪
자동으로 기본 생성자 super()를 호출▪
이 때 상위 클래스에서 기본 생성자를 사용할 수 없다면 문법 오류가 발생단원 06 상속과 다형성
상위 클래스에서 기본 생성자가 없는 경우의 문제
❖ 다음 Vehicle과 같이 인자가 있는 생성자를 구현한다면
▪
더 이상 기본 생성자는 구현 없이 자동으로 사용 불가능▪
하위 클래스 생성자 구현에서 super()를 사용한다면 문법 오류가 발생14
단원 06 상속과 다형성
실습예제 6-4, 6-4
❖ 생성자를 구현한 차량 클래스
❖ 자동차를 위한 생성자의 구현과 객체 의 생성
15
단원 06 상속과 다형성
클래스 접근 지정자
❖ 클래스 접근 지정자는 public과 [default] 방식
▪
키워드 public을 사용한 클래스•
다른 모든 클래스에서 사용 가능▪
접근 지정자를 아무것도 기술하지 않은 default 클래스•
동일한 패키지의 다른 클래스에서만 사용 가능•
그러므로 default 클래스는 package 클래스라고도 부름16
단원 06 상속과 다형성
필드와 메소드 접근 지정자
❖ public, protected
[default], private 4 가지 종류
17
단원 06 상속과 다형성
실습예제 6-6
❖ 은행계좌를 추상화한 상위 클래스
18
단원 06 상속과 다형성
실습예제 6-7
❖ 저축계좌를 표현한 클래스
19
단원 06 상속과 다형성
실습예제 6-8
❖ 동일한 패키지에서 SavingAccount의 사용
20
단원 06 상속과 다형성
실습예제 6-9
❖ 다른 패키지의 Account를 상위로 하는 하위 클래스
21
단원 06 상속과 다형성
실습예제 6-10
❖ 다른 패키지에서
SavingAccount 를 사용하는 클 래스 CheckTest
22
단원 06 상속과 다형성 23
2. 다형성
단원 06 상속과 다형성
클래스 Person
❖ 학교의 교직원과 학생 정보를 표현하기 위한 계층도
24
단원 06 상속과 다형성
실습예제 6-12, 6-13
❖ 교직원과 직원 클래스
25
단원 06 상속과 다형성
하위 객체를 상위 클래스형 변수에 대입
❖ 업 캐스팅
▪
하위 객체는 상위 클래스형 변수에 대입이 가능, 상위로의 자료형 변환•
업 캐스팅은 하위인 교직원은 상위인 사람이라는 개념이 성립❖ 업 캐스팅의 제약
▪
업 캐스팅된 변수로는 하위 객체의 멤버를 참조할 수 없는 제약• Faculty 형 변수 f로는 접근 지정자만 허용하면 모든 멤버를 접근 가능
• Person 형 변수 p로는 Person의 멤버인 name과 number만 접근이 가능
26
단원 06 상속과 다형성
실습예제 6-14
❖ 참조형의 형 넓히기 변환
27
단원 06 상속과 다형성
상위 객체를 하위 클래스형 변수에 대입
❖ 다운 캐스팅
▪
상위 클래스 형을 하위 클래스 형으로 변환▪
다운 캐스팅은 반드시 명시적인 형변환 연산자 (하위 클래스)가 필요•
만일 형변환 연산자가 없으면 컴파일 시간에 오류 발생28
단원 06 상속과 다형성
다운 캐스팅의 실행 오류
❖ 컴파일 시간
▪
상속 관계만 성립하면 다운 캐스팅은 가능❖ 실행 시간
▪
실제 객체가 할당되지 않았다면 실행 시간에 오류가 발생29
단원 06 상속과 다형성
객체 확인 연산자
❖ 연산자 instanceof
30
단원 06 상속과 다형성
오버라이딩
❖ 메소드 오버라이딩(method overriding) 정의
▪
상위 클래스의 동일한 메소드를 하위 클래스에서 다시 정의하는 것•
메소드 재정의(method redefinition)•
또는 메소드 대체(method replacement) 라고도 표현❖ 메소드 오버라이딩의 목적
▪
상위 클래스에서 이미 정의한 메소드를•
다시 수정하지 않고 하위 클래스에서 좀 더 보완 수정하거나 완전히 새로운 것으로 대체하 기 위한 방법31
단원 06 상속과 다형성
오버라이딩 조건
❖ 조건
▪
❶ 메소드의 반환 값과 메소드 이름, 매개변수는 반드시 같아야 함▪
❷ 접근 지정자는 하위 클래스의 메소드가 보다 공개적•
상위 클래스의 메소드가 public이면– 오버라이딩되는 메소드는 public만 가능
•
상위 메소드가 protected이면– 하위 메소드는 public과 protected만 가능
•
상위 메소드가 default이면– 하위 메소드는 public과 protected, default만 가능
▪
❸ 메소드 수정자가 final, private인 메소드는 오버라이딩될 수 없음32
단원 06 상속과 다형성
메소드 오버라이딩 예
33
단원 06 상속과 다형성
키워드 final
❖ 클래스 앞의 final
▪
클래스가 더 이상 상속되지 못한다는 의미의 키워드❖ 메소드 반환형 앞의 지정자 final
▪
더 이상 하위 클래스에서 메소드 오버라이딩이 허용되지 않도록 지정하는 키워드34
단원 06 상속과 다형성
동적 바인딩
❖ 오버라이딩 메소드 호출
▪
가장 하위 객체의 메소드 실행35
단원 06 상속과 다형성
실습예제 6-21
❖ 메소드 재정의를 알아보는 예제
36
단원 06 상속과 다형성
메소드 오버로딩
❖ 이름이 같으며 인자가 다른 여러 메소드 구현
▪
하나의 클래스 또는 상속 관계에 있는 클래스 내부에서•
인자가 다르나 이름이 같은 메소드가 여러 개 정의될 수 있는 특징37
단원 06 상속과 다형성 38
3. 추상클래스와 인터페이스
단원 06 상속과 다형성
추상 클래스(1)
❖ 추상 클래스(abstract class)의 의미
▪
클래스 계층구조에서 상위에 위치, 하위 클래스를 대표하는 클래스▪
추상의 의미대로 “구체적”이지 않은 클래스•
보다 구체적인 하위 클래스를 대표하는 클래스❖ 다른 일반 클래스와 구별되는 특징
▪
① 추상 클래스는 직접 객체화(instantiation)될 수 없다.•
즉 생성자를 사용하여 객체를 생성할 수 없다.▪
② 추상 클래스는 다른 클래스에 의하여 상속되어야 한다.•
즉 하위 클래스가 없는 추상클래스는 의미가 없다.▪
③ 추상 클래스는 하위 클래스가 있어야 하므로•
추상 클래스 구현 시 클래스 앞에 키워드 final이 올 수 없다.39
단원 06 상속과 다형성
추상 클래스(2)
❖ 키워드 abstract
40
단원 06 상속과 다형성
추상 클래스 내부의 추상 메소드
❖ 추상 메소드
▪
메소드 몸체가 없는 메소드▪
추상 메소드 정의 시 반환형 앞에 키워드 abstract를 기술하고•
메소드 몸체 구현 없이 바로 세미콜론을 삽입▪
추상 메소드는 private와 final이 사용될 수 없음❖ 추상 클래스
▪
적어도 하나 이상의 추상 메소드를 가진 클래스는 반드시 추상이어야 함▪
키워드 final 이용 불가능41
단원 06 상속과 다형성
하위 클래스에서 추상 메소드의 구현
42
단원 06 상속과 다형성
실습예제 6-24
❖ 추상 클래스 Shape 구현
43
단원 06 상속과 다형성
실습예제 6-25, 26
❖ Circle.java
▪
원을 표현한 클래스로 상위 클래스 Shape의 추상 메소드 draw( )를 구현❖ Rectangle.java
▪
사각형을 표현한 클래스로 상위 클래스 Shape의 추상 메소드 draw( )를 구현44
package inheritance.abstratinterface;
public class Circle extends Shape { double radius;
public Circle(double x, double y, double radius) {
super(x, y);
this.radius = radius;
}
public void draw() { super.drawCenter();
System.out.printf("반지름: %f, ", radius);
System.out.printf("원 면적: %f\n", radius*radius*Math.PI);
} }
package inheritance.abstratinterface;
단원 06 상속과 다형성
실습예제 6-27
❖ 추상 클래스 Shape 형의 변수로 객체의 추상 메소드 호출
45
단원 06 상속과 다형성
인터페이스의 의미와 정의
❖ IT 에서 인터페이스
▪
인터페이스는 컴퓨터와 다른 주변기기를 연결하는 표준을 의미❖ 자바에서 인터페이스
▪
해야 할 작업의 구체적 구현 없이 기능만 선언한 클래스▪
하위 클래스가 수행해야 하는 메소드와 필요한 상수만을 미리 추상적으로 정의해 놓은 특별한 클래스▪
인터페이스는 다중 상속(multiple inheritance)을 지원•
자바의 일반 클래스는 다중 상속을 지원하지 않음▪
키워드 interface46
단원 06 상속과 다형성
인터페이스 상속
❖ 키워드 extends
▪
인터페이스들 간의 상속▪
다중 상속인 경우 상위 인터페이스 여러 개를 쉼표로 구분하여 나열❖ 키워드 implements
▪
인터페이스를 상속받는 하위 클래스를 정의할 때는 사용❖ 인터페이스를 상속받는 클래스
▪
상위 인터페이스에서 정의한 모든 추상 메소드를 구현47
단원 06 상속과 다형성
인터페이스 설계
48