πŸ“• Backend/Java

[Java] μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ΄μš©ν•œ λ‹€ν˜•μ„±κ³Ό ν™œμš©

Dongwoongkim 2023. 10. 2. 20:44

μΈν„°νŽ˜μ΄μŠ€μ˜ 닀쀑 상속 

μ•žμ„œ μΈν„°νŽ˜μ΄μŠ€λŠ” 닀쀑상속이 κ°€λŠ₯ν•˜λ‹€κ³  ν–ˆμŠ΅λ‹ˆλ‹€. 

public interface Attackable {
	void attack(int power);
}
public interface Movable {
	void move(int m);
}
public interface Fightable extends Movable, Attackable {
    void attackAndMove(int power, int m);
}
  • 클래슀 상속과 λ§ˆμ°¬κ°€μ§€λ‘œ μΈν„°νŽ˜μ΄μŠ€λ„ λΆ€λͺ¨ μΈν„°νŽ˜μ΄μŠ€μ— μ •μ˜λœ 멀버λ₯Ό λͺ¨λ‘ μƒμ†λ°›μŠ΅λ‹ˆλ‹€.
  • Fightable은 본인의 멀버 attackAndMove()와 λΆ€λͺ¨ λ©€λ²„μ˜ attack(), move()λ₯Ό λ©€λ²„λ‘œ κ°–κ²Œ 됨.
public class Fighter implements Fightable {

    @Override
    public void attack(int power) {

    }

    @Override
    public void attackAndMove(int power, int m) {

    }

    @Override
    public void move(int m) {

    }
}
  • 이 λ•Œ λΆ€λͺ¨μ˜ μ ‘κ·Ό μ œμ–΄μžλŠ” public abstractκ°€ μƒλž΅λœ 것이기 λ•Œλ¬Έμ— (μΈν„°νŽ˜μ΄μŠ€μ˜ νŠΉμ§•) ν΄λž˜μŠ€μ—μ„œ κ΅¬ν˜„ν•  λ•Œ λΆ€λͺ¨μ˜ μ œμ–΄μžλ₯Ό λ°˜λ“œμ‹œ public으둜 μ„€μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€.

 

μΈν„°νŽ˜μ΄μŠ€μ—μ„œλŠ” λ‹€μ€‘μƒμ†μœΌλ‘œ μΈν•œ λ¬Έμ œκ°€ μ—†μ„κΉŒ?

ν΄λž˜μŠ€μ—μ„œ 닀쀑상속이 μ•ˆλ˜λŠ” μ΄μœ λŠ” 두 λΆ€λͺ¨ ν΄λž˜μŠ€κ°€ λ™μΌν•œ μ‹œκ·Έλ‹ˆμ²˜μ˜ λ©”μ†Œλ“œλ₯Ό κ°–κ³  μžμ‹μ΄ 이 두 클래슀λ₯Ό μƒμ†λ°›λŠ” 경우, μžμ‹ μž…μž₯μ—μ„œλŠ” 상속받을 λ•Œ μ–΄λ–€ 클래슀의 λ©”μ†Œλ“œλ₯Ό 상속받아야 ν•˜λŠ” μ§€ μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€. 

 

ν•˜μ§€λ§Œ μΈν„°νŽ˜μ΄μŠ€μ—μ„œλŠ” 이 문제λ₯Ό ν”Όν•΄κ°ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. why ? λ©”μ†Œλ“œκ°€ μ •μ˜λ˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έ 

 

  • μ–΄μ°¨ν”Ό λΆ€λͺ¨ λ©”μ†Œλ“œκ°€ κ΅¬ν˜„λ˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ—, μžμ‹ ν΄λž˜μŠ€μ—μ„œλŠ” λ‘˜ 쀑 μ–΄λŠ 것을 상속 받아도 κ΅¬ν˜„ν•΄μ£Όμ–΄μ•Ό ν•˜λ―€λ‘œ, μ–΄λ–€ λΆ€λͺ¨λ‘œλΆ€ν„° μƒμ†λ°›μ•˜λŠ”μ§€μ— λŒ€ν•΄μ„œλŠ” μ•Œ ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.
