Cute Light Pink Flying Butterfly 인터페이스란 무엇인가? :: 놀면서 돈벌기
본문 바로가기
IT/Architecture

인터페이스란 무엇인가?

by esclife_ 2025. 10. 25.
반응형

아래의 링크를 참조하여 공부하였습니다.

 

☕ 인터페이스(Interface) 문법 & 활용 - 완벽 가이드

인터페이스 정의 (친숙하게 설명) 객체 지향 프로그래밍의 추상화를 배우고 추상 클래스를 접해봤다면 그 다음 접해보는 것이 인터페이스(Interface) 일 것이다. 인터페이스는 간단히 말하자면 프

inpa.tistory.com

 

 


인터페이스란? 서로 다른 두 개의 시스템/장치 사이에서 정보나 신호를 주고받거나 연결 장치간의 경계면을 이야기하는데요.

즉, 사용자가 기기를 쉽게 동작시키는데 도움을 주는 상호작용 시스템을 의미한답니다.

예를 들면, 바탕화면의 '아이콘'이 인터페이스인 셈입니다. 사용자가 프로그램에 접근할 수 있게하는 매개체이니까요.

 

interface = 독립된 두 개 시스템간의 상호작용 방식

(그 대상은, S/W <-> H/W도 될 수 있고, 사람 <->시스템도 될 수 있고..)

 

 

ex) interface 예시
1. interface 구현

public interface BakingRecipe { 

    // 변수는 자동으로 public static final (상수)
    int FLOUR_GRAMS = 250;
    int BUTTER_GRAMS = 150;
    int MILK_ML = 100;
    int OVEN_TEMP_CELSIUS = 180;
    
    // 메서드는 자동으로 public abstract
    void prepareIngredients();   // 재료를 준비하고 계량하는 단계
    void mixDryAndWet();         // 건조 재료와 습식 재료를 섞는 단계
    void bake(int durationMinutes); // 지정된 시간(분) 동안 굽는 단계
    boolean checkReadiness();      // 베이킹이 완료되었는지 확인하고 결과를 반환하는 단계
}

 


인터페이스의 가장 기본적인 활용 방법은 인터페이스를 모두 구현한 클래스를 만들고, 이 클래스의 객체를 인터페이스 타입으로 참조하여 사용하는 것입니다. BakingRecipe라는 인터페이스를 만들고나서, 이걸 활용하는 방법은 아래의 순서와 같습니다.

 

2. Class implements Interface(모든 인터페이스를 구현한 클래스 추가)

// 🍪 Cookie 클래스는 BakingRecipe의 규약을 "구현(implements)"합니다.
public class Cookie implements BakingRecipe {

    // 1. prepareIngredients()를 반드시 구현해야 합니다.
    @Override
    public void prepareIngredients() {
        System.out.println("버터와 설탕을 섞고 계란을 넣습니다.");
    }

    // 2. mixDryAndWet()를 반드시 구현해야 합니다.
    @Override
    public void mixDryAndWet() {
        System.out.println("밀가루와 반죽을 섞습니다.");
    }

    // 3. bake()를 반드시 구현해야 합니다.
    @Override
    public void bake(int durationMinutes) {
        System.out.println("쿠키를 " + durationMinutes + "분 동안 굽습니다. (실제 쿠키 시간: 12분)");
    }

    // 4. checkReadiness()를 반드시 구현해야 합니다.
    @Override
    public boolean checkReadiness() {
        return true; // 간단히 true 반환 가정
    }
}

 

 

3. interface = new Class (인터페이스 타입으로 객체를 참조하여 호출)

interface 메서드들을 구현했던 클래스를 참조하여 인터페이스를 최종 호출합니다.

클래스 구현 내용
Cookie 클래스 prepareIngredients(): 버터와 설탕을 섞는다.
bake(int durationMinutes): 12분 동안 굽는다.
Muffin 클래스 prepareIngredients(): 밀가루, 베이킹파우더를 섞는다.
bake(int durationMinutes): 20분 동안 굽는다.

 

public class Bakery { // 이 클래스에서 베이킹을 실행한다고 가정

