티스토리 뷰

상속은 부모 클래스와 자식 클래스 관계에서 자식 클래스가 부모 클래스의 속성과 기능을 그대로 물려 받는 것이다.
상속에서의 생성자 호출 방식과 왜 상속을 사용해야하는지, 상속을 사용할 때 주의해야할 점은 무엇이 있는지 알아보려고 한다.
상속 관계에서의 생성자 호출
자식 클래스의 어떠한 생성자도 명시적으로 선언되어있지 않다면 컴파일러는 자식클래스에 기본 생성자를 생성한다.
public HybridCar {
public HybridCar() {
super();
}
}
super()는 부모의 기본 생성자를 호출한다. 이때, 부모 클래스의 생성자가 아무것도 선언되어있지 않다면 컴파일러가 자동으로 기본 생성자를 생성하기 때문에 문제가 되지 않지만 매개변수를 포함하는 생성자가 있는 경우에는 기본 생성자를 명시적으로 선언해줘야한다.
public class Car {
private String brand;
public Car(String brand) {
this.brand = brand;
}
}
public class HybridCar extends Car {
public HybridCar() {
super("hyundai");
}
//잘못 된 생성자
//컴파일 오류: Call to 'super()' must be first statement in constructor body
public HybridCar(String brand) {
System.out.println("자식 클래스 생성자 호출"); //super() 보다 먼저 오면 안됨.
super(brand); //무조건 생성자의 첫번째 라인에 위치해야한다.
}
}
부모 클래스가 매개변수를 포함하는 생성자만 선언되어있는 경우에는 super(매개변수)로 부모 클래스의 생성자를 호출해야한다. 이때, 매개변수의 타입과 일치하는 부모 생성자가 없을 경우에는 컴파일 에러가 발생한다.
또한, super() 코드는 반드시 자식 클래스의 생성자 첫 줄에 위치해야 한다.
만약, 자식 클래스의 생성자에서 부모 클래스의 생성자를 명시적(super)으로 호출하지 않았다면 컴파일러는 자동으로 부모 클래스의 기본 생성자를 호출한다.
public class Car {
private String brand;
//기본 생성자
public Car() {}
//매개변수 포함 생성자
public Car(String brand) {
this.brand = brand;
}
public String getBrand() {
return this.brand;
}
}
public class HybridCar extends Car {
public HybridCar(String brand) {
//부모 클래스 생성자를 호출하지 않음
}
}
Car car = new HybridCar();
System.out.println(car.getBrand()); //null이 나옴
자식 클래스에서 매개변수가 있는 생성자로부터 부모클래스의 어떠한 생성자를 호출하지 않으면 자바에서는 자동으로 부모 클래스의 기본 생성자를 호출한다.
위 예시에서 부모 클래스 내에 brand 필드를 선언되어있다. 이는 자식 클래스로부터 값을 받아서 저장해야하는데 자식 클래스에서 부모 클래스의 생성자를 호출하지 않았으므로 해당 필드값은 null이다.
상속을 사용하는 이유
1. 코드의 확장성과 재사용성
공통적인 속성과 기능을 상위 클래스에 정의하고, 이를 하위 클래스에서 재사용함으로써 유지보수성과 확장성을 높이고 다형성을 활용할 수 있게 한다.
public class HybridCar {
public void drive() {
System.out.println("자동차가 주행합니다");
}
public void switchToGasolineMode() {
System.out.println("가솔린 모드로 전환합니다");
}
}
public class ElectricCar {
public void drive() {
System.out.println("자동차가 주행합니다");
}
}
두 클래스는 drive 라는 공통된 메서드를 가지며, 구현 내용도 동일하기 때문에 중복 코드로 확인할 수 있다.
만약 다른 종류의 자동차 클래스를 추가해야한다고 가정해본다.
그럼 새로운 자동차 클래스에도 공통된 속성과 기능에 대해서도 구현해줘야한다. 이때, 발생할 수 있는 문제점은 공통된 속성과 기능에 대해서 구현을 못하여 기능의 일관성이 깨질 수 있고 구현했다고 하더라도 중복 코드는 발생한다는 것이다.
따라서 Car라는 상위 클래스를 만들어 공통된 속성과 기능을 정의하고, 자식 클래스가 이를 활용하는 방식으로 변경하는 것이 효율적일것이다. 이는 중복 코드를 줄이고, 유지보수와 확장성이 용이해진다.
public class Car {
int wheels;
public void drive() {
System.out.println("자동차가 주행합니다");
}
}
public class HybridCar extends Car {
public void switchToGasolineMode() {
System.out.println("가솔린모드로 전환합니다");
}
//부모 클래스의 메서드 재정의
@Override
public void drive() {
System.out.println("하이브리드차가 주행합니다");
}
}
public class ElectricCar extends Car {
//부모 클래스의 메서드 재정의
@Override
public void drive() {
System.out.println("전기차가 주행합니다");
}
}
Car 라는 부모클래스를 생성하고, HybridCar와 ElectricCar라는 자식클래스가 Car 클래스를 상속받도록 하였다.
drive 라는 공통 메서드를 부모 클래스인 Car 클래스에 정의하고 자식 클래스들이 필요에 따라 공통 메서드를 재 정의할 수 있으며, 새로운 종류의 자동차 클래스 생성시에도 쉽게 확장할 수 있다.
또한, 자식 클래스는 부모의 속성과 기능을 사용할 수 있을 뿐만 아니라 자신에게 필요한 속성과 기능을 추가적으로 구현하여 사용할 수 있다.
2. 다형성
2024.10.20 - [Language/Java] - 객체지향의 다형성
객체지향의 다형성
객체지향의 특징 중 다형성이 상속과 인터페이스에서 각각 어떻게 구현되는지 알아보려고 한다. 타입 변환상속과 인터페이스의 다형성에서 동일하게 적용되는 기술은 타입 변환이다.타입 변
yeongnius.tistory.com
상속을 사용할 때 주의해야할 점
상속은 카테고리화된 관계에서만 사용해야한다.
다중 상속을 허용하지 않는다.
두 개의 부모 클래스가 동일한 기능을 갖고 있을 때, 자식 클래스가 이 두 부모 클래스를 상속받으려고 하면 문제가 발생할 수 있다. 동일한 기능에 대해서 어떤 부모 클래스를 상속받아야 할지 혼란스러울 수 있기 때문에, 다중 상속은 허용하지 않는다.
class ElectricCar {
void drive() {
System.out.println("가솔린차 주행합니다");
}
}
class GasolineCar {
void drive() {
System.out.println("가솔린차 주행합니다");
}
}
//컴파일 실패: Class cannot extend multiple classes
class HybridCar extends ElectricCar, GasolineCar {
// 어떤 drive 메서드를 상속받아야 할지 모른다.
}
'Language > Java' 카테고리의 다른 글
Object 클래스 (0) | 2024.11.05 |
---|---|
예외와 에러에 대하여 (5) | 2024.11.03 |
인터페이스에 대하여 (0) | 2024.10.27 |
추상클래스와 인터페이스 (0) | 2024.10.22 |
싱글톤(Singleton)에 대하여 (0) | 2024.10.20 |
- Total
- Today
- Yesterday
- Security
- 자동구성
- Sticky Session
- java
- 인스턴스변수
- 고정 세션
- 다중화
- HashSet
- 로드 밸런서
- 추상클래스
- nosql
- object
- fail-safe
- AutoConfiguration
- nginx
- @conditional
- Caching
- Load Balancer
- spring boot
- syncronized
- Red-Black Tree
- JPA
- 오블완
- 티스토리챌린지
- Hash
- fail-fast
- 인터페이스
- Spring
- HashMap
- 정적변수
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |