1. 상속이란?
: 부모 클래스가 가지는 멤버(필드, 메소드)를 자식 클래스가 물려받아 자신의 멤버인 것처럼 사용할 수 있도록 만든 기술
- 생성자는 물려받지 않는다.
- 부모 클래스의 private 멤버는 상속되지 않는다.
(하지만 부모 클래스가 private 멤버에 대한 접근을 제공하는 protected 또는 public 메서드를 정의하면,
자식클래스는 이를 통해 간접적으로 private 멤버에 접근 가능)
- 멤버 외에도 부모 클래스의 타입도 상속된다. (다형성의 토대)
- 상속 구조로 인해 불필요한 기능이 추가될 수도 있다.
- 자바는 단일상속(자식 클래스는 하나의 부모 클래스만 갖는다.)만 지원한다.
2. 상속의 키워드
(1) IS-A
- IS-A 관계가 성립하는 경우 상속 사용 가능
ex) FireCar is a Car.
RacingCar is a Car.
(2) super와 super()
1) super
: 부모 인스턴스의 주소를 보관하는 레퍼런스 변수
(자식 클래스에서 인스턴스 생성 시 부모 생성자를 호출하여 부모 클래스의 인스턴스도 함께 생성함)
- 자식 클래스 내의 모든 생성자와 메소드 내에서 묵시적으로 사용가능한 레퍼런스 변수
@Override
public String getInformation() {
return super.getInformation()
+ "Computer ["
+ "cpu=" + this.cpu
+ ", hdd=" + this.hdd
+ ", ram=" + this.ram
+ ", operationSystem=" + this.operationSystem
+ "]";
}
2) super()
: 인자, 매개변수의 타입, 갯수, 순서가 일치하는 부모 생성자를 호출하는 구문
- 부모 클래스가 가지는 private 생성자를 제외한 나머지 생성자를 호출할 수 있도록 한 구문
(3) 오버라이딩
: 부모클래스에서 상속받은 메소드를 자식 클래스가 재정의하여 사용하기 위한 기술
1) 오버라이딩 성립 조건
- 메소드명 동일
- 메소드 리턴 타입 동일
- 매개변수의 타입, 개수, 순서 동일
- 부모 클래스의 private 메소드는 오버라이딩 불가
- 부모 클래스의 final 키워드가 사용된 메소드는 오버라이딩 불가
- 접근 제어자는 부모 메소드와 같거나 더 넓은 범위여야 한다.
ex) protected -> default는 더 좁은 범위로의 변경이라 불가
protected -> public으로 변경 시 더 넓은 범위로의 변경이라 가
- 예외처리는 같은 예외이거나 더 구체적(하위)인 예외를 처리해야 한다.
public class Car {
private boolean runningStatus;
public Car(){
super();
System.out.println("Car 클래스의 기본 생성자 호출");
}
public void run() {
runningStatus = true;
System.out.println("자동차가 달립니다.");
}
public void stop() {
runningStatus = false;
System.out.println("자동차가 멈춥니다.");
}
public void soundHorn() {
if(isRunning()) {
System.out.println("빵!빵!");
} else {
System.out.println("주행 중이 아닌 상태에서는 경적을 울릴 수 없습니다.");
}
}
/*private*/ protected boolean isRunning() { return runningStatus; }
}
public class FireCar extends Car {
public FireCar() {
// 부모의 기본 생성자를 호출하는 구문으로 명시적/묵시적으로 사용 가능하다.
// 자바에서 모든 클래스는 Object 클래스의 후손이다.
// 모든 생성자 위에는 super()가 묵시적으로 사용되고 있었던 것이다. (캄파일러가 자동으로 추가)
super(); // 생략 가능
System.out.println("FireCar 클래스 기본 생성자 호출");
}
// soundHorn 메소드 재작성 (overriding)
// @Override 어노테이션 : 오버라이딩 성립 요건을 체크하여 성립 되지 않는 경우 컴파일 에러를 발생시킨다.
// 부모 클래스에서 상속받은 메소드를 자식 클래스에 맞게 기능하게끔 오버라이딩해서 사용 가능.
// 추가적인 기능을 정의하여 부모 클래스 확장도 가능.
@Override
public void soundHorn() {
if(isRunning()) {
System.out.println("빠아아앙~!!!!빠아아앙~~!!!!");
} else {
System.out.println("소방차가 앞으로 갈 수 없습니다. 비키세요.");
}
}
// 상속은 자식 클래스가 부모 클래스를 확장하는 것이므로 FireCar만의 추가 기능도 작성 가능
public void sprayWater() {
System.out.println("물을 뿌립니다 ====================>>>>>>>>>>>>>>>");
}
}
public class Application {
public static void main(String[] args) {
Car car = new Car();
car.soundHorn();
car.run();
car.soundHorn();
car.stop();
car.soundHorn();
FireCar fireCar = new FireCar();
fireCar.soundHorn();
fireCar.run();
fireCar.soundHorn();
fireCar.stop();
fireCar.soundHorn();
fireCar.sprayWater();
// car.sprayWater(); -> 부모는 자식의 멤버에 접근해서 사용할 수 없다.
}
}
'Java' 카테고리의 다른 글
Java(8) 추상클래스와 인터페이스 (0) | 2024.08.08 |
---|---|
Java(7) 다형성 (0) | 2024.08.08 |
Java(5) final (0) | 2024.08.07 |
Java(4) 클래스와 객체 (0) | 2024.08.07 |
Java(3) API(Application Programming Interface) (0) | 2024.08.06 |