인터페이스(interface)

2022. 8. 30. 20:46Java 프로그램

728x90

오늘은 interface를 배워보겠습니다!

우선 인터페이스란?

- 코딩한 코드와 객체가 서로 통신하는 접점입니다.

역할은?

- 코드가 객체에 종속되지 않게 하도록 하는 역할

- 객체와 코드 사이에서 중개역할

- 개발코드 변경 없이 리턴값 또는 실행 내용이 다양해질수 있는 다형성을 다룸

 

인터페이스선언)

[public] interface 인터페이스명{

     //상수
     타입 상수명 = 값;
     
     //추상 메소드
     타입 메소드명(매개변수,...);
     
     //디폴트 메소드
     default 타입 메소드명(매개변수,...){..}
     
     //정적 메소드
     static 타입 메소드명(매개변수){...}

}

[상수 필드 선언]

1. 인터페이스는 상수필드만 선언이 가능합니다.

2. 인터페이스에 선언된 필드는 모두 자동으로 public static final 이 됩니다. (쓰지 않아도 컴파일 과정에서 붙음)

3. 상수명은 대문자로 작성합니다.

4. 선언과 동시에 초기값 지정을 해야합니다.

 

[추상 메소드 선언]

1. 인터페이스의 메소드는 기본적으로 추상메소드 선언합니다.

2. public abstract를 생략하여 쓰더라도 내부적으로 알아서 붙습니다.

 

[Default 메소드 선언]

1. 실행 블록을 가지고 있는 메소드 입니다.

2. 앞에 default를 반드시 붙혀줘야 합니다. static final이나 abstract처럼 자동으로 붙지 않습니다.

3. public은 생략해도 자동으로 붙습니다.

 

이제 예제를 보겠습니다.

public interface RemoteControl {
	
	//public static final int MAX_VOLUME = 10;
	int MAX_VOLUME = 10;		// 상수
	int MIN_VOLUME = 0;	// 상수
	
	void turnOff();     // public abstract 생략
	void turnOn();		// public abstract 생략
    
    
	public void setVolume(int volume);
}

인터페이스명 : RemoteControl

필드 : MAX_VOLUME = 10;, MIN_VOLUME

추상메소드: turnOff(); , turnOn();

 

첫번째 구현 객체

public class Audio implements RemoteControl {
	private int volume;
	
	@Override
	public void turnOff() {
		
		System.out.println("Audio를 끕니다.");//인터페이스에 선언된 추상 메소드의 실체를 가진 메소드
	}

	@Override
	public void turnOn() {
		System.out.println("Audio를 켭니다.");//인터페이스에 선언된 추상 메소드의 실체를 가진 메소드

	}

	@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("현재 Audio volume : " + this.volume);

	}

}

이건 Audio라는 객체를 만든 클래스입니다.

두번째는 Television이라는 객체를 만든 클래스

public class Television implements RemoteControl {
	private int volume;
	
	@Override
	public void turnOff() {
		
		System.out.println("TV를 끕니다.");// Audio에서 Tv로 바뀜
	}

	@Override
	public void turnOn() {
		System.out.println("Tv를 켭니다.");// Audio에서 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 volume : " + this.volume);// Audio에서 Tv로 바뀜

	}

}

다른 점은 출력하는 이름만 다르지만 서로 다른 객체라는 점을 아셔야합니다. 결국 인터페이스를 사용해 각자의 객체만 교체하여 만든 것이라는 것을 인지하여 인터페이스를 왜 사용하는지에 대한 역할에 대해 이해 하셔야합니다.

 

그렇다면 실행코드를 보겠습니다.

public class RemoteControlEx {

	public static void main(String[] args) {
		RemoteControl rc;
		
		rc = new Audio();	//promotion	
		rc.turnOn();		//polymorphism
		rc.setVolume(7);
		rc.turnOff();
        
        rc = new Television();
        rc.turnOn();		
		rc.setVolume(7);
		rc.turnOff();

	}

}

이렇게 생성에 따라 결과 값은

인터페이스 예제 결과

이렇게 다르게 나오는걸 확인 할 수 있습니다.

인터페이스가 왜필요하고 이것을 썼을 때와 안썻을 때의 차이점을 알고 넘어가신다면 문제 없을 것 같습니다.

감사합니다.

반응형

'Java 프로그램' 카테고리의 다른 글

자바 기본 API 1편  (0) 2022.09.30
예외처리(Exception)  (2) 2022.09.20
클래스 상속- 다형성  (0) 2022.08.30
상속 (클래스 상속)/ @Override  (0) 2022.08.30
Class(클래스)  (0) 2022.08.30