Override

김현·2023년 7월 18일

자바

목록 보기
17/31

예시) 육군(Army), 해군(Navy), 공군(AirForce)

  • Unit이라는 클래스를 통해서 공통 속성을 정의한다.
    -> 이름(멤버변수, getter, setter), 공격(attack())
  • 같은 이름이지만 다른 동작을 수행해야 하는 필요성
    -> 모든 군대는 '공격'이라는 공통된 특성을 갖지만 공격하는 방법은 육/해/공군이 서로 다르게 처리되어야 한다.
  • 부모클래스가 갖고 있는 기능을 자식 클래스가 재정의
    -> 부모 클래스에 정의된 것과 동일한 이름을 갖는 메서드를 자식 클래스가 정의한 경우, 부모클래스의 기능은 자식클래스에게 가려진다.
    -> 이렇게 부모의 기능을 재정의 하는 것을 메서드 Override라고 한다.

1. 하나의 이름으로 다양한 효과 얻기

  • 모든 자식클래스가 동일한 이름의 메서드를 갖게 되므로 각 객체에 대하여 attack() 이라는 이름을 사용하여 서로 다른 형태를 구현할 수 있게 된다.

2. super키워드

  • 클래스의 상속관계에서 자식 클래스가 부모 클래스를 가리키는 예약어

  • 사용방법

    1) 멤버변수 이름 앞에 명시
    : 부모 클래스의 멤버변수를 의미한다, 하지만 부모클래스의 멤버변수는 이미 모두 상속되어 있기 때문에 이 경우에는 this 키워드를 사용하는 것과 동일한 결과이기에 잘 사용하지 않는다.

    2) 메서드 이름 앞에 명시
    : 부모 클래스의 메서드를 의미한다.

    2-1) 재정의 되지않은 메서드
    : 이미 상속되어있기 때문에 this키워드를 사용하는 것과 동일한 결과를 갖는다.
    2-2) 재정의 된 메서드
    : Override 된 메서드 이름 앞에 사용하게 되면 재정의 되기 이전의 원본 메서드를 의미한다.
    (부모클래스에 정의된 say는 this와 super로 호출 가능하지만 자식클래스(korean)에 정의된 say는 super로 호출하면 부모클래스의 say가 호출(Hello)되고 this로 호출하면 안녕하세요가 호출된다.)

    3) 키워드 자체를 메서드처럼 사용
    : super()
    부모 클래스의 생성자를 의미한다.

3. 생성자가 정의된 클래스의 상속 제한

  • 생성자는 상속되지 않는다.
  • 하지만 생성자가 정의된 클래스는 객체 생성을 위해서 생성자 파라미터를 반드시 전달받아야 하기때문에 파라미터를 갖는 생성자가 정의된 클래스를 상속받게 되면 에러가 발생한다.

4. @Override

  • 메서드 재정의 과정에서의 오타 방지 옵션
  • @Override는 이 키워드가 명시된 위치 아래에 정의되는 메서드가 부모클래스에 존재하지 않을 경우 구문 에러로 처리된다.
  • 부모 클래스의 메서드를 재정의 하고자 할 경우 의도치 않은 실수를 예방하기 위한 '오타 방지 옵션'이다.
  • 여러 개의 메서드를 재정의 한다면 재정의 되는 모든 메서드들 위에 각기 명시해야 한다.

5. 자바 최상위 클래스

  • Object 클래스

<복습>

1) Unit에서 name을 정의한다.

3) attack이란 메서드를 만든다.

2) Army라는 자식 클래스를 만들고 Unit에 상속시킨다.

3) tank라는 메서드를 만든다.

4) attack이라고 하는 메서드를 만든다.

5) super.attack() : 부모 클래스인 Unit에서 정의한 attack메서드를 가져온다.

7) Navy도 Unit에 상속시키고 필요한 메서드들을 만들어준다.

8) Airforce도 위 과정과 같이 만들어준다.

9) Unit에서 정의한 name을 이용하여 각각의 자식 클래스들을 추출할 수 있게 만들어준다.

10) 각각의 자식 클래스에서 만든 메서드들을 출력한다.

11) 결과가 문제없이 나온 것을 확인할 수 있다.

0개의 댓글