# [Java] μΈν„°νŽ˜μ΄μŠ€μ˜ μš©λ„(usage)에 λŒ€ν•΄
Study Repository

[Java] μΈν„°νŽ˜μ΄μŠ€μ˜ μš©λ„(usage)에 λŒ€ν•΄

by rlaehddnd0422

좔상 ν΄λž˜μŠ€λŠ” 상속을 톡해 μžμ‹(ν•˜μœ„) ν΄λž˜μŠ€μ—μ„œ 섀계도λ₯Ό μ™„μ„±ν•˜λ„λ‘ μœ λ„ν•˜λŠ” ν΄λž˜μŠ€μž…λ‹ˆλ‹€. (= λ―Έμ™„μ„± 섀계도)

 

  • 좔상 ν΄λž˜μŠ€λŠ” 상속을 μœ„ν•œ 클래슀이기 λ•Œλ¬Έμ— λ”°λ‘œ 객체λ₯Ό 생성할 수 μ—†μŠ΅λ‹ˆλ‹€.(사싀 읡λͺ… λ‚΄λΆ€ 클래슀둜 객체 생성은 κ°€λŠ₯ν•˜μ§€λ§Œ μ΄λŠ” μ˜λ„ν•œ λ°”κ°€ μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— 객체λ₯Ό 생성할 수 μ—†λ‹€κ³  μž‘μ„±ν•˜μ˜€μŒ)
  • 좔상 ν΄λž˜μŠ€λŠ” λ©”μ†Œλ“œμ—λŠ” 'abstarct' μ˜ˆμ•½μ–΄λ₯Ό μ‚¬μš©ν•΄μ„œ 상속을 톡해 'κ΅¬ν˜„' ν•΄μ•Ό ν•œλ‹€λŠ” 것을 μ•Œλ €μ£Όκ³  μ„ μ–ΈλΆ€λ§Œ μž‘μ„±ν•˜λŠ” '좔상 λ©”μ†Œλ“œ'λ₯Ό μ„ μ–Έν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μžμ‹(ν•˜μœ„) ν΄λž˜μŠ€μ—μ„œλŠ” 좔상 클래슀의 '좔상 λ©”μ†Œλ“œ'λ₯Ό μ˜€λ²„λΌμ΄λ”© 및 κ΅¬ν˜„ν•˜μ—¬ λΉ„λ‘œμ†Œ 섀계도λ₯Ό μ™„μ„±μ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.
abstract class Animal {
    abstract void bark();				// ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ λ‹€λ₯΄κ²Œ λ™μž‘ν•˜λŠ” λ©”μ†Œλ“œ
    public void sleep() { 				// ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ λ™μΌν•˜κ²Œ λ™μž‘ν•˜λŠ” λ©”μ†Œλ“œ
        System.out.println("Sleeping...zZZ");
    }
}
public class Dog extends Animal{

    private String species;

    public Dog(String species) {
        this.species = species;
    }

    @Override
    public void bark() {
        System.out.println("This puppy barks like " + this.species);
    }

}

 

좔상 ν΄λž˜μŠ€μ— λŒ€ν•œ 더 μžμ„Έν•œ λ‚΄μš©μ€ μ•„λž˜ 링크 μ°Έμ‘° 

 

[Java] 좔상 클래슀(abstract class)에 λŒ€ν•΄

μžλ°”μ—μ„œ abstarct μ œμ–΄μžλŠ” '좔상적인'μ΄λΌλŠ” 의미둜 μ‚¬μš©λ©λ‹ˆλ‹€. μ„ μ–ΈλΆ€λ§Œ 있고 κ΅¬ν˜„λΆ€κ°€ μ—†λŠ” λ©”μ†Œλ“œλ₯Ό 좔상 λ©”μ†Œλ“œλΌ ν•˜κ³ , ν•˜λ‚˜ μ΄μƒμ˜ 좔상 λ©”μ†Œλ“œλ₯Ό ν¬ν•¨ν•˜κ³  μžˆλŠ” ν΄λž˜μŠ€λŠ” λ°˜λ“œμ‹œ abstract

rlaehddnd0422.tistory.com

 

