인터페이스(INTERFACE)
인터페이스 - 객체의 사용방법을 정의한 타입
객체의 교환성을 높여주기 때문에 다형성을 구현하는 매우 중요한 역할을 함
인터페이스란? 극단적으로 동일한 목적 하에 동일한 기능을 보장하게 하기 위함!
어떻게? 자바의 다형성을 이용하여 개발코드 수정을 줄이고 유지보수성을 높인다!
인터페이스의 역할
인터페이스는 개발코드와 객체가 서로 통신하는 접점역할
개발코드가 인터페이스의 메소드를 호출하면 인터페이스는 객체의 메소드를 호출 →
개발코드는 객체의 내부 구조를 알 필요가 없고 인터페이스의 메소드만 알고있으면 된다
왜 중간에 인터페이스를 둘까?
개발코드를 수정하지 않고 사용하는 객체를 변경할 수 있도록 하기 위해서.
개발코드 측면에서는 코드 변경없이 실행내용과 리턴값을 다양화 할 수 있다는 장점있음.
인터페이스(Interface) 란?
자바에서 제공하는 인터페이스란, 추상 클래스와 마찬가지로 추상된 틀을 만들어 개발에 혼선이 없게끔 도와주는 역할을 하는 객체이다.
협업을 하는 개발자들끼리의 원활한 의사소통을 위해서 생성된 개념으로 인터페이스라는 이름을 가지는 것 같다.
추상 클래스와 무엇이 다를까?
추상 클래스는 트리 형식으로 상위 클래스와 하위 클래스로 나뉘어지는 트리 구조이다.
하위 클래스는 상위 클래스에서 추상화시킨 생성자 혹은 메서드를 정의하면서 더 구체화되어간다.
반면에, 인터페이스는 트리 구조와 같은 수직적 구조가 아닌 수평적 구조를 가지게 된다.
수직적 구조를 갖는 추상 클래스는 하나의 상위 클래스에게만 상속받을 수 있지만,
수평적 구조의 인터페이스는 하나의 클래스가 여러 인터페이스를 가져올 수 있다.
인터페이스 :
메서드의 틀을 미리 만들어 개발자 간의 의사소통 혼선을 줄여주고
다형성 개발에 유리함을 가져다주는 객체이다.
아래 추가설명 출처 : 자바[Java] 인터페이스[Interface] 사용과 이유 (tistory.com)
인터페이스 사용이유 : https://gofnrk.tistory.com/22
인터페이스선언
class키워드대신 interface키워드사용
[public] interface 인터페이스명 {...}
상수 : 인터페이스에서 값을 정해줄테니 함부로 바꾸지 말고 제공해주는 값만 참조해라 (절대적)
추상메소드 : 가이드만 줄테니 추상메소드를 오버라이팅해서 재구현해라. (강제적)
디폴트메소드 : 인터페이스에서 기본적으로 제공해주지만, 맘에 안들면 각자 구현해서 써라. (선택적)
정적메소드 : 인터페이스에서 제공해주는 것으로 무조건 사용 (절대적)
interface 인터페이스명 {
//상수
타입 상수명 = 값;
//추상메소드
타입 메소드명 (매개변수...);
//디폴트메소드
default 타입 메소드명 (매개변수...) {...}
//정적메소드
static 타입 메소드명 (매개변수) {...}
}
1.상수필드선언 2.추상메소드선언 3.디폴트메소드선언 4.정적메소드선언
클래스 구성멤버 : 필드,생성자,메소드
인터페이스 구성멤버 : 상수, 메소드
(인터페이스는 객체로 생성할 수 없기 때문에 생성자 가질수없다)
1.상수필드선언
2.추상메소드선언
인터페이스는 최종적으로 객체에서 실행됨. 그저 껍데기라고 할 수 있다. (추상클래스와 비슷한 개념)
3.디폴트메소드선언
※ 디폴드메소드는 인스턴스없이 실행이 불가하다.
4.정적메소드선언
※ 정적메소드는 인스턴스없이 실행이 가능하다
※ 인터페이스의 static과 default 불러오는 메모리 구조 방식 차이 설명 ※
인터페이스는 힙영역에 만들어지게 된다.
Static 하고 default 차이점 :
Static은
데이터영역에 적재
인터페이스에서 직접적으로 참고 가능
Default는
구현클래스를 통해 인스턴스를 만들어야 하고
만들어진 인스턴스를 통해서만 값에 접근이 가능합니다.
인터페이스구현
구현클래스선언
//구현클래스 선언
public class 구현클래스명 implements 인터페이스명 {
//인터페이스에 선언된 추상메소드의 실체 메소드선언
}
익명구현객체
인터페이스 변수 = new 인터페이스() {
//인터페이스에 선언된 추상메소드의 실체 메소드선언
};
다중인터페이스 구현클래스
public class 구현클래스명 implements 인터페이스A, 인터페이스B{
//인터페이스A 에 선언된 추상메소드의 실체메소드 선언
//인터페이스B 에 선언된 추상메소드의 실체메소드 선언
}
추상메소드사용
디폴트메소드사용
다형성
인터페이스간 상속 가능
public interface 하위인터페이스 extends 상위인터페이스1, 상위인터페이스2 {...}
extends 와 implements 간단 정리
상속받을때는 모두 extends
implements 구현이라는 개념 (상속받았으면 구현해야한다!라는 의미) - 여러가지가 통으로 내려온다.
구현이 오버라이딩과 다른 것은 오버라이딩은 재정의지만,
구현은 주의사항이나 강조사항을 강제한다. 강제로 일을 시킨다
- extends는 일반 클래스와 abstract 클래스 상속에 사용되고, implement는 interface 상속에 사용된다.
- class가 class를 상속받을 땐 extends를 사용하고, interface가 interface를 상속 받을 땐 extends를 사용한다.
- class가 interface를 사용할 땐 implements를 써야하고
- interface가 class를 사용할 땐 implements를 쓸수 없다.
- extends는 클래스 한 개만 상속 받을 수 있다.
- extends 자신 클래스는 부모 클래스의 기능을 사용한다.
- implements는 여러개 사용 가능하다.
- implements는 설계 목적으로 구현 가능하다.
- implements한 클래스는 implements의 내용을 다 사용해야 한다.
출처 : https://velog.io/@hkoo9329/%EC%9E%90%EB%B0%94-extends-implements-%EC%B0%A8%EC%9D%B4
extends 예제
//자바에서는 다중상속을 지원하지않음.
//예: public class A extends B, C {....} 불가능
//그러므로 인터페이스인 implements가 나온것.
public class extendsEX {
public static void main(String[] args) {
testpaper sc = new testpaper();
System.out.println(sc.math);
System.out.println(sc.eng);
System.out.println(sc.kor);
//testpaper가 score상속받았기에
//scored에있는 test_result의 메서드를 접근할 수 있다.
sc.test_result();
}
}
class score{
protected int math = 60;
protected int kor = 21;
protected int eng = 100;
protected int result = math + kor + eng;
public int test_result(){
return result;
}
}
//오버라이딩할필요없음
//testpaper 가 score를 extends을 이용해 상속받았지만,
//result만 사용하였음
class testpaper extends score{
public void print(){
System.out.println(result);
}
}
implements 예제
//implement는 다중상속을 지원한다.
//public class A extends B,C { }
//이런 식으로 지원한다.
//상속받을때는 모두 extends
//implements는 구현이라는 개념
//구현이 오버라이딩과 다른 것은 오버라이딩은 재정의지만,
//구현은 주의사항이나 강조사항을 강제한다. 강제로 일을 시킨다
public class implementsEX {
public static void main(String[] args) {
ExampleInterface in = new ExampleInterface();
in.num1();
in.num2();
}
}
interface testInterface{
public static int num = 12;
public void num1();
public void num2();
}
//ExampleInterface에서 interface인 testInterface를 implements해 재성의
//implements는 무조건 부모의 메서드를 재정의(오버라이딩)을 해야한다.
//안에 내용을 @override public void num2(){ } 이렇게 비워놓아도 된다.
class ExampleInterface implements testInterface{
@Override
public void num1() {
System.out.println(num);
}
@Override
public void num2() {
System.out.println(num + 2);
}
}
인터페이스 예제
package package001;
//RemoteControl의 자식
//구현 클래스 선언
//pulbic class 구현클래스명 implements 인터페이스{ }
public class Audio implements RemoteControl {
//필드
private 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) { //super가 안되는 이유 : 인터페이스는 생성이없기때문
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);
}
@Override
public void setMute(boolean mute){
if(mute){
System.out.println("오디오무음");
}else {
System.out.println("오디오무음해제");
}
}
}
package package001;
//SmartTelevision의 부모
//[public] interface 인터페이스명{}
public interface RemoteControl {
//상수필드선언!
//타입 상수명 = 값
int MAX_VOLUME = 10;
int MIN_VOLUME = 0;
int BATTERY_COUNT = 0;
//추상메소드선언! *껍데기만있는메소드
//타입 메소드명(매개변수);
void turnOn();
void turnOff();
void setVolume(int volume);
//디폴트메소드선언! (satic x 인스턴스없이 실행 불가)
//오버라이드를 하기위한 재료!
//default 타입 메소드명(매개변수){}
default void setMute(boolean mute) {
if(mute) {
System.out.println("무음");
} else {
System.out.println("무음해제");
}
}
//정적메소드선언! (인스턴스없이 실행o 상속안됨)
//static 타입 메소드명(매개변수){}
static void changeBattery() {
System.out.println("배터리 교체");
}
}
*디폴트메소드는 인스턴스를 만들어야 실행이 가능하고
*정적메소드는 인스턴스없이 실행이 가능하다
package package001;
//클래스선언
public class RemoteControlExample {
//main
public static void main(String[] args) {
SmartTelevision tv = new SmartTelevision();
RemoteControl rc = tv;
Searchable searchable = tv;
}
}
package package001;
//SmartTelevision의 부모
//[public] interface 인터페이스명{}
public interface Searchable {
//추상메소드
//타입 메소드명(매개변수);
void search(String url);
}
package package001;
//extends와 다름
// implements - 특징 : 부모의메소드를 반드시 오버라이딩(재정의)해야한다, 다중상속을대신해준다
//extends는 일반 클래스와 abstract 클래스 상속에 사용되고, implement는 interface 상속에 사용된다.
//RemoteControl, Searchable의 자식
//다중인터페이스 구현 클래스 선언
//pulbic class 구현클래스명 implements 인터페이스A,인터페이스B { }
public class SmartTelevision implements RemoteControl, Searchable {
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("tv볼륨" + volume);
}
public void search(String url) {
System.out.println(url + "채널돌리기");
}
@Override
public void setChannel(int channel) {
// TODO Auto-generated method stub
}
}
import package001.*;
public class main {
public static void main(String[] arg){
example();
//implements와 extends 차이에 따른 사용예시
//인터페이스의 static과 default 불러오는 메모리구조 방식차이설명
}
private static void example() {
RemoteControl.changeBattery();
Audio audio_A = new Audio();
audio_A.turnOn();
audio_A.setVolume(30);
audio_A.setMute(true);
audio_A.turnOff();
}
}
이미지 출처 : 이것이자바다
'STUDY > JAVA' 카테고리의 다른 글
[JAVA] 인터페이스 ! 개념 이해 추가 정리 ☑ (0) | 2022.07.04 |
---|---|
[JAVA] 22-07-01 인터페이스를 활용한 문제해결 (0) | 2022.07.01 |
[JAVA] 22-06-30 추상클래스 ☑ (0) | 2022.06.30 |
[JAVA] 22-06-29 다형성 형변환 ☑ (0) | 2022.06.29 |
[JAVA] 22-06-28 상속을 이용해 샌드위치 만들기 문제 ☑ (0) | 2022.06.28 |