Java

Java(6) 상속

hyomee2 2024. 8. 7. 17:43

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