μžλ°”μ—λŠ” 이 좔상 ν΄λž˜μŠ€μ™€ 맀우 λΉ„μŠ·ν•œ μš©λ„λ‘œ μ‚¬μš©λ˜λŠ” 'μΈν„°νŽ˜μ΄μŠ€'λΌλŠ” 것이 μ‘΄μž¬ν•©λ‹ˆλ‹€.

 

좔상 ν΄λž˜μŠ€λŠ” μΌλΆ€λ§Œ μ™„μ„±λœ 'λ―Έμ™„μ„± 섀계도'라고 ν•˜λ©΄, μΈν„°νŽ˜μ΄μŠ€λŠ” 'κΈ°λ³Έ 섀계도'μž…λ‹ˆλ‹€.

좔상 ν΄λž˜μŠ€μ—μ„œλŠ” 같은 λ™μž‘μ„ ν•˜λŠ” λ©”μ†Œλ“œμ— λŒ€ν•΄μ„œ abstract ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  좔상 ν΄λž˜μŠ€μ— κ΅¬ν˜„ν–ˆλ‹€λ©΄, μΈν„°νŽ˜μ΄μŠ€μ—μ„œλŠ” ν•˜λ‚˜λ„ 빠짐없이 μž‘μ„±λ˜λŠ” λͺ¨λ“  λ©”μ†Œλ“œκ°€ 좔상 λ©”μ†Œλ“œλ‘œ μ„ μ–Έλ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. ( Before JDK 1.8 ver )

 

μ΄μ–΄μ„œ μΈν„°νŽ˜μ΄μŠ€μ˜ κΈ°λ³Έ μ‚¬μš©λ²•μ— λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.


μΈν„°νŽ˜μ΄μŠ€(interface)

μΈν„°νŽ˜μ΄μŠ€λž€?

μΈν„°νŽ˜μ΄μŠ€λŠ” ν΄λž˜μŠ€λ“€μ΄ ν•„μˆ˜λ‘œ κ΅¬ν˜„ν•΄μ•Ό ν•˜λŠ” 좔상 μžλ£Œν˜•μž…λ‹ˆλ‹€.

좔상 ν΄λž˜μŠ€μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ μΈν„°νŽ˜μ΄μŠ€ λ˜ν•œ λ‚΄λΆ€μ—λŠ” κ΅¬ν˜„λœ μ½”λ“œ(λ©”μ†Œλ“œλ‚˜ μΈμŠ€ν„΄μŠ€ ν•„λ“œ)κ°€ μ—†κΈ° λ•Œλ¬Έμ— μΈν„°νŽ˜μ΄μŠ€ κ·Έ μžμ²΄λ‘œλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μ—†κ³ , μΈν„°νŽ˜μ΄μŠ€μ— λŒ€ν•œ κ΅¬ν˜„μ²΄λ₯Ό 톡해 μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

μΈν„°νŽ˜μ΄μŠ€ μ„ μ–Έ

1. μžλ°”μ—μ„œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ„ μ–Έν•  λ•ŒλŠ” 'interface' μ˜ˆμ•½μ–΄ μ‚¬μš©, κ΅¬ν˜„μ²΄μ—μ„œλŠ” 상속을 'extends'κ°€ μ•„λ‹Œ  'implements' μ˜ˆμ•½μ–΄λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

public interface Car {
}
public class Suv implements Car{
}
  • 단, μΈν„°νŽ˜μ΄μŠ€κ°„μ˜ μƒμ†μ—μ„œλŠ” extends ν‚€μ›Œλ“œ μ‚¬μš©

 

2. μΈν„°νŽ˜μ΄μŠ€λŠ” μΈν„°νŽ˜μ΄μŠ€λ‘œλΆ€ν„°λ§Œ 상속받을 수 있고, ν΄λž˜μŠ€μ™€λŠ” 달리 닀쀑 상속이 κ°€λŠ₯

public interface Car extends Navigation, MusicPlayer{

    public static final String name = "μžλ™μ°¨";

    abstract void start();
    void stop();
    String ModelName();
}

 

3. μΈν„°νŽ˜μ΄μŠ€μ—λŠ” ꡬ체적인 λŒ€μƒμ„ 생성할 수 μ—†κ³ , μ˜€λ‘œμ§€ μƒμˆ˜μ™€ 좔상 λ©”μ†Œλ“œλ§Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. (JDK 1.8 이전)

