GiantStepDEV

닀쀑 μΈν„°νŽ˜μ΄μŠ€μ™€ 상속이 λ™μ‹œμ— 적용될 μˆ˜λ„ μžˆλ‹€.

(이둠적으둜 μΈν„°νŽ˜μ΄μŠ€ 상속은 λ¬΄ν•œνžˆ κ°€λŠ₯, 상속은 ν•˜λ‚˜λ§Œ)

 

  • 에어컨 μΈν„°νŽ˜μ΄μŠ€ (ON/OFF, μ˜¨λ„ μ„€μ •)
  • μžμœ¨μš΄μ „ μΈν„°νŽ˜μ΄μŠ€
  • μ ‘κ·Όμ œν•œμžλŠ” protected

AirCon

public interface AirCon {
    int MAX_TEMP = 30;
    int MIN_TEMP = 0;

    void airConON();
    void airConOFF();
    void setAirConTemp(int tmp);
}
  • int MAX_TEMP, int MIN_TEMP
    μΈν„°νŽ˜μ΄μŠ€ ε…§ ν•„λ“œλŠ” μΈμŠ€ν„΄μŠ€ ν•„λ“œ X, μΈν„°νŽ˜μ΄μŠ€ μ†Œμ†O
    μ•žμ— public final static이 숨겨져 있음
  • void airConON();
    μžλ™μœΌλ‘œ μΆ”μƒλ©”μ†Œλ“œκ°€ 되며 μ•žμ— abstract 숨겨져 있음

AutoDrive

public interface AutoDrive {
    void autoDrvieON();
    void autoDriveOFF();
}

Car

public class Car {
    protected int speed;
    protected String color;
    protected String year;

    public Car() {
        this.speed = 150;
        this.color = "white";
        this.year = "2022";
    }
}
  • protected int speed;
    μΈμŠ€ν„΄μŠ€ ν•„λ“œ, 객체 μ†Œμ†
    protected μ ‘κ·Ό μ œν•œμžλŠ” 동일 νŒ¨ν‚€μ§€ ν˜Ήμ€ 상속 κ΄€κ³„μ—μ„œ μ ‘κ·Ό κ°€λŠ₯

SportsCar

public class SportsCar extends Car implements AirCon, AutoDrive{
    private boolean isAirCon; // ON/OFF
    private int setTemp;
    private boolean isAutoDrive;
    private boolean isTurbo;

    public SportsCar(boolean isAirCon, int setTemp, boolean isAutoDrive, int speed, String color,
              String year, boolean isTurbo) {
        this.isAirCon = isAirCon;
        this.setTemp = setTemp;
        this.isAutoDrive = isAutoDrive;
        this.speed = speed;
        this.color = color;
        this.year = year;
        this.isTurbo = isTurbo;
    }
    public void viewInfo() {
        String airConStr = (isAirCon) ? "ON" : "OFF";
        String autoStr = (isAutoDrive) ? "ON" : "OFF";
        String turboStr = (isTurbo) ? "ON" : "OFF";
        System.out.println("속도 : " + speed);
        System.out.println("색상 : " + color);
        System.out.println("연도 : " + year);
        System.out.println("에어컨 : " + airConStr);
        System.out.println("μžμœ¨μ£Όν–‰ : " + autoStr);
        System.out.println("μ˜¨λ„ : " + setTemp);
        System.out.println("터보λͺ¨λ“œ : " + isTurbo);
    }

    @Override
    public void airConON() {
        System.out.println("에어컨을 μΌ°μŠ΅λ‹ˆλ‹€.");
    }

    @Override
    public void airConOFF() {
        System.out.println("에어컨을 κ»μŠ΅λ‹ˆλ‹€.");
    }

    @Override
    public void setAirConTemp(int tmp) {
        System.out.println("에어컨 μ„€μ • μ˜¨λ„λ₯Ό " + tmp + "둜 λ³€κ²½ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.");
    }

    @Override
    public void autoDrvieON() {
        System.out.println("자율 μ£Όν–‰ λͺ¨λ“œλ₯Ό μΌ°μŠ΅λ‹ˆλ‹€.");
    }

