>

TIL

JAVA - 인터페이스

ekdud 2024. 12. 12. 14:55

📑

     

    인터페이스

    • 인터페이스: 두 객체를 연결하는 것.

    자바의 다형성을 극대화하여 개발코드 수정을 줄이고 프로그램 유지보수성을 높이기 위해 사용.

    ex. 객체 A가 인터페이스의 메소드를 호출 → 인터페이스가 객체 B의 메소드를 호출 → 그 결과를 인터페이스가 받아 객체 A로 전달.

     

    객체 A가 객체 B의 메소드를 직접 호출하도록 하지 않는 이유

    : 이렇게 인터페이스를 거치지 않는 경우, 객체 B가 객체 C로 변경된다면 A의 소스코드를 객체 B에서 객체 C로 변경하는 작업이 추가로 필요해지기 때문이다.

    다형성 구현에 주된 기술로 인터페이스를 사용.

    (상속을 이용하는 방법도 있지만 인터페이스 사용 多)

     

     

     

    인터페이스 선언

    -class 대신 interface 키워드 사용.

    접근 제한자는 클래스와 마찬가지로 같은 패키지 내에서만 사용 가능한 default, 패키지와 상관없이 사용하는 public을 붙임.

    interface 인터페이스명 {...} //default 접근제한
    public interface 인터페이스명 {...} //public 접근제한

     

    중괄호 안에는 다음과 같은 인터페이스가 가지는 멤버들을 선언할 수 있다.

    public interface 인터페이스명 {
    
    public 상수 필드
    
    public 추상 메소드
    
    public 디폴트 메소드
    
    public 정적 메소드
    
    private 메소드
    
    private 정적 메소드
    
    }

     

    상수 : 인터페이스에서 값을 정해줄테니 함부로 바꾸지 말고 제공해주는 값만 참조. 강제성

    추상메소드 : 가이드는 제공해주지만 추상메소드를 오버라이딩해서 재구현 가능.

    디폴트메소드 : 인터페이스에서 기본적으로 제공해주지만, 원하는대로 각자 구현해서 사용 가능.

    정적메소드 : 인터페이스에서 제공해주는 것으로 무조건 사용.

     

    * 이클립스에서의 인터페이스 선언

    해당 프로젝트의 src폴더에 패키지를 생성하고 New - Interface - 인터페이스명 입력 - Finish 클릭 - public 추상 메소드를 하나 작성.

    *추상 메소드: 선언부만 있고 실행부인 중괄호가 없는 메소드. 리턴 타입, 메소드명, 매개변수만 기술되고 중괄호{}를 붙이지 X.

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

    → public abstract를 생략하더라도 컴파일 과정에서 자동으로 붙음.

     

     

     

    구현 클래스 선언

    객체 A가 인터페이스의 추상메소드를 호출하면 인터페이스는 객체 B의 메소드를 실행한다. 그러려면 객체 B가 인터페이스에 선언된 추상메소드와 동일한 선언부를 가진 (재정의된) 메소드를 가지고 있어야 한다. 객체 B를 구현객체라고 함.

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

    implements 키워드는 해당 클래스가 인터페이스를 통해 사용할 수 있다는 표시이며, 인터페이스의 추상 메소드를 재정의한 메소드가 있다는 뜻.

     

    turnOn(): RemoteControl의 추상메소드. Television: 구현 객체

     

     

    인터페이스 상속

    - 클래스와 달리 인터페이스는 다중 상속을 허용함.

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

     

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

    - 구현 객체는 자식 및 부모 인터페이스 변수에 대입될 수 있음.

     

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

     

     

    다형성

    다형성: 사용방법은 동일하지만 다양한 결과가 나오는 성질.

     

    현업에서는 상속보다는 인터페이스를 통해서 다형성을 구현하는 경우가 더 多.

    메소드 재정의 + 자동 타입 변화 ⇒ 다형성

     

     

     

    필드의 다형성

    - 상속에서 부모 타이어 클래스 타입에 자식 객체인 한국 타이어 또는 금호 타이어를 대입해서 다형성을 보여준 것과 비슷하지만 필드의 다형성에서는 부모 타입이 클래스 타입이 아니고 인터페이스임.

     

     

    • 봉인된 인터페이스

    - 무분별한 자식 인터페이스 생성을 방지하기 위해 봉인된 (sealed) 인터페이스를 사용할 수 있음.

    - 봉인된 예비부모인터페이스를 상속하는 예비자식인터페이스는 non-sealed 키워드로 선언하거나 sealed 키워드를 사용해서 또 다른 봉인 인터페이스로 선언해야함.

    public sealed interface interface예비부모 permits interface예비자식 { … }

    ⇒ 예비부모인터페이스의 자식 인터페이스는 예비자식인터페이스만 가능해짐.

    public non-sealed interface interface예비부모 extends interface예비자식 { … }

    ⇒ non-sealed는 봉인을 해제하는 것. 따라서 예비자식인터페이스가 다른 자식 인터페이스를 만들 수 있게 됨.