╱╱╭╮╱╱╱╱╱╱╭━━━╮╱╱╱╭╮╱╭╮╱╱╱╱╱╱ ╱╱┃┃╱╱╱╱╱╱┃╭━╮┃╱╱╱┃┃╱┃┃╱╱╱╱╱╱ ╱╱┃┣━━┳━━╮┃┃╱┃┣━╮╱┃╰━╯┣━━┳━╮╱ ╭╮┃┃╭╮┃┃━┫┃╰━╯┃╭╮╮┃╭━╮┃╭╮┃╭╮╮ ┃╰╯┃╭╮┃┃━┫┃╭━╮┃┃┃┃┃┃╱┃┃╭╮┃┃┃┃ ╰━━┻╯╰┻━━╯╰╯╱╰┻╯╰╯╰╯╱╰┻╯╰┻╯╰╯

Java/Java 기초

[Java] 객체지향 언어 특징(상속성 Inheritance)

재안안 2022. 4. 14. 04:39

클래스를 이해하는데 있어서 알아야하는 중요한 개념이 있다.

객체지향 언어의 특징이다.

객체지향 언어의 특징은 아래와 같다.

 

  • 추상화
  • 상속성
  • 다형성
  • 캡슐화

 

위의 모든 개념들은 클래스와 접목시킬 수 있다.

 

  • 상속성(Inheritance)

 

상속성이란

 

하나의 클래스가 가지고 있는 데이터(값,기능)을 다른 클래스가 그대로 물려받는 것을 뜻한다.

 

클래스간의 단일 방향의 데이터 전달을 부모자식의 상속 관계에 빗대어 설명한 것이다.

 

이때 데이터를 넘겨주는 클래스는 부모클래스, 물려받는 클래스는 자식클래스이다.

그리고 데이터의 전달은 부모 -> 자식 (상위 -> 하위)의 단일 방향으로만 진행된다.

 

클래스간의 상속 관계를 맺을때 주의해야하는 점이 있다.

 

부모 자식 클래스의 부모 자식 여부가 논리적으로도 맞아야 한다는 것이다.

  • 포식자(부모) 늑대(자식)
  • 사람(부모) 학생(자식)
  • 음료(부모) 콜라(자식)

 

부모는 자식이 될 수 없지만 자식은 부모가 될 수 있어야한다.

 

말이 좀 이상하지만 아래에서 예제를 보여주겠다.

  • 포식자는 늑대로 특정 될 수 없지만 늑대는 포식자가 될 수 있고
  • 사람은 학생으로 특정 될 수 없지만 학생은 사람이 될 수 있고
  • 음료는 콜라로 특정 될 수 없지만 콜라는 음료가 될 수 있어야한다,

 

상속관계는 extends 키워드를 사용해 표현한다.

 

아래의 예제를 통해 설명하겠다.

상속

해당 예제에선 Wolf 클래스가 Predator 클래스를 상속했다.

Predator의 데이터는 Wolf 클래스가 물려받았다.

Predator에서 선언되었던 ifPredator는 이제 Wolf 클래스로 상속되었다.

데이터 이동
상속 확인
실행결과

 

본래 다른 클래스의 변수인데 접근이 가능하다는 것은 상속관계가 잘 형성되었다는 것을 뜻한다.

추가적으로 자식 클래스의 인스턴스 생성은 아래의 순서로 진행된다.

 

부모클래스 생성자 -> 자식클래스 생성자 -> 자식 클래스 인스턴스 생성

 

부모클래스의 생성자가 먼저 부모 클래스를 생성하고

부모클래스의 필드와 메소드를 자식클래스에게 상속해 주기에

자식클래스에서 부모클래스의 필드와 메소드를 사용할 수 있는 것이다.

 

추가적으로 부모클래스와 자식클래스의 관계는 그림으로 아래와 같이 나타낸다.

화살표의 방향은 "자식클래스 -> 부모클래스" 이다

 

상속 관계 표현

 

추상화를 통해 부모클래스를 만들고

상속성을 이용해 자식클래스에게 데이터를 공통적으로 전달하고

추가적인 데이터는 자식클래스에서 표현하면 코드는 매우 간결해진다.

 

상속성은 코드를 매우 간결하게 만들어준다.

객체지향 언어의 가장 큰 장점이라고 말 할 수 있다.

 

추가적으로 오버라이딩이라는 개념이 있다.

 

오버라이딩이란 부모클래스에서 정의한 메소드를 자식클래스에서 재정의 하는 것이다.

 

아래의 예제를 통해 설명하겠다.

 

 

Predator 클래스와 Wolf 클래스 모두 hunt 메소드를 정의하였다.

 

아래의 실행결과를 통해 출력 값을 확인해 보겠다.

 

실행 결과

 

p1의 hunt는 "포식자가 사냥을 시작합니다."가 출력됐고

w1의 hunt는 "늑대가 사냥을 시작합니다."가 출력됐다.

 

이와같이

 

부모 클래스에서 정의된 메소드를

자식 클래스에서 재정의 하는 것이 메소드 오버라이딩이다.

 

메소드 오버로딩과 혼동하면 안되겠다.

 

그리고 여담으로 재미있는 사실이 하나 있는데

 

사용자가 정의하는 모든 클래스는 사실 Object 클래스의 자식 클래스이다.

 

Object Class는 이미 메모리 어딘가에 정의 되어 있고

사용자가 정의하는 모든 클래스는 이를 상속받는다.

 

분명 사용자 클래스엔 사용자가 정의하지 않았던 메소드들이 있다.

이것들이 바로 Object 클래스에서 정의된 메소드들인 것이다.

 

Object Class는 Class의 시조격인 셈이다.