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

  μΈν„°νŽ˜μ΄μŠ€(Interface) 좔상 클래슀(Abstract Class)
μ‚¬μš© λͺ©μ  ν΄λž˜μŠ€κ°€ κ΅¬ν˜„ν•΄μ•Όν•  λ©”μ„œλ“œμ˜ 집합을 μ •μ˜ 상속을 톡해 곡톡 κΈ°λŠ₯ 곡유
κ΅¬ν˜„ λͺ¨λ“  λ©”μ„œλ“œκ°€ 좔상 λ©”μ„œλ“œ (좔상 λ©”μ„œλ“œλ§Œ κ°€λŠ₯) 좔상 λ©”μ„œλ“œμ™€ 일반 λ©”μ„œλ“œλ₯Ό λͺ¨λ‘ 가짐
멀버 λ³€μˆ˜ (μ•”λ¬΅μ μœΌλ‘œ) public static final μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ κ°€μ§ˆ 수 있음
닀쀑 상속 μ—¬λΆ€ ν•˜λ‚˜μ˜ ν΄λž˜μŠ€μ—μ„œ μ—¬λŸ¬κ°œμ˜ μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„ κ°€λŠ₯ ν•˜λ‚˜μ˜ ν΄λž˜μŠ€μ— ν•˜λ‚˜μ˜ 좔상 클래슀만 상속 κ°€λŠ₯
 μƒμ„±μž κ°€λŠ₯μ—¬λΆ€ μƒμ„±μž κ°€μ§ˆ 수 μ—†μŒ μƒμ„±μž κ°€μ§ˆ 수 있음 

 


μžλ°”μ—λŠ” λΉ„μŠ·ν•œ λ“― λ‹€λ₯Έ μΈν„°νŽ˜μ΄μŠ€μ™€ 좔상 ν΄λž˜μŠ€κ°€ μžˆλ‹€. 이 λ‘˜μ˜ 차이점을 정리해보렀 ν•œλ‹€. 

λ¨Όμ €, μΈν„°νŽ˜μ΄μŠ€μ™€ 좔상 ν΄λž˜μŠ€κ°€ 무엇인지 λ¨Όμ € μ•Œμ•„λ³΄μž.

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

μΈν„°νŽ˜μ΄μŠ€λŠ” λͺ¨λ“  λ©”μ„œλ“œκ°€ 좔상 λ©”μ„œλ“œλ‘œ κ΅¬μ„±λ˜μ–΄μžˆκ³ , ν΄λž˜μŠ€κ°€ κ΅¬ν˜„ν•΄μ•Όν•  λ©”μ„œλ“œμ˜ 집합을 μ •μ˜ν•œλ‹€.

κ°„λ‹¨ν•˜κ²Œ 무언가 κ΅¬ν˜„ν•΄μ•Όν•  λ‚΄μš©μ„ μ •μ˜ν•΄λ†“μ€ 것이라고 μƒκ°ν•˜λ©΄ λœλ‹€.

'κ΅¬ν˜„ν•΄μ•Όν• ' 것듀을 μ •μ˜ν•΄λ†“μ€ κ²ƒμ΄λ―€λ‘œ 일반 ν΄λž˜μŠ€μ™€ 달리 λ©”μ„œλ“œμ— μ½”λ“œ λΈ”λŸ­μ΄ μ—†λ‹€. 즉, μ–΄λ–€ λ©”μ„œλ“œμ˜ κΈ°λŠ₯을 κ΅¬ν˜„ν•΄λ†“μ€ λ‚΄μš©μΈ μ½”λ“œ λΈ”λŸ­μ΄ μ—†λ‹€.

interface μΈν„°νŽ˜μ΄μŠ€λͺ…() {
    public static final μƒμˆ˜λͺ… = κ°’;
    public abstract void λ©”μ„œλ“œλͺ…();
}

μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ„ μ–Έν•  λ•ŒλŠ” μ ‘κ·Ό μ œμ–΄μžμ™€ ν•¨κ»˜ β‘  interface ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.

그리고 β‘‘ μΈν„°νŽ˜μ΄μŠ€μ˜ λͺ¨λ“  λ©”μ„œλ“œλŠ” μ•”λ¬΅μ μœΌλ‘œ public 이며, ν•„λ“œ(λ³€μˆ˜)λŠ” public static final 이닀.

