[Java] 인터페이스(Interface)

쓰옹·2022년 12월 1일
0

📙 Java 잡아🤏

목록 보기
16/25
post-thumbnail

인터페이스(Interface)

  • 클래스 혹은 프로그램이 제공하는 기능을 명시적으로 선언하는 역할
  • 추상메서드로 이루어짐
  • 어떤 객체가 특정 인터페이스를 사용한다면 그 객체는 반드시 인터페이스의 메서드를 구현해야함. (implements 예약어 사용)
    • 추상메서드로 구현체에게 구현 강제
  • 클래스의 명세서 역할.
    • 어떤 메서드를 제공할지 미리 알려줌
  • 동시개발 가능
    • 의사소통의 창구
    • 동시 개발 시 커뮤니케이션 미스를 줄일 수 있음
    • 인터페이스 수정 시 약속이 되어 있어야 함.
  • 다형성 구현
    • 같은 방식으로 요청을 하지만 다른 결과물을 만들어 냄.

    • 자동 타입 변환(Promotion)
      - 상위 클래스, 인터페이스, 추상클래스로 Upcasting 가능

      interface I2(){
      	public String A();
      }
      interface I3{
      	public String B();
      }
      class D implements I2, I3{
      	public String A(){
             ...
      	}
      	public String B(){
             ...
      	}
      }
      
      public class Polymorphism {
      	public static void main(String[] args) {
      		D obj = new D();
      // 특정 기능을 가진 인터페이스만 필요하다면 다른 기능은 배제
      		I2 objI2 = new D();  //데이터타입은 I2
      		I3 objI3 = new D();  //데이터타입 I3
      
      		obj.A();
      		obj.B();
      
      		obj2.A();
      		//obj2.B();  // I2 입장에서 존재하지 않기 때문에 에러
      
      		//obj3.A();  // I3 입장에서 존재하지 않기 때문에 에러
      		obj3.B();   
      	}
      }
    • Dynamic Dispatch 동작

      • Runtime polymorphism

      • 재정의(override)된 메서드에 대한 호출이 런타임에 해결되는 프로세스

      • 어떤 객체가 다른 객체에게 메서드를 보낼 때 그때 그때 상황에 맞게(Dynamic) 보내준다(Dispatch)는 뜻


인터페이스 규칙

  • 정의되는 멤버들의 접근제어자는 public 이어야 함
    • public이 아닌 제어자는 에러 발생
    • 생략시엔 컴파일 과정에서 붙음
  • 하나의 클래스가 여러개의 인터페이스 구현 가능 - 다중구현 가능
  • 인터페이스도 상속됨
    interface I3{
    	public void x();
    }
    
    interface I4 extends I4{
    	public void z();
    }
    
    class A implements I4{
    	public void x(){}
    	public void z(){}
    }
  • 인터페이스에 선언한 변수는 컴파일 시 상수로 변환
    • public static final이 컴파일 과정에서 붙음
    • 상수명 - 대문자_대문자로 쓸 수 있음 HI_FIVE
  • 디폴트메서드
    public interface I5{
    		...	
    	default void y() {  //디폴트메서드 선언
    		 ...
    	}
    }
    
    public class B implements I5 {
    	public static void main(String[] args) {
    			...
    		B obj = new B();  //클래스 생성
    			...
    		obj.y();  // 디폴트메서드 호출
    	}
    }
    
    • 재정의 가능
  • static 메서드(정적메서드) 사용 가능
    • 헬퍼 또는 유틸리티 메소드를 제공할 때 사용

    • 인터페이스 이름 직접 참조

      public interface I5{
      		...	
      	static void y() {  // static메서드 선언
      		 ...
      	}
      }
      
      public class B implements I5 {
      	public static void main(String[] args) {
      			...
      			...
      		System.out.println(I5.y());  // static메서드 호출
      	}
      }
      
    • static 블록 작성 불가




reference

Dynamic Dispatch를 알면 코드가 빨라진다

생활코딩 JAVA - 다형성

profile
기록하자기록해!

0개의 댓글