프로그래밍/JAVA

[Java] 상속

daykim 2023. 9. 12. 10:29
이것이 자바다(개정판) 기반 정리

 

목차

  • 상속 개념
  • 부모 생성자 호출
  • 메소드 재정의
  • final클래스와 final 메소드
  • protected 접근 제한자
  • 타입 변환
  • 추상 클래스
  • 봉인된 클래스

 

상속 개념


상속

객체지향 프로그램에서 부모 클래스의 필드와 메소드를 자식 클래스에게 물려주는 것을 말한다.

  • 중복되는 코드를 줄여줘 효율적으로 코드를 작성할 수 있다.
public class 자식 클래스 extends 부모클래스 {

}

 

클래스 상속

  • 자바는 다중 상속을 허용하지 않는다.
  • 즉, extends 뒤엔 하나의 부모 클래스만 올 수 있다.

 

 

부모 생성자 호출


자식클래스 name = new 자식클래스();
  • 위의 코드는 자식 객체를 생성한 것으로 보인다.
  • 하지만, 부모 객체가 먼저 생성된 다음 자식 객체가 생성된 것이다.

 

부모 객체 생성자 호출

public 자식클래스() {
    super();
}
  • super : 컴파일 과정에서 자동으로 추가되는데, 부모의 기본 생성자를 호출한다.
  • 만약, 부모 클래스에 기본 생성자가 없으면, 자식 생성자 선언에서 컴파일 에러가 발생한다.
  • 부모 클래스에 기본 생성자 없이, 매개변수를 갖는 생성자만 있다면, 그에 맞게 매개변수를 넣어줘야 한다.

 

 

메소드 재정의


  • 부모 클래스의 메소드가 자식 클래스에서 사용하기 적합하지 않을 수 있다.
  • 이 경우 자식 클래스에서 메소드를 재정의해서 사용한다. -> 오버라이딩

 

메소드 오버라이딩

  • 부모 클래스로부터 상속받은 메소드를 자식 클래스에서 재정의하는 것이다.
  • 이 경우 부모 메소드는 숨겨지고, 자식 메소드가 우선적으로 사용된다.
  • 부모 메소드의 선언부인 리턴 타입, 메소드 이름, 매개변수가 동일해야 한다.
  • 접근 제한을 더 강하게 오버라이딩 할 수 없다.
  • 새로운 예외를 throws할 수 없다.
@Override
// 컴파일 시 정확히 오버라이딩이 되었는지 체크해주는 어노테이션

 

부모 메소드 호출

  • 비록 부모 메소드의 일부만 변경된다 하더라도, 자식 메소드도 중복된 내용을 모두 가지고 있어야 한다.
  • 이 경우 공동 작업 처리 기법을 이용해 쉽게 해결할 수 있다.
  • 아래 코드를 사용하면, 부모 객체의 메소드를 호출한다.
super.부모메소드이름();

 

 

final 클래스와 final 메소드


final 클래스

  • 클래스 선언할  final을 class 앞에 붙이면, 최종적인 클래스이므로 더는 상속할 수 없다.
  • 즉, 부모클래스가 될 수 없어 자식 클래스도 없다.
public final class 클래스이름 {
}

 

final 메소드

  • 메소드 선언할 때 final을 붙이면, 최종적인 메소드이므로 오버라이딩 할 수 없다.
  • 즉, 자식 클래스에서 부모 클래서의 final 메소드를 재정의할 수 없다.

 

 

protected 접근 제한자


protected

  • 제한 대상 : 필드, 생성자, 메소드
  • 같은 패키지거나, 자식 객체만 사용 가능하다.

 

 

타입 변환


  • 클래스에서 타입 변환은 상속 관계에 있는 클래스 사이에 발생한다.

 

자동 타입 변환

  • 자동적으로 타입 변환이 일어나는 것을 말한다.
  • 아래와 같은 경어 자동 타입 변환이 일어난다.
