You are on page 1of 72

상 속(Inheritance)

Chapter 7

1/71
1절. 상속 개념
 상속(Inheritance)이란?
 현실 세계:
• 부모가 자식에게 물려주는 행위
 객체 지향 프로그램:
• 기존의 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는
것으로, 이미 구현된 클래스를 상속받아 속성이나 기능을 확장하는 클래스
구현
• 자식(하위) 클래스가 부모(상위) 클래스의 멤버를 물려받는 것
• 상속 대상: 부모의 필드와 메소드

2/71
1절. 상속 개념

 상속(Inheritance) 개념의 활용
 상속의 효과
• 부모 클래스 재사용(코드의 재사용성) – 개발 생산성을 높이는 효과
• 반복된 코드 중복 줄임
• 유지 보수 편리성 제공
• Data의 효율적 관리
• 형 변환(Type Casting)을 통한 Object 관리 용이(객체 다형성 구현 가능)

 상속 대상 제한
• final 클래스는 상속 불가능
• 부모 클래스의 private으로 선언된 필드와 메소드는 상속 불가능
• 부모 클래스가 다른 패키지에 있을 경우, default 접근제한자를 갖는 필드와
메소드도 상속 불가능

3/71
1절. 상속 개념
 상속의 의미
상속은 클래스의 재사용(확장)의 개념으로,
연관 있는 클래스들의 공통적인 구성요소를 분류(Classification)하여, 이를 대표하는 클래스를
정의하고, 관련 있는 클래스 정의 시 대표 클래스를 상속하여 확장 클래스를 구현

공통 공통
요소 요소

Employee class Professor class Student class

4/71
1절. 상속 개념

 상속(Inheritance)은?

 상위 클래스는 하위 클래스보다 일반적인 의미를 가짐

 하위 클래스는 상위 클래스보다 구체적인 의미를 가짐

일반화
(추상화)

구체화

5/71
2절. 클래스 상속(extends)

 클래스 상속 - extends 키워드


 자식 클래스가 상속할 부모 클래스를 지정

 자바는 단일 상속만 가능(다중 상속이 불가능)

6/71
2절. 클래스 상속(extends)

 클래스 상속 - 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()
+ 마일리지 점수 계산()
+ 고객정보 안내()

SILVER고객 클래스 VIP고객 클래스


- 특별 마일리지 포인트

+ 생성자 + 생성자
+ 마일리지 점수 계산() + 마일리지 점수 계산()

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(…))

 자식 객체를 생성하면 부모 객체도 생성되는가?


 상위 클래스의 인스턴스가 먼저 생성되고, 하위 클래스의 인스턴스가
생성됨
Stack 영역 Heap 영역

vip 0x001 0x001 customerID


customerName
customerGrade
mileagePoint 1) Customer() 생성자 호출
- Customer 인스턴스 생성
mileageRatio - 부모 객체
agentID
discountRate

specialMP 2) VIPCustomer() 생성자 호출


- VIPCustomer 인스턴스 생성
- 자식 객체

28/71
3절. 부모 생성자 호출(super(…))

 명시적인 부모 생성자 호출
 super() 키워드는 자식 클래스에서 명시적으로 부모 클래스의 생성자를
호출할 때 사용하는 키워드
 부모 클래스의 생성자가 여러 개 선언되어 있는 경우, super() 키워드를
사용하여 어떤 생성자를 호출할 것인지 명시적 지정해야 함

• super(매개값,…)
- 매개값과 동일한 타입, 개수, 순서 맞는 부모 생성자 호출
- 동일한 시그니처를 가진 부모 생성자 없다면 컴파일 오류 발생
• super() 키워드는 반드시 자식 생성자의 첫 줄에 위치
• 부모 클래스에 생성자가 여러 개 선언되어 있는 경우, 부모 클래스 생성자의
시그니처에 맞도록 super(매개변수,…) 키워드를 선언하여 호출해야 함
29/71
3절. 부모 생성자 호출(super(…))

 명시적인 부모 생성자 호출

