뭐지?

[Java] 인터페이스에도 완성된 메서드를 쓴다고?

호기심 많은 솔이 2025. 4. 23. 17:32

*본 게시물은 개인 공부를 기록하기 위해 작성하였으며, 내용에 오류가 있을 수 있음을 밝힙니다.

 

지금까지 인터페이스는 상수와 추상 메서드만 선언할 수 있는, 말 그대로 '껍데기'라고만 알고 있었다. 그런데 오늘 인터페이스에도 구현된 메서드, 즉 static과 default 메서드를 정의할 수 있다는 사실을 처음 알게 되었다.

 

처음 알게 된 개념이어서 궁금한 점이 많았고, 여러 자료를 찾아보며 공부한 내용을 이 글에 정리해 보았다.

 

 

결과부터 말하자면, 이전에는 내가 알던 대로 인터페이스에는 무조건 추상 메서드만 쓸 수 있었다. 하지만, 자바 8부터는 완성된 default 메서드와 static 메서드를 쓸 수 있게 된 것이다.

 

우선 인터페이스에서의 default 메서드와 static 메서드에 대해

1. 호출 방법

2. 오버라이딩 가능 여부

3. 사용하는 이유

에 대해 간단히 설명한 후,

 

인터페이스에서 default 메서드와 static 메서드를 어떻게 사용하고 있는지 예시 코드를 보면서 설명해 보겠다.

 

1. 호출 방법

- default 메서드의 경우 car.turnOnLights()와 같이 인스턴스로 메서드를 호출한다.

- static 메서드의 경우 Car.companyInfo()와 같이 인터페이스명으로 메서드를 호출한다.

 

2. 오버라이딩 가능 여부

- default 메서드는 오버라이딩이 가능하다.

- static 메서드는 오버라이딩이 불가능하다.

--> 아래 예시 코드 설명할 때 자세히 설명 예정.

 

3. 사용하는 이유

- 인터페이스 구현 클래스에 기본 동작 제공

- 도구성, 유틸리티 메서드 제공

 

 

<예시 코드>

Car Interface

 

위의 Car 인터페이스를 보면 추상 메서드, default 메서드, static 메서드가 정의되어 있다.

여기서 추상 메서드는 상속받은 클래스에서 반드시 구현해야 하는 메서드이고, default 메서드는 이미 구현이 되어 있어 Car의 공통 동작을 제공하지만, 원한다면 Override 하여 구현 내용을 바꿀 수 있다. 마지막으로, static 메서드는 클래스처럼 공통으로 사용하는 유틸성 메서드로써, 모든 Car의 기본 틀 정도로 이해할 수 있고, default 메서드와 달리 오버라이딩을 할 수 없다.

 

 

 

이제 이 Car 인터페이스를 구현한 HyundaeCar클래스와 KiaCar클래스를 보면서 추가 설명을 해보겠다.

Car Interface를 구현한 HyundaeCar 클래스

 

Car 인터페이스를 구현한 HyundaeCar 클래스를 보면, 추상 메서드인 drive의 내용을 구현한 것을 볼 수 있고, Car 인터페이스의 default 메서드 turnOnLights를 오버라이딩하여 구현 내용을 바꾼 것을 볼 수 있다. 하지만, 이 클래스에는 Car 인터페이스에는 있었던 static 메서드인 companyInfo()는 없는 것을 확인할 수 있는데, 이는 인터페이스에서 만든 static 메서드는 그 인터페이스 자체에 귀속되기 때문이다. 호출 시에도 HyundaeCar의 객체가 아닌 인터페이스 이름(Car)으로만 호출이 가능하다.

 

 

이번에는 Car 인터페이스를 구현한 KiaCar 클래스를 보면,

Car Interface를 구현한 KiaCar 클래스

 

추상 메서드인 drive()는 직접 구현하였고, HyundaeCar클래스와 달리, default 메서드는 보이지 않는다. default 메서드는 직접 오버라이딩 하지 않아도 기본적으로 제공되기 때문이다.

 

 

마지막으로 CarMain클래스를 보면,

CarMain 클래스

 

출력값

 

각 메서드에 구현된 내용이 출력되는 것을 볼 수 있다. 여기서 주의할 점은 static 메서드인 companyInfo()는 인터페이스의 추상 메서드 drive, default 메서드 turnOnLights()를 객체를 통해 호출하는 것과 달리, 인터페이스명으로 호출한다는 것이다.