챕터8 쭈욱쭉 드로간다 냠냠
인터페이스
ㅇ인터페이스 개념이해, 선언하기
ㅇ인터페이스 구현 클래스 선언하고 이용하기
ㅇ인터페이스의 자동타입변환, 강제타입변환 알기
ㅇ필드와 매개변수의 다형성 이해하기
ㅇ인터페이스 상속해서 새로운 인터페이스 선언하기
개발 코드는 객체 내부구조 알 필요 없고 '인터페이스의 메소드만 알고 있으면 된다' <--아!
인터페이스 :
개발 코드와 객체가 서로 통신하는 접점 역할..
??) 왜 개발코드가 직접 객체의 메소드를 호출하지 않고, 중간에 인터페이스를 두나요?
-->개발코드를 수정하지 않고 사용하는 객체를 변경할 수 있게 하기위해!
-->코드 변경 없이 실행내용과 리턴값을 다양화할 수 있다.
인터페이스의 물리적 형태는 클래스와 동일함.
ㄴ~.java 형태의 소스 파일로 작성된다.
ㄴ컴파일러(javac)를 통해 ~.class형태로 컴파일된다.
ㅇBut 소스작성할 때 '선언하는 방법'이 다르다!
ㄴclass키워드 대신에 interface키워드를 사용해 선언한다.
인터페이스 선언
[public] interface 인터페이스이름 {...}
(클래스 만드는 것과 비슷한 방법으로 패키지탐색창을 이용해 인터페이스를 생성한다. 그럼 인터페이스 선언부는 이클립스가 자동으로 만들어 준다.)
***인터페이스는 객체로 생성할 수 없기 때문에 생성자를 가질 수 없다
***클래스는 필드,생성자,메소드를 구성 멤버로 가지지만, 인터페이스는 <상수필드>와 <추상메소드>만을 구성멤버로 가진다.
interface 인터페이스이름 {
//상수
타입 상수이름 = 값;
//추상메소드
타입 메소드이름(매개변수, ...);
}
상수필드랑 추상메소드 선언에 대해 알아보자.
상수 필드 선언
인터페이스는 '객체 사용 방법'을 정의한 것이다.
ㄴ데이터를 저장하는 인스턴스 또는 정적 필드를 선언할 수 없다.
ㄴ그러나 상수 필드는 선언 가능하다!!!
인터페이스에 고정된 값으로서, 데이터를 바꿀 수 없다.
상수 필드만 선언 가능하므로
인터페이스에 선언된 필드는 모두 public static final의 특성을 갖는다.
public static final을 생략하더라도 컴파일 과정에서 다 붙는다.
추상 메소드 선언
ㅇ인터페이스 통해 호출된 메소드는 최종적으로 객체에서 실행되므로 추상 메소드로 선언한다.
(메소드 선언부) (호출 방법만 기술)
ㅇ개발 코드가 인터페이스 메소드를 호출하면, 인터페이스는 객체의 메소드를 호출한다. (상속 개념)
객체가 추상 메소드를 가지면, 실체 메소드를 가지고 있어야 한다.
ㄴ이런 객체를 '인터페이스의 구현 객체'라고 한다.
ㄴ구현 객체를 생성하는 클래스를 '구현 클래스'라고 한다.
인터페이스에 선언되는 메소드는 모두 public abstract의 특성을 갖기 때문에
public abstract를 생략해도 컴파일 과정에서 다 붙는다.
인터페이스 구현
인터페이스에서 호출하는 객체의 메소드는
인터페이스에서 정의된 추상 메소드와 동일한 리턴타입, 매개타입, 메소드 이름을 가진 실체 메소드여야 하며
이 때, 이런 메소드를 가지고 있는 객체를 구현(implement) 객체라고 한다.
구현 객체를 생성하는 클래스를 구현 클래스라고 한다.
구현 클래스
-->보통 클래스와 동일.
-->하지만 인터페이스 타입으로 사용할 수 있음을 알려줘야 함
-->클래스 선언부에 implements 키워드와 인터페이스 이름을 명시해야 하고
-->인터페이스에 선언된 추상 메소드의 실체 메소드를 선언해야 함
public class 구현클래스이름 implements 인터페이스이름 { //인터페이스에 선언된 추상 메소드의 실체 메소드 선언 } |
<<인터페이스의 구현 클래스를 작성해보자.>>
RemoteControl의 두개의 구현 클래스인 Television, Audio를 작성해보자.
구현 클래스 선언부 끝에는 implements RemoteControl이 붙어 있다.
RemoteControl에는 세개의 추상 메소드가 있기 때문에
Television과 Audio에는 각각 세 개의 실체 메소드가 존재해야 한다.
+구현클래스의 메소드에서 : 인터페이스의 상수를 이용해서 volume필드의 값을 제한하고 있다.
+주의할 점: public 접근제한 : 구현클래스에서 실체메소드를 작성할 때, public보다 더 낮은 접근제한으로 작성할 수 없다. "기본적으로 인터페이스의 모든 메소드는 public 접근 제한을 갖기 때문이다."
(어길때 컴파일 에러 : Cannot reduce the visibility of the inherited method" 오케이~.~)
ㅡㅡㅡㅡ
구현 클래스 작성 후
new 연산자로 객체를 생성하는 것은 (Television tv = new Television();)
인터페이스를 사용한 것이 아니다!
인터페이스를 사용하려면..
"인터페이스 변수를 선언 후 구현 객체를 대입해야 한다."
인터페이스 변수는 참조 타입이므로 구현 객체의 번지를 저장한다.
인터페이스 변수;
변수 = 구현객체
OR
인터페이스 변수 = 구현객체;
<<익히기>>
RemoteControl 인터페이스로 구현객체들을 사용하려면
RemoteControl 타입 변수 rc를 선언하고 구현객체를 대입해야 한다.
구현객체는 인터페이스 변수에 대입해 사용한다는 거 잊지 말자
다중 인터페이스 구현 클래스
객체는 다수의 인터페이스 타입으로 사용할 수 있다.
이때 객체는 사용하고자 하는 인터페이스를 모두 구현해야 한다.
public class 구현클래스이름 implements 인터페이스A, 인터페이스B {
//인터페이스A에 선언된 추상메소드의 실체메소드 선언
//인터페이스B에 선언된 추상메소드의 실체메소드 선언
}
<<익히기>>
SmartTelevision이 리모컨과 인터넷 검색 기능을 둘 다 제공한다면
RemoteControl과 Searchable 인터페이스를 모두 구현한 SmartTelevision 클래스를 작성할 수 있다.
두 인터페이스를 모두 구현하고 있는 SmartTelevison 클래스는
SmartTelevision 객체를
RemoteControl타입 변수와 Searchable타입 변수에 각각 대입할 수 있다.
그럼 이제 인터페이스를 통해 구현객체를 어떻게 사용할까??
ㅇ방금 했듯, 인터페이스가 로컬변수 타입 (또는 필드 타입)로 사용될 경우 : 구현 객체를 대입할 수 있다.
ㅇ생성자나 메소드의 매개변수 자리가 인터페이스로 선언되어 있으면,
그 인터페이스변수자리에 구현객체를 대입할 수 있다.
구현 객체가 인터페이스 타입에 대입 되면 --> 인터페이스에 선언된 추상 메소드를 개발 코드에서 사용할 수 있다.
(개발 코드에서 추상 메소드를 호출하면 --> 객체의 메소드가 자동 실행되었잖앙>_<)
ㅇ필드로 선언된 rc의 사용
MyClass myClass = new MyClass();
myClass.rc.turnOn();
myClass.rc.setVolume(5);
ㅇ생성자 매개변수 타입으로 선언된 rc의 사용
MyClass( RemoteControl rc ) {
this.rc = rc;
rc.turnOn();
rc.setVolume(5);
}
이 때 다음처럼 MyClass 객체가 생성되었을 때는 Audio의 메소드가 실행된다.
(개발코드 -> 인터페이스의 추상메소드 -> 구현객체의 실체메소드)
MyClass myClass = new MyClass(new Audio());
ㅇ로컬 변수로 선언된 rc의 사용
void methodA() {
RemoteControl rc = new Audio();
rc.turnOn();
rc.setVolume();
}
Audio의 메소드를 사용하게 된다. 인터페이스 변수 rc에 구현객체를 대입했으니까^-^
ㅇ메소드의 매개타입으로 선언된 rc의 사용
MyClass myClass = new MyClass();
myClass.methodB(new Television());
이 때 Television의 메소드가 실행된다.
(인터페이스 변수가 들어갈 자리에 구현객체를 넣었으므로 구현객체를 참조하게 되어 구현객체의 메소드가 실행된다)
인터페이스는 개발코드와 구현객체 사이 접점이라는 거!!
개발 코드는 인터페이스에 선언된 추상 메소드 호출 --> 인터페이스는 구현 객체의 재정의 메소드를 호출!
<<인터페이스 사용 익히기>>
복습을 꼭 하자
확인문제
03.
'JAVA' 카테고리의 다른 글
[혼자 공부하는 자바] 7/13 9-1 [중첩 클래스와 중첩 인터페이스] (0) | 2020.07.13 |
---|---|
[혼자 공부하는 자바] 7/12 8-2 [타입 변환과 다형성] [인터페이스 상속] (0) | 2020.07.12 |
[혼자 공부하는 자바] 7/11 07-3 [추상 클래스] [실체 클래스] [메소드 재정의] (0) | 2020.07.11 |
[혼자 공부하는 자바] 7/10 07-2 [타입 변환과 다형성] [자동 타입 변환] [강제 타입 변환] (0) | 2020.07.11 |
[혼자 공부하는 자바] 7/09 07-1 [상속] [자식클래스] [부모클래스] [오버라이딩] [메소드 재정의] (0) | 2020.07.10 |