public interface Car {

    public static final String name = "μžλ™μ°¨";
    public static final int wheel = 4;

    default void openWindow() { // After JDK 1.8 ver
        System.out.println("μ°½λ¬Έ μ—΄κΈ°");
    }

    static int getWheel() { // After JDK 1.8 ver 
        return wheel;
    }

    abstract void start();
    void stop();
    String ModelName();
}
  • JDK 1.8 버전 μ΄μ „μ—μ„œλŠ” μΈν„°νŽ˜μ΄μŠ€μ—λŠ” μƒμˆ˜(static final)와 좔상 λ©”μ†Œλ“œ(abstract method)만 μ‚¬μš©ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.
  • JDK 1.8 버전 μ΄ν›„μ—λŠ” static λ©”μ†Œλ“œμ™€ default λ©”μ†Œλ“œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜κΈ΄ ν•˜μ§€λ§Œ, JDK 1.8 버전 이전 κΈ°μ€€μœΌλ‘œ ν†΅μš©ν•˜κ² μŠ΅λ‹ˆλ‹€.
    • default λ©”μ†Œλ“œλ₯Ό 톡해 κ³΅ν†΅μ μœΌλ‘œ λ“€μ–΄κ°ˆ κΈ°λŠ₯을 κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 
  • 좔상 λ©”μ†Œλ“œ μ„ μ–Έ μ‹œ abstract ν‚€μ›Œλ“œλŠ” μƒλž΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ( 컴파일 μ‹œ μžλ™μœΌλ‘œ 생성 )
  • 멀버 λ³€μˆ˜ μ„ μ–Έμ‹œ public static final λ˜ν•œ μƒλž΅ κ°€λŠ₯ ( 컴파일 μ‹œ μžλ™μœΌλ‘œ 생성 )
    • μΈν„°νŽ˜μ΄μŠ€λŠ” μΈμŠ€ν„΄μŠ€κ°€ μ‘΄μž¬ν•  수 μ—†κΈ° λ•Œλ¬Έμ— 상속받은 κ΅¬ν˜„ κ°μ²΄μ—μ„œ 같은 μƒνƒœλ₯Ό 보μž₯ν•˜κΈ° μœ„ν•΄μ„œ public static final을 μ‚¬μš©ν•©λ‹ˆλ‹€.
public class Suv implements Car{

    private String modelName;

    @Override
    public void start() {
        System.out.println("μ‹œλ™μ΄ μΌœμ‘ŒμŠ΅λ‹ˆλ‹€.");
    }

    @Override
    public void stop() {
        System.out.println("μ‹œλ™μ„ λ•λ‹ˆλ‹€.");
    }

    @Override
    public String ModelName() {
        return name + this.modelName;
    }
}

 

좔상 ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€ 비ꡐ

곡톡점

  1. 좔상 λ©”μ†Œλ“œλ₯Ό κ°€μ§‘λ‹ˆλ‹€.
  2. κ·Έ 자체둜 μΈμŠ€ν„΄μŠ€ 생성이 λΆˆκ°€λŠ₯ν•˜κ³  상속/κ΅¬ν˜„ν•œ 클래슀λ₯Ό 톡해 μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μžˆμŠ΅λ‹ˆλ‹€.
  3. μΈν„°νŽ˜μ΄μŠ€μ™€ μΆ”μƒν΄λž˜μŠ€μ˜ κ΅¬ν˜„, 상속 ν΄λž˜μŠ€λŠ” 좔상 λ©”μ†Œλ“œλ₯Ό λ°˜λ“œμ‹œ κ΅¬ν˜„ν•˜μ—¬μ•Ό ν•©λ‹ˆλ‹€.

 

