[Java & SpringBoot로 시작하는 웹 프로그래밍] 3주차 학습 - 2 (상속, 매서드 오버라이딩, 다형성)

진문장·2021년 9월 11일
0

상속

클래스에서 상속의 의미

새로운 클래스를 정의 할 때 이미 구현된 클래스를 상속(inheritance) 받아서 속성이나 기능이 확장되는 클래스를 구현함

상속을 사용하는 경우

  • 상위 클래스는 하위 클래스 보다 일반적인 개념과 기능을 가짐
  • 하위 클래스는 상위 클래스 보다 구체적인 개념과 기능을 가짐
  • extends 뒤에는 단 하나의 class 만 사용할 수 있음
  • 자바는 단일 상속만 지원함

EX) 동물 -> 사자

class Animal {

}

class Lion extends Animal {

}

상속을 사용하여 고객관리 프로그램 구현하기

  • 고객에 등급에 따른 차별화된 서비스를 제공할 수 있습니다.
  • 고객의 등급에 따라 할인율, 적립금이 다르게 적용됩니다. 이러한 경우에 대한 구현을 해보도록 합시다.
class Customer {
  protected String customerID;
  protected String customerName;
  protected String customerGrade;
  protected int bonusPoint;
  protected double bonusRatio;
}

protected 예약여

외부 클래스에는 private으로 하위 클래서에서는 public의 기능을 구현한 키워드

상위 클래스에 protected로 선언된 변수나 메서드는 다른 외부 클래스에서는 사용할 수 없지만 하위 클래스에서는 사용가능

접근 제한자의 가시성

외부 클래스하위 클래스동일 패키지내부 클래스
publicOOOO
protectedXOOO
defaultXXOO
privateXXXO

하위 클래스가 생성되는 과정

  1. 하위 클래스가 생성 될 때 상위 클래스가 먼저 생성 됨
  2. 상위 클래스으 생성자가 호출되고 하위 클래스의 생성자가 호출 됨
  3. 하위 클래스의 생성자에서는 무조건 상위 클래스의 생성자가 호출되어야 함
  4. 하위 클래스에서 상위 클래스의 생성자를 호출하는 코드가 없는 경우 컴파일러는 상위 클래스 기본 생성자를 호출하기위한 super()를 추가함
  5. super()로 호출되는 생성자는 상위 클래스의 기본 생성자 임
  6. 만약 상위 클래스의 기본생성자가 없는 경우(매개변수가 있는 생성자만 존재하는 경우) 하위 클래스는 명시적으로 상위 클래스의 생성자를 호출해야 함

상위 클래스로의 묵시적 형 변환(업캐스팅)

  • 상위 클래스 형으로 변수를 선언하고 하위 클래스 인스턴스를 생성 할 수 있음
  • 하위 클래스는 상위 클래스의 타입을 내포하고 있으므로 상위 클래스로 묵시적 형변환이 가능 함
  • 상속관계에서 모든 하위 클래스는 상위클래스로 묵시적 형 변환이 됨 ( 그 역은 성립하지 않음)
Customer customer = new VIPCustomer(); // 상위 = new 하위

클래스 계층구조가 여러 단계일 경우

  • Human은 내부적으로 Primate와 Mammal의 자료형을 모두 내포하고 있음

하위 클래스에서 메서드 재정의 하기

  • 오버라이딩(overriding)
    : 상위 클래스에 정의된 메서드의 구현 내용이 하위 클래스에서 구현할 내용과 맞지 않은 경우 하위 클래스에서 동일한 이름의 메서드를 재정의 할 수 있음

예제의 Customer 클래스의 calcPrice() 와 VIPCustomer의 calcPrice() 구현내용은 할인율과 보너스 포인트 적립내용부분의 구현이 다름

따라서 VIPCustomer 클래스는 calcPrice()메서드를 재정의 해야함

EX)

일반고객 (할인율 없음)
10000 * (1.0 - 0.0) = 10000원

VIP 고객 ( 할인율 있음)
10000 * (1.0 - 0.1) = 9000원

@override 애노테이션

  • 재정의된 메서드라는 의미로 선언부가 기존의 메서드와 다른 경우 에러 발생
@override
pulbic int calcPrice(money) {
	return money * (1.0 - saleRatio)
}

가상 메서드(virtual method)

  • 메서드의 이름과 메서드 주소를 가진 가상 메서드 테이블에서 호출될 메서드의 주소를 참조함

상위 클래스와 하위 클래스에 같은 이름의 메서드가 존재할 때 호출되는 메서드는 인스턴스에 따라 결정된다.
EX)

Customer customer = new VIPCustomer();
customer.priceCalc(10000); // VIPCustomer의 priceCalc 메서드 실행

다형성(ploymorphism) 이란?

  • 하나의 코드가 여러 자료형으로 구현되어 실행되는 것
    같은 코드에서 여러 실행 결과가 나옴

  • 정보은닉, 상속 과 더불어 객체지향 프로그래밍의 가장 큰 특징 중 하나 객체지향 프로그래밍의 유연성, 재활용성, 유지보수성에 기본이 되는 특징임

다형성의 사용함으로써 갖는 장점

  • 다양한 여러 클래스를 하나의 자료형(상위 클래스)으로 선언하거나 형변환하여 각 클래스가 동일한 메서드를 오버라이딩 한 경우, 하나의 코드가 다양한 구현을 실행 할 수 잇음

  • 유사한 클래스가 추가되는 경우 유지보수에 용이하고 각 자료형 마다 다른 메서드를 호출하지 않으므로 코드에서 많은 if 문이 사라짐!!

상속은 언제 사용할까?

  • IS-A 관계(inheritance)
    일반적인 개념과 구체적인 개념과의 관계
    • 상위 클래스: 일반적인 개념 클래스 EX) 포유류
    • 하위 클래스: 구체적인 개념 클래스 EX) 사람, 원숭이, 고래
  • HAS-A 관계(composition)
    한 클래스가 다른 클래스를 소유한 관계
    코드 재사용의 한 방법
    Student 가 Subject를 포함한 관계
class Student {
  Subject majorSubject;
}

하위 클래스로 형 변환, 다운캐스팅

  • 묵시적으로 상위 클래스 형변환된 인스턴스가 원래 자료형(하위클래스)으로 변환되어야 할 때 다운캐스팅이랄 함

  • 하위 클래스로의 형 변환은 명시적으로 되어야 함

Customer vc = new VIPCustomer(); // 묵시적
VIPCustomer vCustomer = (VIPCustomer)vc; //명시적

instanceof로 인스턴스의 형 체크

해당 참조변수가 참조하고 있는 인스턴스의 실제 타입이 뭔지 알려주는 명령

Animal hAnimal = new Human();
if(hAnimal instanceof Human) {
  Human human = (Human)hAnimal;
}

0개의 댓글