쏭식
Ssongcode;
쏭식
전체 방문자
오늘
어제
  • 분류 전체보기 (106)
    • JAVA (21)
      • Basic (21)
    • Kotlin (14)
      • Basic (14)
    • Android (64)
      • Basic (24)
      • JETPACK (30)
      • Compose (8)
      • 파고들기 (2)
    • Project (4)
    • etc (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 객체지향
  • AAC
  • workmanager
  • Android
  • 프로젝트회고
  • 메소드
  • 코드업100제
  • 상속
  • 코틀린코테
  • 변수
  • Room
  • Adapter
  • 자바
  • 백준
  • Jetpack
  • ViewModel
  • Kotlin
  • DataBinding
  • 컴포즈
  • compose
  • mvvm
  • 알고리즘
  • livedata
  • 리사이클러뷰
  • 코테
  • 기초100제
  • 코딩테스트
  • 자료구조
  • 코틀린
  • 배열

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
쏭식

Ssongcode;

[JAVA-basic] default 메소드와 static 메소드
JAVA/Basic

[JAVA-basic] default 메소드와 static 메소드

2021. 9. 12. 09:30

인터페이스에는 원래 추상메소드만 선언할 수 있었다.

JDK1.8 부터 디폴트 메소드와 static메소드도 추가할 수 있게 되었다.

 

static메소드는 인스턴스와 관계가 없는 독립적인 메소드이기 때문에 예전부터 인터페이스에 추가하지 못할 이유가 없었다. 그러나 규칙을 단순히 할 필요가 있어서 인터페이스의 모든 메소드는 추상 메소드이어야 한다는 규칙에 예외를 두지 않았다. 그래서 인터페이스와 관련된 static메소드는 별도의 클래스에 따로 두어야 했다.

디폴트 메소드

조상 클래스에 새로운 메소드를 추가하는 것은 별 일 아니지만, 인터페이스의 경우에는 매우 큰일이다.

인터페이스에 메소드를 추가한다는 것은 추상메소드를 추가한다는 것이고, 이 인터페이스를 구현한 기존의 모든 클래스들이 새로 추가된 메소드를 구현해야 하기 때문이다.

 

그래서 디폴트 메소드라는 것이 생겨났다. 디폴트 메소드는 추상메소드의 기본적인 구현을 제공하는 메소드로,

추상메소드가 아니기 때문에 디폴트 메소드가 새로 추가되어도 해당 인터페이스를 구현한 클래스를 변경하지 않아도 된다.

 

디폴트 메소드 앞에 키워드 default를 붙이며 추상 메소드와 달리 일반 메소드처럼 { }이 있어야 한다.

디폴트 메소드 역시 접근 제어자가 public이며, 생략가능하다.

interface MyInterface{
   void method() ;
   void newMethod() ;
}
여기서 newMethod() 는 추상메소드이다.
이것을 디폴트 메소드로 정의한다면,
MyInterface를 구현한 클래스는 변경하지 않아도된다.
interface MyInterface{
   void method() ;
   default void newMethod() { }
}

즉, 조상클래스에 새로운 메소드를 추가한 것과 동일해 지는 것이다.

 

대신, 새로 추가된 디폴트 메소드가 기존의 메소드와 이름이 중복되어 충돌하는 경우가 발생하는데,

이 충돌을 해결하는 규칙은 다음과 같다.

1. 여러 인터페이스의 디폴트 메소드 간의 충돌
-인터페이스를 구현한 클래스에서 디폴트 메소드를 오버라이딩 해야 한다.

2. 디폴트 메소드와 조상클래스 메소드 간의 충돌
-조상 클래스의 메소드가 상속되고, 디폴트 메소드는 무시된다.

다음 예시를 살펴보자.

인터페이스1
메소드 이름이 중복된 인터페이스2
부모클래스
자식클래스
메인클래스

Child클래스는 Parent클래스를 상속받고, MyInterface, MyInterface2 두개의 인터페이스를 구현하였다.

하지만 두 개의 인터페이스에는 동일한 이름의 default메소드가 충돌하였다.

따라서 Child클래스에서 디폴트 메소드 method1()을 오버라이딩해서 문제를 해결하였다.

 

또한, 상속받은 Parent클래스에서의 method2()와 MyInterface에서의 method2() 가 충돌되었지만,

조상클래스의 메소드가 상속되고, 디폴트 메소드는 무시되는 규칙이 적용되었다.

저작자표시 (새창열림)

'JAVA > Basic' 카테고리의 다른 글

[JAVA-basic] 인터페이스(2)  (0) 2021.09.09
[JAVA-basic] 인터페이스  (0) 2021.08.31
[JAVA-basic] 추상클래스  (0) 2021.08.27
[JAVA-basic] 다형성(2)  (0) 2021.08.24
[JAVA-basic] 다형성  (0) 2021.08.24
    'JAVA/Basic' 카테고리의 다른 글
    • [JAVA-basic] 인터페이스(2)
    • [JAVA-basic] 인터페이스
    • [JAVA-basic] 추상클래스
    • [JAVA-basic] 다형성(2)
    쏭식
    쏭식

    티스토리툴바