본문 바로가기
Java/Java 17 문법

[Java] Java - 인터페이스

by cogito30 2025. 2. 16.

인터페이스

인터페이스

- 인터페이스(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