인터페이스
인터페이스
- 인터페이스(interface): 서로 다른 장치나 시스템 간 신호를 주고받는 접점
- Java 인터페이스: 개발자가 작성한 자바 클래스 간의 협업을 위한 규약을 제공하는 일종의 추상 클래스
- Java의 인터페이스는 클래스가 특정한 메서드를 반드시 구현하도록 요구
- 인터페이스는 일종의 추상 클래스지만 인터페이스의 추상 메서드는 주로 매개변수를 받도록 정의
- 인터페이스의 이름은 클래스의 이름과 동일한 규칙을 적용. 끝에 ible, able를 붙여 짓는 경우도 있음
- 인터페이스를 상속 받은 클래스는 반드시 추상 메서드를 구현해야 함
- interface 와 구현 클래스는 실체화(realization) 관계
인터페이스 선언
접근제어자 interface InterfaceName {
type interfaceMethodName(type param1, ...);
}
인터페이스 구현
접근제어자 class ClassName implements InterfaceName {
}
인터페이스 예시
public interface Vehicle {
void sound(int n);
}
public class Car implements Vehicle {
@Override
public void sound(int n) {
for (int i = 0; i < n; ++i) {
System.out.println("Car!");
}
}
}
public class CarTest {
public static void main(String[] args) {
Car car = new Car();
car.sound(2);
}
}
업캐스팅
- 업캐스팅(upcasting): 부모-자식 관계에서 암시적으로 자식 클래스 객체를 부모 클래스 타입으로 캐스팅하는 것
- 업캐스팅은 부모 클래스 타입으로 바뀌는 것으로 부모 클래스에 있는 메서드만 사용 가능. 메서드 호출시 인스턴스화된 클래스 메서드로 동작
- 제약이 있지만 확장성이라는 장점이 있어 인터페이스를 사용
- 인터페이스를 사용하는 이유는 의존성(dependency)를 줄이기 위함
- 클래스를 직접 참조할 경우 강결합. 인터페이스를 참조하는 경우 약결합으로 표현
- 인터페이스를 이용하면 약결합으로 결합도를 낮추어 유연성이 높아지지만 복잡도가 증가함
+) 추상클래스는 구현체가 있고 인터페이스는 구현체가 없음
업캐스팅
InterfaceName className = new ClassName();
클래스 직접 참조(강결합)
public class ClassName2 {
public ClassName1 className1;
public ClassName2() {
this.className1 = new ClassName1;
}
public void methodName2() {
className1.methondName();
}
}
인터페이스 참조(약결합)
public class ClassName{
private InterfaceName interfaceName;
public ClassName(InterfaceName interfaceName) {
this.interfaceName = new interfaceName();
}
public void methodName1() {
interfaceName.methodName();
}
}
업캐스팅 예시
인터페이스 다중 상속
+) 클래스의 상속은 단일 상속만 가능
- 인터페이스는 다중 상속을 지원
다중 상속 선언
public interface InterfaceName1 {
void methodName(type1 param1, ...);
}
public interface InterfaceName2 {
void methodName(type2 param2, ...);
}
public class ClassName impements InterfaceName1, InterfaceName2 {
@Override
public void methodName(type1 param1, ...) {
}
public void methodName(type2 param2, ...) {
}
}
다중 상속 사용
public class ClassName1 {
private InterfaceName1 interfaceName1;
public ClassName1(InterfaceName1 interfaceName1) {
this.interfaceName1 = interfaceName1;
}
public type method() {
interface1.methond(arg1, ...);
}
}
public class ClassName2 {
private InterfaceName2 interfaceName2;
public ClassName2(InterfaceName2 interfaceName2) {
this.interfaceName2 = interfaceName2;
}
public type method() {
interface2.methond(arg1, ...);
}
}
public class ClassNameTest {
public static void main(String[] args) {
InterfaceName1 interfaceName1 = new ClassName();
ClassName1 className1 = new ClassName1(interfaceName1);
InterfaceName2 interfaceName2 = new ClassName();
ClassName2 className2 = new ClassName2(interfaceName2);
className1.method();
className2.method();
}
}
다중상속 예시
public interface Soundable {
void play(String analogSignal);
}
public interface Wirelessable {
void play(int digitalSignal);
}
public class Device impements Soundable, WIrelessable {
@Override
public void play(String analogSignal) {
System.out.printf("Analog Play: %s\n", analogSignal);
}
public void play(int digitalSignal) {
System.out.printf("Digital Play: %d\n", digitalSignal);
}
}
public class DeviceTest {
public static void main(String[] args) {
Soundable soundable = new Device();
Wirelessable wirelessable = new Device();
soundable.play("fm sound");
wirelessable.play(10001);
}
}
인터페이스 예제1
풀이1
'Java > Java 17 문법' 카테고리의 다른 글
[Java] Java - 람다표현식 (0) | 2025.02.16 |
---|---|
[Java] Java - 제네릭/Enum (0) | 2025.02.16 |
[Java] Java - 클래스(생성자/상속/추상클래스) (0) | 2025.02.16 |
[Java] Java - 메서드 (0) | 2025.02.16 |
[Java] Java - 제어문 (0) | 2025.02.16 |