회사 코드를 보던 중 발견한 default...?
바로 코드로 보자
1. 기본 선언
Test Interface
public interface Test {
default void callDefault() {
System.out.println("I'm default");
}
static void callStatic() {
System.out.println("I'm static");
}
}
TestImpl Class
public class TestImpl implements Test {
}
Main Class
public class TestMain {
public static void main(String[] args) {
Test test = new TestImpl();
test.callDefault();
Test.callStatic();
}
}
2. 특이점
- interface의 method들이 body를 가질 수 있다!
- 구현체인 TestImpl class에서 override를 하지 않아도 에러가 나지 않는다!
3. 추가 테스트
TestImpl Class
public class TestImpl implements Test {
@Override
public void callDefault() {
System.out.println("I'm overrided default!");
}
}
Main Class
public class TestMain {
public static void main(String[] args) {
Test test = new TestImpl();
test.callDefault();
Test.callStatic();
}
}
4. 그럼 abstract class와의 차이는...?
- 말 그대로 interface 와 class의 차이!
- 다수의 interface를 구현(implements)할 수 있지만, 하나의 클래스만을 상속(extends)해야 한다.
- 생성자 차이도 존재
- interface의 멤버 변수는 상수(constant)만을 가져야 하지만, abstract class는 아니다.
- 접근제어자의 차이도 존재