인터페이스(Interface)

syeon·2022년 1월 10일
0

Java

목록 보기
2/4

인터페이스

인터페이스란 사용자 또는 컴퓨터 간의 통신이 가능하도록 해주는 디바이스 프로그램을 의미한다. 쉽게 말해서 하나의 표준화를 제공하는 중간 매개체를 뜻한다.

Java에서의 인터페이스는 다른 클래스를 작성할 때 기본이 되는 틀을 제공하고, 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스이다.

인터페이스가 기능에 대한 선언을 제공하면 인터페이스를 구현하는 클래스에서는 추상화된 기능을 구현한다.

🤔 인터페이스 어떻게 사용하지?

Java에서 인터페이스는 인터페이스 명 앞에 interface 키워드를 붙여 사용이 가능하다.
그리고 클래스는 클래스명 뒤에 implements 키워드 + 인터페이스명을 입력하여 해당 인터페이스를 구현하고자 함을 선언할 수 있다.
그렇게 어떤 클래스가 인터페이스를 사용(상속)한다면 인터페이스에 선언되어져 있는 메서드를 구현해야 한다.
추상 클래스와 같이 인터페이스에는 메서드의 구체적인 내용이 기술되어 있지 않기 때문에 상속 받은 클래스에서 재정의(오버라이딩)하여 메서드를 이용할 수 있다.

interface Allowance {
    int monthly_allowance = 30000;
    
    void in(int value, String name);
    void out(int value, String name);
}
interface Academy {
    void pay(int academy_fee, String name);
}

Allowance 인터페이스는 용돈의 입출금 기능을 선언하고,
Academy 인터페이스는 학원비 결제 기능을 선언한다고 해보자.

class Student implements Allowance, Academy {
    // 인터페이스 구현
    @Override
    public void in(int value, String name) {
        System.out.printf("%s에게서 %d원 용돈을 받았습니다.%n", name, value);
    }

    @Override
    public void out(int value, String name) {
        System.out.printf("금액 %d원을 %s(으)로 지출했습니다.%n", value, name);
    }

    @Override
    public void pay(int academy_fee, String name) {
        System.out.printf("%s 학원비 %d 입금 완료.%n", name, academy_fee);
    }
}

Student 클래스는 위의 두 인터페이스를 구현한다.
implements 키워드를 이용해 인터페이스를 구현하겠음을 선언해준 뒤,
콤마(,)를 이용해 인터페이스를 다중 상속할 수 있다.
Student 클래스에서 인터페이스의 추상 메서드를 오버라이딩하여 기능을 구체화한다.

public class Main {
    public static void main(String[] args) {
        Student s1 = new Student();

        s1.in(5000, "엄마");
        s1.out(2000, "PC방");
        s1.in(s1.monthly_allowance, "엄마");
        s1.pay(300000, "수학 학원");

        System.out.println(Allowance.monthly_allowance);
    }
}
------------------------------------------------------------
>> 엄마에게서 5000원 용돈을 받았습니다.
>> 금액 2000원을 PC방()로 지출했습니다.
>> 엄마에게서 30000원 용돈을 받았습니다.
>> 수학 학원 학원비 300000 입금 완료.
>> 30000

🤔 장점(왜 써야 하는가)

인터페이스를 이용하면 메서드의 추상적인 선언과 그 메서드들을 구체적으로 구현한 부분을 분리할 수 있다. 이렇게 인터페이스를 통해 분업화된 시스템을 구축하여 개발 주체마다 독립적으로 프로젝트를 개발할 수 있다.

인터페이스 VS 추상클래스


https://techvidvan.com/tutorials/abstract-class-vs-interface/

- 사용방법

상속을 받기 위해서 추상클래스는 extends 키워드를 사용하고, 인터페이스는 implements 키워드를 사용한다.

- 메서드 타입

추상클래스는 추상메서드, 일반 메서드 모두 가질 수 있다. 반면에 인터페이스는 추상메서드만을 갖는다.
*Java8부터는 default메서드와 static메서드도 가질 수 있게 되었다.

- 상수(Final Variables)

인터페이스에 선언된 변수는 기본적으로 final 변수, 즉 상수이다. 추상클래스는 non-final 변수까지 포함 가능하다.

- 변수 타입

인터페이스는 오직 static 변수와 final 변수만을 갖는다.
반면에 추상 클래스는 final, non-final / static, non-static 변수 모두를 가질 수 있다.

- 구현

추상클래스는 인터페이스의 구현을 제공할 수 있으나, 반대로 인터페이스는 추상클래스를 구현할 수 없다.

- 상속

인터페이스는 오직 다른 인터페이스만을 상속할 수 있다.
추상클래스는 다른 클래스도 상속 가능하며 다중 인터페이스 구현도 가능하다.

- 데이터 변수 접근성

인터페이스 변수는 기본적으로 public이다.
추상클래스 변수는 private, protected 등 모든 접근 제어자를 가질 수 있다.

https://www.geeksforgeeks.org/difference-between-abstract-class-and-interface-in-java/

- 다중 상속 기능 제공

인터페이스의 역할과 구현은 앞서 살펴본 추상 클래스와 상당히 유사하다. 그러나 클래스를 다중 상속할 경우 메소드 출처의 모호성 등 여러 문제가 발생할 가능성이 있기 때문에 Java에서는 클래스를 이용한 다중 상속을 지원하고 있지 않다.
하지만 다중 상속의 이점도 있기 때문에 인터페이스를 이용해 다중 상속 기능을 제공하고 있다.

- 우선순위(extends VS implements)

상속을 받는 extends 키워드와 구현을 받는 implements 키워드를 동시에 사용하면 extends 키워드가 먼저 사용되어야 한다.

class Student extends Person implements Allowance, Academy {...}

profile
기록하려고 만든 개발블로그, 까먹지 말자!

0개의 댓글