-
[java] 인터페이스 사용법java 2023. 7. 1. 00:59
전 포스팅과 이어지는 내용임
https://lee-ding.tistory.com/13
[java] 인터페이스
인터페이스는 개발코드와 객체가 서로 통신하는 접점 역할을 한다. 개발 코드가 인터페이스의 추상 메소드를 호출하면, 인터페이스의 추상 메소드는 각 객체의 재정의된 실체메소드를 호출한
lee-ding.tistory.com
Television.java라는 구현 클래스가 있다고 해보자. 구현 클래스가 작성되면, new 연산자로 객체를 생성할 수 있다.
단순히 Television tv = new Television(); 과 같이 구현 객체를 생성한것이 인터페이스를 사용하였다고 볼 수는 없다.
인터페이스로 구현 객체를 사용하려면, 인터페이스 변수를 선언하고 구현 객체를 대입해야한다.
1. 인터페이스 선언
package interface_Test; //interface : RemoteControl public interface RemoteControl { //상수 필드 선언 public int MAX_VOLUME = 10; public int MIN_VOLUME = 0; //추상 메소드 선언 public void turnOn(); public void turnOff(); public void setVolume(int volume); }
2. 구현 클래스 선언
package interface_Test; //구현 클래스 : Television public class Television implements RemoteControl{ public int volume; //turnOn()의 실체 메소드 public void turnOn(){ System.out.println("TV를 켭니다."); } //turnOff()의 실체 메소드 public void turnOff(){ System.out.println("TV를 끕니다."); } //setVolume()의 실체 메소드 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); } }
package interface_Test; //구현 클래스 : Audio public class Audio implements RemoteControl{ public int volume; //turnOn()의 실체 메소드 public void turnOn(){ System.out.println("Audio를 켭니다."); } //turnOff()의 실체 메소드 public void turnOff(){ System.out.println("Audio를 끕니다."); } //setVolume()의 실체 메소드 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("현재 Audio 볼륨: "+this.volume); } }
3. 인터페이스를 사용하기 위해서는 기본적으로 구현 객체가 인터페이스 변수에 대입되어야 한다.
다음은 인터페이스가 사용되는 4가지 방식을 설명한다.
package interface_Test; public class MyClass { //1. 인터페이스가 필드 타입으로 사용되는 경우 RemoteControl rc = new Television(); //인터페이스로 구현 객체를 사용할려면, 다음과 같이 인터페이스 변수를 선언하고 구현객체를 대입해야한다. //생성자 MyClass(){ } //2. 인터페이스가 생성자의 매개 변수 타입으로 사용되는 경우 //new 연산자로 객체를 생성할 때 구현 객체를 생성자의 매개값(ex new Audio()) 으로 전달함 MyClass(RemoteControl rc){ this.rc = rc; rc.turnOn(); rc.turnOff(); rc.setVolume(5); } void methodA(){ RemoteControl rc = new Audio();//3. 인터페이스가 특정 메소드 내부 로컬 변수 타입으로 사용될 경우, 변수에 구현객체를 대입한다, rc.turnOn(); rc.setVolume(5); } //4. 인터페이스가 메소드의 매개 변수 타입으로 사용될 경우, 메소드 호출 시 구현 객체를 매개값(ex. new Television())으로 대입한다. void methodB( RemoteControl rc ){ rc.turnOn(); rc.setVolume(5); } }
4. 위 4가지 경우에 따라main 클래스에선 어떻게 호출할까
package interface_Test; public class MyClassExample { public static void main(String args[]) { //1의 경우 -> 바로 . 연산자로 사용가능 MyClass myClass1 = new MyClass(); myClass1.rc.turnOn(); myClass1.rc.setVolume(5); //2의 경우 -> new연산자로 생성한, 구현 객체를 매개값으로 대입함 MyClass myClass2 = new MyClass(new Audio()); //3의 경우 MyClass myClass3 = new MyClass(); myClass3.methodA(); //4의 경우 -> new연산자로 생성한, 구현 객체를 매개값으로 대입함 MyClass myClass4 = new MyClass(); myClass4.methodB(new Television()); } }
어떤 구현 객체를 대입하느냐에 따라, new Audio()? or new Television()?
인터페이스 소스 코드의 변함은 없는데. 구현 객체를 교체함으로써 프로그램의 실행결과가 다양해진다. 이것이 인터페이스 다형성이다.
'java' 카테고리의 다른 글
[java] JFrame 레이아웃 구성, Socket class (client 코드) (2) 2023.12.06 메소드 오버로딩 vs 메소드 오버라이딩 (0) 2023.06.27 [java] 엑셀 데이터 추출해오기 - Apache POI (in intellij) (1) 2023.06.19 7장 연습문제 (0) 2023.01.31 ClassCastException (0) 2023.01.31