*μΈν„°νŽ˜μ΄μŠ€ ν•„λ“œμ— int COUNT = 3;은 public static final을 μƒλž΅ν•΄λ„ μžλ™μœΌλ‘œ public static final이 μ μš©λœλ‹€.

 

λ©”μ„œλ“œμ— κΈ°λŠ₯을 κ΅¬ν˜„ν•΄λ†“μ§€ μ•ŠκΈ° λ•Œλ¬Έμ—, μΈν„°νŽ˜μ΄μŠ€λŠ” ν˜Όμžμ„œ λ¬΄μ–Έκ°ˆ ν•  μˆ˜λŠ” μ—†λ‹€. μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒμ†ν•œ 클래슀(κ΅¬ν˜„μ²΄)μ—μ„œ λ©”μ„œλ“œλ₯Ό Override ν•΄μ„œ κ΅¬ν˜„ν•΄μ•Όν•œλ‹€.

interface Computer { }
Computer C = new Computer(); // Error: Cannot instantiate the type Computer

μœ„μ²˜λŸΌ μΈν„°νŽ˜μ΄μŠ€κ°€ μžˆλ‹€κ³  ν• λ•Œ, Computer 객체λ₯Ό μƒμ„±ν•˜λ €ν•˜λ©΄ μ—λŸ¬κ°€ λ°œμƒν•œλ‹€. 

 

그리고 μΈν„°νŽ˜μ΄μŠ€λŠ” β‘’ 닀쀑 상속이 κ°€λŠ₯ν•΄μ„œ, μ•„λž˜μ™€ 같이 ν•œ ν΄λž˜μŠ€κ°€ μ—¬λŸ¬ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 상속받아 κ΅¬ν˜„ν•  수 μžˆλ‹€.

class 클래슀λͺ… implements μΈν„°νŽ˜μ΄μŠ€1, μΈν„°νŽ˜μ΄μŠ€2

 

β‘£ Java8 λΆ€ν„° μΈν„°νŽ˜μ΄μŠ€λŠ” default λ©”μ„œλ“œμ™€ static λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

μΈν„°νŽ˜μ΄μŠ€μ˜ λ©”μ„œλ“œλŠ” κ΅¬ν˜„μ²΄λ₯Ό κ°€μ§ˆ 수 μ—†μ§€λ§Œ, default λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ μ‹€μ œ κ΅¬ν˜„λœ ν˜•νƒœμ˜ λ©”μ„œλ“œλ₯Ό κ°€μ§ˆ 수 μžˆλ‹€. 

그리고 μΈν„°νŽ˜μ΄μŠ€μ— static λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜λ©΄ μΈν„°νŽ˜μ΄μŠ€λͺ….μŠ€νƒœν‹±λ©”μ„œλ“œλͺ…κ³Ό 같이 μ‚¬μš©ν•˜μ—¬ 일반 클래슀의 static λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 것과 λ™μΌν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€.

interface TestInterface {
    // default λ©”μ„œλ“œ
    default void printSomething() {
    	System.out.println("default method in interface");
    }
    // static λ©”μ„œλ“œ
    static int getNum() {
    	return 10;
    }
}

μ•„λž˜μ™€ 같이 μΈν„°νŽ˜μ΄μŠ€λͺ….μŠ€νƒœν‹±λ©”μ„œλ“œλͺ…μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.

TestInterface.printSomething();

 

μΈν„°νŽ˜μ΄μŠ€(Interface)λ₯Ό μ‚¬μš©ν•˜λŠ” 이유?

κ·Έλ ‡λ‹€λ©΄ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ™œ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ”κ±ΈκΉŒ?

보톡 μ€‘μš” 클래슀λ₯Ό μž‘μ„±ν•˜λŠ” μ‹œμ μ—μ„œ 클래슀의 κ΅¬ν˜„μ²΄κ°€ λͺ‡ κ°œκ°€ 될지 μ•Œ 수 μ—†μœΌλ―€λ‘œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν•΄μ„œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κΈ°μ€€μœΌλ‘œ λ©”μ„œλ“œλ₯Ό λ§Œλ“œλŠ” 것이 효율적이기 λ•Œλ¬Έμ΄λ‹€.

 