부모타입 변수 = 자식 타입 객체;
  • 자식은 부모의 특징과 기능을 상속받기 때문에 부모와 동일하게 취급될 수 있다.
  • 바로 위의 부모가 아니더라도 상속 계층에서 상위 타입이라면, 자동 타입 변환이 일어날 수 있다.
  • 부모 타입으로 자동 타입 변환된 이후엔, 부모 클래스에 선언된 필드와 메소드만 접근이 가능하다.
    • 비록 변수는 자식 객체를 참조하지만, 접근 가능한 멤버는 부모 클래스 멤버로 한정된다.
    • 만약 자식 클래스에서 오버라이딩 된 메소드가 있다면, 부모 메소드 대신 오버라이딩된 메소드가 호출된다. -> 다형성과 관련됨

ex)

  • Cat이 Animal을 상속받는다 가정
Cat cat = new Cat();
Animal animal = cat;
  • cat과 animal은 변수 타입만 다르고, 동일한 객체를 참조한다.
  • 따라서 두 참조 변수의 == 연산 결과는 true다.

 

강제 타입 변환

  • 부모는 자식 타입으로 자동 변환되지 않아, 캐스팅 연산자로 강제 타입 변환을 해야한다.
자식타입 변수 = (자식타입) 부모타입객체;
  • 그런데 자식이 부모 타입으로 자동 변환 후, 다시 자식 타입으로 변환할 때 강제 타입을 사용할 수 있다.

 

 

추상 클래스


  • 추상(abstract) : 실체 간에 공통되는 특성을 추출한 것이다.

 

추상 클래스

  • 클래스들의 공통적인 필드나 메소드를 추출해 선언한 클래스다.
  • 객체를 생성할 수 있는 클래스를 실체 클래스라고 한다.
  • 추상 클래스는 실체 클래스의 부모 역할을 한다.
  • 즉, 실체 클래스는 추상 클래스를 상속해 공통적인 필드나 메소드를 물려받을 수 있다.
public abstract class 클래스명 {
    // 필드
    // 생성자
    // 메소드
}
  • new 연산자를 이용해 객체를 직접 만들지 못 하고, 상속을 통해 자식클래스만 만들 수 있다.
  • 즉, extends 뒤에만 올 수 있다.
  • 자식 객체가 생성될 때 super()로 추상 클래스의 생성자를 호출하기 때문에, 생성자도 반드시 있어야 한다.

 

추상 메소드와 재정의

  • 공통 메소드를 뽑아 추상 클래스를 작성할 때, 메소드 선언부만 동일하고 실행 내용은 자식 클래스마다 달라야 하는 경우가 있다.
  • 이 경우 추상 클래스에서 통일해 작성할 수 없으므로, 추상 메소드를 선언할 수 있다.
  • 추상 메소드는 자식 클래스의 공통 메소드라는 것만 정의하고, 실행 내용을 가지지 않는다.
public abstract class 클래스명 {
    abstract void 메소드명();
}
  • 추상 메소드는 자식 클래스에서 반드시 오버라이딩 해야 한다.

 

 

봉인된 클래스


  • Java 15부터는 무분별한 자식 클래스 생성을 방지하기 위한 봉인된(sealed) 클래스가 도입됐다.

ex)

public sealed class Animal permits Dog, Cat {

}
  • sealed 키워드를 사용하면, permits 키워드 뒤에 상속 가능한 자식 클래스를 지정해야 한다.

 

public final class Dog extends Dog {...}
public non-sealed class Cat extends Cat {...}
  • 봉인된 클래스를 상속한 클래스는 final (상속 불가), non-sealed(봉인 해제) 키워드로 위와 같이 선언하거나, sealed 키워드를 사용해 또 다른 봉인 클래스로 선언해야 한다.
  •  즉, non-sealed의 경우엔 자식 클래스를 만들 수 있다.

 

'프로그래밍 > JAVA' 카테고리의 다른 글

[Java] 중첩 선언과 익명 객체  (1) 2023.10.04
[Java] 인터페이스  (0) 2023.09.13
[Java] Static  (0) 2023.06.30
[JAVA] 클래스  (0) 2023.01.14
[JAVA] 참조 타입  (2) 2022.11.08