반응형
추상 클래스와 인터페이스는 존재 목적이 다르다.
추상 클래스: 자신을 상속받아서 기능을 이용하고 확장하는 용도
인터페이스: 함수의 구현을 강제하여 구현 객체의 같은 동작을 보장하는 용도
1. 클래스는 하나의 추상 클래스만 상속받을 수 있지만 인터페이스는 여러 개 구현할 수 있다.
- 즉 인터페이스는 여러개 구현할 수 있지만 java는 단일 상속만 허용하기 때문이다.
왜...? 단일 상속일까?
- 인터페이스의 목적은 함수의 구현을 강제한다고 했다. 즉 서로 다른 Interface에 같은 추상 메서드가 있을 때 Override가 필수이기 때문에 자신이 Override로 작성한 메서드가 호출이 될 것이다.
public class Main extends A implements C, D {
@Override
public void testInterface() {
}
}
interface C {
void testInterface();
}
interface D {
void testInterface();
}
다중 상속을 허용하게 된다면??
public class Main extends A,B{
@Override
public void testClass() {
super.testClass();
}
}
abstract class A{
public void testClass(){
System.out.println("test A");
}
}
class B {
public void testClass(){
System.out.println("test C");
}
}
- 메서드 이름이 같을 때 어떤 부모의 메서드를 호출시켜야 될지 알 수 있는 방법이 있을까..? 충돌이 일어난다.
2. 추상 클래스는 인스턴스 변수(필드)로 공통 상태를 가질 수 있지만 인터페이스는 인스턴스 변수를 가질 수 없다.
java 8의 default method를 이용해서 같은 코드를 구현했지만 인터페이스에서는 컴파일 에러가 발생한다.
abstract class A{
String name = "uhanuu";
public void setName(String name) {
this.name = name;
}
}
interface C {
String name = "uhanuu";
default public void setName(String name){
this.name = name; // 컴파일 에러
}
}
왜 컴파일 에러가 발생하는 걸까??
인터페이스의 내부 규칙인 "인터페이스는 인스턴스 변수를 가질 수 없다."를 생각해보면
- 인터페이스에 선언된 모든 메서드는 public이고 abstract이다. (default, static 메서드 제외)
interface A {
// 1) 규칙이기 때문에 무조건 공개 메서드이고 추상 메서드이다.
public abstract void m1();
// 2) public을 생략해도 내부적으로 public으로 간주한다.
abstract void m2();
// 3) abstract를 생략해도 내부적으로 abstract로 간주한다.
void m3();
// 4) 구현 메서드를 가질 수 없다.
// void m4() {} // 컴파일 오류!
}
- 또한 인터페이스에 선언된 모든 필드(영역)는 public이고 static이며 final이다.
interface B {
// [필드 선언 규칙]
// 1) 규칙이기 때문에 무조건 공개 필드이고, 스태틱 필드이다
// 그리고 값을 바꿀 수 없는 상수 필드이다.
public static final int v1 = 200;
// 2) public을 생략하면 내부적으로 public으로 간주한다.
static final int v2 = 200;
// 3) static을 새약하면 내부적으로 static으로 간주한다.
final int v3 = 200;
// 4) final을 생략하면 내부적으로 final로 간주한다.
int v4 = 200;
}
- 필드 선언 규칙에 의해서 항상 public static final이 붙는다고 생각하면 될거 같다.
자바에서 final 키워드는 여러 컨텍스트에서 오로지 한 번 할당될 수 있는 entity를 정의할 때 사용된다.
- 재 정의를 못하게 하는것
- 한 번 인스턴스가 할당되면 절대 재할당 될 수 없는것
- 다른 클래스가 상속받지 못하게 함으로 원래 동작이 바뀌면 안될 때
final 키워드에 주요 특징의 이유 때문에 이런 차이점들이 생긴것이다. 물론 java 개발자 분들은 다 생각하고 만드셨겠지만 ㅜ.ㅜ,,
다음 포스팅 (모던 자바 default method)
- 둘 다 추상 메서드와 바디를 포함하는 메서드를 정의할 수 있는데 차이점은 무엇일까?
reference
반응형
'Java' 카테고리의 다른 글
default 메서드에서 왜 Obejct 메서드를 재정의하지 못할까? (0) | 2024.04.02 |
---|---|
Enum에서 어떻게 비교할까? (Objects.equals(), equals(), == 비교 연산자) (0) | 2024.02.17 |
JVM의 개념 및 구조(JDK, JRE, JIT 컴파일러) (0) | 2024.02.04 |
타입추론 var에 대해서 (0) | 2024.02.02 |