GiantStepDEV
article thumbnail

상속(Inheritance)

μžμ‹ ν΄λž˜μŠ€κ°€ λΆ€λͺ¨ 클래슀의 κΈ°λŠ₯을 κ·ΈλŒ€λ‘œ 물렀받을 수 μžˆλŠ” κΈ°λŠ₯
μ•„λž˜ μ½”λ“œμ²˜λŸΌ 상속을 μ΄μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” extends ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©

 

μƒμ†μ˜ μž₯점

  1. 기쑴에 μž‘μ„±λœ 클래슀 μž¬ν™œμš©
  2. 쀑볡 μ½”λ“œ μž‘μ„± μ•ˆν•΄λ„ 됨
  3. 클래슀 κ°„μ˜ 계측적 관계λ₯Ό κ΅¬μ„±ν•¨μœΌλ‘œμ¨ λ‹€ν˜•μ„± ν† λŒ€κ°€ 됨

μžλ°”μ˜ 상속 방식

  • 닀단계 상속 및 계측적 상속을 지원, 닀쀑 상속은 지원X
  • ν•˜μ§€λ§Œ, interfaceλ₯Ό ν†΅ν•΄μ„œ 닀쀑 상속과 μœ μ‚¬ν•œ ν˜•νƒœμ˜ 상속 κΈ°λŠ₯ 제곡

package 상속기본0113;

public class BasicInheritance {
    public static void main(String[] args) {
        HouseDog houseDog = new HouseDog();
        houseDog.setName("백호");
        houseDog.sleep();
        houseDog.sleep(4);
    }
}
package 상속기본0113;
public class Animal {
    String name;
    void setName(String name) {
        this.name = name;
    }
}

class Dog extends Animal {
    void sleep() {
        System.out.println(name + "은(λŠ”) μž μ„ μž‘λ‹ˆλ‹€.");
    }
}
class HouseDog extends Dog {
    @Override // (μ–΄λ…Έν…Œμ΄μ…˜) μ˜€λ²„λΌμ΄λ“œ ν–ˆλ‹€λŠ” κ±Έ κ΄€λ‘€μ μœΌλ‘œ μ•Œλ €μ£ΌλŠ” 것
    void sleep() {
        System.out.println(name + "은(λŠ”) μ§‘μ—μ„œ μž μ„ μž‘λ‹ˆλ‹€.");
    }
    // μ˜€λ²„λ‘œλ”© 관계가 성립함
    void sleep(int time) {
        System.out.println(name + "κ°€(이) " + time + "μ‹œκ°„ λ™μ•ˆ μ§‘μ—μ„œ μž μ„ μž‘λ‹ˆλ‹€.");
    }
}

  • @Override : ν‘œμ€€ μ–΄λ…Έν…Œμ΄μ…˜ 쀑 ν•˜λ‚˜λ‘œ, 사전적 μ˜λ―Έλ‘œλŠ” μ£Όμ„μ΄λΌλŠ” λœ»μ„ κ°€μ§€κ³  μžˆλ‹€.
    κΌ­ 써야 ν•˜λŠ” 것은 μ•„λ‹ˆκ³ , κ΄€λ‘€μ μœΌλ‘œ Override ν–ˆλ‹¨ 것을 μ•Œλ €μ£ΌλŠ” μš©λ„
  • μžμ‹ ν΄λž˜μŠ€μ—μ„œ μ•„λ¬΄λŸ° κΈ°λŠ₯ κ΅¬ν˜„ν•˜μ§€ μ•Šμ•„λ„ μžλ™μœΌλ‘œ λΆ€λͺ¨μ˜ ν•„λ“œμ™€ λ©”μ†Œλ“œκ°€ 포함됨.

final ν΄λž˜μŠ€μ™€ final λ©”μ†Œλ“œ

final ν‚€μ›Œλ“œλŠ” 클래슀, ν•„λ“œ, λ©”μ†Œλ“œ μ„ μ–Έμ‹œ μ‚¬μš© κ°€λŠ₯.
final ν‚€μ›Œλ“œλŠ” ν•΄λ‹Ή 선언이 μ΅œμ’… μƒνƒœμ΄κ³  μˆ˜μ • λΆˆκ°€ν•¨μ„ λ‚˜νƒ€λƒ„.
package μ˜€λ²„λΌμ΄λ”©μ œμ•½0113;
public class FinalOverriding {
    public static void main(String[] args) {
        SportsCar sportsCar = new SportsCar("람보λ₯΄κΈ°λ‹ˆ");
        sportsCar.setTurbo(true);
        sportsCar.infoCar();
        sportsCar.accelerator();
        sportsCar.breakPanel();

        ElectricCar electricCar = new ElectricCar("ν…ŒμŠ¬λΌ");
        electricCar.setAutoDrv(true);
        electricCar.infoCar();
    }
}
package μ˜€λ²„λΌμ΄λ”©μ œμ•½0113;
public class Vehicle {
    protected int speed;
    protected String color;
    protected String name;
   