λ‹Ήμž₯ 이 λ¬Έμž₯을 μ½μ—ˆμ„λ•ŒλŠ” 무슨 μ†Œλ¦°κ°€ μ‹Άλ‹€.

 

μ˜ˆμ‹œλ‘œ ν•œλ²ˆ λ‹€μ‹œ μ •λ¦¬ν•΄λ³΄μž.

Animal 클래슀λ₯Ό μƒμ†ν•˜λŠ” Tiger, Bear ν΄λž˜μŠ€κ°€ 있고, 이듀을 κ΄€λ¦¬ν•˜κ³  먹이λ₯Ό μ£ΌλŠ” ZooKeeper ν΄λž˜μŠ€κ°€ μžˆλ‹€κ³  ν•΄λ³΄μž.

class Animal {
	String name;
	void setName(String name) {
		this.name = name;
	}
}

class Tiger extends Animal { }
class Bear extends Animal { }
class ZooKeeper {
	void feed(Tiger tiger) {
		System.out.println("feed apple to Tiger");
	}
	void feed(Bear bear) {
		System.out.println("feed banana to Bear");
	}
}

ZooKeeperλŠ” feed() λ©”μ„œλ“œ ν˜ΈμΆœμ‹œ 인자의 νƒ€μž…μ— 따라 Tigerλ‚˜ Bearμ—κ²Œ 먹이λ₯Ό μ€€λ‹€.

public static void main(String[] args) {
    ZooKeeper zooKeeper = new ZooKeeper();
    Tiger tiger = new Tiger();
    Bear bear = new Bear();

    zooKeeper.feed(tiger); // feed apple to Tiger
    zooKeeper.feed(bear); // feed banana to Bear
}

근데 μ΄λ•Œ 동물듀이 κ³„μ†ν•΄μ„œ λŠ˜μ–΄λ‚œλ‹€λ©΄, ZooKeeper에 ν•΄λ‹Ή λ™λ¬Όλ“€μ˜ νƒ€μž…μ„ λ§€κ°œλ³€μˆ˜λ‘œ ν•œ feed() λ©”μ„œλ“œλ₯Ό 계속 계속 μΆ”κ°€ν•΄μ£Όμ–΄μ•Όν•œλ‹€. μ΄λ ‡κ²Œ 계속 μΆ”κ°€ν•˜κ²Œ 되면 ZooKeeper κ°€ ꡉμž₯히 λ³΅μž‘ν•΄μ§ˆ 것이닀.

 

μ΄λŸ΄λ•Œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λ©΄ 훨씬 효율적으둜 μ½”λ“œλ₯Ό ꡬ성할 수 μžˆλ‹€.

먹이λ₯Ό μ£ΌλŠ” λ©”μ„œλ“œ κΈ°λŠ₯을 κ°€μ§„ μΈν„°νŽ˜μ΄μŠ€ Workλ₯Ό μƒμ„±ν•΄λ³΄μž.

interface Work {	} // μΈν„°νŽ˜μ΄μŠ€
class Animal { // λΆ€λͺ¨(μƒμœ„) 클래슀
    String name;
    void setName(String name) {
    	this.name = name;
    }
}
class Tiger extends Animal implements Work { }
class Bear extends Animal implements Work { }

그리고 Tiger, Bear ν΄λž˜μŠ€μ—μ„œ  μΈν„°νŽ˜μ΄μŠ€ Workλ₯Ό μƒμ†ν•œλ‹€. 

*μΈν„°νŽ˜μ΄μŠ€ μƒμ†μ‹œ ν‚€μ›Œλ“œλŠ” implements

 

μ΄λ ‡κ²Œν•˜λ©΄ ZooKeeper ν΄λž˜μŠ€μ— μΈν„°νŽ˜μ΄μŠ€ Work νƒ€μž…μ„ λ§€κ°œλ³€μˆ˜λ‘œ λ°›μ•„μ„œ 먹이λ₯Ό μ£ΌλŠ” κΈ°λŠ₯인 feed() λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•  수 μžˆλ‹€. 

