Language/JAVA

[JAVA] 상속

IT수정 2024. 9. 4. 16:12

상속 개념

상속(Inheritance)은 부모가 자식에게 물려주는 행위를 말한다. 객체지향 프로그램에서도 부모 클래스의 필드와 메서드를 자식 클래스에게 물려줄 수 있다.

 

상속은 이미 잘 개발된 클래스를 재사용해서 새로운 클래스를 만들기 때문에 중복되는 코드를 줄여 개발 시간을 단축시킨다. 상속의 또 다른 이점은 클래스의 수정을 최소화할 수 있다는 것이다. 부모 클래스를 수정하면 모든 자식 클래스에 수정 효과를 가져온다. 예를 들어 B, C가 A를 상속할 경우 A의 필드와 메서드를 수정하면 B, C를 수정하지 않아도 수정된 A 필드와 메서드를 이용할 수 있다.

 

클래스 상속

현실에서의 상속은 부모가 자식을 선택해서 물려주지만, 프로그램에서는 자식이 부모를 선택한다. 자식 클래스를 선언할 때 어떤 부모로부터 상속받을 것인지를 결정하고, 부모 클래스를 다음과 같이 extends 뒤에 기술한다.

public class 자식클래스 extends 부모클래스 {}

 

다른 언어와 달리 자바는 다중 상속을 허용하지 않는다. 즉, 여러 개의 부모 클래스를 상속할 수 없다. 따라서 extends 뒤에는 단 하나의 부모 클래스 만이 와야 한다.

 

부모 생성자 호출

현실에서 부모 없는 자식이 있을 수 없듯이 자바에서도 자식 객체를 생성하면 부모 객체가 먼저 생성된 다음에 자식 객체가 생성된다. 모든 객체는 생성자를 호출해야만 생성된다. 부모 객체도 예외는 아니다. 그렇다면 부모 객체의 생성자는 어디서 호출된 것일까? 이것에 대한 비밀은 자식 생성자에 숨어 있다. 부모 생성자는 자식 생성자의 맨 첫 줄에 숨겨져 있는 super()에 의해 호출된다.

public 자식클래스(...) {
	super();
    ...
    }

 

super()는 컴파일 과정에서 자동 추가되는데, 이것은 부모의 기본 생성자를 호출한다. 만약 부모 클래스에 기본 생성자가 없다면 자식 생성자 선언에서 컴파일 에러가 발생한다.

 

부모 클래스에 기본 생성자가 없고 매개변수를 갖는 생성자만 있다면 개발자는 다음과 같이 super(매개값,...) 코드를 직접 넣어야 한다. 이 코드는 매개값의 타입과 개수가 일치하는 부모 생성자를 호출한다.

public 자식클래스(...) {
	super(매개값, ...);
    ...
    }

 

메서드 재정의

부모 클래스의 모든 메서드가 자식 클래스에게 맞게 설계되어 있다면 가장 이상적인 상속이지만, 어떤 메서드는 자식 클래스가 사용하기에 적합하지 않을 수도 있다. 이러한 메서드는 자식 클래스에서 재정의해서 사용해야 한다. 이것을 메서드 오버라이딩(Overriding)이라고 한다.

 

메서드 오버라이딩

메서드 오버라이딩은 상속된 메서드를 자식 클래스에서 재정의 하는 것을 말한다. 메서드가 오버라이딩 되었다면 해당 부모 메서드는 숨겨지고, 자식 메서드가 우선적으로 사용 된다. 메서드를 오버라이딩 할 때는 다음과 같은 규칙을 주의해야 한다.

  • 부모 메서드의 선언부(리턴 타입, 메서드 이름, 매개변수)와 동일해야 한다.
  • 접근 제한을 더 강하게 오버라이딩할 수 없다.(public → private으로 변경 불가).
  • 새로운 예외를 throws 할 수 없다.

부모 메서드 호출

메서드를 재정의 하면, 부모 메서드는 숨겨지고 자식 메서드만 사용되기 때문에 비록 부모 메서드의 일부만 변경된다 하더라도 중복된 내용을 자식 메서드도 갖고 있어야 한다. 예를 들어 부모 메서드가 100줄의 코드를 갖고 있을 경우, 자식 메서드에서 1줄만 추가하고 싶더라도 100줄의 코드를 자식 메서드에서 다시 작성해야 한다.

 

이 문제는 자식 메서드와 부모 메서드의 공동 작업 처리 기법을 이용하면 매우 쉽게 해결된다. 자식 메서드 내에서 부모 메서드를 호출하는 것인데, 다음과 같이 super 키워드와 도트(.) 연산자를 사용하면 숨겨진 부모 메서드를 호출할 수 있다.

class Parent {
public void method() {}
}

class Child extends Parent {
@Override
public void method() {
super.method();
}
}

 

super.method()의 위치는 작업 처리2 전후에 어디든지 올 수 있다. 우선 처리가 되어야 할 내용을 먼저 작성하면 된다. 이 방법은 부모 메서드를 재사용함으로써 자식 메서드의 중복 작업 내용을 없애는 효과를 가져온다.

'Language > JAVA' 카테고리의 다른 글

[JAVA] 추상 클래스  (1) 2024.09.04
[JAVA] 상속2  (0) 2024.09.04
[JAVA] 싱글톤 패턴  (0) 2024.09.04
[JAVA] Getter와 Setter  (0) 2024.09.04
[JAVA] 접근 제한자  (0) 2024.09.04