전공/객체지향프로그래밍

[객체지향프로그래밍][Java] 인터페이스의 구성 요소 심화 내용

Campus Coder 2023. 5. 31. 17:05
728x90
반응형

자바 인터페이스의 구성 요소

(취소선 부분 생략 가능)

상수

  • public static final

 

int X = 10;

int X;

 

int X = 10;은 public static final int X = 10;이 생략된 형태로 X라는 상수를 정의한 것이지만,

int X;는 변수를 선언하는 것으로 해석되기 때문에 컴파일 에러가 발생

 

메소드

public abstract
(abstract public)
추상 메소드
함수 몸통 부분 없음
사용하려면 반드시 함수 몸체 구현 필요
public default
(default public)
인터페이스 내에서 메소드 정의({ } 부분이 필요함, 정의 안하면 컴파일 에러)
인터페이스 상속하여 default 메소드 사용 가능
오버라이딩 가능

Interface A -> Interface B -> class C
C에서 A에 있는 default 함수 호출 불가(A.super.A_Method(); 불가), 오버라이딩은 가능
public static
(static public)
인터페이스 내에서 메소드 정의({ } 부분이 필요함, 정의 안하면 컴파일 에러)
InterfaceName.staticMethod() 형식으로 사용(객체.staticMethod 형식은 컴파일 에러)
오버라이딩 불가
private 인터페이스 내에서 메소드 정의({ } 부분이 필요함, 정의 안하면 컴파일 에러)
오버라이딩 불가
private static
(static private)
인터페이스 내에서 메소드 정의({ } 부분이 필요함, 정의 안하면 컴파일 에러)
오버라이딩 불가

private 메소드는 해당 인터페이스 안에서의 사용을 위해 만들어짐(오버라이딩 불가)

static 메소드는 인터페이스 자체에서 사용됨(오버라이딩 불가)

 

상속에서 주로 상위 클래스 혹은 인터페이스의 레퍼런스를 만들고, 하위 클래스의 객체를 만들어 사용

실행되는 메소드는 참조 레퍼런스의 타입에 상관없이 객체의 메소드가 실행됨

 

오버라이딩 했지만 부모 인터페이스의 메소드를 호출하고 싶다면, '부모인터페이스이름.super.메소드이름'으로 호출 가능

단, 직접적으로 상속하는 인터페이스의 메소드만 가능(Interface A -> Interface B -> class C, C에서 A의 메소드 super로 호출 불가)

 

두 인터페이스 이상을 상속받는 경우

  • 오버라이딩을 통해 상속받는 인터페이스들의 메소드 모두 구현 가능
  • 부모 인터페이스의 default 메소드를 호출하고 싶다면, '부모인터페이스이름.super.메소드이름'으로 호출 가능
  • 인터페이스에 함수 이름이 같고 형태가 다른 메소드(예를 들어 public abstract, public default)가 존재하면 필수적으로 오버라이딩 필요(그렇지 않다면 컴파일 에러)

 

추상 클래스 인터페이스를 동시에 상속받는 경우

  • 오버라이딩이 추상 클래스, 인터페이스의 메소드에 모두 적용

 

클래스 인터페이스를 동시에 상속받는 경우

  • 클래스의 메소드를 상속받고, 상속받은 메소드가 인터페이스까지 오버라이딩
  • 오버라이딩이 클래스, 인터페이스의 메소드에 모두 적용
728x90
반응형