class ZooKeeper {
    void feed(Work work) {
        System.out.println("feed apple to Animal");
    }
}

μ›λž˜λŠ” Tiger, Bear νƒ€μž…μ— λŒ€ν•΄ 각각 feed() λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•΄μ•Όν–ˆμ§€λ§Œ, μΈν„°νŽ˜μ΄μŠ€μΈ Work νƒ€μž…μ˜ν•˜λ‚˜μ˜ λ©”μ„œλ“œλ§ŒμœΌλ‘œλ„ feed() λ©”μ„œλ“œ κ΅¬ν˜„μ΄ κ°€λŠ₯ν•˜λ‹€.

μ‹€μ œλ‘œ Tiger, Bear μΈμŠ€ν„΄μŠ€λ₯Ό feed(Work work) λ©”μ„œλ“œμ˜ 인자둜 λ„£μ–΄μ„œ ν˜ΈμΆœν•˜λ©΄ μ•„λž˜μ™€ 같은 κ²°κ³Όκ°€ λ‚˜μ˜¨λ‹€.

public static void main(String[] args) {
    ZooKeeper zooKeeper = new ZooKeeper();
    Tiger tiger = new Tiger();
    Bear bear = new Bear();

    zooKeeper.feed(tiger); // feed apple to Animal
    zooKeeper.feed(bear); // feed apple to Animal
}

 

이제 μ–΄λ–€ 동물 클래슀λ₯Ό μΆ”κ°€ν•˜λ“  ZooKeeper ν΄λž˜μŠ€μ— feed() λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•  ν•„μš”κ°€ μ—†λ‹€.

 

λ‹€μ‹œ μœ„μ—μ„œ μ–˜κΈ°ν–ˆλ˜ 이유λ₯Ό κ°€μ Έμ˜€λ©΄,

"μ€‘μš” 클래슀λ₯Ό μž‘μ„±ν•˜λŠ” μ‹œμ μ—μ„œ 클래슀의 κ΅¬ν˜„μ²΄κ°€ λͺ‡ κ°œκ°€ 될지 μ•Œ 수 μ—†μœΌλ―€λ‘œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν•΄μ„œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κΈ°μ€€μœΌλ‘œ λ©”μ„œλ“œλ₯Ό λ§Œλ“œλŠ” 것이 효율적"

μ΄λΌλŠ” 말이 μ‘°κΈˆμ€ 이해가 될 것이닀.

 

λ‹€λ§Œ, μœ„ μ˜ˆμ‹œλŠ” μΈν„°νŽ˜μ΄μŠ€κ°€ μ™œ ν•„μš”ν•œκ°€μ— λŒ€ν•œ 뢀뢄에 λŒ€ν•œ μ„€λͺ…을 μœ„ν•œ μ˜ˆμ‹œλ‘œ, Work μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒμ†ν•˜λŠ” λͺ¨λ“  ν΄λž˜μŠ€μ—μ„œ 같은 좜λ ₯이 λ‚˜μ˜¨λ‹€. 이건 Work μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒμ†λ°›λŠ” ν•˜μœ„ 클래슀, 즉 μžμ‹ ν΄λž˜μŠ€μ—μ„œ λ³„λ„λ‘œ λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•΄μ„œ 각 동물 ν΄λž˜μŠ€λ§ˆλ‹€ λ‹€λ₯Έ κ²°κ³Όλ₯Ό λ‚˜μ˜€κ²Œ ν•  수 μžˆλ‹€.

*μ–΄λ–»κ²Œ ν•˜λŠ”κ±΄μ§€λŠ” 이 ν¬μŠ€νŒ…μ—μ„œλŠ” 닀루지 μ•Šκ² λ‹€. 좔상 ν΄λž˜μŠ€λž‘ 비ꡐ가 λͺ©μ μ΄λ―€λ‘œ..

 

좔상 클래슀(Abstract Class)

