μΈν°νμ΄μ€ (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
볡μ¬