반응형
익명 객체 (챕터9)
- 클래스 없이 생성될 수 있는 객체를 의미함
- 추상클래스의 자식 객체 생성 또는 인터페이스의 구현 객체 생성시 사용
BoardInterface bi = new BoardInterface() {
//일회용 BoardInterface의 구현 클래스를 정의하는 위치
@Override
public void modify(int bno, String title) {
System.out.println("익명 구현 객체를 통한 호출");
}
@Override
public void insert() {
}
@Override
public void view() {
}
@Override
public void delete() {
}
};
bi.modify(10, "");
다중인터페이스
- 구현 클래스는 다중 인터페이스를 허용한다
이때 구현 클래스에서는 반드시 구현하고 있는 모든 인터페이스의 추상메소드를 정의해야 한다 - 다중 인터페이스를 구현하는 클래스로 생성된 객체는 구현된 모든 인터페이스의 구현 객체가 될 수 있다
- 다중인터페이스를 구현하는 객체를 각각의 인터페이스에 대입하였을때 사용할 수 있는 범위는 대입된 인터페이스의 구성요소까지만 접근 가능
1)
public class Radio implements Remocon, Soundable {
@Override
public String sound() {
return "지지직";
}
@Override
public void powerOn() {
System.out.println("Radio를 켭니다");
}
}
Radio radio = new Radio();
Remocon rc = radio;
rc.powerOn();
Soundable sb = radio;
System.out.println(sb.sound());
2)
인터페이스 RemoteControl,Searchable
클래스 SmartTelevision
Main MultiInterfaceImplExample
public interface RemoteControl {
//추상메소드
void turnOn();
void turnOff();
}
public interface Searchable {
//추상메소드
void search(String url);
}
public class SmartTelevision implements RemoteControl,Searchable {
@Override
public void turnOn() {
System.out.println("TV를 켭니다");
}
@Override
public void turnOff() {
System.out.println("TV를 끕니다");
}
@Override
public void search(String url) {
System.out.println(url + "를 검색합니다");
}
}
public class MultiInterfaceImplExample {
public static void main(String[] args) {
//RemoteControl 인터페이스 변수 선언 및 구현 객체 대입
RemoteControl rc = new SmartTelevision();
//RemoteControl 인터페이스에 선언된 추상 메소드만 호출 가능
rc.turnOn();
rc.turnOff();
//rc.search(""); 구현 객체 메소드는 인터페이스가 가지고 있는 추상메소드만 호출가능
//Searchable 인터페이스 변수 선언 및 구현 객체 대입
Searchable searchable = new SmartTelevision();
//Searchable 인터페이스에 선언된 추상 메소드만 호출 가능
searchable.search("https://www.youtube.com");
}
}
3) 인터페이스 상속
구현 객체에서 구현하는 인터페이스의 부모 타입에도 대입이 가능하다
public interface ParentInterface {
void parentMethod01();
void parentMethod02();
}
public interface DadInterface {
void dadMethod01();
}
public interface ChildInterface extends DadInterface, ParentInterface {
void ChildMethod();
}
public class ImpleClass implements ChildInterface {
//===================================================
//DadInterface의 추상메소드
@Override
public void dadMethod01() {
System.out.println("dad 인터페이스의 메소드");
}
//===================================================
//ChildInterface의 추상메소드
@Override
public void ChildMethod() {
System.out.println("child 인터페이스의 메소드");
}
//===================================================
//ParentInterface의 추상메소드
@Override
public void parentMethod01() {
System.out.println("parent 인터페이스의 메소드01");
}
//===================================================
@Override
public void parentMethod02() {
System.out.println("parent 인터페이스의 메소드02");
}
public static void main(String[] args) {
ChildInterface ci = new ImpleClass();
ci.dadMethod01();
ci.ChildMethod();
DadInterface di = new ImpleClass();
//di.ChildMethod(); 사용범위 초과
ParentInterface pi = new ImpleClass();
}
}
형변환
<인터페이스에서 자동형변환>
구현 객체를 인터페이스 타입 변수로 대입할 때 이루어지는 변환
Remocon rc2 = new Radio();
<인터페이스에서 강제형변환>
인터페이스 타입 변수에 대입된 구현 객체를 구현 클래스 타입변수로 대입시 발생
이유: 컴파일러는 인터페이스 타입 변수에 어떤 구현 클래스 타입 객체가 담겨있을지 알수없기 때문
instanceof 연산자를 통하여 강제형변환 전에 타입 체크를 해주는 것이 안전하다
//Remocon 인터페이스의 구현 객체 Radio, TV, Audio인 상태
if(rc2 instanceof Radio) {
Radio radio2 = (Radio)rc2; //강제형변환
radio2.sound();
}
다형성
<인터페이스에서 필드의 다형성>
특정 클래스의 필드 타입을 인터페이스로 선언했을때 어떤 구현 객체가 필드에 대입되느냐에 따라 같은 실행문이지만 결과가 달라짐
<인터페이스에서 매개변수의 다형성>
특정 클래스의 메소드에서 매개변수의 타입을 인터페이스로 선언했을때 어떤 구현 객체가 매개값이 되느냐에 따라
같은 메소드 호출이지만 결과가 달라짐
public class Sample {
public Remocon remocon; //인터페이스 타입 필드 선언
public void method(Remocon remocon) {
remocon.powerOn();
}
public static void main(String[] args) {
Sample sample = new Sample();
sample.remocon = new TV();
sample.remocon.powerOn();
sample.remocon = new Radio();
sample.remocon.powerOn();
sample.method(new TV());
sample.method(new Radio());
}
}
배열이 인터페이스 타입일 경우 다양한 구현 객체를 저장할 수 있다.
Remocon[] rarr = {new TV(), new Radio()};
반응형
'Java' 카테고리의 다른 글
[Java] Object, equals(), hashCode() (0) | 2024.08.09 |
---|---|
[Java] 예외처리 (0) | 2024.08.08 |
[Java] 인터페이스 (0) | 2024.08.06 |
[Java] 상속, 메소드 오버라이딩, 추상클래스 (0) | 2024.08.03 |
[Java] 인스턴스 멤버, 정적 멤버, 정적 필드, 정적 메소드, 상수, 패키지, 접근제한자, 싱글톤 (0) | 2024.08.01 |