좔상 ν΄λž˜μŠ€λŠ” β‘  ν•˜λ‚˜ μ΄μƒμ˜ 좔상 λ©”μ„œλ“œλ₯Ό ν¬ν•¨ν•˜λ©°, μΈν„°νŽ˜μ΄μŠ€μ˜ 역할도 ν•˜λ©΄μ„œ 클래슀의 κΈ°λŠ₯도 κ°€μ§€κ³  μžˆλŠ” ν΄λž˜μŠ€μ΄λ‹€. 

ν•˜λ‚˜ μ΄μƒμ˜ 좔상 λ©”μ„œλ“œλ₯Ό ν¬ν•¨ν•œλ‹€λŠ” 것은, 일반 λ©”μ„œλ“œλ₯Ό κ°€μ§ˆ 수 μžˆλ‹€λŠ” μ˜λ―Έλ„ λ‚΄ν¬ν•œλ‹€.

μΈν„°νŽ˜μ΄μŠ€μ˜ 경우, λͺ¨λ“  λ©”μ„œλ“œκ°€ 좔상 λ©”μ„œλ“œμΈ 반면 좔상 ν΄λž˜μŠ€λŠ” 미리 κ΅¬ν˜„λœ λ©”μ„œλ“œλ₯Ό κ°€μ§ˆ 수 μžˆλ‹€λŠ” 차이가 μžˆλ‹€.

abstract class 클래슀λͺ…() { // 좔상 클래슀
    abstract λ°˜ν™˜νƒ€μž… λ©”μ„œλ“œλͺ…(); // 좔상 λ©”μ„œλ“œ
}

좔상 λ©”μ„œλ“œλŠ” μΈν„°νŽ˜μ΄μŠ€μ˜ λ©”μ„œλ“œμ™€ λ§ˆμ°¬κ°€μ§€λ‘œ κ΅¬ν˜„μ²΄κ°€ μ—†λ‹€.

즉, 좔상 클래슀λ₯Ό μƒμ†ν•˜λŠ” μžμ‹ ν΄λž˜μŠ€μ—μ„œ λ°˜λ“œμ‹œ ν•΄λ‹Ή 좔상 λ©”μ„œλ“œλ₯Ό μ˜€λ°”λΌμ΄λ”©μ„ν•΄μ•Ό μ‚¬μš©ν•  수 μžˆλ‹€.

좔상 λ©”μ„œλ“œλŠ” μ½”λ“œ λΈ”λŸ­μ΄ μžˆλŠ” κ΅¬ν˜„μ²΄λ‘œ μž‘μ„±λ˜μ§€ μ•Šκ³ , μ„ μ–ΈλΆ€λ§Œ μ‘΄μž¬ν•œλ‹€. 이 λ©”μ„œλ“œλ₯Ό μžμ‹ ν΄λž˜μŠ€μ—μ„œ μ˜€λ²„λΌμ΄λ”©ν•˜μ—¬ κ΅¬ν˜„ν•΄μ„œ μ‚¬μš©ν•˜λŠ” 것이닀.

 

λ‹€μ‹œλ§ν•΄, 좔상 ν΄λž˜μŠ€λŠ” "λ‚΄κ°€ 이 κΈ°λŠ₯을 정해두지 μ•Šμ„ν…Œλ‹ˆ, λ‚˜λ₯Ό μƒμ†ν•œ μžμ‹ ν΄λž˜μŠ€λ“€μ•„, λ‚΄κ°€ μ •μ˜ν•œ κΈ°λŠ₯을 κ΅¬ν˜„ν•΄λ΄!" 라고 이야기 ν•˜λŠ” 것이닀. 여기에 μΆ”κ°€λ‘œ, "단 μΌλΆ€λŠ” λ§Œλ“€μ–΄μ£Όκ³ , μΌλΆ€λŠ” μ•ˆλ§Œλ“€μ–΄μ€„κ²Œ" 라고 ν•œλ‹€κ³  μƒκ°ν•˜λ©΄ κΈ°μ–΅ν•˜κΈ° 쉽닀.

 

좔상 ν΄λž˜μŠ€λŠ” μΈν„°νŽ˜μ΄μŠ€μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ κ΅¬ν˜„λΆ€κ°€ μ—†λŠ” 좔상 λ©”μ„œλ“œκ°€ 있기 λ•Œλ¬Έμ— 일반 ν΄λž˜μŠ€μ™€ 달리  β‘‘ λ‹¨λ…μœΌλ‘œ 객체, 즉 μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μ—†λ‹€.