차이점

  1. 좔상 ν΄λž˜μŠ€λŠ” extends ν‚€μ›Œλ“œλ₯Ό ν†΅ν•œ 상속, μΈν„°νŽ˜μ΄μŠ€λŠ” implements ν‚€μ›Œλ“œλ₯Ό ν†΅ν•œ κ΅¬ν˜„μ΄ μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.
  2. 좔상 ν΄λž˜μŠ€λŠ” 멀버 λ³€μˆ˜, μƒμ„±μž, 일반 λ©”μ†Œλ“œ, 좔상 λ©”μ†Œλ“œ λͺ¨λ‘ κ°€μ§ˆ 수 μžˆμ§€λ§Œ, μΈν„°νŽ˜μ΄μŠ€μ—μ„œλŠ” μƒμˆ˜μ™€ 좔상 λ©”μ†Œλ“œλ§Œ κ°€μ§ˆ 수 있고, μƒμ„±μžμ™€ 멀버 λ³€μˆ˜λ₯Ό κ°€μ§ˆ 수 μ—†μŠ΅λ‹ˆλ‹€.
  3. 좔상 ν΄λž˜μŠ€λŠ” 닀쀑 상속이 λΆˆκ°€λŠ₯ ν•˜μ§€λ§Œ, (νƒœμ΄ˆμ— ν΄λž˜μŠ€λŠ” 닀쀑 상속이 λΆˆκ°€λŠ₯) μΈν„°νŽ˜μ΄μŠ€λŠ” μΈν„°νŽ˜μ΄μŠ€λΌλ¦¬ 닀쀑 상속이 κ°€λŠ₯ν•©λ‹ˆλ‹€. 
    1. 이 λ‘˜μ€ 이 '닀쀑 상속' 여뢀에 λ”°λ₯Έ 차이가 μžˆμ§€λ§Œ, 이 κΈ°λŠ₯의 μ—¬λΆ€λ‘œ 인해 μ‚¬μš© λͺ©μ μ΄ κ°ˆλ¦¬λŠ” 것은 μ•„λ‹˜

 

μ–Έμ œ μΆ”μƒν΄λž˜μŠ€λ₯Ό μ‚¬μš©ν•˜κ³  μ–Έμ œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ”κ°€?

좔상 ν΄λž˜μŠ€λŠ” κ΅¬ν˜„을 톡해 ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ κ³΅ν†΅μœΌλ‘œ μ‚¬μš©ν•˜λŠ” 멀버듀은 μƒμœ„ 좔상 ν΄λž˜μŠ€μ— λ©”μ†Œλ“œλ‘œ ν•œ 번만 κ΅¬ν˜„ν•¨μœΌλ‘œμ¨ ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œμ˜ λΆˆν•„μš”ν•œ μ½”λ“œ 쀑볡을 λ°©μ§€ν•˜λ„λ‘ μ˜λ„λœ ν΄λž˜μŠ€μž…λ‹ˆλ‹€.

  • 쀑볡 멀버λ₯Ό ν†΅ν•©ν•˜κ³ μž ν•  λ•Œ
public class Cat{

    private String type; // 쀑볡 멀버
    private int wakeUpHour; // 쀑볡 멀버

    public Cat(String type) {
        this.type = type;
    }

    public void bark() {
        System.out.println("This Cat howl like " + this.type);
    } // 쀑볡 멀버

    public void sleep() {
        System.out.println("Sleeping..");
    } // 쀑볡 멀버
}
public class Dog {

    private String type; // 쀑볡 멀버
    private int wakeUpHour; // 쀑볡 멀버

    public Dog(String type) {
        this.type = type;
    }

    public void bark() { // 쀑볡 멀버
        System.out.println("This puppy barks like " + this.type);
    }

    public void sleep() {
        System.out.println("Sleeping..");
    } // 쀑볡 멀버

}

μœ„ μ½”λ“œμ˜ Catκ³Ό Dog ν΄λž˜μŠ€λŠ” 쀑볡 멀버λ₯Ό κ°–κ³  μžˆμŠ΅λ‹ˆλ‹€. (ν•„λ“œλ‘œ 보면 type, wakeUppHour, λ©”μ†Œλ“œλ‘œ 보면 bark(), sleep())

이 λ•Œ μ•„λž˜μ™€ 같이 쀑볡 멀버λ₯Ό μƒμœ„ 클래슀둜 λ¬Άκ³  λ©”μ†Œλ“œλ„ ν†΅ν•©ν•˜λ©° 좔상화λ₯Ό ν•΄μ£Όλ©΄ λ‚˜μ€‘μ— λ‹€λ₯Έ μ’…λ₯˜μ˜ 클래슀λ₯Ό μΆ”κ°€, ν™•μž₯함에 μžˆμ–΄ μœ μ—°ν•˜κ³  ꡬ쑰적인 객체 지ν–₯ 섀계λ₯Ό λ§Œλ“€ 수 있게 λ©λ‹ˆλ‹€.

 