    @Override
    public void autoDriveOFF() {
        System.out.println("자율 μ£Όν–‰ λͺ¨λ“œλ₯Ό κ»μŠ΅λ‹ˆλ‹€.");
    }
}
μΈν„°νŽ˜μ΄μŠ€μ™€ 상속이 λ™μ‹œμ— 적용 κ°€λŠ₯ν•˜λ‹€λŠ” 것을 μ•„λŠ” 것이 μ€‘μš”
κ·Έλ‹€μ§€ μ€‘μš”ν•œ μ˜ˆμ œμ½”λ“œλŠ” μ•„λ‹˜.

Main

public class Main {
    public static void main(String[] args) {
        SportsCar sportsCar = new SportsCar(true, 20, true, 100,
                "black","2023",false);
        sportsCar.viewInfo();
    }
}
속도 : 100
색상 : black
연도 : 2023
에어컨 : ON
μžμœ¨μ£Όν–‰ : ON
μ˜¨λ„ : 20
터보λͺ¨λ“œ : false

μΈν„°νŽ˜μ΄μŠ€ ν™œμš©

ν•œ ν΄λž˜μŠ€κ°€ μ—¬λŸ¬ 클래슀둜 λΆ€ν„° 상속을 λ°›μœΌλ©΄ μ—¬λŸ¬κ°€μ§€ 문제 λ°œμƒ
μžλ°”λŠ” 이런 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ ν•œ ν΄λž˜μŠ€κ°€ μ—¬λŸ¬ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•  수 있음.

Buy

public interface Buy {
    void buy();
    default void order() {
        System.out.println("ꡬ맀 주문");
    }
}
  • μΈν„°νŽ˜μ΄μŠ€λŠ” κ΅¬ν˜„λΆ€λ₯Ό κ°€μ§ˆ 수 μ—†μ§€λ§Œ μ˜ˆμ™Έμ μœΌλ‘œ default λ©”μ†Œλ“œλŠ” κ΅¬ν˜„λΆ€{}κ°€ 있음.
    μ΄λ‘ μ μœΌλ‘œλŠ” 각 μΈν„°νŽ˜μ΄μŠ€κ°€ μ€‘λ³΅λœ default λ©”μ†Œλ“œλ₯Ό κ°€μ§ˆ 수 μžˆλ‹€.
    λ‹€λ§Œ, 이럴 경우 λ‚˜νƒ€λ‚  수 μžˆλŠ” λ¬Έμ œλŠ” μ•„λž˜ μ½”λ“œλ₯Ό 톡해 확인

Sell

public interface Sell {
    void sell();
    default void order() {
        System.out.println("판맀 주문");
    }
}

Customer

public class Customer implements Buy, Sell{
    @Override
    public void buy() {
        System.out.println("κ΅¬λ§€ν•˜κΈ°");
    }

    @Override
    public void order() {
        System.out.println("고객 주문");
    }

    @Override
    public void sell() {
        System.out.println("νŒλ§€ν•˜κΈ°");
    }
}
  • μ›λž˜ default λ©”μ†Œλ“œλŠ” μžμ‹ ν΄λž˜μŠ€μ—μ„œ μ˜€λ²„λΌμ΄λ”©μ„ 해도 되고, μ•ˆν•΄λ„ λ˜μ§€λ§Œ 각 μΈν„°νŽ˜μ΄μŠ€μ—μ„œ 같은 λ©”μ†Œλ“œλ₯Ό default ν•˜λ©΄ μžμ‹ ν΄λž˜μŠ€μ—μ„œ λͺ¨μˆœμ΄ 생겨버림.
  • λ”°λΌμ„œ, λͺ¨μˆœμ„ ν”Όν•˜κΈ° μœ„ν•΄ ν•΄λ‹Ή λ©”μ†Œλ“œλ₯Ό λ°˜λ“œμ‹œ μ˜€λ²„λΌμ΄λ”© ν•΄μ€˜μ•Ό 함.
    μœ„μ˜ default void order(){} λ©”μ†Œλ“œ 처럼..(각 μžμ‹ ν΄λž˜μŠ€μ—μ„œ μ˜€λ²„λΌμ΄λ”© μ•ˆν•˜λ©΄ 였λ₯˜λœΈ)
