본문 바로가기
Develop/Java

상속(Inheritance)

by jaeyoungb 2022. 9. 6.

객체 지향 프로그래밍(OOP)에서 상속은

하위 클래스가 상위 클래스의 속성과 기능을 그대로 받아 재사용하는 것을 말한다.

 

하위 클래스는 extends 키워드를 통해 상위 클래스를 상속받는데,

여기서 extends는 '확장하다' 라는 의미를 갖고 있으므로

상속 받은 하위 클래스는 상위 클래스를 확장시킨 것이라고 이해하는 게 편할 것 같다.

 

 

객체 지향 프로그래밍의 핵심 4가지 요소가 존재한다.

  • 상속 (Inheritance)
  • 캡슐화 (Encapsulation)
  • 다형성 (Polymorphism)
  • 추상화 (Abstraction)

 

상속을 통해서 클래스를 작성하면,

상위 클래스의 있는 속성과 기능을 동일하게 확장된 하위 클래스에서도 쓸 수 있기 때문에 코드의 재사용성이 높다.

상위 클래스의 속성 및 기능을 목적에 맞게 업데이트할 수도 있다. - 객체의 다형성 구현 효과

 

공통된 속성과 기능이 상위 클래스를 기반으로 생성이 된 것이니까, 수정이 필요하다면

상위 클래스에 있는 속성과 기능만 수정하면 되기 때문에, 유지보수에도 용이하다.

 

 

상속의 장점과 단점에 대해 각각 알아보자.

 

장점에는

  • 잘 만들어 놓은 객체가 있다면, 언제든 상속을 받아 재사용을 통해 다시 가져다 쓸 수 있다
  • 코드의 추가 및 변경이 매우 용이하다.
  • 코드의 재사용성이 높기 때문에, 프로그램의 생산성과 유지보수에 크게 기여한다.

단점에는

  • 상위 클래스의 기능에 문제가 생기면, 상속받은 하위 클래스가 정삭적으로 동작할 수 있는지는 예측이 불가하다.
  • 상속을 주고받은 클래스들이 많아질수록 오히려 보수가 힘들어질 수 있다.
  • 상위 클래스의 몇몇 기능들은 하위 클래스에서 필요로하지 않을 수 있고, 그로 인해 상속받은 많은 하위 클래스들에서 새로운 기능들이 생겨날 수 있다. 점점 복잡해지게 되고, 보수가 힘들어질 수 있다는 것이다.

 

 

자바는 단일 상속만을 사용한다.

 

객체 지향 프로그래밍에서는 다중 상속도 존재하지만,

 

다중 상속의 경우에는 클래스 간의 관계가 매우 복잡해지고,

서로 다른 클래스로부터 상속받은 멤버들간의 이름이 같은 경우에 잘 구별하기 어렵다는 단점이 존재한다.

 

 

이러한 다중 상속의 문제를 해결하기 위해, 자바는 단일 상속만을 사용한다.

 

단일 상속이 하나의 상위 클래스만을 가질 수 있기 때문에 다중 상속에 비해 불편한 점이 있겠지만,

클래스 간의 관계가 보다 명확해지고 코드를 더욱 신뢰성 있게 만들어준다.

 

 

다음은 자바에서 상속 예시를 보자.

상속 예시

위 코드처럼 상속을 통해 상위 클래스의 변수들을 사용할 수 있고, 거기에 더해 새로운 변수도 만들 수 있고,

메서드 또한 재정의가 가능하다.

 

 

상속 방법은 간단하다. 클래스 이름 뒤에 extends 키워드를 붙여주고 상속받는 상위 클래스 명을 적어주면 된다.

class 자식클래스 extends 부모클래스 { -- 내용 -- }

다음과 같이, 다중으로 상속받는 경우는 불가능하다.

자바는 오로지 단일 상속만 가능하다.

class 자식클래스 extends 부모클래스1, 부모클래스2 { -- 내용 -- }       // 불가능

하지만, 부모 클래스는 여러 자식 클래스에게 상속이 가능하다.

class 자식클래스1 extends 부모클래스 { -- 내용 -- }
class 자식클래스2 extends 부모클래스 { -- 내용 -- }

 

 

상속은 앞서 보았듯이, 여러 장점들이 존재한다.

그러나, 상속이 제외되는 것들이 있다. 다음을 살펴보자.

  1. 생성자는 상속이 불가능하다.
  2. 접근 제어자가 private으로 선언된 멤버 변수와 메서드는 상속이 불가능하다.
  3. 부모 클래스와 자식 클래스가 서로 다른 패키지에 존재한다면, default 접근 권한을 갖는 메서드는 상속이 불가능하다.

 

 

 

super  vs  super()

 

 

super 키워드는 상위 클래스의 객체를 호출한다.

하위 클래스에 상위 클래스와 같은 이름의 변수가 존재하는 경우, 상위 클래스의 변수를 호출하기 위해 super 키워드를 사용할 수 있다.

 

 

super() 메서드는 상위 클래스의 생성자를 호출한다.

생성자 안에서만 사용이 가능하고, 반드시 첫 줄에 와야한다.

 

만약, super() 메서드를 적어주지 않으면 컴파일러가 자동으로 생성해준다.

상위 클래스에 생성자가 만약 매개 변수를 가지는 생성자라면,
반드시 super() 메서드를 명시적으로 적어주어야 한다.

 

 

 

Object 클래스는 자바 클래스의 상속계층도에서 최상단에 위치한다.

따라서, 자바의 모든 클래스들은 Object 클래스로부터 확장된다.

class Parent {          // 컴파일러가 자동으로 "extends Object" 추가

}


class Child extends Parent {

}

 

Object 클래스로부터 사용할 수 있는 주요 메서드들은 다음과 같다.

반환 타입 메서드명 설명
String toString() 객체 정보를 문자열로 출력
boolean equals(Object obj) 등가 비교 연산(==)과 동일하게 스택 메모리값을 비교
int hasCode() 객체의 위치정보와 관련.
Hashtable 또는 HashMap에서 동일 객체 여부 판단
void wait() 현재 쓰레드 일시정지
void notify() 일시정지 중인 쓰레드 재동작

 

 

추가적으로 알게되는 내용이 생긴다면, 내용을 덧붙일 예정입니다.

피드백 환영합니다.

 

 

(참고 : http://wiki.hash.kr/index.php/%EC%83%81%EC%86%8D_(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D)

'Develop > Java' 카테고리의 다른 글

다형성(Polymorphism)  (0) 2022.09.10
캡슐화(Encapsulation)  (0) 2022.09.06
구분자를 기준으로 문자열 분리하는 방법  (0) 2022.09.06
내부 클래스란?  (0) 2022.09.05
생성자란?  (0) 2022.09.05