Search

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

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

ν΄λž˜μŠ€λ“€μ΄ μ°Έμ‘°ν•  μƒμˆ˜μ™€ κ΅¬ν˜„ν•΄μ•Όν•˜λŠ” 좔상 λ©”μ†Œλ“œλ₯Ό μ •μ˜ν•œ μ°Έμ‘° νƒ€μž…

μΈν„°νŽ˜μ΄μŠ€ κ°œλ…

μΈν„°νŽ˜μ΄μŠ€(Interface)λŠ” μžλ°” ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ ν΄λž˜μŠ€λ“€μ΄ κ΅¬ν˜„ν•΄μ•Ό ν•˜λŠ” 좔상 λ©”μ†Œλ“œμ˜ 집합을 μ •μ˜ν•˜λŠ” μ°Έμ‘° νƒ€μž…μž…λ‹ˆλ‹€. μΈν„°νŽ˜μ΄μŠ€λŠ” 닀쀑 μƒμ†μ˜ 효과λ₯Ό μ œκ³΅ν•˜λ©°, 객체 κ°„μ˜ 계약(contract)을 μ •μ˜ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€.

μΈν„°νŽ˜μ΄μŠ€μ˜ νŠΉμ§•

β€’
λͺ¨λ“  λ©”μ†Œλ“œλŠ” 기본적으둜 public abstractμž…λ‹ˆλ‹€.
β€’
λͺ¨λ“  ν•„λ“œ(λ³€μˆ˜)λŠ” public static finalμž…λ‹ˆλ‹€.
β€’
ν΄λž˜μŠ€λŠ” μ—¬λŸ¬ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ™μ‹œμ— κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
β€’
μžλ°” 8λΆ€ν„° κΈ°λ³Έ λ©”μ†Œλ“œ(default method)와 정적 λ©”μ†Œλ“œλ₯Ό 포함할 수 μžˆμŠ΅λ‹ˆλ‹€.
β€’
μΈν„°νŽ˜μ΄μŠ€λŠ” μΈμŠ€ν„΄μŠ€ν™”ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

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