public interface Mom {
    void giveMoney(int money);
}
public interface Father {
    void giveMoney(int money);
}
public class Child implements Father, Mom {
    @Override
    public void giveMoney(int money) {

    }
}

 

μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ΄μš©ν•œ λ‹€ν˜•μ„±

λ‹€ν˜•μ„±μ— λŒ€ν•΄ λ‹€λ£° λ•Œ μžμ‹ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό λΆ€λͺ¨νƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜λ‘œ μ°Έμ‘°ν•˜λŠ” 것이 κ°€λŠ₯ν•˜λ‹€κ³  ν–ˆμ—ˆμŠ΅λ‹ˆλ‹€.

public class Tv {
	protected String model;
    
}

public class SmartTv extends Tv {
	protected String smartFunction;
    
   	private void printSmartFunction(){
    	System.out.println(this.smartFuntion);
    }
}

public class SmartTvTest {
	public static void main(String[] args){
 		Tv t = new SmartTv();   
    }
}

 

μΈν„°νŽ˜μ΄μŠ€ μ—­μ‹œ 이λ₯Ό κ΅¬ν˜„ν•œ 클래슀의 쑰상이라 ν•  수 μžˆμœΌλ―€λ‘œ ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜λ‘œ 이λ₯Ό κ΅¬ν˜„ν•œ 클래슀(μžμ‹)의 μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•  수 있으며, μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μœΌλ‘œ ν˜•λ³€ν™˜ λ˜ν•œ κ°€λŠ₯ν•©λ‹ˆλ‹€.

public interface Fightable {
    void attack(int power);
}
public class Fighter implements Fightable{

    @Override
    public void attack(int power) {
        System.out.println(power + "의 λ°λ―Έμ§€λ‘œ 곡격");
    }

}
public class FighterTest {
    public static void main(String[] args) {
        Fightable f = new Fighter();
        f.attack(50);
    }
}

 

μ‹€ν–‰ κ²°κ³Ό

50의 λ°λ―Έμ§€λ‘œ 곡격
  • λ”°λΌμ„œ 뿐만 μ•„λ‹ˆλΌ Up-casting(λΆ€λͺ¨ → μžμ‹)도 κ°€λŠ₯ν•©λ‹ˆλ‹€.
public class FighterTest {
    public static void main(String[] args) {
        Fightable f = (Fightable) new Fighter();
        f.attack(50);
    }
}
  • μΈν„°νŽ˜μ΄μŠ€λŠ” λ‹€μŒκ³Ό 같이 λ©”μ†Œλ“œμ˜ λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μœΌλ‘œ μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€.
public interface Fightable {
    void attack(int power, Fightable f);

    String getName();
}
public class Fighter implements Fightable{
    private String name;

    public Fighter(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public void attack(int power, Fightable f) {
        System.out.println("Fighter attack " + f.getName() + " with " + power);
    }

}
public class Boxer implements Fightable {

    private String name;

    public Boxer(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public void attack(int power, Fightable f) {
        System.out.println("Boxer attack " + f + " with " + power);
    }
}
public class FighterTest {
    public static void main(String[] args) {
        Fightable f = new Fighter("fighter1");
        f.attack(50, new Boxer("boxer1"));
    }
}

 

μ‹€ν–‰ κ²°κ³Ό

Fighter attack boxer1 with 50

 

λ¦¬ν„΄νƒ€μž…μ΄ μΈν„°νŽ˜μ΄μŠ€μΌ λ•Œ 

λ©”μ†Œλ“œμ˜ λ¦¬ν„΄νƒ€μž…μ΄ μΈν„°νŽ˜μ΄μŠ€ β–ΆοΈŽ λ©”μ†Œλ“œκ°€ ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό λ¦¬ν„΄ν•©λ‹ˆλ‹€.

 

μ˜ˆμ‹œ μ½”λ“œ

public interface Parseable {
    void parse(String fileName);
}
public class HTMLParser implements Parseable {

    @Override
    public void parse(String fileName) {
        System.out.println(fileName + " HTML Parsing");
    }
}
public class XMLParser implements Parseable {

