[Java 개념] 인터페이스 예제

예세림·2024년 7월 23일

Java

목록 보기
7/12

앞선 인터페이스 포스팅에서 확장하여 예제를 공유드립니다.

// 일반적인 인터페이스와 관련된 예제

// 자바 인터페이스 정의
public interface Vehicle {
    void startEngine();
    void stopEngine();
}

// 다양한 구현 클래스
public class Car implements Vehicle {
    @Override
    public void startEngine() {
        System.out.println("Car engine started");
    }

    @Override
    public void stopEngine() {
        System.out.println("Car engine stopped");
    }
}

public class Boat implements Vehicle {
    @Override
    public void startEngine() {
        System.out.println("Boat engine started");
    }

    @Override
    public void stopEngine() {
        System.out.println("Boat engine stopped");
    }
}

// 플러그인 아키텍처 예제
public class VehicleManager {
    private List<Vehicle> vehicles = new ArrayList<>();

    public void addVehicle(Vehicle vehicle) {
        vehicles.add(vehicle);
    }

    public void startAllEngines() {
        for (Vehicle vehicle : vehicles) {
            vehicle.startEngine();
        }
    }
}

public class Main {
    public static void main(String[] args) {
        VehicleManager manager = new VehicleManager();
        
        Vehicle car = new Car();
        Vehicle boat = new Boat();
        
        manager.addVehicle(car);
        manager.addVehicle(boat);
        
        manager.startAllEngines();  // 출력: Car engine started, Boat engine started
    }
}

제네릭(Generic)의 구체적 설명

  • 제네릭은 데이터 타입을 일반화하는 방법입니다.
    • 제네릭을 사용하면 동일한 클래스나 메서드가 다양한 데이터 타입으로 동작할 수 있습니다.
    • 예를 들어, List<T>는 제네릭 리스트로, T가 어떤 타입이든 리스트를 생성할 수 있게 합니다.
public class Box<T> {
    private T item;

    public void setItem(T item) {
        this.item = item;
    }

    public T getItem() {
        return item;
    }
}

public class Main {
    public static void main(String[] args) {
        Box<String> stringBox = new Box<>();
        stringBox.setItem("Hello");
        System.out.println(stringBox.getItem());  // 출력: Hello

        Box<Integer> integerBox = new Box<>();
        integerBox.setItem(123);
        System.out.println(integerBox.getItem());  // 출력: 123
    }
}

추상 클래스와 인터페이스의 연관성

  • 추상 클래스:

    • 일부 구현된 메서드와 추상 메서드를 모두 가질 수 있습니다.
    • 클래스 간의 공통된 행동을 정의할 수 있으며, 단일 상속만 가능합니다.
  • 인터페이스:

    • 메서드 시그니처만 정의하며 구현을 제공하지 않습니다. (Java 8 이후에는 default 메서드를 통해 일부 구현 제공 가능)
    • 다중 상속이 가능하며, 클래스에 구현해야 할 메서드를 명확히 정의합니다.

추상 클래스와 인터페이스의 혼합 사용

// 추상 클래스 정의
public abstract class AbstractVehicle {
    abstract void startEngine();
    abstract void stopEngine();
    
    void honk() {
        System.out.println("Honking!");
    }
}

// 인터페이스 정의
public interface Electric {
    void chargeBattery();
}

// 클래스에서 추상 클래스와 인터페이스 구현
public class ElectricCar extends AbstractVehicle implements Electric {
    @Override
    public void startEngine() {
        System.out.println("Electric car engine started");
    }

    @Override
    public void stopEngine() {
        System.out.println("Electric car engine stopped");
    }

    @Override
    public void chargeBattery() {
        System.out.println("Charging battery");
    }
}

public class Main {
    public static void main(String[] args) {
        ElectricCar myCar = new ElectricCar();
        myCar.startEngine();
        myCar.honk();
        myCar.chargeBattery();
        myCar.stopEngine();
    }
}

이와 같이 인터페이스와 추상 클래스는 각자의 강점을 살려 혼합하여 사용하면 보다 유연하고 확장 가능한 객체 지향 프로그램을 작성할 수 있습니다.

0개의 댓글