인터페이스

띠로리·2024년 3월 27일

인터페이스

인터페이스 역할

인터페이스(Interface)는 사전적인 의미로 두 장치를 연결하는 접속기를 말한다.

다형성 구현의 주된 기술

객체 A는 인터페이스를 통해 객체 B를 사용할 수 있다.

→ 객체 A가 객체 B의 메소드를 직접 호출하면 간단할텐데 왜 중간 인터페이스를 거치도록 하는 걸까?

객체 A는 인터페이스의 메소드만 사용하므로 객체 B가 객체 C로 변경된 것에는 관심이 없다. 만약 인터페이스 없이 객체 A가 객체 B를 직접 사용한다면 객체 A의 소스 코드를 객체 B에서 객체 C로 변경하는 작업이 추가로 필요해진다.

✅ 객체 A가 인터페이스 메소드 호출 → 객체 B 혹은 객체 C의 메소드 실행

이때, 객체 B의 실행 결과와 C의 결과가 다르다면, 객체 A는 객체 교체로 인해 다른 결과를 얻게 된다.

인터페이스와 구현 클래스 선언

인터페이스 선언

interface 인터페이스명 { ... }        // default 접근 제한
public interface 인터페이스명 { ... } // public 접근 제한
  • class 키워드 대신 interface 키워드를 사용한다.
  • 접근 제한자 → default와 public을 사용할 수 있다.
  • 중괄호 안에는 인터페이스가 가지는 멤버들을 선언할 수 있다.
public interface 인터페이스명 {
	// public 상수 필드
	// public 추상 메소드
	// public 디폴트 메소드
	// public 정적 메소드
	// private 메소드
	// private 정적 메소드
}

구현 클래스 선언

그림 1에서 객체 A가 인터페이스의 추상 메소드를 호출하면 인터페이스는 객체 B의 메소드를 실행한다. 그렇다면 객체 B는 인터페이스에 선언된 추상 메소드와 동일한 선언부를 가진 메소드를 가지고 있어야 한다.

✅ 여기서, 객체 B를 인터페이스를 구현한 (Implement) 객체라고 한다.

왜? 인터페이스에 정의된 추상 메소드에 대한 실행 내용이 구현(작성)되어 있기 때문이다.

public class B implements 인터페이스명 { ... }

변수 선언과 구현 객체 대입

인터페이스 ← 하나의 타입이기 때문에 변수의 타입으로 사용할 수 있다.

인터페이스는 참조 타입에 속하므로, 인터페이스 변수에는 null을 대입할 수 있다.

RemoteControl rc = null;    // 가능
rc = new Television();
  • 인터페이스를 통해 구현 객체를 사용하려면, 인터페이스 변수에 구현 객체를 대입해야 한다. 정확히 말하면, 구현 객체의 번지를 대입해야 한다.

상수 필드

[public static final] 타입 상수명 =;

인터페이스에 선언된 필드는 모두 [public static final] 특성을 갖기 때문에, 이를 생략하더라도 자동적으로 컴파일 과정에서 붙게 된다.

상수명은 대문자로 작성하되, 서로 다른 단어로 구성되어 있을 경우에는 언더바로 연결하는 것이 관례이다.

추상 메소드

[public abstract] 리턴타입 메소드명(매개변수, ...):

인터페이스는 구현 클래스가 재정의해야 하는 public 추상 메소드(abstract method)를 멤버로 가질 수 있다.

인터페이스의 구현 객체는 추상 메소드의 실행부를 갖는 재정의된 메소드가 있어야한다.

  • 구현 클래스에서 추상 메소드를 재정의할 때, 인터페이스의 추상 메소드는 기본적으로 public 접근 제한을 갖기 때문에 public보다 더 낮은 접근 제한으로 정의할 수 없다.

디폴트 메소드

완전한 실행 코드를 가진 메소드

[public] default 리턴타입 메소드명(매개변수, ...) { ... }

리턴 타입 앞에, default를 적어줘야 한다. (안 적으면 오류남)

디폴트 메소드의 실행부에는 상수 필드를 읽거나 추상 메소드를 호출하는 코드를 사용할 수 있다.

구현 클래스는 디폴트 메소드를 재정의해서 자신에게 맞게 수정할 수도 있다. 이때, public 접근자를 반드시 붙여야 하고, default 키워드를 생략해야 한다.

다중 인터페이스 구현

구현 객체는 여러 개의 인터페이스를 implements 할 수 있다.

Untitled

구현 클래스는 인터페이스 A와 인터페이스 B를 implements 뒤에 쉼표로 구분해서 작성해, 모든 인터페이스가 가진 추상 메소드를 재정의해야 한다.

public class 구현클래스명 implements 인터페이스A, 인터페이스B {
	// 모든 추상 메소드 재정의
}

인터페이스 상속

인터페이스도 다른 인터페이스를 상속할 수 있으며, 클래스와는 달리 다중 상속을 허용한다.

public interface 자식인터페이스 extends 부모인터페이스1, 부모인터페이스2 { ... }

구현 객체가 자식 인터페이스 변수에 대입되면 자식 및 부모 인터페이스의 추상 메소드를 모두 호출할 수 있으나, 부모 인터페이스 변수에 대입되면 부모 인터페이스에 선언된 추상 메소드만 호출 가능하다.

타입 변환

자동 타입 변환

인터페이스 변수 = 구현객체;

구현 객체가 인터페이스 변수로 자동 타입 변환 된다.

강제 타입 변환

캐스팅 기호를 사용해서 인터페이스 타입을 구현 클래스 타입으로 변환시키는 것

구현클래스 변수 = (구현클래스) 인터페이스변수;

구현 객체가 인터페이스 타입으로 자동 변한되면, 인터페이스에 선언된 메소드만 사용 가능하다.

profile
차곡 차곡 기록 쌓기

0개의 댓글