인터페이스(interface)

인터페이스

인터페이스의 정의

인터페이스는 메서드의 시그니처(이름, 매개변수, 반환 값)만을 정의하며, 구현 내용을 제공하지 않는 객체 지향 프로그래밍의 개념입니다. 인터페이스는 interface 키워드를 사용하여 정의하며, 다음과 같은 특징을 가집니다:

  • 모든 메서드는 암묵적으로 publicabstract입니다.

  • 상수(static final) 필드를 가질 수 있습니다.

인터페이스의 구성

인터페이스는 다음과 같이 구성됩니다:

  1. 메서드 시그니처(abstract method signatures): 인터페이스는 메서드의 이름과 매개변수 타입, 반환 타입만을 정의합니다. 메서드 몸체(구현 내용)는 이 인터페이스를 구현하는 (implements) 객체에서 반드시 구현해야 합니다.

  2. 상수 필드(static final fields): 인터페이스 내에서 선언한 필드는 상수로 취급되며, 암묵적으로 public, static, final 특성을 가집니다.

인터페이스 사용예제

아래 예제는 Transport 인터페이스를 정의하고, CarBicycle 클래스에서 이 인터페이스를 구현한 사용 예제입니다.

interface HeadLight {
    void turnOn();
}
interface FuelDoor {
    void fillUp(int fuel);
}
interface Charger {
    void charge(int electricEnergy);
}
class Vehicle {
    int speed;

    Vehicle(String name, int mileage, int speed) {
        this.name = name;
        this.mileage = mileage;
        this.speed = speed;
    }

    void start() {
        System.out.println(name + " 운송수단이 출발합니다.");
    }
}
class Car extends Vehicle implements HeadLight, FuelDoor {
    int fuel;

    Car(String name, int mileage, int speed, int fuel) {
        super(name, mileage, speed);
        this.fuel = fuel;
    }
    
    @Override
    public void turnOn() {
        System.out.println("내연차 전조등을 켭니다.");
    }
    
    @Override
    public void fillUp(int fuel) {
        System.out.println("연료를 채웁니다.");
        this.fuel += fuel
    }
}
class ElectricCar extends Vehicle implements HeadLight, Charger {
    int batteryAmount;

    ElectricCar(String name, int mileage, int speed, int batteryAmount) {
        super(name, mileage, speed);
        this.batteryAmount = batteryAmount;
    }
    
    @Override
    public void turnOn() {
        System.out.println("전기차 전조등을 켭니다.");
    }
    
    @Override
    public void charge(int electricEnergy);
        System.out.println("배터리를 충전합니다.");
        batteryAmount += electricEnergy;
    }
}

상속은 is-a 관계에 적합한 반면,

  • 내연차는 운송수단이다.

  • 전기차는 운송수단이다.

인터페이스는 has-a 관계에 적합합니다.

  • 내연차는 전조등, 주유구를가진다.

  • 전기차는 전조등, 충전기를 가진다.

List<HeadLight> headLights = new ArrayList<>();
headLights.add(new Car("내연차", 100, 0, 20));
headLights.add(new ElectricCar("전기차", 50, 0, 70));

for (HeadLight headLight: headLights) {
    headLight.turnOn();
}

아래 코드를 실행시켜보면 아래 결과가 나옵니다.

내연차 전조등을 켭니다.
전기차 전조등을 켭니다.

headLights 에 자동차와 자전거를 담는 것이 이상해보이나, '전조등 기능을 가진 것들' 을 담는다고 생각하면 이치에 맞습니다. 그래서 인터페이스명을 HeadLightable , Fillable, Chargable-able 을 붙여 짓기도 합니다.

이렇게 인터페이스는 각 클래스가 가진 기능에 대해 명시하는 기능을 하며,

구현체가 메소드를 강제적으로 구현해야 하기 때문에, 초반 인터페이스 설계가 아주 중요합니다.

Last updated