30/71
3절. 부모 생성자 호출(super(…))

 명시적인 부모 생성자 호출
부모 클래스 생성자

자식 클래스 생성자

 this 가 자기 자신의 인스턴스의 주소를 가지는 것처럼


super 는 자식 클래스가 부모 클래스에 대한 주소를 가지게 됨
31/71
4절. final 클래스와 final 메소드

 final 키워드의 용도
 final 필드: 수정 불가 필드
 final 메소드: 자식이 재정의할 수 없는 메소드
 final 클래스: 부모로 사용 불가한 클래스 – 상속 불가

 상속할 수 없는 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)

 자동 타입 변환(Promotion) – 묵시적 형 변환(Up-Casting)


 참조 변수의 형 변환
• 상속 관계에서 자식 클래스가 부모 클래스 타입으로 참조되는 것을 허용
• 따라서 부모 클래스형으로 참조 변수를 선언하고 자식 클래스 인스턴스를 생성할 수 있음
• 자식 클래스는 부모 클래스의 타입을 포함하고 있으므로 부모 클래스로 자동(묵시적) 형
변환(Up-casting)이 일어남(자식 클래스 객체의 성질은 그대로 유지됨)
• 참조 변수의 형 변환에 따라 사용(접근)할 수 있는 인스턴스의 멤버가 다름
- Up-casting 된 참조 변수는 부모 클래스로 부터 상속받은 멤버에만 접근 가능
(자식 클래스의 멤버에 접근하기 위해서는 Down-casting을 해야 함)
- 단, 자식 클래스에서 재정의 한 메소드를 호출하면 재정의 된 메소드가 호출됨

36/71
5절. 타입변환과 다형성(polymorphism)

 자동 타입 변환(Promotion) - 묵시적 형 변환(Up-Casting)


 바로 위의 부모가 아니더라도 상속 계층의 조상이면 자동 타입 변환 가능
• 단, 변환 후에는 부모 클래스 멤버만 접근 가능

37/71
5절. 타입변환과 다형성(polymorphism)

 자동 타입 변환(Promotion) - 묵시적 형 변환(Up-Casting)

 VIPCustomer() 생성자로 인스턴스가 생성 되었지만


참조 변수의 타입이 Customer 클래스 이므로 접근할 수 있는 멤버는
Customer 클래스의 필드와 메서드 임

38/71
5절. 메소드 재정의(Override)

 메소드 재정의(@Override)
 부모 클래스의 메소드를 상속하여 자식 클래스에서 재정의하는 것

 메소드 재정의 조건
• 부모 클래스의 메소드와 동일한 시그니처를 가져야 함
• 재정의 메서드의 접근 제한자 범위는 부모 메소드 보다 넓거나 같아야 함

부모 클래스(메소드) 자식 클래스(메소드) 접근 범위

private 재정의 불가 동일 클래스

default default, protected, 동일 패키지에 소속된 클래스


public
protected protected, public 동일 패키지에 소속된 클래스,
자식 클래스(상속 관계)
public public 모든 클래스

39/71
5절. 메소드 재정의(Override)

 @Override 어노테이션
 컴파일러에게 재정의된 메소드임을 알려주는 역할
 컴파일러에게 부모 클래스의 메소드 선언부와 동일한지 검사 지시
 정확한 메소드 재정의를 위해 붙여주는 것이 바람직

 메소드 재정의 효과
 부모 메소드를 자식 클래스에서 재정의하여 필요한 기능 확장
• 객체 생성시 참조 변수의 타입에 관계없이 재정의된 자식 메소드 실행
즉, Up-casting시 참조되는 멤버는 부모클래스의 멤버들이지만,
부모클래스의 메소드를 자식클래스에서 재정의 한 경우에는
재정의된 자식클래스의 메소드가 호출됨

40/71
5절. 메소드 재정의(Override)
 메소드 재정의(@Override)

재정의

41/71
5절. 메소드 재정의(Override)

 자동 타입 변환과 재정의된 메서드 호출

 VIPCustomer() 생성자로 인스턴스가 생성 되었지만


