상속 - Inheritance(자바의 정석)

minjjai·2022년 11월 18일
0

상속

  • 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것(코드의 재사용)
  • 두 클래스를 조상과 자손으로 관계를 부여하는 것
  • 자손은 조상의 모든 멤버(변수, 메서드 등)를 상속받는다(생성자, 초기화 블럭 제외)
  • 자손의 변경은 조상에 영향을 미치지 않는다.
  • 자손의 멤버 개수는 조상보다 같거나 많다.
class Parent {
	int a;
    int b;
    void play() {}
}
class Child extends Parent { //상속
	int c;
}

위의 코드를 그림으로 그리면 아래와 같다.

상속의 장점

  • 상속을 통해 클래스를 작성하면 보다 적은 코드로 새로운 클래스를 작성할 수 있다.
  • 코드를 공통적으로 관리할 수 있기 때문에, 코드의 추가 및 변경이 용이하다.
  • 코드의 재사용성 증가, 코드의 중복 제거, 프로그램의 생산성 증가, 유지보수 용이

클래스간의 상속관계(포함, 상속)

상속관계

  • ~은 ~이다. -> extends 사용
  • ex) 아기는 사람이다.
class Human {
	int age;
	int name;
}
class Baby extends Human {}

포함관계

  • ~은 ~를 가지고 있다.
  • ex) 원은 점을 가지고 있다.
class Point {}
class Circle {
	Point p = new Point();
}

단일 상속

다른 객체지향언어인 C++에서는 클래스간의 다중상속을 허용한다. 다중상속을 허용하면 다중상속으로 인해 복합적인 여러 기능들을 가지는 클래스를 쉽게 작성할 수 있다는 장점이 있지만 클래스들 간의 관계가 복잡해지고, 서로 다른 클래스에서 상속받은 멤버들의 이름이 같을 경우에 이를 구별할 수 없다는 단점이 있다.

이런 이유로 자바에서는 단일상속만을 허용한다.

class Tv {}
class Audio {}
class TvAudio extends Tv, Audio {} //다중상속 -> 오류

위와 같이 코드를 작성하면 오류가 난다.
만일 두 개 이상의 클래스를 상속받고 싶다면,
상속받을 멤버의 비중이 가장 큰 클래스를 상속관계(extends)로 상속받고, 그 외의 클래스는 포함관계로 상속을 받으면 된다.

class Tv {}
class Audio {}
class TvAudio extends Tv {
	Audio audio = new Audio();
}

Object - 모든 클래스들의 조상

Object클래스는 모든 클래스 상속계층도의 가정 최상위에 있는 클래스이다. 어떤 클래스가 상속받는 클래스가 없다면, 해당 클래스는 자동적으로 Object클래스를 상속받게 되어있다.

class Example {} //아래의 코드와 같다.
class Example extends Object {}

아래의 예시 코드를 보자.

class Tv {}
class SmartTv extends Tv {}

SmartTv클래스는 Tv클래스를 상속받는다. 그리고 Tv클래스는 Object클래스를 상속받는다.
그림으로 나타내면 아래와 같은 상속계층도로 나타낼 수 있다.

오버라이딩

조상 클래스로부터 상속받은 메서드를 변경하는 것이다. 상속받은 메서드를 그대로 사용하기도 하지만, 자손 클래스에 맞게 변경시키기도 한다. 이럴 때 메서드 '오버라이딩'을 한다.

  • override(덮어쓰다)
class Parent {
	void ParentMethod() {}
}
class Child extends Parent {
	void ParentMethod() {} //오버라이딩
    	void ParentMethod(int i) {} //오버로딩
}

오버라이딩의 조건

  1. 메서드의 선언부가 조상클래스의 메서드와 일치해야 한다.
    조상클래스의 메서드와 메서드 이름, 메서드의 매개변수, 반환타입이 일치해야 한다.
  2. 접근 제어자를 조상클래스의 메서드보다 좁은 범위로 변경할 수 없다.
  3. 예외는 조상클래스의 메서드보다 많이 선언할 수 없다.

오버라이딩 vs 오버로딩

오버라이딩과 오버로딩은 이름이 비슷해 헷갈릴 수 있다.
하지만 오버라이딩과 오버로딩은 그 차이가 분명하고, 서로 연관관계도 딱히 없다.
그 의미와 차이에 대해서 잘 알아두어야 한다.

  • 오버라이딩
    상속받은 메서드의 내용을 자신에 맞게 변경하는 것
  • 오버로딩
    기존에 없던 새로운 메서드를 정의하는 것
profile
BackEnd Developer

0개의 댓글