λ°˜λ“œμ‹œ 좔상 클래슀λ₯Ό μƒμ†ν•œ μ‹€μ œ 클래슀λ₯Ό ν†΅ν•΄μ„œλ§Œ 객체λ₯Ό 생성할 수 μžˆλ‹€.

(좔상 클래슀λ₯Ό μƒμ†ν•œ μžμ‹ ν΄λž˜μŠ€μ—μ„œ ν•΄λ‹Ή 좔상 클래슀의 좔상 λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”© ν•΄μ•Ό, μžμ‹ 클래슀의 μΈμŠ€ν„΄μŠ€ 생성 κ°€λŠ₯)

abstract class Teacher { }
Teacher t = new Teacher();  // Error: Cannot instantiate the type Teacher

 

그리고 좔상 ν΄λž˜μŠ€λŠ” μΈν„°νŽ˜μ΄μŠ€μ™€ 달리 일반 클래슀처럼 β‘’ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜, μƒμ„±μž, private λ©”μ„œλ“œ 등을 κ°€μ§ˆ 수 μžˆλ‹€.

즉, 좔상 λ©”μ„œλ“œμ™€ 일반 λ©”μ„œλ“œ, 객체 λ³€μˆ˜, μƒμ„±μžκΉŒμ§€ κ°€μ§ˆ 수 μžˆλŠ” 것이닀.

abstract class Teacher {
	private String name; // 멀버 λ³€μˆ˜
	Teacher() {} // μƒμ„±μž
    
	abstract void hello(); // 좔상 λ©”μ„œλ“œ
	void hi() { System.out.println("μ•ˆλ…•!"); } // 일반 λ©”μ„œλ“œ
}

 

그리고 Javaμ—μ„œλŠ” 클래슀의 닀쀑 상속을 막기 λ•Œλ¬Έμ— β‘£ 좔상 ν΄λž˜μŠ€λŠ” 닀쀑 상속을 ν•  수 μ—†λ‹€.

class 클래슀λͺ… extends μΆ”μƒν΄λž˜μŠ€

 

좔상 클래슀(Abstract Class)λ₯Ό μ‚¬μš©ν•˜λŠ” 이유?

좔상 λ©”μ„œλ“œλ„ μΈν„°νŽ˜μ΄μŠ€μ™€ λΉ„μŠ·ν•˜κ²Œ, μ€‘λ³΅λ˜κ±°λ‚˜ κ³΅ν†΅λ˜λŠ” 뢀뢄에 λŒ€ν•΄ 미리 λ§Œλ“€μ–΄μ§„ 것을 μ‚¬μš©ν•˜κ³ , 이λ₯Ό μ‚¬μš©ν•˜λŠ” μͺ½μ—μ„œ μžμ‹ μ—κ²Œ ν•„μš”ν•œ λΆ€λΆ„λ§Œ μž¬μ •μ˜ν•΄μ„œ μ‚¬μš©ν•¨μœΌλ‘œμ¨ 생산성과 νš¨μœ¨μ„±μ΄ ν–₯μƒλ˜κΈ° λ•Œλ¬Έμ— μ‚¬μš©ν•œλ‹€.

 

λ˜ν•œ 좔상 λ©”μ„œλ“œκ°€ ν¬ν•¨λœ 클래슀λ₯Ό μƒμ†λ°›λŠ” ν•˜μœ„(μžμ‹)ν΄λž˜μŠ€κ°€ λ°˜λ“œμ‹œ κ·Έ 좔상 λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜κ²Œλ” ν•˜κΈ° μœ„ν•¨μ΄λ‹€.

일반 λ©”μ„œλ“œλŠ” ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜μ§€ μ•Šμ„μˆ˜λ„ μžˆμ§€λ§Œ, 좔상 λ©”μ„œλ“œκ°€ ν¬ν•¨λœ 좔상 클래슀λ₯Ό 상속받은 λͺ¨λ“  ν•˜μœ„(μžμ‹)ν΄λž˜μŠ€λŠ” 좔상 λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•΄μ•Όλ§Œ μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 있기 λ•Œλ¬Έμ— λ°˜λ“œμ‹œ κ΅¬ν˜„ν•˜κ²Œ λœλ‹€.

 

