Practice JAVA - 인터페이스

최정환·2022년 12월 14일
0

Practice JAVA

목록 보기
8/10

Interface

개발 코드와 객체가 서로 통신하는 접점 역할을 한다.
개발 코드가 인터페이스의 메소드를 호출하면 인터페이스는 객체의 메소드를 호출시킨다.
=> 개발 코드와 객체 사이의 미들웨어 같은 역할

개발 코드를 수정하지 않고 사용하는 객체를 변경할 수 있도록 하기 위해서 사용한다.
인터페이스는 하나의 객체가 아니라 여러 객체들과 사용이 가능하므로 어떤 객체를 사용하느냐에 따라서 실행 내용과 리턴값이 다를 수 있다.

따라서 개발 코드 측면에서는 코드 변경 없이 실행 내용이 리턴값을 다양화할 수 있다는 장점을 가지게 된다.
잘 구현된 Interface는 DIP, OCP 원칙을 지킬 수 있다.

interface name {...}

인터페이스는 객체로 생성할 수 없기 때문에 상수 필드와 추상 메소드만을 구성 멤버로 가진다.

상수 필드, 추상 메소드 선언

상수이기 때문에 키워드를 사용하지 않더라도 public static final의 특성을 자동적으로 가지게 된다.

메소드도 최종적으로 객체에서 실행되기 때문에 추상 메소드로 선언한다.
그리고 public abstract 특성을 갖기 때문에 생략 가능하다.

상수, 메소드의 생략했던 특성은 컴파일 단계에서 자동으로 붙게된다.

interface Television {
	// public static final 생략 가능
	String NAME = "Samsung TV";
    // public abstract 생략 가능
    void turnOn();
}

구현 클래스

보통 클래스와 동일하며 인터페이스 타입으로 사용할 수 있음을 알려주기 위해 클래스를 선언할 때 implements를 추가한다.

인터페이스는 추상 클래스와 다르게 여러 개를 implements가 가능하다.

public class ClassName implements InterfaceName{}

인터페이스 상속

인터페이스도 상속 받을 수 있다.

interface A {}
interface B {}
interface C {}

interface ABC extends A, B, C {...}

타입 변환과 다형성

소스 코드의 변함 없이 구현 객체를 교체함으로서 프로그램의 실행결과가 다양해진다.

소스코드

// 문제 있던 객체
//I i = new AI();
I i = new BI();

i.method();
i.method2();

자동 타입 변환

인터페이스에도 자동 타입변환이 가능하다.

인터페이스로 구현한 클래스에서 자식 클래스를 만들었다면 자식 객체도 인터페이스 타입으로 자동 변환이 가능하다.

필드의 다형성

public class Car {
	// 1. 선언
	Tire frontTire = new FrontTireA();
    Tire backTire = new BackTireA();
}

Car myCar = new Car();
// 2. 바뀜
myCar.frontTire = new FrontTireB();
myCar.backTire = new BackTireB();

Car에서 frontTire에 어떤 구현 객체가 저장되어도 Car 객체는 타이어 인터페이스에 선언된 메소드만 사용하므로 문제가 없다.

1. 선언
필드에 객체가 바뀌기 전까지는 원래 선언한 객체의 메소드를 사용하지만
2. 바뀜
만약 필드에 객체가 바뀐다면 바뀐 객체에 있는 메소드를 사용하게된다.

이것이 필드의 다형성이 된다.

매개 변수의 다형성

interface Car {
	void run();
}

class Driver {
	void drive(Car car){
    	car.run();
    }
}

class Bus implements Car {...}


Driver driver = new Driver();
// Bus는 Car로 자동 타입 변환된다.
Bus bus = new Bus();
driver.drive(bus);

0개의 댓글