    @Override
    public void parse(String fileName) {
        System.out.println(fileName + " XML Parsing");
    }
}
public class ParserManager {

    public static Parseable getParser(String type) {
        if (type.equals("XML")) {
            return new XMLParser();
        } else{
            return new HTMLParser();
        }
    }
}
public class ParserTest {
    public static void main(String[] args) {
        Parseable pm = ParserManager.getParser("XML");
        pm.parse("doc.xml");
    }
}

μœ„ μ½”λ“œμ—μ„œ μΆ”ν›„ μƒˆλ‘œμš΄ μ’…λ₯˜μ˜ XML Parser ν΄λž˜μŠ€κ°€ λ‚˜μ™€λ„ μ•„λž˜ μ½”λ“œμ™€ 같이 리턴 λΆ€λΆ„λ§Œ λ³€κ²½ν•˜λ©΄ λ©λ‹ˆλ‹€.

if (type.equals("XML")) {
//    return new XMLParser();
  	return new NewXMLParser();  
}

 

μΈν„°νŽ˜μ΄μŠ€μ˜ μž₯점

  • 개발 μ‹œκ°„ 단좕
    • μΈν„°νŽ˜μ΄μŠ€κ°€ μž‘μ„±λ˜λ©΄ μ„ μ–ΈλΆ€λ§Œ μ•Œλ©΄ 이λ₯Ό μ‚¬μš©ν•΄μ„œ ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λŠ” 것이 κ°€λŠ₯
  • ν‘œμ€€ν™” κ°€λŠ₯
    • ν”„λ‘œμ νŠΈμ— μ‚¬μš©λ˜λŠ” κΈ°λ³Έ 틀을 μΈν„°νŽ˜μ΄μŠ€λ‘œ μž‘μ„±ν•œ λ‹€μŒ, κ°œλ°œμžλ“€μ—κ²Œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜μ—¬ ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λ„λ‘ ν•¨μœΌλ‘œμ¨ 보닀 μΌκ΄€λ˜κ³  μ •ν˜•ν™”λœ ν”„λ‘œκ·Έλž¨μ˜ 개발이 κ°€λŠ₯
  • μ„œλ‘œ κ΄€κ²Œμ—†λŠ” ν΄λž˜μŠ€λ“€μ—κ²Œ 관계λ₯Ό 맺어쀄 수 있음
    • 상속관계에 μžˆμ§€λ„ μ•Šκ³ , 같은 λΆ€λͺ¨ 클래슀λ₯Ό κ°€μ§€κ³  μžˆμ§€ μ•Šμ€ μ„œλ‘œ 아무 관계도 μ—†λŠ” ν΄λž˜μŠ€λ“€μ—κ²Œ ν•˜λ‚˜μ˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ³΅ν†΅μ μœΌλ‘œ κ΅¬ν˜„ν•˜λ„λ‘ ν•˜μ—¬ 관계λ₯Ό 맺어쀄 수 μžˆμŠ΅λ‹ˆλ‹€.

 

μΈν„°νŽ˜μ΄μŠ€ - μΆ”μƒν΄λž˜μŠ€ - κ΅¬ν˜„ 클래슀 λ””μžμΈ νŒ¨ν„΄

μΈν„°νŽ˜μ΄μŠ€μ™€ κ΅¬ν˜„ 클래슀 사이에 좔상 클래슀λ₯Ό ν•˜λ‚˜ 두고 이 좔상 ν΄λž˜μŠ€μ— κ΅¬ν˜„ 클래슀의 곡톡, 쀑볡 뢀뢄듀을 λͺ¨μ•„λ‘λŠ” νŒ¨ν„΄μž…λ‹ˆλ‹€.

μ˜ˆμ‹œ

public interface Animal {
    void walk();
    void run();
    void sleep();
    void eat();
}
public class Lion implements Animal {

    private String sex; // 쀑볡
    private String color; // 쀑볡

    public String getSex() { // 쀑볡
        return sex;
    }

    public String getColor() { // 쀑볡
        return color;
    }