μžμ‹ ν΄λž˜μŠ€μ—μ„œ μ˜€λ²„λΌμ΄λ”© ν•˜λŠ” μˆœκ°„ λΆ€λͺ¨ ν΄λž˜μŠ€μ— μžˆλŠ” default λ©”μ†Œλ“œλŠ” 사라져 버림.
Main2 ν΄λž˜μŠ€μ—μ„œ 확인 κ°€λŠ₯!

Main1

public class Main {
    public static void main(String[] args) {
        // 1번
        Customer customer = new Customer();
        Buy buyer = customer;
        buyer.buy();

        // 2번
        Buy buyer2 = new Customer();
        buyer2.buy();

        // 3번
        Sell sell = customer;
        sell.sell();
        
        // 4번
        Customer customer1 = (Customer) sell;
        customer1.buy();
        customer1.sell();
    }
}
  1. Buy buyer = customer;
    Customer νƒ€μž…μ˜ customer μ°Έμ‘°λ³€μˆ˜λ₯Ό Buy μΈν„°νŽ˜μ΄μŠ€ν˜• buyer μ°Έμ‘°λ³€μˆ˜μ— λŒ€μž…(casting λ°œμƒ)
    Buy와 Customerκ°€ 상속 κ΄€κ³„λ‘œ 있기 λ•Œλ¬Έμ— ν˜•λ³€ν™˜ κ°€λŠ₯함.
    buyer.buy(); buyerλŠ” Buy μΈν„°νŽ˜μ΄μŠ€μ˜ λ©”μ†Œλ“œλ§Œ 호좜 κ°€λŠ₯
  2. Buy buyer2 = new Customer();
    1번, 2번 κ°™μŒ
  3. Sell sell = customer;
    1번과 같이 λΆ€λͺ¨μ—μ„œ μžμ‹μœΌλ‘œμ˜ ν˜•λ³€ν™˜μ€ μžλ™μœΌλ‘œ 일어남
    sell.sell(); 이것도 1번과 같이 Sell μΈν„°νŽ˜μ΄μŠ€κ°€ μ•Œκ³ μžˆλŠ” λ©”μ†Œλ“œλ§Œ μ ‘κ·Ό κ°€λŠ₯
  4. Customer customer1 = (Customer) sell;
    λ‹€μ‹œ μ—­μœΌλ‘œ ν˜•λ³€ν™˜, μžμ‹μ΄ λΆ€λͺ¨λ‘œ λ³€ν™˜ν•  λ•ŒλŠ” λͺ…μ‹œμ μœΌλ‘œ ν•΄μ•Ό 함.
    이λ₯Ό 'λ‹€μš΄ μΊμŠ€νŒ…'이라고 ν•œλ‹€.

Main2

public class Main2 {
    public static void main(String[] args) {
        Customer customer = new Customer();

        Buy buyer = customer;
        buyer.buy();
        buyer.order(); // Customer ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜λœ λ©”μ†Œλ“œκ°€ 호좜 됨.

        Sell seller = customer;
        seller.order(); // 동일
    }
}
κ΅¬λ§€ν•˜κΈ°
고객 주문
고객 주문
  • μ•žμ„œ λ§ν–ˆλ˜ 것 처럼 Customer ν΄λž˜μŠ€κ°€ Buy, Sell 두 μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜κ³  Buy μΈν„°νŽ˜μ΄μŠ€μ™€ Sell μΈν„°νŽ˜μ΄μŠ€μ— λ˜‘κ°™μ€ default order() λ©”μ†Œλ“œλ₯Ό κ°€μ§€λŠ” 경우 λ¬Έμ œκ°€ λœλ‹€.
  • 이 경우, μƒμ†λ°›λŠ” Customer ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜ν•΄μ„œ μ‚¬μš©ν•΄μ•Ό 함.
μž¬μ •μ˜ν•œ λ’€ mainμ—μ„œ 각 μΈν„°νŽ˜μ΄μŠ€ 객체λ₯Ό μƒμ„±ν•΄μ„œ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄
μžμ‹ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜ν•œ λ©”μ†Œλ“œκ°€ 호좜됨

 

profile

GiantStepDEV

@kongmi

ν¬μŠ€νŒ…μ΄ μ’‹μ•˜λ‹€λ©΄ "μ’‹μ•„μš”β€οΈ" λ˜λŠ” "κ΅¬λ…πŸ‘πŸ»" ν•΄μ£Όμ„Έμš”!