JAVA(인터페이스)

김민성·2023년 7월 7일

JAVA

목록 보기
7/11

인터페이스 역할

: 두 객체를 연결해주는 역할

  • 객체 A가 객체 B를 직접 사용하면 될텐데 인터페이스를 사용하는 이유?
  • 만약 객체 B가 객체 C로 변경된다면, 객체 A는 인터페이스의 메소드만 사용하기에 관심이 없음
  • 근데 A가 B를 직접 사용한다면 A의 코드를 B에서 C를 사용하도록 다 수정해줘야 할 것
    -> 코드의 수정은 줄이고 재사용성은 높이기 위한 방안

구현 클래스 선언

  • 객체 A가 인터페이스의 추상 메소드를 호출하면 인터페이스는 객체 B의 메소드 실행
  • B는 인터페이스에 선언된 추상 메소드와 동일한 선언부를 가진(재정의된) 메소드를 가지고 있어야 함
  • 객체 B : 인터페이스를 구현한 객체 (implements)
    -> 인터페이스에 정의된 추상 메소드에 대한 실행 내용이 구현되어 있기 때문

변수 선언과 구현 객체 타입

: 인터페이스도 하나의 타입이므로 변수의 타입으로 사용할 수 있음

  • 인터페이스는 참조 타입에 속하므로 인터페이스 변수에는 객체를 참조하고 있지 않다는 뜻으로 null을 대입할 수 있다.
  • 인터페이스를 통해 구현 객체를 사용하려면 인터페이스 변수에 구현 객체의 주소를 대입해야 함
    -> 인터페이스 변수를 통해 인터페이스의 추상 메소드를 호출할 수 있음

추상 메소드

: 인터페이스는 구현 클래스가 재정의해야 하는 public abstract 메소드를 멤버로 가질 수 있음

  • {} 실행부가 없는 메소드
  • 인터페이스 구현 객체는 인터페이스의 추상 메소드의 실행부를 갖는 재정의된 메소드가 있어야 함

default 메소드

: 인터페이스에 완전한 실행 코드를 가진 디폴트 메소드를 선언할 수 있음

  • 실행부에는 상수 필드를 읽거나 추상 메소드를 호출하는 코드
  • 추상 메소드와 마찬가지로 구현 객체가 필요함
    -> 구현 객체는 자신에게 맞게 디폴트 메소드 또한 재정의할 수 있음
    -> 재정의 시 public 필수 / default 없애야 함
[public] default 리턴타입 메소드명 ( ) { }

static 메소드

: static 메소드는 구현 객체가 없어도 인터페이스만으로 호출 가능

  • static 메소드의 실행부 작성 시 추상 메소드 / 디폴트 메소드 / private 메소드 등 호출 불가
    -> 이 메소드들은 구현 객체가 필요한 메소드이기 때문

private 메소드

: 인터페이스의 상수, 추상 메소드, 디폴트 메소드, static 메소드는 모두 public. 하지만 외부에서 접근할 수 없는 private 메소드 선언도 가능.

  • private : 구현 객체가 필요한 메소드
    -> 디폴트 메소드 안에서만 호출이 가능
  • private static : 구현 객체가 필요 없는 메소드
    -> 디폴트 메소드 + static 메소드 안에서도 호출 가능

다중 인터페이스

  • 구현 클래스는 구현하는 모든 인터페이스의 추상 메소드를 재정의해야 함
public class 구현클래스 implements 인터페이스1, 인터페이스2 {
	// 모든 추상 메소드 정의
}

인터페이스 상속

: 인터페이스는 클래스와 달리 다중 상속 허용

  • 자식 인터페이스 구현 클래스는 자식 인터페이스 + 부모 인터페이스의 모든 메소드를 재정의해야 함
  • 구현 객체는 자식 및 부모 인터페이스 변수에 대입 가능
    -> 자식 인터페이스 변수에 대입 : 자식 및 부모 추상 메소드 모두 호출 가능
    -> 부모 인터페이스 변수에 대입 : 부모 추상 메소드만 호출 가능

타입 변환

: 인터페이스 - 구현 클래스 간에 타입 변환

  • 인터페이스 변수에 구현 객체 대입 : 구현 객체는 인터페이스 타입으로 자동 변환
  • 인터페이스 타입을 구현 클래스 타입으로 강제 타입 변환

자동 타입 변환

  • 부모 클래스가 인터페이스를 구현하고 있다면 자식 클래스도 인터페이스 타입으로 자동 타입 변환 가능

강제 타입 변환

  • 구현 객체가 인터페이스 타입으로 자동 변환되면 인터페이스에 선언된 메소드만 사용 가능
  • 자동 타입 변환 후에 Television의 setTime()과 record()를 호출하고 싶다면 캐스팅 하여 Television으로 강제 타입 변환해야 한다.

다형성

: 상속보다 인터페이스를 통해 다형성을 구현하는 경우가 더 많음

  • 구현 객체 B와 C중 어떤 객체가 인터페이스에 대입되냐에 따라 객체 A의 실행 결과가 달라짐
  • 인터페이스 또한 상속과 마찬가지로 '메소드 재정의와 자동 타입 변환'이 필요
    -> 인터페이스 추상 메소드는 구현 클래스에서 재정의
    -> 구현 객체는 인터페이스 타입으로 자동 타입 변환
    -> 인터페이스 메소드 호출 시 구현 객체의 재정의된 추상 메소드 호출

0개의 댓글