본문 바로가기
Programing/JAVA (& 혼공자Java)

자바(Java) - 인터페이스

by a.k.a DUKI 2020. 11. 16.
728x90
반응형

자바에서 인터페이스는 객체의 사용 방법을 정의한 타입이다.

인터페이스를 통해 다양한 객체를 동일한 사용 방법으로 이용할 수 있다. 인터페이스를 통해 다형성을 구현할 수 있다.

 

 

인터페이스(interface)

  • 개발 코드는 인터페이스를 통해서 객체와 서로 통신한다.

  • 인터페이스의 메소드를 호출하면 객체의 메소드가 호출된다.

  • 개발 코드를 수정하지 않으면서 객체 교환이 가능하다.

혼공자 유툽 참고

인터페이스 선언

  • ~.java 형태 소스 파일로 작성되고, 컴파일러를 통해 ~.class 형태로 컴파일 된다.

  • 클래스와 물리저거 파일 형태는 같으나 소스 작성 내용이 다르다.

[public] interface 인터페이스이름 { ... }
  • 인터페이스는 객체로 생성할 수 없으므로 생성자를 가질 수 없다.

interface 인테페이스 이름 {
	//상수
    타입 상수이름 = 값;
    
    //추상 메소드
    타입 메소드이름(매개변수, ...);
}

 

상수 필드(constant field) 선언

  • 데이터를 저장할 수 있는 인스턴스 또는 정적 필드를 선언 할 수 없다.

  • 상수 필드만 선언이 가능하다.

[public static final] 타입 상수이름 = 값;
  • 상수 이름은 대문자로 작성하며, 서로 다른 단어로 구성되어 있을 경우 언더바(_) 를 이용한다.

public interface RemoteControl{
	public int MAX_VOLUME = 10;
    public int MIN_VOLUME = 0;
}
// 인터페이스 상수는 반드시 선언과 동시에 초기값을 지정해야 한다.

 

추상 메소드 선언

  • 인터페이스를 통해 호출된 메소드는 최종적으로 객체에서 실행 된다.

  • 인터페이스의 메소드는 실행 블록이 필요 없는 추상 메소드로 선언한다.

혼공자 유툽 참고

예시1) 상수 필드 선언 & 추상 메소드 선언

public interface RemoteControl {
	//상수
	public int MAX_VOLUME = 10;
	public int MIN_VOLUME = 0;
	
	//추상 메소드 - 메소드 선언부만 작성한다.
	public void turnOn();
	public void turnOff();
	public void setVolume(int volume);
}

 

인터페이스 구현

  • 인터페이스의 구현 객체: 추상 메소드와 동일한 메소드 이름, 매개 타입, 리턴 타입을 가진 실체 메소드
  • 구현 클래스: 구현 객체를 생성하는 클래스

구현(implement) 클래스

  • 인터페이스에서 정의된 추상 메소드를 재정의해서 실행내용을 가지고 있는 클래스
  • 클래스 선언부에 implements 키워드를 추가하고 인터페이스 이름을 명시한다.
  • 인터페이스에 선언된 추상 메소드의 실체 메소드를 선언한다.
pulbic class 구현클래스이름 implements 인터페이스이름{
	//인터페이스에 선언된 추상 메소드의 실체 메소드 선언
}

 

인터페이스와 구현 클래스 사용 방법

인터페이스 변수를 선언하고 구현 객체를 대입 한다.

인터페이스 변수;
변수 = 구현 객체;
인터페이스 변수 = 구현객체;

혼공자 유툽 참고

예시2) 인터페이스 구현

추상 메소드 선언

public interface RemoteControl {
	//상수
	int MAX_VOLUME = 10; //public static final 생략 가능
	int MIN_VOLUME = 0;
	
	//메소드
	void turnOn();  //public avstract 생략 가능
	void turnOff();
	void setVolume(int volume);
	
}

구현 클래스

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) {// 최대 볼륨시 MAX_VOLUME값으로 대체
			this.volume = RemoteControl.MAX_VOLUME;
		} else if (volume < RemoteControl.MIN_VOLUME) { // 최소 볼륨시 MIN_VOLUME값으로 대체
			this.volume = RemoteControl.MIN_VOLUME;
		} else { // 올바른 볼륨 값
			this.volume = volume;
		}
		System.out.println("현재 TV 볼륨: " + this.volume);
	}

}

구현 클래스

 

public class Audio implements RemoteControl {
	private int volume;

	@Override
	public void turnOn() {
		System.out.println("Audio를 킨다.");
	}

	@Override
	public void turnOff() {
		System.out.println("Audio를 끈다.");
	}

	@Override
	public void setVolume(int volume) {
		if (volume > RemoteControl.MAX_VOLUME) {// 최대 볼륨시 MAX_VOLUME값으로 대체
			this.volume = RemoteControl.MAX_VOLUME;
		} else if (volume < RemoteControl.MIN_VOLUME) { // 최소 볼륨시 MIN_VOLUME값으로 대체
			this.volume = RemoteControl.MIN_VOLUME;
		} else {// 올바른 볼륨 값
			this.volume = volume;
		}
		System.out.println("현재  Audio 볼륨: " + this.volume);
	}

}

 인터페이스 변수에 구현 객체 대입

public class RemoteControlEx {

	public static void main(String[] args) {

		RemoteControl rc;
		rc = new Audio();
		
		rc.turnOn();
		rc.setVolume(5);
		rc.turnOff();
		
		System.out.println("--------------");
		
		rc = new Television();
		rc.turnOn();
		rc.setVolume(7);
		rc.turnOff();
	}

}

 

 

다중 인터페이스 구현 클래스

객체는 다수의 인터페이스 타입으로 사용 가능 하다.

 

