Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags more
Archives
Today
Total
관리 메뉴

ultra_dev

이것이 자바다 CH 8(인터페이스) 본문

이것이 자바다

이것이 자바다 CH 8(인터페이스)

ultra_dev 2023. 1. 13. 00:36

☑️ 인터페이스

:접속기, 객체를 연결하는 역할

객체 A - 인터페이스 - 객체 B

객체 A가 인터페이스 메소드 호출 시, 인터페이스는 객체B의 메소드 호출하고 그 결과를 객체A에게 전달

→ 왜 바로 객체B의 것을 호출하지 않고 번거롭게 인터페이스를 거칠까

→ 만약 객체 B가 객체 C로 교체된다고 가정 시, 객체 A는 객체B가 C로 교체되든말든 상관 안함

관심사는 인터페이스의 메소드일뿐..

만약 인터페이스 없이 객체B의 것을 직접 사용했다면

객체A는 소스코드를 객체B에서 객체C로 변경하는 번거로운 작업을 거쳐야 했겠지만 인터페이스를 사용하면 그럴 필요가 없음

  • .java 소스파일로 작성되고, .class 형태로 컴파일 되기 때문에 물리적 형태는 클래스와 동일
  • 접근 제한자
interface 인터페이스명 {...} -> default 접근제한자 자동으로 붙음
public interface 인터페이스명 {...} -> public 접근제한

객체 A - 인터페이스 - 객체 B

위 예시에서 객체B는 인터페이스를 구현한(implement) 객체라고 한다.

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

  • 구현클래스 B
public class B implements 인터페이스명 {...}

→ implements 키워드는 해당 클래스가 인터페이스 통해 사용할 수 있다는 표시이며,

인터페이스의 추상 메소드를 재정의한 메소드가 있다는 뜻

☑️ 인터페이스도 하나의 타입이므로 변수의 타입으로 사용 가능

: 인터페이스를 통해 구현 객체를 사용하려면 인터페이스 변수에 구현 객체 대입해야함

RemoteControl rc;
rc = new Televeision();

또는
RemoteControl rc = new Television();

->만약 Television이 implements RemoteControl로 선언되지 않았다면 변수 rc에 대입 불가능!!

인터페이스 변수에 구현 객체가 대입 됐으면 이제 변수 통해 인터페이스의 추상메소드 호출 가능
rc.turnOn()

☑️ 상수 필드

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

  • 인터페이스는 객체 사용 설명서 이므로 런타임 시 데이터를 저장할 수 있는 필드를 선언할 수 없고 상수 필드만 선언할 수 있음(..)
[public static final] 타입 상수명 = 값;
  • 상수명 → 대문자 + 언더바(_)로 연결

☑️ 추상 메소드

:인터페이스는 public abstract를 생략하더라도 컴파일 과정에서 자동으로 붙게됨

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

→ 추상메소드 재정의 시 주의점 : 인터페이스의 추상 메소드는 기본적으로 public접근 제한을 갖고 있기 때문에 public보다 더 낮은 접근제한으로 재정의 불가능!!

→ 따라서 재정의 되는 메소드에는 모두 public이 추가되어있음

☑️ 디폴트 메소드

:인터페이스도 완전한 실행 코드를 가진 디폴트 메소드 선언 가능

→ 실행부(중괄호{})가 없던 추상 메소드와 달리 실행부 존재

→ default 키워드가 리턴타입 앞에 붙음 → 접근제한자 아님..

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

→ 구현 객체가 필수임

→ 구현 클래스는 디폴트 메소드를 오버라이딩 가능함.

다만 public 접근 제한자 붙혀야 하고 default 키워드를 생략해야함

default void setMute(boolean mute) <ㅡ 인터페이스 디폴트 메소드

@Override
public void setMute(boolean mute){....} <ㅡ 디폴트 메소드 오버라이딩

☑️정적 메소드

