003. 상속

Cornchip·2022년 9월 19일
0

bitcamp

목록 보기
3/11
post-thumbnail

목차
1. 상속 개념
2. 상속 문법과 다형성
3. 오버라이딩(Overriding)
4. 위임 (= 연관)



1. 상속 개념

  • 공통 코드를 공유하는 방법 = 상속의 목적 그 자체

    • 일반화(generalizaiton)
      • 클래스들의 공통 코드(필드, 메서드)를 추출하여 별도의 클래스로 정의하는 것.
      • 이렇게 정의한 클래스를 공유하는 것.
    • 전문화(specialization)
      • 기존 클래스를 연결하고 필드나 변수를 추가하여 역할을 특화시키는 것.
    • 다형성(polymorphism)
      • 상황에 맞춰 여러 용도로 사용되는 것.
      • 다형적 변수(polymorphic variables) : 상위 타입의 변수는 하위 타입의 객체를 가리킬 수 있다.
  • 명명

상위클래스(super class = parent class)
^
|   : 기능을 상속한다. (inheritance) ------------ 속이 빈 화살표를 사용한다.
|
하위클래스(sub class = child class)

주의! - 상위클래스의 필드와 메서드를 '가져오는 것이 아니다.'

  • 상속 문법 = 코드 공유 방법
    : 상위 클래스의 코드를 자신의 코드처럼 사용할 수 있게 만드는 문법 : 코드 중복을 없앤다!


2. 상속 문법과 다형성

  • 다형적 변수
  • 오버로딩(overloading)
  • 오버라이딩(overriding)

1) 클래스 정의와 수퍼클래스 지정하기

  • 수퍼클래스를 지정하지 않으면 자동으로 object가 지정된다.
class Board extends Object {}

// extends Object
// 의 경우에는 생략가능하다.

  • 상위 클래스 레퍼런스는 하위 클래스의 인스턴스주소를 저장할 수 있다.
    = 하위 클래스의 인스턴스를 가리킬 수 있다.

  • ex) Sedan s = new Car(); 를 할 수 없다.

    모든 차들은 세단이 아니기 때문이다.
    ssedan타입이라서 sedan의 기능을 사용하려 하겠지만 scar를 가리키고 있어서 실행오류가 발생할 것이다.

2) 일반화

1. 기존 소스를 복제해서 기능 확장

  • 특징
    • 기존코드를 손대지 않아서 프로젝트에 영향을 끼치지 않는다.
  • 단점
    • 복제했기 때문에 중복코드가 생성되고 기능추가시 전체에 적용시켜줘야 한다.
    • 버그 수정시 또 전체에 적용시켜줘야 한다. = 유지보수가 힘들다

2. 상속을 이용해서 기능 확장

  • 특징
    • 기존 코드를 손대지 않는다. = 이전 프로젝트에 영향을 끼치지 않는다.
    • 기존 코드를 재사용한다. = 개발비용 절감, 버그 추가 가능성 낮춘다, 코드 중복을 없앤다.
    • 버그 수정이 용이하다.
  • 단점
    • 여러 단계를 거치다 보면 필요없는 기능도 강제로 상속받을 경우가 있다.

  • 상속과 인스턴스 필드

    • 수퍼클래스의 인스턴스 변수부터 생성한다!!
  • 생성자 호출

    • 생성자의 '첫 문장'은 반드시 수퍼클래스의 생성자 호출 문장이어야 한다. super()
      • 수퍼클래스의 생성자 호출을 생략하면 컴파일러가 자동으로 추가한다.
    • 같은 클래스의 다른 생성자를 호출하는 문장이어야 한다. this()


3. 오버라이딩(Overriding)

  • 오버라이딩(Overriding) : 수퍼클래스의 메서드를 현재클래스의 역할에 맞춰 재정의

    • 같은 기능을 수행하는 메서드라면 이름을 같게 하는 것이 일관성 있어서 좋다.
    • 파라미터의 타입이나 개수, 순서가 다르더라도 같은 기능을 수행하는 메서드에 대해 같은 이름을 부여함으로써, 프로그램의 일관성을 제공하는 문법
  • generalizatoin : 기본 기능을 추출해서 부모 클래스로 재정의.

  • 추상메서드 : sub클래스에서 재정의 해야할 메서드라면 수퍼클래스에서 정의하지 않는다.

    메서드 형식만 정의하자! = 메서드 바디를 만들지 않는다.

    • public abstract void run(); 까지만하고 메서드 바디{}가 없다.
    • 부모 클래스에도 public abstract class Parent {... 라고 써줘야한다
  • 추상메서드에서 말하는 '메서드 형식' : Method Signature

  • Concrete Class : 구체 클래스 : 추상클래스를 상속받아서 제대로 (콘크리트처럼 딱딱하게) 구현된 클래스

  • 상속의 한계 : 쓰기 싫은 기능이 있어도 부모의 기능이라면 상속받아서 사용하게 된다.

    해결법 :: '위임' 기능 사용!



4. 위임 (= 연관)

  1. 개념
  • 위임 : 상속과는 다르게 위임받은 클래스는 위임해주는 클래스를 '포함'한다

    Calculator c = new Calculator(); 라고 한 후
    c.plus(), c.minus(), ... 등으로 사용하고
    기능을 추가하고 싶을 땐 직접 처리한다.


  1. 필요성
  • 수퍼클래스 교체시

    수퍼클래스와 서브클래스는 강하게 결합되어 있기 때문에 수퍼 클래스 교체가 매우 어렵고, 교체한다 하더라도 기존 코드에 너무 많은 영향을 끼친다
    = 유지 보수가 어렵다.
    = 연관(association)을 통해서 해결하고자 함.


  1. 클래스 관계
    1) 상속(inheritance) 속빈화살표
    class B extends A
    2) 연관(associatoin) 일반화살표
    class B { A obj = ....}
    3) 집합(aggregation) 속빈다이아몬드꼬리
    class B { A obj; }
    4) 합성(composition) 까만다이아몬드꼬리
    class B { A obj; }

    < 집합과 합성 >
    집합 : B가 사라져도 A가 사라지지 않는다.
    합성 : 위와 반대로 B가 사라지면 A도 사라진다. = lifecycle이 같다.

    5) 의존(dependency)(B가 A를 의존한다.)점선화살표
    class B {void m(A obj) }


  1. 상속과 연관의 비교
  • 상속 : 상속은 강하게 결합되어 있기 때문에 기능 변경, 교체가 어렵다
    • 수퍼클래스를 교체하면 오버로딩, 오버라이딩 메소드 변경
    • 이 클래스를 사용하는 다른 클래스도 변경해야 한다.
  • 연관 : 교체한 클래스에 맞춰 메서드 호출을 변경
    • 이 클래스를 사용하는 다른 클래스도 변경될 필요가 없다.
    • 위임은 기능 변경과 교체가 쉽다.
profile
cornchip

0개의 댓글