혼공자 유툽 참고

public class 구현클래스이름 implements 인터페이스A, 인터페이스B{
	//인터페이스 A에 선언된 추상 메소드의 실제 메소드 선언
    //인터페이스 B에 선언된 추상 메소드의 실제 메소드 선언
}

 

예시3) 인터페이스 구현

인터페이스

public interface Searchable {
	void search(String url);
}

구현 클래스

public interface RemoteControl {
	//상수
	int MAX_VOLUME = 10; //public static final 생략 가능
	int MIN_VOLUME = 0;
	
	//메소드
	void turnOn();  //public avstract 생략 가능
	void turnOff();
	void setVolume(int volume);
	
}

다중 인터페이스 구현 클래스

public class SmartTelevision implements RemoteControl, Searchable {
	private int volume;

	// Searchable의 추상 메소드에 대한 실체 메소드
	@Override
	public void search(String url) {
		System.out.println(url + "을 검색한다.");
	}

	// RemoteControl의 추상 메소드에 대한 실체 메소드
	@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);
	}

}

인터페이스 변수에 구현 객체 대입

public class SmartTelevisionEx {

	public static void main(String[] args) {

		SmartTelevision tv = new SmartTelevision();

		RemoteControl rc = tv;
		rc.turnOn();
		rc.setVolume(5);
		rc.turnOff();

		Searchable seachable = tv;
		seachable.search("http://www.naver.com");

	}

}

 

 

예시4) 인터페이스 구현

추상 메소드 선언

public interface RemoteControl {
	//상수
	int MAX_VOLUME = 10; //public static final 생략 가능
	int MIN_VOLUME = 0;
	
	//메소드
	void turnOn();  //public avstract 생략 가능
	void turnOff();
	void setVolume(int volume);
	
}

구현 클래스

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) {// 최대 볼륨시 MAX_VOLUME값으로 대체
			this.volume = RemoteControl.MAX_VOLUME;
		} else if (volume < RemoteControl.MIN_VOLUME) { // 최소 볼륨시 MIN_VOLUME값으로 대체
			this.volume = RemoteControl.MIN_VOLUME;
		} else { // 올바른 볼륨 값
			this.volume = volume;
		}
		System.out.println("현재 TV 볼륨: " + this.volume);
	}

}

구현 클래스

public class Audio implements RemoteControl {
	private int volume;

	@Override
	public void turnOn() {
		System.out.println("Audio를 킨다.");
	}

	@Override
	public void turnOff() {
		System.out.println("Audio를 끈다.");
	}

	@Override
	public void setVolume(int volume) {
		if (volume > RemoteControl.MAX_VOLUME) {// 최대 볼륨시 MAX_VOLUME값으로 대체
			this.volume = RemoteControl.MAX_VOLUME;
		} else if (volume < RemoteControl.MIN_VOLUME) { // 최소 볼륨시 MIN_VOLUME값으로 대체
			this.volume = RemoteControl.MIN_VOLUME;
		} else {// 올바른 볼륨 값
			this.volume = volume;
		}
		System.out.println("현재  Audio 볼륨: " + this.volume);
	}

}

 인터페이스 사용

public class MyClass {
	//Field
	RemoteControl rc = new Television();
	
	//Constructor
	MyClass(){
		
	}
	
	MyClass(RemoteControl rc){
		this.rc = rc;
		rc.turnOn();
		rc.setVolume(5);
	}
	
	//Method
	void methodA() {
		RemoteControl rc = new Audio();
		rc.turnOn();
		rc.setVolume(5);
	}
	
	void methodB(RemoteControl rc) {
		rc.turnOn();
		rc.setVolume(5);
	}
}

 인터페이스 사용

public class MyCalssEx {

	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());
	}

}

 

 

※용어 정리

  • 인터페이스: 객체의 사용 방법을 정의한 타입이며, 개발 코드와 객체가 서로 통신하는 접점 역할을 한다. 개발 코드가 인터페이스의 메소드를 호출하면 인터페이스는 객체의 메소드를 호출 시킨다. 구성 멤버는 상수 필드와 추상메소드 이다.

  • 상수 필드: 인터페이스의 상수 필드는 기본적으로 pulbic static final 특성을 갖는다. 관례적으로 필드 이름은 모두 대문자로 작성해야하며, 선언시 초기값을 대입해야 한다.

  • 추상 메소드: 인터페이스에 선언된 메소드는 public abstract가 생략되고 메소드 선언부만 있는 추상 메소드 이다. 구현 클래스는 반드시 추상메소드를 재정의 해야한다.

  • implements: 구현 클래스는 어떤 인터페이스로 사용가능한지를 기술하기 위해 클래스 선언 시 implements키워드를 사용한다.

  • 인터페이스 사용: 클래스를 선언할 때 인터페이스는 필드, 생성자 또는 메소드의 매개 변수, 생성자 또는 메소드의 로컬 변수로 선언될 수 있다.

    • 인터페이스가 필드 타입으로 사용될 경우: 필드에 구현 객체를 대입할 수 있다.

    • 인터페이스가 생성자의 매개 변수 타입으로 사용될 경우: new연산자로 객체를 생성할 때 구현 객체를 생성자의 매개값으로 대입할 수 있다.

    • 인터페이스가 로컬 변수 타입으로 사용될 경우: 변수에 구현 객체를 대입할 수 있다.

    • 인터페이스가 메소드의 매개 변수 타입으로 사용될 경우: 메소드 호출 시 구현 객체를 매개 값으로 대입할 수 있다.

 

본 내용은 #혼자공부하는자바 책을 참고해 공부하려 작성했습니다.
728x90
반응형

댓글