상속과 Override

노건우·2023년 7월 10일
0

상속

실제 세계에서 부모님이 자식들에게 재산을 물려주는 것과 비슷하다. 차이라고 하면 자식(클래스)이 상속받고 싶은 부모(클래스)를 선택해서 물려받는다. 이때 상속받는 클래스를 자식 클래스, 하위 클래스 또는 서브 클래스라고 부른다. 상속을 해주는 클래스를 부모 클래스, 상위 클래스 또는 슈퍼 클래스라고 한다.

-클래스 간에는 부모-자식의 상속 관계를 설정할 수 있다.
-부모 클래스 A를 자식 클래스 B가 상속받을때, B는 A의 모든 멤버변수와 메서드를 자신의 것으로 상속받게 된다. (단, private로 설정된 기능은 상속되지 않는다.)
-상속가능 여부: public, protected
-B는 A의 public,protected 기능들을 직접적으로 코딩하지 않더라도 자신의 것으로 사용할 수 있게 된다.

풀어서 예시로 설명해보면,

A B라는 클래스가 있을 때
A는 PLUS, MINUS를 상속받고
B는 PLUS,MINUS를 받고
TIMES를 추가. 기존 완성된 A클래스에 추가하는 건 개발자에게 부담이 될 수 있다.
//TIMES 그래서 B클래스에 상속받아 추가


이것은 부모클래스인 CalcParent

이것이 자식 클래스인 CalcChild이다. 사진에서 볼 수 있듯 extends를 이용해 CalcParent를 상속받은 모습을 확인 할 수 있다. 결국 현재 자식 클래스는 부모 클래스에서 받은 +,-를 가지고 times를 이용한 곱하기, divide나누기 까지 가지고 있다. 위의 예시에서 말했듯 두 개는 받고 두 개는 추가하였는데, 그 예시가 이것이다. 이렇게 하면 개발자의 부담이 줄어들 수 있다.

  • 여러 개의 클래스에 공통되는 기능을 추출하여 공유하기
    공통의 기능을 별도의 클래스로 추출해내면 코드의 재사용 및 수정이 용이하다.

이러한 상속은
CalcChild,CalcParent와는 다르게 그림으로 표현하면

이런 모양의 class라고 할 수 있겠다.
A라는 큰 클래스가 존재하고 그 밑에 하위 클래스 두 개가 A의 클래스를 공유하는 것이다.

Override

override는 쉽게 말해 상속 관계인 부모 클래스와 자식 클래스 사이에서 부모 클래스의 메서드를 똑같이 가져와 사용하는 것이다.

코드를 가져와서 설명해야 와닿을 것 같다.

이것이 부모 클래스인 unit

하위 클래스인 Navy

하위 클래스인 army이다.

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

두 코드를 보면 부모 클래스가 attack이라는 이름을 사용하고 있는데, 자식 클래스인 Army와
Navy또한 attack을 사용하고 있다. 하지만 Army와 Navy는 각각 지상 공격 실행,해상공격 실행으로 다른 형태를 취한다. 이것이 override이다. 같은 메서드를 가져왔지만 취하는 결과는 다른 것이다.

  • super키워드
    클래스의 상속 관계에서 자식 클래스가 부모 클래스를 가리키는 예약어
    사용방법
    ->멤버변수 이름 앞에 명시
    :부모 클래스의 멤버변수를 의미한다. 하지만 부모클래스의 멤버변수는 이미 상속되어 있기 때문에 이 경우에는 this키워드를 사용하는 것과 동일한 결과이기에 잘 사용하지 않는다.

Overload

  • 메서드 오버로드
    원칙적으로 하나의 클래스 안에서는 동일한 이름의 메서드가 두개이상 존재할 수 없지만 이를 가능하게 하는 예외적인 처리 기법
  • 이름이 동일한 메서드를 정의하기 위한 조건
    메서드 간의 파라미터가 서로 달라야 한다.
    ->파라미터의 데이터 타입이 다르다.
    (데이터형이 동일하고 변수의 이름이 다른 경우는 동일한 파라미터로 인식된다.)
    ->파라미터의 개수가 다르다
    ->서로 다른 데이터형을 갖는 파라미터들의 전달순서가 다르다.
    리턴형이 다른 경우는 오버로드의 성립에 아무런 영향을 주지 않는다.

오버로드의 예시

파라미터의 데이터형이 서로 다르기 때문에 오버로드 성립
public void foor(int a){...}
public void foor(String a){...}

파라미터의 개수가 서로 다르기 때문에 오버로드 성립
public void user(int a){...}
public void user(int a, int b){...}

데이터형의 전달 순서가 서로 다르기 때문에 오버로드 성립
public void user(int a, String b){...}
public void user(String a, int b){...}

오버로드 성립되지 않음
public void user(int a){...}
public void user(int b){...}

profile
초보 개발자 이야기

0개의 댓글