abstract class Animal {

    String type; 
    int wakeUpHour;

    public abstract void bark();

    public void sleep() {
        System.out.println("Sleeping...zZZ");
    }
}
public class Dog extends Animal {

    public Dog(String type) {
        this.type = type;
    }

    public void bark() { // 쀑볡 멀버
        System.out.println("This puppy barks like " + this.type);
    }

}
public class Cat extends Animal{

    public Cat(String type) {
        this.type = type;
    }

    public void bark() {
        System.out.println("This Cat howl like " + this.type);
    } // 쀑볡 멀버
}
  • ν΄λž˜μŠ€κ°„ 계측 ꡬ쑰λ₯Ό λͺ…ν™•ν•˜κ²Œ 섀계할 λ•Œ 

λ˜ν•œ 클래슀 끼리 λͺ…ν™•ν•œ 계측 ꡬ쑰가 ν•„μš”ν•  λ•Œλ„ 좔상 클래슀λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

 

이λ₯Ό ν…Œλ©΄ λ¦¬μ†ŒμŠ€μ˜ Ownerμ΄κ±°λ‚˜ λ˜λŠ” κΆŒν•œμ΄ ADMIN인지 κ²€μ‚¬ν•˜λŠ” 클래슀λ₯Ό λ§Œλ“œλ €κ³  ν•©λ‹ˆλ‹€. 이 λ•Œ μ–΄λ–€ λ¦¬μ†ŒμŠ€μ— λŒ€ν•œ 검사λ₯Ό ν•  것 인지에 μž‘μ„± ν•˜κΈ° μ „, 좔상 ν΄λž˜μŠ€μ— 곡톡 λΆ„λͺ¨λ“€μ„ ν‘œν˜„(check(), hasAuthority()) ν•˜κ³ , 상속을 톡해 μ—¬λŸ¬ Guard 클래슀λ₯Ό ν™•μž₯ν•΄λ‚˜κ°μœΌλ‘œμ¨ μƒμœ„ Guard 좔상 ν΄λž˜μŠ€μ™€ ν•˜μœ„ 클래슀 (PostGuard, CommentGuard) κ°„μ˜ μ˜λ―ΈμžˆλŠ” 연관관계λ₯Ό ꡬ좕할 수 μžˆμŠ΅λ‹ˆλ‹€.

// ν΄λΌμ΄μ–ΈνŠΈλ₯Ό κ²€μ‚¬ν•˜λŠ” μΆ”μƒν™”λœ μ½”λ“œ
public abstract class Guard { 

    public final boolean check(Long id){ // 둜그인 ν•˜μ˜€κ³ , id에 λŒ€ν•œ λ¦¬μ†ŒμŠ€ κΆŒν•œμ΄ μžˆλŠ”μ§€ 검사
       return SecurityUtil.isAuthenticated() && hasAuthority(id);
    }

    private boolean hasAuthority(Long id){ // ADMINμ΄κ±°λ‚˜, ν•΄λ‹Ή λ¦¬μ†ŒμŠ€μ˜ Owner인지 검사
        return SecurityUtil.extractMemberRolesFromContext().contains(RoleType.ADMIN) || isResourceOwner(id);
    }

    abstract protected boolean isResourceOwner(Long id);
}
public class CommentGuard extends Guard {

    private final CommentRepository commentRepository;

    @Override
    protected boolean isResourceOwner(Long id) {
        Comment comment = commentRepository.findById(id).orElseThrow(GuardException::new);
        return comment.getId().equals(id);
    }
}
public class PostGuard extends Guard {

    private final PostRepository postRepository;

    @Override
    protected boolean isResourceOwner(Long id) {
        Post post = postRepository.findById(id).orElseThrow(GuardException::new);
        Long memberId = Long.valueOf(SecurityUtil.getCurrentUserId().orElseThrow(GuardException::new));

        return post.getMember().getId().equals(memberId);
    }
}

 