public interface MyInterface { // μƒμˆ˜ μ„ μ–Έ int MAX_SIZE = 100; // public static final이 μƒλž΅λ¨ // 좔상 λ©”μ†Œλ“œ μ„ μ–Έ void method1(); // public abstractκ°€ μƒλž΅λ¨ int method2(String param); // μžλ°” 8 이상: κΈ°λ³Έ λ©”μ†Œλ“œ default void defaultMethod() { System.out.println("κΈ°λ³Έ κ΅¬ν˜„μ΄ μžˆλŠ” λ©”μ†Œλ“œ"); } // μžλ°” 8 이상: 정적 λ©”μ†Œλ“œ static void staticMethod() { System.out.println("μΈν„°νŽ˜μ΄μŠ€μ˜ 정적 λ©”μ†Œλ“œ"); } }
Java
볡사

μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„ 방법

public class MyClass implements MyInterface { // μΈν„°νŽ˜μ΄μŠ€μ˜ λͺ¨λ“  좔상 λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•΄μ•Ό 함 @Override public void method1() { System.out.println("method1 κ΅¬ν˜„"); } @Override public int method2(String param) { return param.length(); } // κΈ°λ³Έ λ©”μ†Œλ“œλŠ” μ„ νƒμ μœΌλ‘œ μž¬μ •μ˜ κ°€λŠ₯ }
Java
볡사

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

β€’
λ‹€ν˜•μ„± κ΅¬ν˜„: μ—¬λŸ¬ ν΄λž˜μŠ€κ°€ 같은 μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λ©΄ λ™μΌν•œ λ°©μ‹μœΌλ‘œ λ‹€λ£° 수 μžˆμŠ΅λ‹ˆλ‹€.
β€’
관계 μœ μ—°μ„±: κ΅¬ν˜„ 클래슀 κ°„μ˜ 관계λ₯Ό λŠμŠ¨ν•˜κ²Œ μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
β€’
λͺ¨λ“ˆν™”: μ½”λ“œμ˜ λͺ¨λ“ˆμ„±μ„ 높이고 μœ μ§€λ³΄μˆ˜μ„±μ„ ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€.
β€’
API 섀계: μΌκ΄€λœ APIλ₯Ό μ„€κ³„ν•˜λŠ” 데 μœ μš©ν•©λ‹ˆλ‹€.

μΈν„°νŽ˜μ΄μŠ€ vs 좔상 클래슀

νŠΉμ§•
μΈν„°νŽ˜μ΄μŠ€
좔상 클래슀
λ©”μ†Œλ“œ
λͺ¨λ“  λ©”μ†Œλ“œλŠ” 기본적으둜 좔상
좔상 λ©”μ†Œλ“œμ™€ 일반 λ©”μ†Œλ“œ ν˜Όν•© κ°€λŠ₯
ν•„λ“œ
μƒμˆ˜λ§Œ κ°€λŠ₯
μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ κ°€λŠ₯
κ΅¬ν˜„
닀쀑 κ΅¬ν˜„ κ°€λŠ₯
단일 μƒμ†λ§Œ κ°€λŠ₯
λͺ©μ 
계약 μ •μ˜, κΈ°λŠ₯ λͺ…μ„Έ
곡톡 κΈ°λŠ₯ 제곡, 상속 계측 ꡬ쑰
μ ‘κ·Ό μ œμ–΄μž
λͺ¨λ“  μš”μ†Œκ°€ public
λͺ¨λ“  μ ‘κ·Ό μ œμ–΄μž μ‚¬μš© κ°€λŠ₯

μžλ°” 8 μ΄ν›„μ˜ μΈν„°νŽ˜μ΄μŠ€ λ³€ν™”

μžλ°” 8λΆ€ν„° μΈν„°νŽ˜μ΄μŠ€μ— κΈ°λ³Έ λ©”μ†Œλ“œ(default method)와 정적 λ©”μ†Œλ“œ(static method)λ₯Ό μΆ”κ°€ν•  수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 이 λ³€ν™”λ‘œ μΈν„°νŽ˜μ΄μŠ€μ˜ μœ μ—°μ„±μ΄ 크게 ν–₯μƒλ˜μ—ˆμŠ΅λ‹ˆλ‹€.
// μžλ°” 9 이후: private λ©”μ†Œλ“œ μΆ”κ°€ κ°€λŠ₯ public interface ModernInterface { default void defaultMethod() { privateHelper(); // private λ©”μ†Œλ“œ 호좜 System.out.println("Default method"); } // μžλ°” 9 이상: private λ©”μ†Œλ“œ private void privateHelper() { System.out.println("Private helper method"); } }
Java
볡사

ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€

μžλ°” 8μ—μ„œλŠ” ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ„ μ§€μ›ν•˜κΈ° μœ„ν•΄ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€(Functional Interface)λΌλŠ” κ°œλ…μ΄ λ„μž…λ˜μ—ˆμŠ΅λ‹ˆλ‹€. ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λŠ” ν•˜λ‚˜μ˜ 좔상 λ©”μ†Œλ“œλ§Œ 가진 μΈν„°νŽ˜μ΄μŠ€λ‘œ, λžŒλ‹€ ν‘œν˜„μ‹κ³Ό ν•¨κ»˜ μ‚¬μš©λ©λ‹ˆλ‹€.
@FunctionalInterface // μ»΄νŒŒμΌλŸ¬κ°€ κ²€μ‚¬ν•˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜ public interface Calculator { int calculate(int a, int b); // 단 ν•˜λ‚˜μ˜ 좔상 λ©”μ†Œλ“œ } // λžŒλ‹€ ν‘œν˜„μ‹μœΌλ‘œ κ΅¬ν˜„ Calculator addition = (a, b) -> a + b; Calculator subtraction = (a, b) -> a - b; int result1 = addition.calculate(10, 5); // 15 int result2 = subtraction.calculate(10, 5); // 5
Java
볡사

μΈν„°νŽ˜μ΄μŠ€ μ˜ˆμ‹œμ½”λ“œ

πŸ“¦ Project └── πŸ“‚ RemoteControl β”œβ”€β”€ πŸ“„ RemoteControl.java β”œβ”€β”€ πŸ“„ Drone.java β”œβ”€β”€ πŸ“„ RcCar.java β”œβ”€β”€ πŸ“„ Driver.java └── πŸ“„ Point.java
Plain Text
볡사

RemoteControl.java

package Day07.Ex02_Interface; public interface RemoteControl { // μƒμˆ˜ // μ΅œμ € 속λ ₯, 졜고 속λ ₯ μƒμˆ˜λ₯Ό μ„ μ–Έν•˜μ‹œμ˜€. // * μΈν„°νŽ˜μ΄μŠ€λŠ” λ³€μˆ˜ μ„ μ–Έ μ‹œ, (public static final)이 μžλ™μœΌλ‘œ μ„ μ–Έλœλ‹€. int MAX_SPEED = 300; int MIN_SPEED = 0; // 좔상 λ©”μ†Œλ“œ // * (public abstract) κ°€ μžλ™μœΌλ‘œ μ„ μ–Έλœλ‹€. void turnOn(); void turnOff(); void setSpeed(int speed); // λ””ν΄νŠΈ λ©”μ†Œλ“œ // : κ΅¬ν˜„ν•œ 객체가 μ˜€λ²„λΌμ΄λ”©ν•˜μ§€ μ•Šμ•„λ„ 기본으둜 μ‚¬μš©ν•  수 μžˆλŠ” λ©”μ†Œλ“œ default void parking(boolean check) { if( check ) { System.out.println("μ£Όμ°¨ λ˜μ—ˆμŠ΅λ‹ˆλ‹€."); setSpeed(MIN_SPEED); } else { System.out.println("μ£Όν–‰ λͺ¨λ“œλ₯Ό μ‹œμž‘ν•©λ‹ˆλ‹€."); setSpeed(10); } } // static λ©”μ†Œλ“œ // : κ΅¬ν˜„ 객체가 없어도 μΈν„°νŽ˜μ΄μŠ€λ§ŒμœΌλ‘œ 호좜이 κ°€λŠ₯ν•œ λ©”μ†Œλ“œ static void changeBattery() { System.out.println("배터리λ₯Ό κ΅μ²΄ν•˜μ˜€μŠ΅λ‹ˆλ‹€."); } }
Java
볡사

RcCar.java

package Day07.Ex02_Interface; // 클래슀λ₯Ό μƒμ†ν•˜λŠ” ν‚€μ›Œλ“œ : extends // μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” ν‚€μ›Œλ“œ : implements public class RcCar implements RemoteControl { int speed; @Override public void turnOn() { System.out.println("RCμΉ΄ 전원을 μΌ­λ‹ˆλ‹€."); } @Override public void turnOff() { System.out.println("RCμΉ΄ 전원을 λ•λ‹ˆλ‹€."); } @Override public void setSpeed(int speed) { // μ΅œλŒ€ 속λ ₯을 μ΄ˆκ³Όν•˜μ§€ λͺ»ν•˜κ²Œ 지정 if( speed > RemoteControl.MAX_SPEED ) { this.speed = RemoteControl.MAX_SPEED; System.err.println("μ΅œλŒ€ 속λ ₯!"); } // μ΅œμ € 속λ ₯ 미만이 λ˜μ§€ μ•Šλ„λ‘ 지정 else if( speed < RemoteControl.MIN_SPEED ) { this.speed = RemoteControl.MIN_SPEED; System.err.println("μ΅œμ € 속λ ₯!"); } else { this.speed = speed; } System.out.println("ν˜„μž¬ 속도 : " + this.speed); } }
Java
볡사

Drone.java

package Day07.Ex02_Interface; public class Drone implements RemoteControl { int speed; @Override public void turnOn() { System.out.println("λ“œλ‘  전원 ON"); } @Override public void turnOff() { System.out.println("λ“œλ‘  전원 OFF"); } @Override public void setSpeed(int speed) { if( speed > MAX_SPEED ) { this.speed = MAX_SPEED; System.err.println("μ΅œλŒ€ 속λ ₯!"); } else if( speed < MIN_SPEED ) { this.speed = MIN_SPEED; System.err.println("μ΅œμ € 속λ ₯!"); } else { this.speed = speed; } System.out.println("ν˜„μž¬ 속도 : " + this.speed); } }
Java
볡사

Driver.java

package Day07.Ex02_Interface; public class Driver { public static void main(String[] args) { // μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 클래슀 객체λ₯Ό λ§Œλ“œλŠ” 법 // - μΈν„°νŽ˜μ΄μŠ€νƒ€μž… 객체λͺ… = new κ΅¬ν˜„ν΄λž˜μŠ€(); // RCμΉ΄ RemoteControl carRc = new RcCar(); carRc.turnOn(); // μ‹œλ™ κ±ΈκΈ° carRc.parking(false); // μ£Όν–‰ λͺ¨λ“œ carRc.setSpeed(20); // 가속 carRc.parking(true); // μ£Όμ°¨ carRc.turnOff(); // μ‹œλ™ 끄기 System.out.println(); // static λ©”μ†Œλ“œλŠ” 객체 생성 없이도 λ°”λ‘œ 호좜 κ°€λŠ₯ RemoteControl.changeBattery(); // 배터리 ꡐ체 System.out.println(); // λ“œλ‘  RemoteControl droneRc = new Drone(); droneRc.turnOn(); // λ””ν΄νŠΈ λ©”μ†Œλ“œλŠ” κ΅¬ν˜„ν•˜μ§€ μ•Šμ•„λ„(μ˜€λ²„λΌμ΄λ”©) λ°”λ‘œ 호좜 κ°€λŠ₯ droneRc.parking(false); droneRc.setSpeed(15); droneRc.parking(true); droneRc.turnOff(); System.out.println(); } }
Java
볡사