:구현 객체가 필요한 추상 메소드, 디폴트 메소드와 달리 구현 객체가 없이 인터페이스만으로 호출 가능

  • public 생략하더라도 컴파일과정에서 자동적으로 붙음
  • 정적메소드 실행부(중괄호{})에 상수필드 제외한 추상메소드,디폴트메소드,private메소드 호출 불가!!

→why? 이 메소드들은 구현객체가 필요한 메소드들이기 때문

 

 

☑️ private 메소드

인터페이스의 상수 메소드 ,추상 메소드 ,디폴트 메소드 ,정적 메소드는 모두 public 접근 제한을 갖는다.

→ 이 멤버들은 public 을 생략해도 컴파일 과정에서 public 접근 제한자가 붙어 항상 외부에서 접근이 가능

반면,

private 메소드는 인터페이스 외부에서 접근할 수 없는 메소드

  • private 메소드 → 구현 객체가 필요한 메소드 → 디폴트 메소드 안에서만 호출 가능
  • private 정적 메소드 → 구현 객체가 필요 없는 메소드 → 디폴트 메소드 + 정적메소드 안에서도 호출 가능

✏️private메소드 사용 이유 : 디폴트 메소드와 정적메소드의 중복 코드 줄이기 위해서

→ 예를 들어 디폴트 메소드가 동일한 코드를 가지고 있으면 이 부분을

private메소드로 빼서 따로 처리하는게 가능함

☑️ 다중 인터페이스 구현

public class 구현클래스명 implements 인터페이스A,인터페이스B{...}

→ 구현 객체는 여러 개의 인터페이스 implements 가능

인터페이스A 변수 = new 구현클래스명();
인터페이스B 변수 = new 구현클래스명();

-> 구현 객체가 어떤 인터페이스 변수에 대입되느냐에 따라 
	변수를 통해 호출 가능한 추상메소드도 결정됨

☑️ 인터페이스 상속

:인터페이스도 다른 인터페이스 상속 가능 + 클래스와 달리 다중상속 가능

→ extends 사용

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

자식인터페이스의 구현 클래스는 자식인터페이스 메소드뿐만 아니라 부모 인터페이스의 모든 추상메소드 재정의 해야됨


자식인터페이스 변수 = new 구현클래스()
부모인터페이스1 변수 = new 구현클래스()
부모인터페이스2 변수 = new 구현클래스()

구현 객체는 자식 및 부모인터페이스 변수에 대입 전부 가능

→ 만약 구현 객체가 자식 인터페이스 변수에 대입되면 자식 및 부모 인터페이스의 추상메소드 모두 호출 가능

반면, 부모인터페이스 변수에 대입되면 부모 인터페이스의 추상메소드 호출 가능

☑️ 자동 타입 변환

인터페이스 변수 = 구현객체;
-> 구현객체가 변수로 자동타입변환
  • 부모 클래스가 인터페이스 구현하고 있다면 자식 클래스도 인터페이스 타입으로 자동 타입 변환 가능
  • → 인터페이스A 구현한 B클래스가 있고 B를 상속한 C클래스가 있으면 C로부터 생성된 객체도 인터페이스 A로 자동 타입 변환 가능

☑️ 강제 타입 변환

구현클래스 변수 = (구현클래스) 인터페이스변수;
-> 인터페이스변수가 변수로 강제타입변환

: 구현 객체가 인터페이스타입으로 자동 변환되면 인터페이스에 선언된 메소드만 사용 가능함

만약 A인터페이스에 3개의 메소드, B클래스에는 5개의 메소드가 있다면

A인터페이스로 호출 가능한 메소드는 3개뿐이라

자동타입변환 이후 B클래스 메소드도 쓰고 싶다면

B클래스로 다시 강제타입변환해서 사용하는 것

💥다형성부분, instanceof 객체 타입 확인, 봉인된 인터페이스 부분도

CH 8-1에서 설명한 추상클래스와 동일함

Comments