개발계발
인터페이스 본문
인터페이스란?
두 객체를 연결하는 역할을 하는 것으로, 인터페이스를 통해 객체가 다른 객체를 직접 사용하지 않음으로 다형성 구현에 주된 기술로 이용된다.
예를 들어, 아래와 같이 객체 B가 객체 C로 변경된다 하더라도, 객체 A는 인터페이스의 메소드만 사용하기 때문에 아무 상관이 없다.
인터페이스 선언
인터페이스는 class 키워드 대신 interface 키워드를 사용한다.(파일 자체는 클래스와 동일하게 .java의 형태)
interface 인터페이스명 {...} // default 접근 제한
// public 접근 제한
public interface 인터페이스명 {
// public 상수 필드
// public 추상 메소드(선언부만 있고, 실행부인 중괄호가 없는 메소드)
// public 디폴트 메소드
// public 정적 메소드
// private 메소드
// private 정적 메소드
}
그럼 구체적으로 인터페이스를 사용하는 예시를 살펴보자
메인(사람)이 인터페이스(리모컨)을 이용해 객체(티비)를 조작하는 예시이다.
// 인터페이스
public interface RemoteControl {
// 추상 메소드
public void turnOn();
}
// 객체1
public class Television implements RemoteControl {
@Override
public void turnOn() {
System.out.println("tv를 킨다.)
}
}
// 객체2
public class Audio implements RemoteControl {
@Override
public void turnOn() {
System.out.println("오디오를 킨다.)
}
}
// 메인
public class RemoteControlExample {
public static void main(String[] args) {
RemoteControl rc;
// rc변수에 Television 객체 대입
rc = new Television();
rc.turnOn();
// rc변수에 Audio 객체 교체
rc = new Audio();
rc.turnOn();
}
}
위의 예시처럼 인터페이스는 추상메소드를 가지고 있고, Television 클래스와 Audio 클래스는 인터페이스를 상속받아서, 인터페이스의 메소드와 같은 이름의 메소드를 Override해서 사용할 수 있다.
이렇게 되면 메인 클래스(사람)은 RemoteControl 인터페이스를 통해 Television과 Audio를 자유롭게 사용할 수 있다.
주의사항
어떤 인터페이스를 상속받은 클래스는 반드시 해당 인터페이스에 정의된 모든 추상 메소드를 재정의해야한다.
인터페이스의 필드
인터페이스는 public static final특성을 갖는 불변의 상수 필드만을 멤버로 가질 수 있다.
public static final 타입 변수명 = 값;
public static final 키워들르 생략해도 컴파일 과정에서 자동으로 붙는다. 아래와 같이 선언할 수 있다.
public interface RemoteControl {
int MAX_VOLUME = 10;
public static final int MIN_VOLUME= 0;
// 둘다 같은 접근 제한을 갖게 됨
}
상수는 구현 객체와 상관없이 인터페이스 소속 멤버이므로 인터페이스로 바로 접근해 사용 가능하다.
public class RemoteControlExample {
public static void main(String[] args) {
System.out.println("리모콘 최대 볼륨: " + RemoteControl.MAX_VOLUME);
}
}
디폴트 메소드
인터페이스에는 추상메소드 외에도 완전한 실행 코드를 갖는 디폴트 메소드를 선언할 수 있다.
바로 아래의 예시를 보자
public interface RemoteControl {
// 추상 메소드
void setVolume(int volume);
// 디폴트 인스턴스 메소드
default void setMute(boolean mute) {
if(mute) {
System.out.println("무음 설정");
setVolume(MIN_VOLUME);
} else {
System.out.println("무음 해제");
}
}
}
정적 메소드
구현 객체없이 인터페이스에 직접 접근해 사용할 수 있는 정적 메소드도 선언가능하다.
아래의 예시를 보자
public interface RemoteControl {
// 정적 메소드
static void changeBattery() {
System.out.println("건전지 교체")
}
}
주의사항 : 정적메소드는 실행부에 상수필드를 제외한 추상 메소드, 디폴트 메소드, private 메소드 등을 호출할 수 없다.(이 메소드들은 구현 객체가 필요한 인스턴스 메소드이기 때문)
private 메소드
인터페이스의 상수 필드, 추상 메소드, 디폴트 메소드, 정적 메소드는 모두 public의 접근 제한을 갖는다.
선언할 때 public 키워드를 생략해도 컴파일 과정에서 public 접근 제한자가 자동으로 붙는데,
private 키워드를 명시해줌으로써 private 접근제한을 갖는 메소드를 선언할 수 있다.(외부에서 접근 불가능)
'자바' 카테고리의 다른 글
인터페이스의 타입 변환과 다형성 (0) | 2024.05.02 |
---|---|
다중 인터페이스 구현 (0) | 2024.05.02 |
추상 클래스와 봉인 클래스 (0) | 2024.04.26 |
상속 (1) | 2024.04.26 |
접근 제한자 (0) | 2024.04.26 |