좔상 ν΄λž˜μŠ€λŠ” μ΄λ ‡κ²Œ λ°€μ ‘ν•˜κ²Œ κ΄€λ ¨λœ ν΄λž˜μŠ€λ“€λΌλ¦¬ μ½”λ“œλ₯Ό κ³΅μœ ν•  λ•Œ λ―Έλ¦¬ 논리적인 클래슀 상속 ꡬ쑰λ₯Ό λ§Œλ“€μ–΄ 놓고 μ‚¬μš©μ΄ κ²°μ •λ˜λŠ” λŠλ‚Œμ΄λΌλ©΄ (상속을 톡해 ν•˜μœ„ 클래슀둜 μžμ‹ λ“€μ˜ κΈ°λŠ₯을 ν™•μž₯ μ‹œμΌœκ°€λŠ” λŠλ‚Œ, Guard -> PostGuard, CommentGuard)

 

μΈν„°νŽ˜μ΄μŠ€λŠ” λ°˜λŒ€λ‘œ 관련성이 μ—†μ§€λ§Œ 같은 성격을 μ§€λ‹Œ ν΄λž˜μŠ€λ“€λΌλ¦¬ 관계λ₯Ό 맺어쀄 λ•Œ, ν•„μš”μ— 따라 자유둭게 λΆ™μ˜€λ‹€ λ–Όμ—ˆλ‹€ν•˜λŠ” λŠλ‚ŒμœΌλ‘œ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. (μΈν„°νŽ˜μ΄μŠ€μ— μ •μ˜λœ λ©”μ†Œλ“œλ₯Ό 각 클래슀의 λͺ©μ μ— 맞게 κΈ°λŠ₯을 κ΅¬ν˜„ν•˜λŠ” λŠλ‚Œ)

 

μœ„ 상속 관계도가 μžˆλ‹€κ³   κ°€μ •ν•©μ‹œλ‹€. μ½”λ“œλ‘œ ν‘œν˜„ν•˜λ©΄ 

abstract class Creature {
}

abstract class Plants extends Creature{
}

public class Carrot extends Plants{
}
public class Tree extends Plants{
}
public class Potato extends Plants{
}



abstract class Animal extends Creature{
}

public class Cow extends Animal {
}
public class Pig extends Animal{
}
public class Monkey extends Animal{
}

 

이 λ•Œ, Eatable λ©”μ†Œλ“œλ₯Ό Carrotκ³Ό Potato, Cow와 Pig ν΄λž˜μŠ€μ— μΆ”κ°€ν•˜λ €κ³  ν•©λ‹ˆλ‹€.

 

이 λ©”μ†Œλ“œλ₯Ό Creature 좔상 ν΄λž˜μŠ€μ— μΆ”κ°€ν•˜κ²Œ 되면, 먹을 수 μ—†λŠ” Tree, Monkey ν΄λž˜μŠ€μ—λ„ λ°˜λ“œμ‹œ 좔상 λ©”μ†Œλ“œλ₯Ό μΆ”κ°€ν•˜κ³  κ΅¬ν˜„ν•΄μ•Όν•˜λŠ” κ°•μ œμ„±μ΄ μƒκΈ°κ²Œ λ©λ‹ˆλ‹€. (λ‚˜λ¬΄μ™€ μ›μˆ­μ΄λŠ” 먹을 수 μ—†λ‹€κ³  κ°€μ • )

abstract class Creature {
public abstract void eatable();
}

abstract class Plants extends Creature{
}

public class Carrot extends Plants{
    @Override
    public void eatable() {
        System.out.println("EAT");
    }
}
public class Tree extends Plants{
    @Override
    public void eatable() {

    }
}
public class Potato extends Plants{
    @Override
    public void eatable() {
        System.out.println("EAT");
    }
}



abstract class Animal extends Creature{
}

public class Cow extends Animal {
    @Override
    public void eatable() {
        System.out.println("EAT");
    }
}
public class Pig extends Animal{
    @Override
    public void eatable() {
        System.out.println("EAT");
    }
}
public class Monkey extends Animal{
    @Override
    public void eatable() {

    }
}

 

