본문 바로가기

PL(ProgrammingLanguage)/JAVA

인터페이스(interface) 정의

우리는  객체를 만들 기 전에 그 객체가 어떤 기능을 가지고 있을까? 에 대하여 먼저 고민해야 한다.

 

만약, 우리가 TV라는 객체를 만든다고 가정해보자.

 

우리는 TV가 어떤 기능을 가질까라는 고민을 하게 될 것이다.

 

기본적으로 TV의 기능으로  전원을 켜고 끄는 기능, 볼륨 조절 기능, 채널 변경 기능도 꼭 있었으면 좋겠다.

 

TV를 어떻게 만들지 내부적으로 내가 전원을 켰을 때, 어떤 식으로 구현이 되어 켜지는지 모르지만

이런 기능들은 필요해. 라고 생각할 수 있다.

 

그래서 꼭 필요한 기능들, 무슨 기능들이 있으면  좋을까?라는 고민을 할 수 있을 텐데

이를 구현은 하지 않고, 그 기능들만 쭉 선언해서 가지고 있는 것을 "interface(인터페이스)"라고 한다. 

 

 

인터페이스: 서로 관계가 없는 물체들이 상호 작용을 하기 위해서 사용하는 장치나 시스템

 


인터페이스 생성

package Java02;

public interface TV {
    public void turnOn();
}

기존의 class 대신 interface라는 게 와있는 것을 알 수 있다.

 

아까 고민했던 대로 기능이니깐 메서드 -> 메서드를 정의하듯이 나는 티비를 켜는 기능이 있었으면 좋겠어요.

--> 켜지기만 하고 특별히 나한테 돌려줄 값은 없기 때문에 리턴 타입은 void로 하고, 메소드의 이름은 turnOn()이라고 했다.

(메소드는 항상 뒤에 매개변수를 받아들여야 하니깐 반드시 괄호를 열고 닫는 부분을 필요.)

 

위 코드를 보면 추상클래스와 비슷하다.

추상클래스는 메소드를 구현하기는 애매하지만 근데 있어야 할 것 같아요.. 할 때 추상클래스를 만들었던 것과 비슷하다.

추상클래스의 경우 abstract을 붙여줘야 에러가 발생시키지 않는다.

 

그런데 인터페이스는 인터페이스 자체가 구현은 없고 어떤 어떤 것을 가지고 있을까?

거기까지만 선언하는 것이기 때문에 굳이 abstract를 붙이지 않아도 오류를 발생시키지 않는다.

 

package Java02;

public interface TV {
    // 숫자를 고정시키고 싶을 때 상수를 활용
    // 상수는 final란 키워드가 없어도 상수처럼 사용이 가능하다.
    // 0-100까지의 볼륨조절
    public int MIN_VOLUME = 0;
    public int MAX_VOLUME = 100;

    public void turnOn();

    public void turnOff();

    public void changeVolume(int volume);

    public void changeChannel(int channel);
}

인터페이스에서 변수를 선언하면 컴파일 시 자동으로 아래와 같이 바뀐다.

public static final int MAX_VOLUME = 100;
public static final int MIN_VOLUME = 0;

인터페이스에서 정의된 메소드는 모두 추상 메소드이다.

위에서 선언된 모든 메소드는 컴파일 시에 다음과 같이 자동으로 변경된다.

    public abstract void on();
    public abstract void off();
    public abstract void volume(int value);
    public abstract void channel(int number);

 

 

인터페이스는 자체적으로 타입의 역할은 할 수 있지만 구현이 하나도 없기 때문에

인터페이스 자체가 객체를 생성해놓지는 못한다.