[STUDY] 240215 | Java | 인터페이스(Interface) 복습

Nimgnos·2024년 3월 9일
0

👾 STUDY

목록 보기
29/40
post-thumbnail

💻 인터페이스(Interface)

  • 인터페이스란?

    • 구현하는(상속받는) 클래스의 "기본 설계도"의 역할
    • 기능을 사용하는 방법을 명시
  • 자바의 다형성을 극대화하여 개발코드 수정을 줄이고 프로그램 유지 보수성을 높이기 위해 인터페이스를 사용한다.
    ➡️ 수정, 보완 효율적, 유지 보수 용이
    ➡️ 다형성(Polymorphism) : 여러가지 형태를 가질 수 있는 능력 / 조상 타입 참조 변수로 자손 타입 객체를 다루는 것
  • 클래스가 인터페이스를 상속하는 행위를 ‘상속’이 아닌 ‘구현(implements)’이라 한다.
  • 인터페이스를 구현한 클래스의 생성자를 호출해서 인터페이스의 객체를 생성할 수 있다.
    • 인터페이스 단독으로 객체 생성은 불가함
      ➡️ 생성자를 호출 해야 하기 때문(내부 생성자 없음!)
  • 인터페이스를 이용해서 서로가 동일한 메소드를 만들도록 규약을 만들어서 공유한 결과, 각자가 상대의 일정이나 구현하는 방식에 덜 영향을 받으면서 에플리케이션을 구축 할 수 있다.
  • 클래스를 구현할 때 사용하는 규약
    ➡️ 해당 인터페이스를 사용하는 클래스는 인터페이스 내에 정의된 메소드를 반드시 구현해야한다.

💡 인터페이스의 특징

  • 하나의 클래스가 여러개의 인터페이스를 구현 할 수 있다.
  • 인터페이스도 상속이 가능하다.
  • 인터페이스의 맴버는 반드시 public이다.
    • 인터페이스는 그 인터페이스를 구현한 클래스를 어떻게 조작할 것인가를 규정한다. 그렇기 때문에 외부에서 제어 할 수 있는 가장 개방적인 접근 제어자인 public만을 허용한다. public을 생략하면 접근 제어자 default가 되는 것이 아니라 public이 된다. 왜냐하면 인터페이스의 맴버는 무조건 public이기 때문이다.
  • abstract vs interface
    • 인터페이스와 추상 클래스는 서로 비슷한 듯 다른 기능이다. 인터페이스는 클래스가 아닌 인터페이스라는 고유한 형태를 가지고 있는 반면 추상 클래스는 일반적인 클래스다. 또 인터페이스는 구체적인 로직이나 상태를 가지고 있을 수 없고, 추상 클래스는 구체적인 로직이나 상태를 가지고 있을 수 있다.

🗒️ 예제 - Printer test

  • 'LG프린트'와 '삼성프린트' 클래스가 각각 존재하며, 각 프린트 클래스에는 흑백, 컬러 출력 기능이 있다고 가정.
  • '프린터 테스트' 클래스에서는 각 사의 프린터를 사용하여 '컬러 출력'과 '흑백 출력' 기능을 사용하고자 함.
  • 인터페이스를 사용하면 프린터 테스트의 기존 코드 변경을 최소화, 효율적으로 클래스에 정의된 '컬러', '흑백' 출력 기능을 사용할 수 있음.

1. lg프린트

public class LgPrinter implements MyPrinter{
    public void grayPrint(){
        System.out.println("엘지프린터-흑백 출력");
    }
    public void colorPrint(){
        System.out.println("엘지프린터-컬러 출력");
    }
}

2. 삼성프린트

public class SamsungPrinter implements MyPrinter{
    public void grayPrint(){
        System.out.println("삼성프린터-흑백 출력");
    }
    public void colorPrint(){
        System.out.println("삼성프린터-컬러 출력");
    }
}

3. myPRINT - 인터페이스 생성

// printer 클래스를 구현할 때 사용하는 규약
// 해당 인터페이스를 사용하는 클래스는 반드시
// 인터페이스 내에 정의된 메소드를 반드시 구현
public interface MyPrinter {
    void grayPrint();
    void colorPrint();
}

4. 프린터 테스트

  • 인터페이스는 외부에서 클래스가 사용하는 방법을 명시하는 것이므로 외부에서 사용할 수 있게 public으로 인식함.
public class PrinterTest {
    public void setPrinter(){
        //인터페이스 사용
        Map<String, String> map1 = new HashMap<>();
        HashMap<String, String> map2 = new HashMap<>();
        ItemService i1 = new ItemServiceImpl();
        ItemServiceImpl i2 = new ItemServiceImpl();
        //인터페이스를 구현한 클래스의 생성자를 호출해서
        //인터페이스의 객체를 생성할 수 있다.
        //인터페이스 단독으로 객체 생성 불가(생성자 호출 해야 하기 때문/내부 생성자 없음)
        //MyPrinter p1 = new MyPrinter(); => 생성 불가
        MyPrinter printer1 = new LgPrinter();
        LgPrinter printer2 = new LgPrinter();
        SamsungPrinter printer3 = new SamsungPrinter();
        printer1.grayPrint();
        printer1.colorPrint();
    }
}


🔍 참고

profile
먹고 기도하고 코딩하라

0개의 댓글