    public static void main(String[] args) {
        
        // 1. BakingRecipe 타입으로 Cookie 객체를 참조 (다형성)
        BakingRecipe recipe = new Cookie();
        
        // 2. 인터페이스가 정의한 메서드를 호출
        recipe.prepareIngredients(); 
        recipe.mixDryAndWet();
        
        // 3. 인터페이스의 상수 사용
        int ovenTemp = BakingRecipe.OVEN_TEMP_CELSIUS;
        
        recipe.bake(15); // 15분을 넣어도, Cookie 클래스의 bake 로직이 실행됩니다.
        
        if (recipe.checkReadiness()) {
            System.out.println("베이킹 완료!");
        }
    }
}

 

 

인터페이스의 특징은?

 

  • 인터페이스 작성 == 추상클래스 작성(추상메서드 집합)
  • 인터페이스 구현코드 안에서는 final(상수)로만 변수 정의가 가능해요
  • 메서드의 선언은 있지만, 그 안에 구체적인 구현코드는 없습니다.(구현은 인터페이스를 호출하는 클래스에서 직접 해야해요)
  • 하나의 클래스 내에서 여러개의 인터페이스가 구현 될 수 있어요 => 다중 상속
  • 접근 제어자가 자동으로 설정돼요. 인터페이스 내에서 변수와 메서드를 선언할 때 public이나 abstract, final 같은 접근 제어자를 따로 붙이지 않아도 자동으로 적용됩니다.

 


인터페이스를 이용해 decoupling(의존성 제거)

 

인터페이스를 이용해서 클래스간 관계를 상속(Extends)가 아닌 구현(Implements)로 변경하면, 객체간 의존성이 줄어들어 SOLID 원칙의 OCP(Open Closed Principle) - 개방/폐쇄 원칙을 충족하는 코드로 구현할 수 있습니다.

예를 들면, [베이킹class(빵레시피, 빵재료선언)/호출class(베이킹class호출)] 베이킹 클래스(빵 레시피)와 호출 클래스가 있을 때, 빵 종류가 추가될 때마다 두 클래스를 모두 수정해야 하는 문제는 강한 결합(Tight Coupling) 때문에 발생합니다. 호출 클래스가 특정 베이킹 클래스에 직접적으로 의존하고 있기 때문입니다.

 

여기에 인터페이스를 추가하게 되면 다음과 같이 의존성이 끊어지고 유연성이 확보됩니다.

🤝 의존성 제거 (Decoupling)

BakingRecipe라는 인터페이스를 추가하고, 호출 클래스가 구체적인 베이킹 클래스 (예: Cookie, Muffin) 대신 이 인터페이스 타입에 의존하도록 변경합니다.

  • 변경 전: 호출 클래스 -> Cookie 클래스 (직접 의존)
  • 변경 후: 호출 클래스 -> BakingRecipe 인터페이스 <- Cookie 클래스 (간접 의존)

호출 클래스는 이제 "이 객체가 무엇인지(쿠키인지 머핀인지)"는 알 필요 없이, "이 객체가 BakingRecipe의 규약을 따르므로 bake() 메서드가 있겠구나"만 알면 됩니다. 즉, 추상화된 규약에 의존하게 되면서 의존성이 줄어듭니다.

🛡️ OCP (개방-폐쇄 원칙) 충족

개방-폐쇄 원칙은 확장에는 열려 있고, 수정에는 닫혀 있어야 한다는 원칙입니다. 인터페이스를 사용하면 이 원칙을 충족할 수 있게되요

원칙 인터페이스 적용 결과
확장에 열려 있음 (Open for Extension) 새로운 빵 종류(Brownie, Cake 등)를 추가할 때, 오직 새로운 클래스만 만들고 BakingRecipe 인터페이스를 구현하기만 하면 됩니다.
수정에 닫혀 있음 (Closed for Modification) 새로운 빵 종류가 추가되더라도, 이미 완성된 호출 클래스의 코드는 수정할 필요가 없습니다. 호출 클래스는 여전히 BakingRecipe 인터페이스를 다루기 때문입니다.
반응형