인터페이스
- 클래스 간의 상속과 관련이 있음
*상속의 장점 : 공통되는 코드를 상위 클래스에 모아두면, 수정할 일이 생겼을 때 상위 코드만 수정하면 됨. -> 하위 코드도 함께 수정되기 때문. => 코드의 재사용성과 유지 보수성이 높아짐.
*사람과 자동차는 Run이라는 기능을 수행할 수 있는데, 이에 대한 부모클래스를 정의할 수 없음. 즉 상속 이용 불가 => 인터페이스 등장
인터페이스 정의 (클래스와 비슷)
public interface 인터페이스_이름 {
public 반환형 추상메소드1(...);
public 반환형 추상메소드2(...);
}
* 인터페이스는 첫 글자를 대문자로 하는 것이 좋음
* 인터페이스 안에는 소속변수, 생성자, 일반 메소드 정의 불가. 추상메소드만 가능
* public 여부는 선택임
* extends 키워드로 다른 인터페이스 상속 가능
+) 추상메소드란?
- body가 없는 메소드
+) 추상메소드 정의 방법
1. void 추상메소드();
2. abstract 추상메소드();
3. public void 추상메소드();
4. public abstract void 추상메소드();
인터페이스 구현 : 인터페이스에 정의된 추상 메소드의 몸체를 구현하는 방법
- 인터페이스만으로는 객체 생성 불가함
- 클래스가 인터페이스를 구현하기 위해서는 implement 키워드 사용
ex. Television 클래스가 RemoteControl 인터페이스를 구현하기 위한 문법
public interface RemoteControl {
public void turnOn();
public void turnOff();
}
class Televison implements RemoteControl {
boolean on;
public void turnOn() {
(...)
}
public void turnOff() {
(...)
}
}
- 인터페이스를 어떤 클래스가 사용하기 위해서는 인터페이스에 포함된 모든 추상 메소드를 구현해야 함.
주의사항
- 인터페이스로 객체를 만들 수 없음. 단, 참조변수는 정의할 수 있음
- 인터페이스 참조변수는 인터페이스를 구현한 모든 클래스 객체를 가리킬 수 있음. (업캐스팅)
RemoteControl obj1 = new RemoteControl(); //컴파일 오류
RemoteControl obj2 = new Television(); // 올바른 코드
obj2를 통해 메소드, 소속변수 등 접근 가능
인터페이스 간의 상속
+) 상속될 때 사용하는 키워드
클래스 -> 클래스 : extends
인터페이스 -> 클래스 : implements
인터페이스 -> 인터페이스 : extends
* extends 뒤에는 1개 밖에 못 씀
* implements 뒤에는 여러 개 사용 가능함
이런 인터페이스가 있다고 가정 여기에 두 개의 추상메소드를 더 추가하고 싶다면?
public interface RemoteControl {
public void turnOn();
public void turnOff();
}
추가는 가능하나, 추상메소드는 모두 구현이 필요하기 때문에 모든 클래스가 동작하지 않음
public interface RemoteControl {
public void turnOn();
public void turnOff();
public void volumUp();
public void volumDown();
}
그래서 인터페이스도 상속 받아서 확장 시킬 수 있게 함
public interface AdvanceRemoteControl extends RemoteControl {
public void volumUp();
public void volumDown();
}
* 클래스 상속과 인터페이스 구현 둘 다 가능함
-> public class A extends B implements C
인터페이스 안의 업캐스팅
interface Drivable { void drive(); }
interface Flyable { void fly(); }
public class Test implements Drivable, Flyable {
public void drive() { System.out.println("Im driving."); }
public void fly() { System.out.println("Im flying"); }
public static void main(String[] args) {
Test obj = new Test();
obj.drive();
obj.fly();
Drivable d = obj; //인터페이스 Drivable 참조 변수가 obj가 가리키는 것을 가리킴
d.drive(); //실행 가능
//d.fly(); //실행 불가
Flyable f = obj; //인터페이스 Flyable 참조 변수가 obj가 가리키는 것을 가리킴
//f.drive(); //실행 불가
f.fly(); //실행 가능
}
}
//출력 결과
Im driving.
Im flying
Im driving.
Im flying
'JAVA' 카테고리의 다른 글
제네릭 - 객지설 10주차 (0) | 2024.05.17 |
---|---|
예외 처리 - 객지설 7~9주차 (0) | 2024.05.10 |
다형성 - 객지설 5주차 (0) | 2024.05.04 |
랩퍼 클래스 - 객지설 4주차 (0) | 2024.05.03 |
객프 13주차 (0) | 2023.11.29 |