KoreanFoodie's Study
8-1. 자바 인터페이스의 역할과 선언, 구현 예제 살펴보기 본문
인터페이스의 역할
인터페이스는 객체의 사용 방법을 정의한 타입이다. 개발 코드가 중간에 인터페이스를 두는 이유는, 개발 코드를 수정하지 않고, 사용하는 객체를 변경할 수 있도록 하기 위해서이다. 인터페이스는 하나의 객체가 아니라 여러 객체들과 사용이 가능하므로 어떤 객체를 사용하느냐에 따라 실행 내용과 리턴값이 다를 수 있다. 따라서 개발 코드 측면에서 코드 변경 없이 실행 내용과 리턴값을 다양화할 수 있다는 장점이 있다.
인터페이스 선언
인터페이스는 "~.java" 형태의 소스 파일로 작성되고 컴파일러(javac.exe)를 통해 "~.class" 형태로 컴파일되기 때문에 물리적 형태는 클래스와 동일하다.
public interface InterfaceName { ... }
인터페이스는 상수와 메소드만을 구성 멤버로 가진다. (생성자도 가질 수 없다). 자바8 부터는 디폴트 메소드와 정적 메소드도 선언이 가능하다.
public interface RemoteControl
{
// 상수
public int MAX_VOLUME = 10;
public int MIN_VOLUME = 0;
// 추상 메소드
public void turnOn();
public void turnOff();
public void setVolume(int volume);
}
디폴트 메소드 선언
디폴트 메소드는 public 특성을 갖기 때문에 public을 생략해도 자동적으로 컴파일 과정에서 붙게 된다.
// 디폴트 메소드
default void setMute(boolean mute)
{
if (mute)
{
System.out.println("Mute");
}
else
{
System.out.println("Mute Off");
}
}
정적 메소드 (static method)
정적 메소드도 컴파일 과정에서 public이 붙게 된다.
static void changeBattery()
{
System.out.println("Change Battery");
}
인터페이스 구현
인터페이스를 구현한 실제 객체를 구현(implement) 객체라고 하고, 구현 객체를 생성하는 클래스를 구현 클래스라고 한다.
public class Television implements RemoteControl
{
public void turnOn() {}
public void turnOff() {}
public void setVolume() {}
}
구현 클래스는 인터페이스의 추상 메소드를 반드시 구현해야 하고, 구현하지 않으면 자동으로 추상 클래스가 된다. 이때 class 앞에 abstract를 붙여 주어야 한다.
public abstract class Television implements RemoteControl
{
public void turnOn() { ... } // 다른 메소드 구현이 없음
}
인터페이스로 구현 객체를 사용하려면 인터페이스 변수를 선언하고 구현 객체를 대입해야 한다. 인터페이스 변수는 참조 타입이기 때문에 구현 객체가 대입될 경우 구현 객체의 번지를 저장한다.
인터페이스 변수;
변수 = 구현객체;
// 인터페이스 변수 = 구현객체;
public class RemoteControlExample
{
public static void main(String[] args)
{
RemoteControl rc;
rc = new Television();
rc = new Audio();
}
}
익명 구현 객체
구현 클래스를 사용하는 것은 일반적이지만, 일회성의 구현 객체를 만들기 위해 소스 파일을 만들고 클래스를 선언하는 것은 비효율적이다. 자바는 소스 파일을 만들지 않고도 구현 객체를 만들 수 있는 방법을 제공하는데, 그것이 익명 구현 객체이다. 자바는 UI 프로그래밍에서 이벤트를 처리하기 위해, 그리고 임시 작업 스레드를 만들기 위해 익명 구현 객체를 많이 활용한다. 자바 8에서 지원하는 람다식은 인터페이스의 익명 구현 객체를 만들기 때문에 익명 구현 객체의 코드 패턴을 잘 익혀야 한다.
인터페이스 변수 = new 인터페이스()
{
// 인터페이스에 선언된 추상 메소드의 실체 메소드 선언
}
new 연산자 뒤에는 클래스 이름이 와야 하는데, 이름이 없다. 인터페이스( ) { }는 인터페이스를 구현해서 중괄호 { }와 같이 클래스를 선언하라는 뜻이고, new 연산자는 이렇게 선언된 클래스를 객체로 생성한다. 중괄호 { } 에는 인터페이스에 선언된 모든 추상 메소드들의 실체 메소드를 작성해야 한다. 추가적으로 필드와 메소드를 선언할 수 있지만, 익명 객체 안에서만 사용할 수 있고 인터페이스 변수로 접근할 수 없다.
package my_interface;
public class RemoteControllerExample {
public static void main(String[] args)
{
RemoteControl rc = new RemoteControl()
{
public void turnOn() {}
public void turnOff() {}
public void setVolume(int volume) {}
};
System.out.println("Hello");
}
}
디폴트 메소드 사용
디폴트 메소드는 인스턴스 구현후 바로 사용이 가능하다. 경우에 따라 오버라이딩을 해주자!
정적 메소드 사용
정적 메소드는 기존의 정적 메소드들 처럼 클래스에서 바로 호출이 가능하다!
'Tutorials > Java' 카테고리의 다른 글
9-1. 자바 중첩 클래스와 중첩 인터페이스 : 로컬 클래스 (0) | 2021.09.17 |
---|---|
8-2. 자바 인터페이스 : 인터페이스 상속, 디폴트 메소드와 인터페이스 확장 (0) | 2021.09.15 |
7. 자바의 상속 : 타입 변환과 다형성 (0) | 2021.09.15 |
6-3. 어노테이션(Annotation) : 자바 어노테이션 개념과 예제 (0) | 2021.09.14 |
6-2. 패키지 : 자바 패키지의 개념과 예제 (0) | 2021.09.14 |