☭DEVELOPER/#2 웹개발(자바기반 풀스택)

[BACKEND]JAVA_ECLIPSE19 인터페이스

조반짝 2023. 8. 28. 13:58
728x90
반응형

인터페이스

코드변경없이 실행내용과 리턴값을 다양화할 수 있다

 

형식은 일반클래스와 동일

인터페이스 이름 앞에 interface 사용

인터페이스는 객체로 생성할 수 없기 때문에 생성자를 가질 수 없다.

 


 


 

인터페이스는 상수필드, 추상메소드만을 가지고 있다.

기능에 대한 규격이다.

인터페이스에 선언된 필드는 모두 public static final의 특성을 가진다.


인터페이스는 추상메소드로 선언한다.

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

추상메소드는 무조건 사용해야함.

중괄호를 붙이지않는 메소드.

인터페이스에서는 일반메서드를 못만든다. 

인터페이스는 static final 상수필드를 자동으로 붙여서 생성한다.

 

구현객체 implement : 인터페이스를 따르는 객체

구현클래스: 구현객체를 생성하는 클래스


상수필드 선언 / 추상메서드 선언

인터페이스를 보면 무엇이 중요한 기능인지 알 수 있다.

 

television 구현 클래스 생성

audio 구현 클래스

실행 클래스 생성

television 자신만의 메서드를 만들 수있다.

기능의 다양성을 가질 수 있다.

구현 클래스가 작성되면 new연산자로 객체를 생성가능하다.

인터페이스로 구현 객체 사용하려면 인터페이스 변수를 선언하고 구현 객체를 대입해야한다.

 


public 접근제한

구현 클래스에서 인터페이스의 추상 메소드에 대한 실체메소드를 작성할 때 주의할 점은

인터페이스의 모든 메소드는 기본 public접근제한을 갖기 때문에 더 낮은 접근 제한으로 작성할 수 없다.

Audio 인터페이스

package chapter08.sec01.exam01;

// 앞서 생성한 RemoteControl 인터페이스 구현(implements)하는 
// 구현클래스(실체 클래스) Audio 클래스를 소스 코딩합니다.
public class Audio implements Remotecontrol{


	// 필드 선언
	private int volume;
	
	// turnOn() 추상메서드의 실체메서드인 turnOn() 메서드 선언
	@Override
	public void turnOn() {
		System.out.println("Audio를 켭니다!");
	}

	
	// turnOff() 추상메서드의 실체메서드인 turnOff() 메서드 선언
	@Override
	public void turnOff() {
		System.out.println("Audio를 끕니다!");
	}

	// setVolume() 추상메서드의 실체메서드인 setVolume() 메서드 선언
	@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 볼륨 = " + this.volume);
	}	//인터페이스를 보면 무엇이 중요한 기능인지 알 수 있다. 
	
}

 

 

Remotecontrol 인터페이스

package chapter08.sec01.exam01;

// remoteControl Interface에서 인터페이스에서 상수(static final constant)필드선언
// turnOn(), turnOFF(), setVolume() 추상 메서드 선언
public interface Remotecontrol {

	// static final 상수 필드 선언
	// 인터페이스에서는 static을 자동으로 붙여서 생성된다.
	public int MAX_VOLUME = 10;
	public int MIN_VOLUME = 0;

	// turnOn(), turnOFF(), setVolume() 추상 메서드 선언
	// abstract 추상메서드로 자동 생성
	// 추상메서드는 선언부만 작성했습니다.
	public void turnOn();
	public void turnOff();
	public void setVolume(int volume);


}

<television 인터페이스>

implements: 구현클래스

package chapter08.sec01.exam01;

// 인터페이스를 바탕으로 실체클래스 구현
// 앞서 생성한 Remotecontrol 인터페이스의 기능(추상 메서드) 구현(implements)을 하는
// Television 구현클래스(실체클래스)를 소스 코딩합니다.
public class Television implements Remotecontrol{
	
	// 필드 선언
	private int volume;
	
	// turnOn() 추상메서드의 실체메서드인 turnOn() 메서드 선언
	@Override
	public void turnOn() {
		System.out.println("TV를 켭니다!");
	}

	
	// turnOff() 추상메서드의 실체메서드인 turnOff() 메서드 선언
	@Override
	public void turnOff() {
		System.out.println("TV를 끕니다!");
	}

	// setVolume() 추상메서드의 실체메서드인 setVolume() 메서드 선언
	@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);
	}	//인터페이스를 보면 무엇이 중요한 기능인지 알 수 있다. 
	
	// Television 자체 메서드를 만들 수 있다.
	public void talkAi(){
		System.out.println("지니 TV가 말을 합니다.");
	}
}

 

RemoteControlExample 실행클래스

package chapter08.sec01.exam01;

// 앞서 생성한 RemoteControl 인터페이스를 구현하는
// 구현클래스(실체 클래스) Television, Audio 클래스를 활용하는
// 실행클래스 RemoteControlExample 클래스를 소스 코딩합니다.
public class RemoteControlExample {

