[JAVA 기초] 상속과 다형성

혜쿰·2023년 8월 2일
0

📌 클래스들의 관계

📎 has a 관계

한 객체와 다른 객체가 포함관계인 경우를 의미한다. has a 관계는 2가지 종류가 있다.
1) 집합 관계 (Aggregation Relationship)
: whole과 part간의 lifecycle이 다른 경우에 해당한다.
A has a B ex) 자동차 has a 라디오
A가 없어져도 B는 독립적으로 존재할 수 있음을 의미한다.

2) 구성 관계 (Compostion Relationship)
: whole과 part간의 lifecycle이 같은 경우에 해당한다.
A has a C ex) 자동차 has a 엔진
A가 없어지면 C는 독립적으로 존재할 수 없음을 의미한다.

위 사진은 UML에서 집합과 구성관계를 나타낸 것이다.
사진 출처 : https://gmlwjd9405.github.io/2018/07/04/class-diagram.html

📎 is a 관계

비슷한 속성 및 동작을 가진 객체들 간의 관계이다. 비슷한 개념들의 객체들은 모두 공통된 속성 및 동작을 가지고 있으며 이는 결국 공통점들이 중복되어 있다는 것이다. 공통점들을 추출해서 상위개념의 객체로 만들 수 있으며 하위 객체들에게 상위 개념의 객체를 "상속"받아서 사용한다면 중복이 제거되고 재사용성도 향상될 수 있다.
ex) 대학생 is a 학생, 중학생 is a 학생


📌 상속

📎 자바 상속의 특징

  • 객체 간에 is a관계 성립
  • 부모클래스의 멤버를 자식클래스가 선언없이 사용 가능. 단, 부모 멤버중에서 private으로 지정한 멤버와 생성자는 상속이 불가능.
  • 자바는 단일 상속만 지원


위 사진은 상속을 uml으로 나타낸 것이다.
사진 출처 : https://gmlwjd9405.github.io/2018/07/04/class-diagram.html

📎 상속 형식

public class 자식클래스 extends 부모클래스 { }

📎 super 키워드

this는 자신의 인스턴스를 의미하고 super는 부모의 인스턴스를 의미한다. super 키워드는 상속관계의 하위클래스에서 상위클래스의 구성요소를 명시적으로 호출할 때 사용된다.
일반적으로 두가지 경우에 사용된다.

  • 부모클래스의 멤버와 자식클래스의 멤버가 이름이 동일한 경우
    -> super.부모멤버 형식으로 표현
  • 자식클래스에서 명시적으로 부모 생성자를 호출하는 경우
    -> super([인자값])형식으로 표현
    인자값은 없거나 여러개 가능하다. 주의할 점은 반드시 자식 생성자의 첫 라인에서 호출해야한다는 것이다.

📌 method overriding

자식 클래스에서 부모 클래스의 메서드를 재정의해서 사용하는 것을 오버라이딩이라고 한다. 오버로딩과 구별해야한다.

📎 오버라이딩 규칙

  • 상속이 전제
  • 메서드의 이름이 반드시 동일해야함
  • 메서드 리턴타입이 반드시 동일해야함. 단, 상속관계인 경우 작은 타입으로 재정의 가능.
  • 메서드 인자 리스트가 반드시 동일해야함.
  • 접근 지정자는 부모의 레벨보다 같거나 확대만 가능.
  • 예외 클래스는 부모의 클래스보다 계층적으로 같거나 하위 클래스만 사용 가능.
  • static, final, private 지정자를 가진 메소드는 오버라이딩이 불가능.

📌 polymorphism

다형성(polymorphism)이란? 상속관계의 계층구조에서 상위타입의 변수로 모든 하위타입을 참조할 수 있는 특성이다.

📎 다형성 필수 조건

  • 상속 관계

다형성을 활용하기 위해서는 필수로 부모-자식 간 클래스 상속이 이루어져야 한다.

  • 오버라이딩 필수 (자식 클래스에서 메소드 재정의)

다형성이 보장되기 위해서는 하위 클래스 메소드가 반드시 재정의되어 있어야 한다.

  • 업캐스팅 (자식 클래스의 객체가 부모 클래스 타입으로 형변환 되는 것)

부모 타입으로 자식클래스를 업캐스팅하여 객체를 생성해야 한다.

📎 다형성 구현 방법

  • 상속 클래스 구현 (부모-자식 클래스 구현)
  • 메소드 오버라이딩
  • 업캐스팅하여 객체 선언
  • 부모 클래스 객체로 자식 메소드 호출

0개의 댓글