    @Override
    public void walk() {
        System.out.println("Lion WALK");
    }

    @Override
    public void run() {
        System.out.println("Lion RUN");
    }
    
    @Override
    public void sleep() {
        System.out.println("Lion SLEEP");
    }

    @Override
    public void eat() {
        System.out.println("Lion EAT");
    }
}
public class Tiger implements Animal{

    private String sex; // 쀑볡
    private String color; // 쀑볡

    public String getSex() { // 쀑볡
        return sex;
    }

    public String getColor() { // 쀑볡
        return color;
    }

    @Override
    public void walk() {
        System.out.println("Tiger WALK");
    }

    @Override
    public void run() {
        System.out.println("Tiger RUN");

    }

    @Override
    public void sleep() {
        System.out.println("TIGER SLEEP");
    }

    @Override
    public void eat() {
        System.out.println("TIGER EAT");
    }
}

 

Tiger와 Lion 클래슀λ₯Ό 보면 sex, color,  getSex(), getColor() μ½”λ“œμ˜ 쀑볡이 λ°œμƒν•˜λŠ”λ° 이 λ•Œ 쀑볡 멀버듀을 μΆ”μƒν΄λž˜μŠ€λ₯Ό λ§Œλ“€μ–΄ 쀑볡을 μ œκ±°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

package aboutInterface.test3;

public abstract class Mammal implements Animal{

    private String sex; // 쀑볡
    private String color; // 쀑볡

    public String getSex() { // 쀑볡
        return sex;
    }

    public String getColor() { // 쀑볡
        return color;
    }
}

 

이 λ””μžμΈ νŒ¨ν„΄μ€ 쀑볡 μ œκ±°μ— νš¨κ³Όμ μ΄μ§€λ§Œ, 클래슀 상속을 기반으둜 ν•˜κ³  있기 λ•Œλ¬Έμ— λ‹€λ₯Έ 클래슀λ₯Ό 상속받아야 ν•˜λŠ” κ²½μš°μ—λŠ” ν΄λž˜μŠ€λŠ” 닀쀑상속이 μ•ˆλ˜κΈ° λ•Œλ¬Έμ— 이 νŒ¨ν„΄μ„ μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 


<참고 자료>

 

 

β˜• μΈν„°νŽ˜μ΄μŠ€ vs μΆ”μƒν΄λž˜μŠ€ μš©λ„ 차이점 - μ™„λ²½ 이해

μΈν„°νŽ˜μ΄μŠ€ vs μΆ”μƒν΄λž˜μŠ€ 비ꡐ 이 글을 μ°Ύμ•„λ³΄λŠ” λ…μžλΆ„λ“€μ€ μ•„λ§ˆλ„ 이미 μΈν„°νŽ˜μ΄μŠ€μ™€ μΆ”μƒν΄λž˜μŠ€ κ°œλ…μ„ ν•™μŠ΅ν•œ 뒀에 이 λ‘˜μ— λŒ€ν•˜μ—¬ 차이의 λͺ¨ν˜Έν•¨ λ•Œλ¬Έμ— λ°©λ¬Έ ν–ˆκ² μ§€λ§Œ, κ·Έλž˜λ„ λ‹€μ‹œν•œλ²ˆ

inpa.tistory.com

 

 

[Java] μΈν„°νŽ˜μ΄μŠ€(interface) 총 정리

μ„œλ‘  Spring κ³΅λΆ€ν•˜λ˜ 쀑 interface뢀뢄에 λŒ€ν•΄ 이해가 λΆ€μ‘±ν•œ 것 κ°™μ•„ μžμ„Έν•˜κ²Œ ν•œλ²ˆ 정리해 보렀고 ν•©λ‹ˆλ‹€. λͺ©μ°¨ 1. μΈν„°νŽ˜μ΄μŠ€λž€? 2. μΈν„°νŽ˜μ΄μŠ€μ˜ μž‘μ„± 방법 3. μΈν„°νŽ˜μ΄μŠ€μ˜ 상속 4. μΈν„°νŽ˜μ΄μŠ€μ˜

dkswnkk.tistory.com