[Java] 상속

Minuuu·2023년 2월 13일
0

Java

목록 보기
16/18

전에 상속을 공부했을 땐 단순히 부모의 기능을 사용할 수 있다! 정도의 개념과
자바는 다중상속이 안된다(다른 언어는 되는게 있다)라고 만 듣고 왜 자바는
안되는지를 제대로 알지 못했다.
이번 기회로 위 사항 뿐만 아니라 상속에 대해 정확히 이해하길 바란다.

1. 상속의 정의

기존의 클래스를 재사용하여 새로운 클래스를 작성

상속 사용법

class Child extends Parent{ // extends 키워드를 사용
}

새로 작성하는 클래스 : child
상속받고자 하는 기존 클래스 Parent
위 두 클래스는 서로 상속 관계에 있다고 하며,
상속해주는 클래스를 조상클래스, 상속받는 클래스를 자손 클래스라 한다

조상클래스 : 부모클래스, 상위클래스, 기반클래스
자손클래스 : 자식클래스, 하위클래스, 파생클래스


2. 상속의 특징

  • 재사용하기 때문에 코드의 재사용성을 높이고 코드의 중복 제거 (유지보수 용이)
  • 자손은 조상의 모든 멤버를 상속받는다(생성자, 초기화블럭 제외)

자손은 조상의 모든 멤버를 상속받기에 반드시 조상보다 멤버가 많거나 적다
ex)

class Parent{
	int age;
}
class Child extends Parent{
	void play();
}

위의 코드를 다이어그램으로 바꾸면 아래와 같다
업로드중..
child 클래스에는 age 멤버가 없지만 상속받았기에 포함되는 것을 볼 수 있다.
parent 클래스의 멤버 : age
child 클래스의 멤버 : age, play()

유의사항

생성자와 초기화 블럭은 상속되지 않는다. 멤버만 상속된다.


3. 클래스 재정의 vs 상속

class Point{ // 2차원 좌표 클래스
	int x;
    int y; 
}

위는 2차원 좌표를 나타내는 클래스이다
이 때 3차원도 나타내는 좌표 클래스를 만들고 싶다면 아래 두가지 방법이 있다

클래스 재정의

class Point3D{
	int x;
    int y;
    int z;
}

상속 활용

class Point3D extends Point{
	int z;
}

두 클래스의 가장 큰 차이는 Point 클래스에 영향 유무이다
만약 Point클래스의 y값이 사라지면 상속을 활용한 클래스는 영향을 받는다
이 것이 상속을 사용하는 이유이지 상속의 특징


4. 단일 상속

다른 언어에서는 여러 조상클래스로부터 상속받는 것이 가능한 다중상속을 지원
하지만 Java는 오직 단일 상속만을 허용

class TVCR extends TV, VCR // 에러발생(단일 상속만 가능)

왜 다중상속을 지원하지않는가?

다중상속을 지원하면 복합적인 기능의 클래스를 쉽게 작성할 수 있지만
클래스간의 관계가 매우 복잡해지고, 다른 클래스로부터 상속받은 멤버간의 이름이 같으면 구별할 수 없기 때문에 자바에서는 금지하고 있다

자바는 위와 같은 문제점을 해결하기 위해 장점을 포기하고 단일 상속만을 허용


5. Object 클래스

Object 클래스는 모든 클래스 상속계층의 최상위에 있는 조상클래스
모든 클래스들은 자동적으로 Object 클래스로부터 상속받게 한다

엥? 저희는 Object 클래스를 상속받은적이 없는데 모든 클래스는 상속받는다구여?

class TV{} 이 클래스는 사실
class TV extends Object{} << 이거와 같다

TV클래스를 컴파일하면 컴파일러는 자동적으로 Object 클래스를 상속받는다!!

그러면 상속받는 클래스를 정의하면 다중상속되는거 아니에요?
위와 같은 질문을 할 수 있는데 전혀 아니다 다중상속이 아니라 최상위 부모가 object이다

class TV{}
class CaptionTv extends TV{}

위와 같은 코드를 짰다면 CaptionTV Extends TV, Object가 아니라
CaptionTv extends TV extends Object << 이와 같다

이처럼 모든 클래스의 최상위 계층에는 Object가 위치한다
그동안 toString(), equals(Object O)와 같은 메서소를 정의하지 않고도 사용할 수
있었던 이유도 Object 클래스에 메소드들이 정의됐기 때문


후기

Object 클래스에는 모든 인스턴스가 가져야할 11개의 메서드가 정의되어 있지만
이는 추후에 java.lang 패키지를 다룰 때 다루겠다.
다중상속의 장단점을 기억하자 Java는 다중상속을 포기하였다
추후 Interface 개념이 등장할 때 Interface는 다중상속이 가능하다
왜 Interface는 다중상속이 가능한지 다룰 것

profile
꾸준히 한걸음씩 나아가려고 하는 학부생입니다 😄

0개의 댓글