    final void accelerator() {
        System.out.println("차의 속도λ₯Ό 증가 μ‹œν‚΅λ‹ˆλ‹€.");
    }
    final void breakPanel() {
        System.out.println("차의 속도λ₯Ό κ°μ†Œ μ‹œν‚΅λ‹ˆλ‹€.");
    }
}

class SportsCar extends Vehicle {
    private boolean isTurbo;
    SportsCar(String name) {
        isTurbo = false;
        speed = 280;
        this.name = name;
        color = "Red";
    }

    
    int getSpeed() {
        if(isTurbo) return speed *= 1.2;
        return speed;
    }
    boolean getTurbo() {
        return isTurbo;
    }
    
    void setTurbo(boolean turbo) {
        isTurbo = turbo;
    }
    void infoCar() {
        System.out.println("이름 : " + name);
        System.out.println("속도 : " + getSpeed());
        System.out.println("색상 : " + color);
        System.out.println("터보 λͺ¨λ“œ : " + isTurbo);
    }
}

class ElectricCar extends Vehicle {
    boolean isAutoDrv;
    ElectricCar(String name) {
        isAutoDrv = false;
        speed = 200;
        this.name = name;
        color = "White";
    }
    boolean getAutoDrv() {
        return isAutoDrv;
    }
    void setAutoDrv(boolean autoDrv) {
        isAutoDrv = autoDrv;
    }
    void infoCar() {
        System.out.println("이름 : " + name);
        System.out.println("속도 : " + speed);
        System.out.println("색상 : " + color);
        System.out.println("μžμœ¨μ£Όν–‰ : " + isAutoDrv);
    }
}

  • μ˜€λ²„λΌμ΄λ”©μ€ λΆ€λͺ¨κ°€ κ°€μ§„ λ©”μ†Œλ“œλ₯Ό μž¬μ •μ˜ν•΄μ„œ μ‚¬μš©ν•˜λŠ” 것
  • λΆ€λͺ¨μ˜ ν΄λž˜μŠ€κ°€ 싀체가 μžˆλŠ” 클래슀이면 μ˜€λ²„λΌμ΄λ”©μ€ 선택 μ‚¬ν•­μž„
  • λΆ€λͺ¨μ˜ ν΄λž˜μŠ€μ—μ„œ λ©”μ†Œλ“œ κ΅¬ν˜„μ‹œ 상속 받은 μžμ‹μ΄ μ˜€λ²„λ‘œλ”© ν•  수 없도둝 κΈˆμ§€ν•  수 있음(final)
  • protected : 상속관계와 동일 νŒ¨ν‚€μ§€ λ‚΄μ—μ„œ μ ‘κ·Ό κ°€λŠ₯, main / μ™ΈλΆ€μ—μ„œλŠ” μ ‘κ·Ό λΆˆκ°€
  • getterλŠ” 보톡 값을 μ½λŠ” κΈ°λŠ₯을 λ„£κΈ° λ•Œλ¬Έμ— λ°˜ν™˜νƒ€μž…μ΄ 있음.
  • setterλŠ” μ™ΈλΆ€μ—μ„œ 내뢀에 μžˆλŠ” ν•„λ“œ 값을 λ°”κΎΈκΈ° μœ„ν•œ κΈ°λŠ₯으둜 주둜 쓰인닀.

static final

λ‚΄μš©μ΄ 더 이상 λ³€κ²½λ˜μ§€ μ•Šκ³  객체 생성이 λ˜μ§€ μ•Šλ„λ‘ λ§Œλ“€κΈ°
public class Common {
    final static String[] screenType = {"", "11인치", "12.9인치"};
    final static String[] colorType = {"", "슀페이슀그레이", "싀버"};
    final static String[] memType = {"", "128BG", "256GB", "512GB", "1TB"};
    final static String[] netType = {"", "Wi-Fi", "Wi-Fi+Cellular"};
}

닀쀑 상속

닀쀑 상속을 μ§€μ›ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ μ•„λž˜μ˜ μ½”λ“œλŠ” μˆ˜ν–‰ μ•ˆ 됨
class A {
    public void msg() {
        System.out.println("A message");
    }
}

class B {
    public void msg() {
        System.out.println("B message");
    }
}

class C extends A, B {
    public void static main(String[] args) {
        C test = new C();
        test.msg();
    }
}

객체 νƒ€μž… 확인(instance)

instanceof : 객체 νƒ€μž… 확인 μ—°μ‚°μž, λΆ€λͺ¨μ™€ μžμ‹ 관계 성립 μ—¬λΆ€ "확인"ν•˜λŠ” μš©λ„
package κ°μ²΄νƒ€μž…ν™•μΈ0113;
public class InstanceOf {
    public static void main(String[] args) {
        Parent parent = new Parent("λΆ€λͺ¨λ‹˜");
        Child child = new Child("μžμ‹");

        System.out.println(parent instanceof Parent); // true
        System.out.println(child instanceof Parent); // true
        System.out.println(parent instanceof Child); // false
        System.out.println(child instanceof Child); // true
    }
}

class Parent {
    String name;
    public Parent(String name) {
        this.name = name;
    }
}

class Child extends Parent {
    public Child(String name) {
        super(name);
        this.name = name;
    }
}
profile

GiantStepDEV

@kongmi

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