객체지향 언어의 특징

OOP is A P.I.E

  • 추상화(Abstraction) : 현실의 객체를 추상화해서 클래스를 구성한다.
  • 상속(Inheritance) : 부모 클래스의 자산을 물려받아 자식을 정의함으로 코드의 재사용이 가능하다.
  • 정보은폐(Information Hiding, EnCapsulation) : 데이터를 외부에 직접 노출시키지 않고 메서드를 아용해 보호할 수 있다.
  • 다형성(Polymorphism) : 하나의 객체를 여러 가지 타입(형)으로 참조할 수 있다.

상속

상속(Inheritance)

  • 기존 클래스의 자산(멤버)을 자식 클래스에서 재사용하기 위한 것
    부모의 생성자와 초기화 블록은 상속하지 않는다.
  • 기존 클래스의 멤버를 물려 받기 때문에 코드의 절감
    부모의 코드를 변경하면 모든 자식들에게도 적용->유지 보수성 향상
  • 상속의 적용

extends 키워드 사용

  • 조상 클래스 : 부모 클래스, 상위(base) 클래스, 슈퍼 클래스
  • 자식 클래스 : 자손 클래스, 하위(derived) 클래스, 서브 클래스

Object 클래스

  • 모든 클래스의 조상 클래스
    별도의 extends 선언이 없는 클래스들은 extends Object가 생략됨
    따라서 모든 클래스에는 Object 클래스에 정의된 메서드가 있음

다양한 상속 관계

  • 상속 관계는 is a 관계라고 함

단일 상속(Single Inheritance)

  • 다중 상속의 경우 여러 클래스의 기능을 물려받을 수 있으나 관계가 매우 복잡해짐
    동일한 이름의 메서드가 두 부모에게 있다면 자식은 어떤 메서드를 쓸 것인가?
  • 자바는 단일 상속만 지원
    대신 interface와 포함 관계(has a)로 단점 극복

포함 관계

  • 상속 이외에 클래스를 재활용 하는 방법
    2개 이상의 클래스에서 특성을 가져올 때 하나는 상속, 나머지는 멤버 변수로 처리
    포함 관계의 UML 표현: 실선
    Spider의 코드를 수정하면 SpiderMan에도 반영되므로 유지 보수성 확보

image

  • 상속? 포함?
  • 어떤 클래스를 상속 받고 어떤 클래스를 포함해야 하는가?
    문법적인 문제는 아니며 프로젝트의 관점 문제
    상속: is a 관계가 성립하는가?
    포함: has a 관계가 성립하는가?