λ©”μ†Œλ“œλ₯Ό μ„ μ–Έν•˜κΈ°λ§Œ 빈칸으둜 놔두면 λ˜κΈ°λŠ” ν•˜μ§€λ§Œ, 객체 지ν–₯ 섀계에 μœ„λ°˜λ  뿐만 μ•„λ‹ˆλΌ λ‚˜μ€‘μ— μœ μ§€λ³΄μˆ˜ λ©΄μ—μ„œλ„ 쒋지 μ•ŠμŠ΅λ‹ˆλ‹€.

 

λ”°λΌμ„œ 이 λ•Œ μœ„ κ·Έλ¦Όκ³Ό 같이 상속에 얽맀이지 μ•ŠλŠ” μΈν„°νŽ˜μ΄μŠ€μ— 좔상 λ©”μ†Œλ“œλ₯Ό μ„ μ–Έν•˜κ³  이λ₯Ό κ΅¬ν˜„ν•˜λ©΄μ„œ 자유둜운 νƒ€μž… λ¬ΆμŒμ„ 톡해 좔상화λ₯Ό 이룰 수 μžˆμŠ΅λ‹ˆλ‹€.

abstract class Creature {
}

public interface Eatable {
    public void eatable();
}

// Plants
abstract class Plants extends Creature{
}

public class Carrot extends Plants implements Eatable{
    @Override
    public void eatable() {
        System.out.println("EAT CARROT");
    }
}

public class Potato extends Plants implements Eatable{
    @Override
    public void eatable() {
        System.out.println("EAT POTATO");
    }
}

public class Tree extends Plants {
}


// Animal
abstract class Animal extends Creature{
}

public class Cow extends Animal implements Eatable {
    @Override
    public void eatable() {
        System.out.println("EAT COW");
    }
}

public class Pig extends Animal implements Eatable {
    @Override
    public void eatable() {
        System.out.println("EAT PIG");
    }
}

public class Monkey extends Animal{
}

 

μ΄λ ‡κ²Œ 좔상 클래슀의 λ‹€ν˜•μ„±μ΄λ‚˜ μΈν„°νŽ˜μ΄μŠ€μ˜ λ‹€ν˜•μ„± λͺ¨λ‘ 클래슀의 νƒ€μž…μ„ ν†΅ν•©ν•œλ‹€λŠ” μ˜λ―ΈλŠ” λ™μΌν•©λ‹ˆλ‹€λ§Œ, μ–Έμ œ μ–΄λŠ 상황에 'λ‹€ν˜•μ„±'을 μ‚¬μš©ν•˜λŠλƒμ— λ”°λ₯Έ μˆœμ„œ 차이둜 인해 μ–΄λŠκ²ƒμ„ μ‚¬μš©ν•˜λŠλƒκ°€ κ°ˆλ¦°λ‹€κ³  λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

 

쑰금 이둠적인 λŠλ‚Œλ„ κ°•ν•©λ‹ˆλ‹€λ§Œ, λ§Žμ€ μ½”λ“œλ₯Ό μ ‘ν•˜λ©΄μ„œ 깨달아야 와닿을 것 κ°™μŠ΅λ‹ˆλ‹€.

 

<정리>

abstract classλ₯Ό μ‚¬μš©ν•  λ•Œ

  • ν•˜μœ„ ν΄λž˜μŠ€κ°€ μ˜€λ²„λΌμ΄λ”© 및 μž¬μ •μ˜ ν•˜λŠ” κΈ°λŠ₯듀을 κ³΅μœ ν•˜κΈ° μœ„ν•œ 상속 κ°œλ…μ„ μ‚¬μš©ν•  λ•Œ
  • μš”κ΅¬μ‚¬ν•­κ³Ό ν•¨κ»˜ κ΅¬ν˜„ μ„ΈλΆ€ μ •λ³΄μ˜ 일뢀 κΈ°λŠ₯만 μ§€μ •ν–ˆμ„ λ•Œ
  • μΈμŠ€ν„΄μŠ€ μƒνƒœλ₯Ό λ³€κ²½ν•˜κΈ° μœ„ν•œ non-final / non-static λ©”μ†Œλ“œκ°€ ν•„μš”ν•œ 경우
  • is - A 관계일 λ•Œ ("~이닀" 의 관계)
  • 멀버에 public μ΄μ™Έμ˜ μ ‘κ·Όμž(protected, private)κ°€ μ‚¬μš©λ˜λŠ” 경우

 

