∙ 자바에서 인터페이스는 객체의 사용 방법을 정의한 타입
∙ 인터페이스를 통해 다양한 객체를 동일한 사용 방법으로 이용할 수 있음
∙ 클래스와 달리 객체를 생성할 수 없으며, 클래스에서 구현해야 하는 작업 명세서
∙ 여러 객체들과 사용이 가능하므로 어떤 객체를 사용하느냐에 따라 실행 내용과 리턴값이 다를 수 있음
∙ 개발 코드 측면에서 코드 변경없이 실행 내용과 리턴값을 다양화 할 수 있음
상수 필드와 추상 메소드
상수 필드
인터페이스는 객체 사용 방법을 정의한 것이라 실행시 데이터를 저장할 수 있는 인스턴스 or 정적 필드를 선언할 수 없다. but 상수 필드는 사용 가능!! (단, 상수는 고정된 값으로 실행 시 데이터를 바꿀 수 없음)
package study1;
public interface RemoteControl {
//[public/static /final] 타입 상수이름 = 값;
public int MAX_VOLUME = 10;
public int MIN_VOLUME = 0;
}
인터페이스 상수는 반드시 선언과 동시에 초기값을 지정해야 한다.
추상 메소드
인터페이스를 통해 호출된 메소드는 최종적으로 객체에서 실행된다.
따라서 인터페이스의 메소드는 실행 블록이 필요없는 추상 메소드로 선언한다.
추상 메소드는 리턴타입, 메소드 이름, 매개 변수만 기술되고 중괄호{}를 붙이지 않는 메소드
추상 메소드는 모두 public abstract의 특성을 갖기 때문에 public abstract를 생략하더라도 컴파일 과정에서 자동으로 붙는다.
RemoteControl.java (인터페이스)
package study1;
public interface RemoteControl {
//상수
public int MAX_VOLUME = 10;
public int MIN_VOLUME = 0;
//추상 메소드
public void turnOn();
public void turnOff();
public void setVolume(int volume);
}
인터페이스 구현
인터페이스 메소드를 호출하면 인터페이스는 객체의 메소드를 호출한다
객체는 인터페이스에서 정의된 추상 메소드와 동일한 메소드 이름, 매개 타입, 리턴타입을 가진 실제 메소드를 가지고 있어야 한다.
이러한 객체를 인터페이스의 구현 객체라함
구현 객체를 생성하는 클래스를 구현 클래스라고 함
Television.java (구현클래스)
package study1;
public class Television implements RemoteControl{
//필드
private int volume;
//추상 메소드의 실체 메소드
@Override
public void turnOn() {
System.out.println("TV를 켭니다");
}
@Override
public void turnOff() {
System.out.println("TV를 끕니다");
}
@Override
public void setVolume(int volume) {
if(volume>RemoteControl.MAX_VOLUME){
this.volume = RemoteControl.MAX_VOLUME;
}
else if(volume<RemoteControl.MIN_VOLUME){
this.volume = RemoteControl.MIN_VOLUME;
}
else{
this.volume = volume;
}
System.out.println("현재 TV 볼륨: " + this.volume);
}
}
Audio.java
package study1;
public class Audio implements RemoteControl{
//필드
private int volume;
//추상 메소드의 실체 메소드
public void turnOn() {
System.out.println("오디오를 켭니다");
}
public void turnOff() {
System.out.println("오디오를 끕니다.");
}
public void setVolume(int volume) {
if(volume>RemoteControl.MAX_VOLUME){
this.volume = RemoteControl.MAX_VOLUME;
}
else if(volume<RemoteControl.MIN_VOLUME){
this.volume = RemoteControl.MIN_VOLUME;
}
else{
this.volume = volume;
}
System.out.println("현재 오디오 볼륨: " + this.volume);
}
}
인터페이스 구현 객체를 사용하려면 인터페이스 변수를 선언하고 구현 객체를 대입해야한다.
인터페이스 변수는 참조 타입이기 때문에 구현 객체가 대입될 경우 구현 객체의 번지를 저장한다.
MainClass.java
package study1;
public class MainClass {
public static void main(String[] args) {
RemoteControl rc; //인터페이스 변수
rc = new Television(); //구현객체 대입
rc = new Audio();
}
}
인터페이스 변수에 구현 객체 대입
인터페이스 사용
Myclass.java
package study1;
public class MyClass {
//인터페이스가 필드타입으로 사용
//구현객체를 대입할 수 있다.
RemoteControl rc = new Television();
MyClass(){
//생성자
}
//생성자의 매개값으로 구현객체 대입
MyClass(RemoteControl rc){
this.rc = rc;
rc.turnOn();
rc.setVolume(5);
}
//메소드
void methodA(){
RemoteControl rc = new Audio(); //로컬변수
rc.turnOn();
rc.setVolume(5);
}
void methodB(RemoteControl rc){
rc.turnOn();
rc.setVolume(5);
}
}
MainClass.java
package study1;
public class MainClass {
public static void main(String[] args) {
System.out.println(" 1)------------------");
MyClass myClass1 = new MyClass();//객체생성
myClass1.rc.turnOn();
myClass1.rc.setVolume(5);
System.out.println(" 2)------------------");
MyClass myClass2 = new MyClass(new Audio());
System.out.println(" 3)------------------");
MyClass myClass3 = new MyClass();
myClass3.methodA();
System.out.println(" 4)------------------");
MyClass myClass4 = new MyClass();
myClass4.methodB(new Television());
}
}
결과
1)------------------
TV를 켭니다
현재 TV 볼륨: 5
2)------------------
오디오를 켭니다
현재 오디오 볼륨: 5
3)------------------
오디오를 켭니다
현재 오디오 볼륨: 5
4)------------------
TV를 켭니다
현재 TV 볼륨: 5
Process finished with exit code 0
1) 인터페이스 만듦(RemoteControl). 여기에는 추상메소드가 들어있고 구현 클래스를 통해 메소드 구현 가능
2) 구현클래스(Televison,Audio)
∙ implement RemoteControl 함
∙ 여기에서 메소드 구현 : turnOn(), turnOff(), setVolume()
3) 새로운 클래스(MyClass) 만듦
∙ 인터페이스형 필드(rc)를 생성한 다음 구현 객체(Television)대입 → RemoteControl rc = new Television();
∙ 메소드 사용 ex) rc.turnOn();
'Language > Java' 카테고리의 다른 글
예외 클래스 (0) | 2022.01.27 |
---|---|
[JAVA] 람다식 (0) | 2022.01.16 |
[JAVA] 생성자 (0) | 2021.11.09 |
[자바 프로그래밍 입문] 객체와 메모리 (0) | 2021.11.09 |
[자바 프로그래밍 입문] 02 Java 프로그램의 실행 구조 (0) | 2021.11.04 |