	public static void main(String[] args) {
		
		// 앞서 생성한 Television 구현 클래스(실체클래스)를 토대로
		// tv 인스턴스(Television 객체 참조 변수)를 생성한 예시
		Television tv = new Television();
		tv.turnOn(); //TV를 켭니다!
		tv.talkAi(); //지니 TV가 말을 합니다.
		tv.turnOff(); //TV를 끕니다!
		
		// 앞서 생성한 Audio 구현 클래스(실체클래스)를 토대로
		// Audio 인스턴스(Audio 객체 참조 변수)를 생성한 예시 
		Audio audio = new Audio();
		audio.turnOn();  //Audio를 켭니다!
		audio.turnOff(); //Audio를 끕니다!

		
		// 인터페이스 변수(rc)에 구현 객체 대입을 해봅니다.
		Remotecontrol rc;
		rc = new Television();
		rc.turnOn();  //TV를 켭니다!
		rc.turnOff(); //TV를 끕니다!
		
		rc = new Audio();
		rc.turnOn();  //Audio를 켭니다!
		rc.turnOff(); //Audio를 끕니다!

		
	}
}

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

인터페이스 A와 인터페이스 B 가 객체의 메소드를 호출 할 수있으려면 객체는 이 두 인터페이스를 모두 구현해야한다.

인터페이스를 강제로 무조건 써야한다.

자신만의 메소드를 선언해서 사용가능하다.

 


searcable interface 생성

SmartTelevision 클래스 생성

Remotecontrol과 Searchable 인터페이스를 다중 구현한다.

 

 

Searchable 인터페이스

package chapter08.exam02;

// 인터넷을 검색할 수 있는 Searchable 인터페이스를 생성해줍니다.
public interface Searchable {
	
	//추상 메서드 searc()를 선언합니다.
	void search(String url);

}

Remotecontrol 인터페이스

package chapter08.exam02;

// remoteControl Interface에서 인터페이스에서 상수(static final constant)필드선언
// turnOn(), turnOFF(), setVolume() 추상 메서드 선언
public interface Remotecontrol {

	// static final 상수 필드 선언
	// 인터페이스에서는 static을 자동으로 붙여서 생성된다.
	public int MAX_VOLUME = 10;
	public int MIN_VOLUME = 0;

	// turnOn(), turnOFF(), setVolume() 추상 메서드 선언
	// abstract 추상메서드로 자동 생성
	// 추상메서드는 선언부만 작성했습니다.
	public void turnOn();
	public void turnOff();
	public void setVolume(int volume);


}

 

다중구현 인터페이스

package chapter08.exam02;

import chapter08.sec01.exam01.Remotecontrol;

// 앞서 생성한 Searchable 인터페이스와 RemoteControl 인터페이스를 다중 구현(implements)하는
// 구현 클래스(실체클래스)인 SmartTelevion 클래스를 소스 코딩합니다.

public class SmartTelevision implements chapter08.exam02.Remotecontrol, Searchable{

	private int volume;
	
	// 앞서 생성한 Searchable 인터페이스에 있는
	// search() 추상메서드를 메서드 오버라이딩(재정의)하여
	// 구현하는 search()메서드 선언
	@Override
	public void search(String url) {
		System.out.println(url + "을 검색합니다.");
	}
	
	@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);
		
	}
	
	void talkAi() {
		System.out.println("지니TV가 말을 합니다!");
	}
}

 

SmartTelevisonExample 실행 클래스

package chapter08.exam02;

// 앞서 생성한 인터페이스와 구현 클래스(실체클래스)를 활용하는
// SmartTelevisonExample 실행 클래스를 소스코딩합니다.
public class SmartTelevisonExample {

	public static void main(String[] args) {
		
		SmartTelevision tv = new SmartTelevision();
		tv.turnOn();  //TV를 켭니다!
		tv.search("Google");  //Google을 검색합니다.
		tv.setVolume(20);  //현재 TV 볼륨:10
		tv.setVolume(-5);  //현재 TV 볼륨:0
		tv.setVolume(7);  //현재 TV 볼륨:7
		tv.talkAi();  //지니TV가 말을 합니다!
		tv.turnOff(); //TV를 끕니다!
		
		Remotecontrol rc = tv;
		rc.turnOn(); // TV를 켭니다!
		rc.setVolume(30);  //현재 TV 볼륨:10
		rc.turnOff(); //TV를 끕니다!
		
		Searchable searchable = tv;
		searchable.search("Google"); //Google을 검색합니다.

	}
}

 

 

 


myclass 클래스 생성

 

 

 

 

 

 

 

 

 

 

 

 

 


★★★★★

● 일반클래스: 추상메소드 같이 못함, 추상메소드: 완성체가아닌 미완의 메소드

● 추상클래스 : 추상메소드를 사용 가능 , 규격화, 기준임 >> 직접인스턴스화 못함,  대신 규격에 부합하는 서브클래스가 상속받아서 실체클래스가 된다면 인스턴스가 됨 >> 프레임워크의 근간이 됨 / 선택적기능과 규격을 가지고 있음

객체타입에서의 기능과 규격 

● 인터페이스 : 인터페이스가 객체가 아닌 기능명세, 인터페이스를 따른 다는 것은 기능의 명세를 충족하고있다 

확인되어져있는 스타틱파이널필드, 추상메서드 규격을 따르고 있다. 실체화가 되어있지 않기 때문에 직접 인스턴스화 못함 , 선택적인 것이 없기 때문에 기능을 따른다는 것이다. 

여러기능들을 상속을 줄 수 있다. 

 

 

728x90
반응형