interfaceλ₯Ό μ‚¬μš©ν•  λ•Œ

  • μ„œλ‘œ 관련성이 μ—†λŠ” 클래슀끼리 관계λ₯Ό 맺어쀄 λ•Œ (ν˜•μ œκ΄€κ³„, νŠΉμ • μ„±μ§ˆμ„ 가지고 μžˆλŠ” has - A 관계)
  • νŠΉμ • 데이터 νƒ€μž…μ˜ λ™μž‘μ„ μ§€μ •ν•˜λ €κ³  ν•˜μ§€λ§Œ ν•΄λ‹Ή λ™μž‘μ„ λˆ„κ°€ κ΅¬ν˜„ν•˜λŠ”μ§€ μ€‘μš”ν•˜μ§€ μ•Šμ„ 경우
  • 닀쀑 상속이 ν•„μš”ν•œ 경우 
  • has - A 관계일 λ•Œ ("~을 가지고 μžˆλ‹€")

<참고 자료>

 

 

μžλ°” 좔상 ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€μ˜ 차이점 μ΄ν•΄ν•˜κΈ°

'is a kind of(~의 ν•œ μ’…λ₯˜) 좔상 클래슀'와 'be able to(~ν•  수 μžˆλŠ”) μΈν„°νŽ˜μ΄μŠ€' - 좔상 클래슀 public abstract class ν΄λž˜μŠ€μ΄λ¦„ { ... public abstract void λ©”μ„œλ“œμ΄λ¦„(); } class μ•žμ— 'abstract' ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ •

wildeveloperetrain.tistory.com

 

 

[JAVA] μΆ”μƒν΄λž˜μŠ€ VS μΈν„°νŽ˜μ΄μŠ€ μ™œ μ‚¬μš©ν• κΉŒ? 차이점, 예제둜 확인 :: 마이자λͺ½

μΆ”μƒν΄λž˜μŠ€ μΈν„°νŽ˜μ΄μŠ€ μ™œ... μ‚¬μš©ν• κΉŒ? μš°λ¦¬λŠ” μΆ”μƒν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€μ— λŒ€ν•΄μ„œ μ•Œκ³  μžˆλƒκ³  λˆ„κ°€ λ¬Όμ–΄λ³Έλ‹€λ©΄ μ•Œκ³  μžˆλ‹€κ³  λŒ€λ‹΅μ„ ν•˜κ³ μžˆμŠ΅λ‹ˆλ‹€. 그런데 이둠적인 λ‚΄μš© 말고 μ •μž‘ "μ™œ μ‚¬μš©ν•˜

myjamong.tistory.com

 

 

[JAVA] μΈν„°νŽ˜μ΄μŠ€(Interface)의 κΈ°λ³Έ κ°œλ…κ³Ό Java 8 μ΄ν›„μ˜ λ³€ν™”

0. μΈν„°νŽ˜μ΄μŠ€(Interface) μΈν„°νŽ˜μ΄μŠ€λŠ” μžλ°”μ˜ λ‹€ν˜•μ„±(Polymorphism)을 κ·ΉλŒ€ν™”ν•˜μ—¬ 객체지ν–₯ν”„λ‘œκ·Έλž˜λ°μ„ 더 μˆ˜μ›”ν•˜κ²Œ ν•΄μ£ΌλŠ” 역할을 ν•©λ‹ˆλ‹€. μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 κ°μ²΄λŠ” 좔상화에 더 μ˜μ‘΄ν•˜κ²Œ 되고,

studyandwrite.tistory.com

 

 

μ½”λ”©κ΅μœ‘ ν‹°μ”¨ν”ΌμŠ€μΏ¨

4μ°¨μ‚°μ—…ν˜λͺ…, μ½”λ”©κ΅μœ‘, μ†Œν”„νŠΈμ›¨μ–΄κ΅μœ‘, μ½”λ”©κΈ°μ΄ˆ, SWμ½”λ”©, κΈ°μ΄ˆμ½”λ”©λΆ€ν„° μžλ°” 파이썬 λ“±

tcpschool.com

 

 

μΆ”μƒν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€μ˜ 차이점

 

devocean.sk.com

 

λΈ”λ‘œκ·Έμ˜ 정보

Study Repository

rlaehddnd0422

ν™œλ™ν•˜κΈ°