티스토리 뷰

1. 상속의 정의 및 사용 이유

1-1. 상속(Inheritance)이란?

💡 부모 클래스가 가지는 멤버(필드, 메소드)를 자식 클래스가 물려 받아 자신의 멤버인 것처럼 사용할 수 있도록 만든 기술.(단, 생성자는 물려 받지 않음)
멤버 외에도 부모 클래스의 타입 또한 상속이 된다.(다형성의 토대)
자바는 단일상속(자식 클래스는 하나의 부모 클래스만 가지는)만 지원.

계속 상속받으면...(스파게티 코딩)
a, b 모두 받고 싶으면 할아버지 만들어야한다. / 자식은 단일 아니여도 된다. 여러 자식 가질 수 있다.

package com.ohgiraffers.section01.extend;

public class Application {
    public static void main(String[] args) {

        /* 수업목표. 상속에 대해 이해할 수 있다. */
        // 다형성을 적용하기 위한 문법적 토대가 상속이다!
        Car car = new Car();

        car.soundHorn();
        car.run();
        car.soundHorn();
        car.stop();
        car.soundHorn();

        System.out.println();

        FireCar fireCar = new FireCar();
        fireCar.soundHorn();
        fireCar.run();
        fireCar.soundHorn();
        fireCar.stop();
        fireCar.soundHorn();
        fireCar.sprayWater();

        System.out.println();

        RacingCar racingCar = new RacingCar();
        racingCar.soundHorn();
        racingCar.run();
        racingCar.soundHorn();
        racingCar.stop();
        racingCar.soundHorn();

    }
}

// 실행 결과
Car 클래스의 기본 생성자 호출됨...
주행중이 아닐 때는 경적을 울릴 수 없습니다.
자동차가 달리기 시작합니다.
빵! 빵!
자동차가 멈춥니다.
주행중이 아닐 때는 경적을 울릴 수 없습니다.

Car 클래스의 기본 생성자 호출됨...
FireCar 클래스의 기본 생성자 호출됨...
빠아아아아아아앙!!~ 빠아아아아아아앙!!
자동차가 달리기 시작합니다.
빠아아아아아아앙!!~ 빠아아아아아아앙!!
자동차가 멈춥니다.
빠아아아아아아앙!!~ 빠아아아아아아앙!!
불난 곳을 발견했습니다. 물을 뿌립니다. ===========3

Car 클래스의 기본 생성자 호출됨...
레이싱카는 경적따위 울리지 않습니다.
레이싱 자동차가 신나게 달립니다. 쌔애애앵!~
레이싱카는 경적따위 울리지 않습니다.
자동차가 멈춥니다.
레이싱카는 경적따위 울리지 않습니다.
package com.ohgiraffers.section01.extend;

public class Car {  // 자동차라면 필요한 기능들..

    private boolean runningStatus;

    public Car() {
        super();    // 모든 클래스는 부모를 가지고 있다. Object 클래스!
        System.out.println("Car 클래스의 기본 생성자 호출됨...");
    }

    public void run() {
        runningStatus = true;
        System.out.println("자동차가 달리기 시작합니다.");
    }

    public void soundHorn() {
        if(runningStatus) {
        System.out.println("빵! 빵!");
        } else {
            System.out.println("주행중이 아닐 때는 경적을 울릴 수 없습니다.");
        }
    }

    public boolean isRunning() {
        return runningStatus;
    }

    public void stop() {
        runningStatus = false;
        System.out.println("자동차가 멈춥니다.");
    }
}
package com.ohgiraffers.section01.extend;

public class FireCar extends Car {      // 자바는 단일 상속만 지원!

    public FireCar() {

        /* 설명. 부모로부터 생성자는 물려받지 않고 super()를 통해 부모 객체 먼저 생성 */
        super();        // 안적어도 자동으로 생성 되는 구문
        System.out.println("FireCar 클래스의 기본 생성자 호출됨...");
    }

    /* 설명. 부모로부터 물려받는 필드 및 메소드 외에 기능 하나 더 추가(확장) */
    public void sprayWater() {
        System.out.println("불난 곳을 발견했습니다. 물을 뿌립니다. ===========3");
    }

    @Override       // @ : Annotation

    /* 필기.
    *   @Override 어노테이션을 추가하는 이유?
    *   1. 메소드 중에 부모로부터 물려받은 메소드인 것을 한 눈에 알아보기 쉽게 하기 위해서(가독성 추천)
    *   2. 부모의 메소드를 오버라이딩할 때 발생할 수 있는 실수를 방지하기 위해서(실수방지 측면)
    *  */
    public void soundHorn() {
        System.out.println("빠아아아아아아앙!!~ 빠아아아아아아앙!!");
    }
}
package com.ohgiraffers.section01.extend;

public class RacingCar extends Car {

    // 생성자 안적으면
//    public RacingCar() {
//        super();
//    }
    // 위의 부분 적혀있는거다!

    @Override
    public void run() {
        System.out.println("레이싱 자동차가 신나게 달립니다. 쌔애애앵!~");
    }

    @Override
    public void soundHorn() {
        System.out.println("레이싱카는 경적따위 울리지 않습니다.");
    }
}

 

1-2. 상속을 사용하는 이유

  1. 기존에 작성된 클래스의 멤버를 재사용할 수 있다.
  2. 클래스 간 계층 관계를 형성하여 다형성 문법의 토대가 된다. → 아직 상속 쓰는 이유

→ 잘 사용하면 유지보수에 도움 but 무분별하게 사용하면 되려 계층 구조 파악 및 정상 동작을 예측하기 힘들어 유지보수에 어려움 초래

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/10   »
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 31
글 보관함