상속

띠로리·2024년 3월 27일

상속

상속이란?

상속(Inheritance) : 부모가 자식에게 물려주는 행위

→ 객체 지향 프로그램에서도 자식 클래스는 부모 클래스의 필드메소드를 상속 받을 수 있다.

상속은 중복되는 코드를 줄여 개발 시간을 단축 시킨다. (이미 잘 개발된 클래스를 재사용하기 때문)

  • 유지 보수 측면에서도 좋다!

클래스 상속

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

프로그램에서는 자식이 부모를 선택한다.

자식 클래스를 선언할 때 어떤 부모로부터 상속 받을 것인지를 결정하고, 부모 클래스를 extends 뒤에 기술한다.

다른 언어와 달리 자바는 다중 상속을 허용하지 않는다. 즉, extends 뒤에는 하나의 클래스만 올 수 있다는 것.


부모 생성자 호출

자식 객체를 생성하면, 부모 객체가 먼저 생성된 다음에 자식 객체가 생성된다.

자식클래스 변수 = new 자식클래스( );
// 이때 부모 객체도 함꼐 생성된다.

모든 객체는 생성자를 호출해야만 생성되는데, 부모 객체의 생성자는 어디서 호출되는 것일까?

→ 자식 생성자의 맨 첫 줄에 숨겨져 있는 super()에 의해 호출된다. super()는 컴파일 과정에서 자동으로 추가된다!

→ 하지만 부모 클래스에 기본 생성자가 없고 매개변수를 갖는 생성자만 있다면, 개발자는 super(매개값, …) 코드를 직접 넣어야 한다.

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

Untitled

💡 Java의 모든 클래스는 Object의 하위 클래스이다. → 클래스 생성 시, 자동으로 superclass에 java.lang.Object가 작성된다. Object 클래스는 필드를 가지지 않으며, 총 11개의 메소드만으로 구성되어 있습니다.

Spuerclass는 직접 수정도 가능하다. 원하는 부모 클래스를 입력하면 자동으로 부모 클래스가 지정된다.

  • 물론 코드에서 직접 적어도 됨!

메소드 재정의

부모 클래스의 모든 메소드가 자식 클래스에게 맞게 설계된 것은 아니다. 이러한 메소드를 재정의해서 사용하는 것을 메소드 오버라이딩이라고 한다.

메소드 오버라이딩(Overriding)

→ 상속된 메소드를 자식 클래스에서 재정의하는 것. 오버라이딩 된 부모 메소드는 숨겨지고, 자식 메소드가 우선적으로 사용된다.

💡 메소드 오버라이딩 규칙 1. 부모 메소드의 선언부 (리턴 타입, 메소드 이름, 매개변수)와 동일해야 한다. 2. 접근 제한을 더 강하게 오버라이딩 할 수 없다. (ex. public → private ❌) 3. 새로운 예외를 throws 할 수 없다.
  • 다만 자바에 한해, ✅ 리턴 타입이 원시형이 아닌 경우 ✅ 상위 클래스의 메서드의 반환형으로 오버라이드된 메서드의 반환형이 자동 형변환이 가능한 경우 두 가지를 만족하면 리턴 타입이 달라도 오버라이딩이 가능하다.

부모 메소드 호출

메소드를 재정의하면, 부모 메소드는 숨겨지고 자식 메소드만 사용되기 때문에 비록 부모 메솓의 일부만 변경된다 하더라도 중복된 내용을 자식 메소드도 가지고 있어야 한다.

→ 자식 메소드 내에서 super 키워드와 도트 연산자를 사용해 부모 메소드를 호출하면 해결!

class Parent {
	public void method() { }
}

class Child extends Parent {
	@Override
	public void method() {
		super.method();
		// 작업 처리
	}
}
  • super.method()의 위치는 작업 처리 전후에 어디든지 올 수 있다. 우선 처리가 되어야 할 내용을 먼저 작성하면 된다!

final 클래스와 final 메소드

final 클래스

클래스를 선언할 때 final 키워드를 class 앞에 붙이며 최종적인 클래스이므로 더 이상 상속할 수 없는 클래스가 된다.

= final 클래스는 부모 클래스가 될 수 없다.

final 메소드

final 메소드는 최종적인 메소드이므로 오버라이딩 할 수 없는 메소드가 된다.


타입 변환

자동 타입 변환

부모타입 변수 = 자식타입객체;

→ 자식객체가 부모 타입으로 자동 변환된다.

자식은 부모의 특징과 기능을 상속받기 때문에 부모와 동일하게 취급될 수 있다.

// Cat 클래스가 Animal 클래스를 상속 받은 경우
Cat cat= new Cat();
Animal animal = cat;
Animal animal = new Cat();

cat == animal //true

부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드와 메소드만 접근이 가능하다. 변수는 자식 객체를 참조하지만, 변수로 접근 가능한 멤버는 부모 클래스 멤버로 한정된다.

✅ 하지만, 자식 클래스에서 오버라이딩된 메소드가 있다면 부모 메소드 대신 오버라이딩 된 메소드가 호출된다. → 다형성과 관련 있음!

💡 왜 오버라이딩 메소드에만 접근이 가능할까? (간단편) 다형성은 **한 타입의 참조 변수를 통해 여러 타입의 객체를 참조할 수 있도록 하는 것이다**. 즉, 상위 클래스 타입의 참조 변수를 통해서 하위 클래스의 객체를 참조할 수 있도록 허용하여 상위 클래스가 동일한 메시지로 하위 클래스들이 서로 다른 동작을 할 수 있도록 한다.
  • 부모를 상속 받는 자식은 여러 명일 수 있다. 따라서 오버라이딩을 사용하게 되면 참조변수 하나로 모든 자식 클래스의 것을 가져다 사용할 수 있게 된다.
  • 부모 타입에 여러 자식 객체를 대입해서 객체를 부품화 하기 위해서 사용

강제 타입 변환

자식타입 변수 = (자식타입) 부모타입객체;

캐스팅 연산자를 통해 강제 타입 변환(Casting)을 할 수 있다.

물론, 무조건 강제 변환할 수 있는 것은 아니다. 자식 객체가 부모 타입으로 자동 변환된 후 다시 자식 타입으로 변환할 때! 강제 타입 변화를 사용할 수 있다.

profile
차곡 차곡 기록 쌓기

0개의 댓글