μΈν„°νŽ˜μ΄μŠ€(Interface) vs 좔상 클래슀(Abstract Class)

그럼 이 λ‘˜μ˜ 차이가 어디에 μžˆλŠ”μ§€ μ •λ¦¬ν•΄λ³΄μž.

 

1. μ‚¬μš© λͺ©μ 

  • μΈν„°νŽ˜μ΄μŠ€λŠ” λͺ¨λ“  λ©”μ„œλ“œκ°€ 좔상 λ©”μ„œλ“œλ‘œ, μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒμ†λ°›λŠ” ν΄λž˜μŠ€κ°€ κ΅¬ν˜„ν•΄μ•Ό ν•  λ©”μ„œλ“œμ˜ 집합을 μ •μ˜ν•œλ‹€. 
  • 좔상 ν΄λž˜μŠ€λŠ” 1개 μ΄μƒμ˜ 좔상 λ©”μ„œλ“œκ°€ 있고, 일반 λ©”μ„œλ“œλ„ 포함할 수 있기 λ•Œλ¬Έμ—, 좔상 λ©”μ„œλ“œμ˜ κΈ°λŠ₯을 κ΅¬ν˜„ν•˜κ²Œ ν•˜κΈ° μœ„ν•΄μ„œλ„ μžˆμ§€λ§Œ, 상속을 ν†΅ν•œ 곡톡 κΈ°λŠ₯ κ³΅μœ ν•˜λ„λ‘ ν•˜λŠ” 것에도 λͺ©μ μ΄ μžˆλ‹€.

2. κ΅¬ν˜„

  • μΈν„°νŽ˜μ΄μŠ€λŠ” λͺ¨λ“  λ©”μ„œλ“œκ°€ 좔상 λ©”μ„œλ“œμ΄λ‹€.
  • 좔상 ν΄λž˜μŠ€λŠ” 좔상 λ©”μ„œλ“œμ™€ 일반 λ©”μ„œλ“œλ₯Ό λͺ¨λ‘ κ°€μ§ˆ 수 μžˆλ‹€.

3. 멀버 λ³€μˆ˜

  • μΈν„°νŽ˜μ΄μŠ€μ˜ 멀버 λ³€μˆ˜λŠ” public static final이닀. 즉, μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό κ°€μ§ˆ 수 μ—†λ‹€.
  • 좔상 ν΄λž˜μŠ€λŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό κ°€μ§ˆ 수 μžˆλ‹€.

4. μƒμ„±μž κ°€λŠ₯ μ—¬λΆ€

  • μΈν„°νŽ˜μ΄μŠ€λŠ” μƒμ„±μžλ₯Ό κ°€μ§ˆ 수 μ—†λ‹€.
  • 좔상 ν΄λž˜μŠ€λŠ” μƒμ„±μžλ₯Ό κ°€μ§ˆ 수 μžˆλ‹€.

5. 닀쀑 상속 μ—¬λΆ€

  • μΈν„°νŽ˜μ΄μŠ€(ν‚€μ›Œλ“œ: implements)λŠ” 닀쀑 상속이 κ°€λŠ₯ν•˜λ‹€.
  • 좔상 클래슀(ν‚€μ›Œλ“œ: extends) λŠ” 닀쀑 상속이 λΆˆκ°€λŠ₯ν•˜λ‹€. 

마치며,

Java의 μΈν„°νŽ˜μ΄μŠ€μ™€ 좔상 ν΄λž˜μŠ€μ— λŒ€ν•΄ μ•Œμ•„λ³΄μ•˜λ‹€.

μ•Œμ•„λ³΄λ©΄μ„œλ„ 더 μ•Œμ•„λ΄μ•Όν•  κ°œλ…λ“€μ΄ λ§Žμ•„μ„œ, 이후에 ν•˜λ‚˜μ”© 차근히 정리해보아야겠닀. 

 

μ°Έκ³  ν¬μŠ€νŒ… 및 μ„œμ 

  • Do it! 점프 투 μžλ°”
  • TCP School

+ Recent posts