참조 변수의 타입이 Customer 클래스 이므로 접근할 수 있는 멤버는
Customer 클래스의 필드와 메소드 임

단, 자식 클래스에서 부모 클래스의 메소드를 재정의 한 경우에는,


참조 타입과 관계없이 실제 생성된 인스턴스의 메서드(재정의)가 호출됨

42/71
5절. 타입변환과 다형성(polymorphism)

 다형성을 구현할 수 있는 기술적 조건

 상속 관계
• 부모 클래스를 상속하여 자식 객체를 생성하는 상속 관계

 객체간 타입 변환(부모 클래스 타입 참조 변수에 자식 객체 할당)


• 부모 클래스 타입으로 참조 변수를 선언하고 자식 객체를 생성하여 대입

 메소드 재정의
• 부모 클래스에 선언된 메소드를 자식 클래스에서 재정의

43/71
5절. 타입변환과 다형성(polymorphism)

 다형성 구현(예)

매개 변수의 다형성

movie() 메소드 오버라이딩

 참조형 매개변수는 메소드 호출 시


자신과 같은 타입 또는 자식 타입의 인스턴스를 인자로 전달 할 수 있음

 동일한 메소드(animal.move())를 호출하지만 실제 animal이 참조하는 객체가 어떤 객체인지에 따라 다양한


결과를 나타냄
44/71
5절. 타입변환과 다형성(polymorphism)
 강제 타입 변환(Casting): Down-casting
 참조 변수의 타입을 부모 타입에서 자식 타입으로 변환하는 것

 조건
• 자식 클래스 타입의 참조 변수는 기본적으로 부모 클래스의 객체를 참조할 수
없으나, 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
부모

human 0x01 Human


2 Down-casting 자식

46/71
5절. 타입변환과 다형성(polymorphism)
 다형성의 활용
 매개변수의 다형성
• 부모 클래스 타입의 매개변수는 다양한 종류의 자식 클래스의 객체를 받을 수 있음

 배열 객체의 다형성
• 부모 클래스 타입의 배열 객체는 다양한 종류의 자식 클래스 객체를 저장할 수 있음

47/71
5절. 타입변환과 다형성(polymorphism)
 다형성 구현
 Step01

reference: https://www.youtube.com/c/namoosori 48/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 – 다형성

Human Tiger Eagle

 다양한 자식 객체를
부모 클래스 타입의 배열 객체에 저장
(다형성)

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 연산자로 객체 생성하지 못하고 상속을 통해 자식 클래스만 생성 가능

public abstract class 클래스이름 { 추상 클래스 형식


[필요시 필드와 구현된 메소드 선언]
[필요시 생성자 선언]
abstract void 추상메서드이름(); 추상 메소드 형식
}

• 추상클래스는 연관 있는 클래스들의 공통적인 구성요소를 분류(Classification)


하여 추상 클래스로 선언(상속을 위한 부모 클래스 선언)
• 추상 메소드는 선언 부분만 있고 실행 블록은 없으며, 실행 블록은
하위 클래스에서 오버라이딩하여 구현해야 함
• 추상 메소드는 구현하는 객체마다 다르게 구현해야 하는 경우에 선언
• 추상 메소드를 일부만 구현한 경우 해당 클래스 역시 추상 클래스이기 때문에
abstract 키워드를 붙여 구현되지 않은 추상 메소드가 있음을 공지
59/71
6절. 추상 클래스(Abstract Class)

 추상 메소드와 오버라이딩(재정의)
 하위 클래스에서 사용 용도에 따라 구현 코드(기능)가 달라질 수 있는 메서드는
추상 메소드로 선언(실행 내용이 하위 클래스마다 다른 메서드)
 예: 동물은 소리를 낸다. 하지만 실체 동물들의 소리는 제각기 다르다.
 구현 방법
• 추상 클래스에는 메서드의 선언부만 작성 (추상 메서드, 하위클래스에 구현을 위임))
• 하위 클래스에서 메서드의 실행 내용 작성(오버라이딩(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

You might also like