Professional Documents
Culture Documents
Chapter 7
1/71
1절. 상속 개념
상속(Inheritance)이란?
현실 세계:
• 부모가 자식에게 물려주는 행위
객체 지향 프로그램:
• 기존의 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는
것으로, 이미 구현된 클래스를 상속받아 속성이나 기능을 확장하는 클래스
구현
• 자식(하위) 클래스가 부모(상위) 클래스의 멤버를 물려받는 것
• 상속 대상: 부모의 필드와 메소드
2/71
1절. 상속 개념
상속(Inheritance) 개념의 활용
상속의 효과
• 부모 클래스 재사용(코드의 재사용성) – 개발 생산성을 높이는 효과
• 반복된 코드 중복 줄임
• 유지 보수 편리성 제공
• Data의 효율적 관리
• 형 변환(Type Casting)을 통한 Object 관리 용이(객체 다형성 구현 가능)
상속 대상 제한
• final 클래스는 상속 불가능
• 부모 클래스의 private으로 선언된 필드와 메소드는 상속 불가능
• 부모 클래스가 다른 패키지에 있을 경우, default 접근제한자를 갖는 필드와
메소드도 상속 불가능
3/71
1절. 상속 개념
상속의 의미
상속은 클래스의 재사용(확장)의 개념으로,
연관 있는 클래스들의 공통적인 구성요소를 분류(Classification)하여, 이를 대표하는 클래스를
정의하고, 관련 있는 클래스 정의 시 대표 클래스를 상속하여 확장 클래스를 구현
공통 공통
요소 요소
4/71
1절. 상속 개념
상속(Inheritance)은?
일반화
(추상화)
구체화
5/71
2절. 클래스 상속(extends)
6/71
2절. 클래스 상속(extends)
extends
7/71
2절. 클래스 상속(extends)
상속 구현 - extends 키워드
8/71
2절. 클래스 상속(extends)
상속 구현 - extends 키워드
9/71
2절. 클래스 상속(extends)
상속 구현 – 실행 클래스
stack heap
emp Employee
Person
name:손흥민
age:27
Employee
dept:전산센터
prof Professor
name:이강인
age:52
subject:인공지능
std Student
name:김유리
age:22
major:컴퓨터공학
10/71
2절. 클래스 상속(extends)
상속 구현
[1단계]
A 백화점에서 고객정보를 이용한 맞춤형 서비스를 제공하기 위해
고객관리 프로그램을 작성하고자 한다.
- 고객 정보: 아이디,이름, 고객 등급, 마일리지 포인트, 마일리지 적립비율
- 매월 고객에게 회원 등급 및 마일리지 정보를 제공
고객 정보
아이디 고객 아이디
이름 고객 이름
고객 등급 고객 등급(SILVER)
마일리지 포인트 제품 구매 시 누적되는 마일리지 포인트
마일리지 적립비율 제품 구매 시 구매금액의 일정비율이 마일리지포인트로 적립
(실버:1%)
11/71
2절. 클래스 상속(extends)
상속 구현
고객 클래스 Customer
-아이디 -customerID: int
-이름 -customerName: String
-고객 등급 -customerGrade: String
-마일리지 포인트 -mileagePoint: int
-마일리지 적립비율 -mileageRatio: double
+생성자
클래스 정의 +Customer(int, String)
+getter() +getter()
+setter() +setter()
+마일리지 점수 계산() +calcMileagePoint(int): int
+고객정보 안내() +customerInfo(): String
12/71
2절. 클래스 상속(extends)
상속 구현 Customer 클래스
13/71
2절. 클래스 상속(extends)
상속 구현 Customer 클래스
14/71
2절. 클래스 상속(extends)
상속 구현 Customer 클래스
15/71
2절. 클래스 상속(extends)
상속 구현 실행 클래스
16/71
2절. 클래스 상속(extends)
상속 구현
[2단계]
VIP 고객 등급 추가
- 고객 정보: 아이디,이름, 고객 등급, 할인율, 마일리지 포인트,
마일리지 적립비율, 특별 마일리지 포인트, 전문 상담원 아이디
- 매월 고객에게 회원 등급 및 마일리지 정보를 제공
고객 정보
아이디 고객 아이디
이름 고객 이름
고객 등급 고객 등급(SILVER, VIP)
할인율 제품 구매 시 할인 비율(SILVER:5%, VIP:10%)
마일리지 포인트 제품 구매 시 누적되는 마일리지 포인트
마일리지 적립비율 제품 구매 시 구매금액의 일정비율이 마일리지포인트로 적립
(실버:1%, VIP:5%)
특별 마일리지 포인트 VIP 고객에게만 추가로 지급하는 특별 마일리지 포인트
전문 상담원 아이디 VIP 고객에게 전문 상담원 배정(상담원 ID 지정)
17/71
2절. 클래스 상속(extends)
상속 구현
고객 클래스
- 아이디
- 이름
- 고객 등급
- 마일리지 포인트
- 마일리지 적립비율
- 상담원 ID
- 할인율
+ 생성자
+ getter()
+ setter()
+ 마일리지 점수 계산()
+ 고객정보 안내()
+ 생성자 + 생성자
+ 마일리지 점수 계산() + 마일리지 점수 계산()
18/71
2절. 클래스 상속(extends)
상속 구현
새로운 고객 등급이 계속 추가되는 경우, 공통점을 분류하여 클래스를
선언하고, 이 클래스를 상속받는 고객 등급별 클래스를 구현
19/71
2절. 클래스 상속(extends)
상속 구현 Customer 클래스
20/71
2절. 클래스 상속(extends)
상속 구현
21/71
2절. 클래스 상속(extends)
상속 구현
22/71
2절. 클래스 상속(extends)
상속 구현 SILVERCustomer 클래스
23/71
2절. 클래스 상속(extends)
상속 구현 VIPCustomer 클래스
24/71
2절. 클래스 상속(extends)
상속 구현 실행 클래스
25/71
3절. 부모 생성자 호출(super(…))
자식 객체를 생성하면 부모 객체도 생성되는가?
상속관계에서 자식 클래스의 객체가 인스턴스화 될 때 기본적으로 부모
클래스의 기본 생성자를 먼저 호출하여 부모 객체를 생성
• 자식 생성자에서 부모 생성자를 명시적으로 호출하지 않으면, 컴파일러는
super() 키워드를 자동으로 추가하여 부모의 기본 생성자를 호출
26/71
3절. 부모 생성자 호출(super(…))
기본적으로 부모 클래스의
기본 생성자가 먼저 호출
27/71
3절. 부모 생성자 호출(super(…))
28/71
3절. 부모 생성자 호출(super(…))
명시적인 부모 생성자 호출
super() 키워드는 자식 클래스에서 명시적으로 부모 클래스의 생성자를
호출할 때 사용하는 키워드
부모 클래스의 생성자가 여러 개 선언되어 있는 경우, super() 키워드를
사용하여 어떤 생성자를 호출할 것인지 명시적 지정해야 함
• super(매개값,…)
- 매개값과 동일한 타입, 개수, 순서 맞는 부모 생성자 호출
- 동일한 시그니처를 가진 부모 생성자 없다면 컴파일 오류 발생
• super() 키워드는 반드시 자식 생성자의 첫 줄에 위치
• 부모 클래스에 생성자가 여러 개 선언되어 있는 경우, 부모 클래스 생성자의
시그니처에 맞도록 super(매개변수,…) 키워드를 선언하여 호출해야 함
29/71
3절. 부모 생성자 호출(super(…))
명시적인 부모 생성자 호출
30/71
3절. 부모 생성자 호출(super(…))
명시적인 부모 생성자 호출
부모 클래스 생성자
자식 클래스 생성자
final 키워드의 용도
final 필드: 수정 불가 필드
final 메소드: 자식이 재정의할 수 없는 메소드
final 클래스: 부모로 사용 불가한 클래스 – 상속 불가
32/71
4절. final 클래스와 final 메소드
final 키워드의 용도
static 키워드와 함께 사용하여 정적 상수 생성
33/71
4절. protected 접근 제한자
protected 접근 제한자
상속과 관련된 접근 제한자
• 같은 패키지: 사용 가능 - default와 동일
• 다른 패키지: 상속 관계에서 자식 클래스만 접근 허용
34/71
5절. 타입변환과 다형성(polymorphism)
다형성 (Polymorphism)
상속 관계에서 상위 클래스가 다양한 하위 클래스들을 통합하여 사용할 수 있는 개념
하나의 타입에 다양한 객체를 대입함으로써 다양한 기능을 구현(다양한 형태가 존재한다는
의미)
부모 타입 참조 변수로 자식 객체를 다룰 수 있는 개념
• 부모 타입에는 모든 자식 객체를 대입
• 인터페이스 타입에는 모든 구현 객체를 대입
효과
• 프로그램을 유연하게 만들어주는 메커니즘
• 프로그래밍을 단순하게 만들어 주는 효과
35/71
5절. 타입변환과 다형성(polymorphism)
36/71
5절. 타입변환과 다형성(polymorphism)
37/71
5절. 타입변환과 다형성(polymorphism)
38/71
5절. 메소드 재정의(Override)
메소드 재정의(@Override)
부모 클래스의 메소드를 상속하여 자식 클래스에서 재정의하는 것
메소드 재정의 조건
• 부모 클래스의 메소드와 동일한 시그니처를 가져야 함
• 재정의 메서드의 접근 제한자 범위는 부모 메소드 보다 넓거나 같아야 함
부모 클래스(메소드) 자식 클래스(메소드) 접근 범위
39/71
5절. 메소드 재정의(Override)
@Override 어노테이션
컴파일러에게 재정의된 메소드임을 알려주는 역할
컴파일러에게 부모 클래스의 메소드 선언부와 동일한지 검사 지시
정확한 메소드 재정의를 위해 붙여주는 것이 바람직
메소드 재정의 효과
부모 메소드를 자식 클래스에서 재정의하여 필요한 기능 확장
• 객체 생성시 참조 변수의 타입에 관계없이 재정의된 자식 메소드 실행
즉, Up-casting시 참조되는 멤버는 부모클래스의 멤버들이지만,
부모클래스의 메소드를 자식클래스에서 재정의 한 경우에는
재정의된 자식클래스의 메소드가 호출됨
40/71
5절. 메소드 재정의(Override)
메소드 재정의(@Override)
재정의
41/71
5절. 메소드 재정의(Override)
42/71
5절. 타입변환과 다형성(polymorphism)
상속 관계
• 부모 클래스를 상속하여 자식 객체를 생성하는 상속 관계
메소드 재정의
• 부모 클래스에 선언된 메소드를 자식 클래스에서 재정의
43/71
5절. 타입변환과 다형성(polymorphism)
다형성 구현(예)
매개 변수의 다형성
조건
• 자식 클래스 타입의 참조 변수는 기본적으로 부모 클래스의 객체를 참조할 수
없으나, Up-casting 된 참조 변수를 명시적 형 변환을 통해 Down-casting 가능
Down-casting이 필요한 경우
• Up-casting 하면 부모 클래스 타입의 참조 변수로 자식 객체를 참조하고 있기 때
문에 부모 클래스에 선언된 멤버(필드와 메소드)만 사용 가능함
• 따라서 자식 객체의 멤버를 사용하기 위해서는 Down-casting 이 필요함
• 즉, Up-casting된 자식 객체의 원래 기능을 사용하기 위해 Down-casting 사용
45/71
5절. 타입변환과 다형성(polymorphism)
객체 타입 확인(instanceof)
Down-casting을 하기 전에 먼저 타입 변환이 가능한지 확인
• ClassCastException 예외 발생 가능
Instanceof: 객체 타입 확인 연산자
• 참조 변수의 형 변환 가능 여부를 확인하며 true/false로 결과를 반환(상속 관계에서 참조 변수
의 타입이 부모 클래스의 타입인지, 자식 클래스의 타입인지 확인하는 데 사용)
사용 방법: obj instanceof Class obj가 Class의 객체인지 확인
1
2
Parent 또는 Parent의
Heap 모든 자손이 올 수 있음
Stack 0x01
1
Up-casting Animal
hAnimal 0x01
부모
46/71
5절. 타입변환과 다형성(polymorphism)
다형성의 활용
매개변수의 다형성
• 부모 클래스 타입의 매개변수는 다양한 종류의 자식 클래스의 객체를 받을 수 있음
배열 객체의 다형성
• 부모 클래스 타입의 배열 객체는 다양한 종류의 자식 클래스 객체를 저장할 수 있음
47/71
5절. 타입변환과 다형성(polymorphism)
다형성 구현
Step01
49/71
5절. 타입변환과 다형성(polymorphism)
다형성 구현
Step02 - 상속
50/71
5절. 타입변환과 다형성(polymorphism)
다형성 구현
Step02 - 상속
51/71
5절. 타입변환과 다형성(polymorphism)
다형성 구현
Step02 - 상속
52/71
5절. 타입변환과 다형성(polymorphism)
다형성 구현
Step03 – 다형성
53/71
5절. 타입변환과 다형성(polymorphism)
다형성 구현
Step03 – 다형성
54/71
5절. 타입변환과 다형성(polymorphism)
Stack
다형성 구현 Heap
0x01 [0] [1] [2]
animals 0x01
Step03 – 다형성
다양한 자식 객체를
부모 클래스 타입의 배열 객체에 저장
(다형성)
55/71
6절. 추상 클래스(Abstract Class)
추상 클래스 개념
추상(abstract)
• 실체들 간에 공통되는 특성을 추출한 것
– 예1: 독수리, 호랑이, 고래 동물 (추상)
– 예2: 삼성, 현대, LG 회사 (추상)
추상 클래스(abstract class)
• 하위 클래스에서 구현되는 추상적인 기능만을 정의하는 클래스로서 하나 이상의
추상 메소드(미완성 메소드)를 가지거나 abstract로 정의된 클래스(미완성 클래스)
• 추상 클래스에서 정의된 추상적인 기능은 하위 클래스에서 구현
• 추상 클래스는 기능이 무엇(what)인지만 정의하고, 어떻게(how) 구현되는지는 하위
클래스에서 정의
• 추상 클래스는 단독으로 객체를 생성 할 수 없고, 구현 클래스에서 상속을 통해 추상
메소드를 구현해야 인스턴스 생성 가능(구현 클래스의 부모 클래스 역할)
56/71
6절. 추상 클래스(Abstract Class)
추상 클래스의 용도
추상 클래스는 인스턴스(객체) 생성의 용도가 아닌,
하위 클래스에서 상위 클래스(추상 메소드)의 구현을 강제화
• 즉, 추상 클래스에는 메소드의 시그니처만 정의하고, 메소드의 실제 구현은
하위 클래스에서 용도에 맞게 반드시 구현하도록 강제화
• 추상 클래스는 불완전한 형태이므로 객체 생성이 불가능하고,
단지 상속시 super 클래스로 존재(객체 생성은 추상 클래스를 상속받은
하위 클래스에서 객체 생성 가능)
상속한 추상 클래스의 추상 메소드를 일부만 구현할 경우 해당 클래스 역시
추상 클래스이기 때문에 abstract 키워드를 붙여야 함
57/71
6절. 추상 클래스(Abstract Class)
추상 클래스의 용도
추상 클래스
(설계 규격-미완성)
타이어 규격
(추상 클래스)
구현 클래스
58/71
6절. 추상 클래스(Abstract Class)
추상 클래스 선언
클래스 선언에 abstract 키워드 사용
• new 연산자로 객체 생성하지 못하고 상속을 통해 자식 클래스만 생성 가능
추상 메소드와 오버라이딩(재정의)
하위 클래스에서 사용 용도에 따라 구현 코드(기능)가 달라질 수 있는 메서드는
추상 메소드로 선언(실행 내용이 하위 클래스마다 다른 메서드)
예: 동물은 소리를 낸다. 하지만 실체 동물들의 소리는 제각기 다르다.
구현 방법
• 추상 클래스에는 메서드의 선언부만 작성 (추상 메서드, 하위클래스에 구현을 위임))
• 하위 클래스에서 메서드의 실행 내용 작성(오버라이딩(Overriding))
추상 클래스로 선언
60/71
6절. 추상 클래스(Abstract Class)
추상 클래스의 사용
부모 클래스
• 자식 클래스들 사이에 공통으로 필요한 메소드들을 추상 클래스에 추가
- 자식 킄래스에서 같은 동작이 필요한 메소드는 일반 메소드로 선언
- 자식 킄래스에서 다른 동작이 필요한 메소드는 추상 메소드로 선언
• 자식 클래스
- 자식 클래스에서 개별적으로 필요한 메소드 선언
- 부모 클래스의 추상 메소드 재정의
61/71
6절. 추상 클래스(Abstract Class)
추상 클래스 구현
62/71
6절. 추상 클래스(Abstract Class)
추상 클래스 구현
63/71
6절. 추상 클래스(Abstract Class)
추상 클래스 구현
64/71
6절. 추상 클래스(Abstract Class)
추상 클래스 구현
65/71
6절. 추상 클래스(Abstract Class)
추상 클래스 구현
66/71
6절. 추상 클래스(Abstract Class)
추상 클래스 구현
67/71
6절. 추상 클래스(Abstract Class)
추상 클래스 구현
68/71
6절. 추상 클래스(Abstract Class)
추상 클래스 구현
69/71
6절. 추상 클래스(Abstract Class)
추상 클래스 구현
70/71
6절. 추상 클래스(Abstract Class)
추상 클래스 구현
71/71
Reference
book
- 이것이 자바다(한빛미디어, 신용권)
- 혼자 공부하는 자바(한빛미디어, 신용권)
- 자바 프로그래밍 입문(이지스퍼블리싱, 박은종)
- 처음해보는 자바프로그래밍(루비페이퍼, 오정임)
site
http://libqa.com/wiki/93
https://www.youtube.com/c/namoosori
72/71