[Java] 자바의 인터페이스 : 상수와 추상 메소드. 추상 클래스와의 차이점, 오버라이딩
인터페이스
1. 인터페이스 문법
public interface Movable{
// 두 가지는 인터페이스에서는 같은 의미이다.
int Number = 10;
public static final Number = 10;
// 두 가지는 인터페이스에서는 같은 의미이다.
void Move(int x, int y);
public abstract void Move(int x, int y);
}
인터페이스는 상수와 추상 메소드의 집합이다. 따라서 추상 클래스는 인터페이스의 기능을 일부분 대체할 수도 있다.
하지만 문법적으로 가장 큰 차이는 추상 클래스와는 다르게
멤버 변수(인스턴스 변수 + 클래스 변수), 일반 메소드를 구성원으로 사용할 수 없다.
즉 반대로 말하면, 상수와 추상 메소드는 사용할 수 있다.
또한 인터페이스에서 선언된 상수과 추상 메소드는 컴파일러 과정에서 자동적으로
( public static final ) int number = 0;
( public abstract ) void method(int x);
괄호 칸의 부분이 생성된다. 따라서 일반적인 선언부에서는 괄호 부분을 생략하고 입력하게 된다.
인터페이스의 기능 이해는 "be able to" , ~할 수 있다, 라고 이해하면 편하다.
그렇기 때문에 인터페이스의 이름들을 보면 ~able 과 같은 형태로 명명되어있는 경우가 많음을 알 수 있다.
인터페이스를 상속하는 클래스의 문법
public class ExampleInterface implements Movable {
public void Move(int x, int y){
}
}
클래스명 implements 인터페이스명 {
public(필수) void 인터페이스 상의 추상메소드명(){
}
}
의 형태를 띈다.
인터페이스를 상속 클래스 내에서 인터페이스의 추상 메소드를 사용하기 위해서는 반드시 public 접근 제한자로 구현해야 한다. == 왜냐하면 위에도 기입했듯, 인터페이스의 추상 메소드에는 public abstract 의 부분이 생략되어 있다. 만약 상속 클래스에서 오버라이딩을 통해 인터페이스의 추상 메소드를 가져온다면, 그 형태가 동일해야 하기 때문에 public 을 입력해주어야 한다는 의미이다.
2. 인터페이스의 장점
그림으로 이해해보자.
최상위 부모 클래스인 Animal 추상 클래스를 상속받아 만들어진 실체 클래스로 각각 포유류와 조류가 있다.
그리고 포유류와 조류 각각을 상속받아 만들어진 people, cat, pig // eagle, chicken 클래스가 있다.
이 중 pig 와 chicken 는 각각 포유류와 조류라는 전혀 다른 상속 클래스를 상속 하고 있는 클래스이다.
그런데 이 둘에게는 공통점이 있다. 바로 사육되고 있는 동물이라는 점이다.
만약 추상 클래스에 "가축사육 동물" 이라는 메소드를 추상 메소드로 입력하게 되면, 오류가 출력된다.
왜냐하면 추상 메소드는 반드시 자식 클래스 모두가 구현해야 하는 메소드이기 때문이다.
만약 Animal 이라는 추상 클래스에 "가축사육 동물" 이라는 추상 메소드를 만들었다면
pig 뿐만 아니라 eagle이나 cat 과 같이 가축사육 동물이 아닌 클래스에도 추상 메소드를 구현하는 에러가 발생할 것이다.
인터페이스는 이러한 서로 다른 상속 클래스들을 가진 실체 클래스들에게 또 다른 루트를 만들어주는 역할을 한다.
3. 인터페이스-추상 클래스의 차이점
1) 선언부에서의 차이점
인터페이스 | 추상 클래스 | |
필드 | 상수만 가능(멤버변수 불가) | 가능 |
생성자 | 불가능 | 가능 |
메소드 | 불가능 | 가능 |
추상메소드 | 가능 | 가능 |
2) 사용용도의 차이점
추상 클래스는 IS-A 관계이다.
반면 인터페이스는 is able to 에 가깝다. 즉 ~할 수 있다는 관점이다.
또한 모든 클래스들은 하나의 추상 클래스만을 가질 수 있다.
하지만 인터페이스는 다중 상속이 가능하다는 장점이 있다. 때문에 상속 클래스들이 모두 반드시 지녀야만 하는 필수 메소드들은 추상 클래스들을 통해 구현하고, 상속 클래스들 중 일부 끼리 공유하는 메소드들은 인터페이스를 통해 구현하여 효율화를 추구할 수 있다.
========================================
추상 클래스
- 관련성이 높은 클래스 간에 코드를 공유하고 싶은 경우
- 추상 클래스를 상속 받을 클래스들이 공통으로 가지는 메소드와 필드가 많거나,
public이외의 접근자(protected, private) 선언이 필요한 경우 - non-static, non-final 필드 선언이 필요한 경우 (각 인스턴스에서 상태 변경을 위한 메소드가 필요한 경우)
인터페이스
- 서로 관련성이 없는 클래스들이 인터페이스를 구현하게 되는 경우.
ex) Comparable, Cloneable 인터페이스는 여러 클래스들에서 구현되는데, 구현클래스들 간에 관련성이 없다. - 특정 데이터 타입의 행동을 명시하고 싶은데, 어디서 그 행동이 구현되는지는 신경쓰지 않는 경우.
- 다중상속을 허용하고 싶은 경우
참고
https://4legs-study.tistory.com/158
https://m.blog.naver.com/heartflow89/220969525191
'Java' 카테고리의 다른 글
[Java] Arrays.sort / list.sort / Collections.sort / 정렬하는 방법 정리 (0) | 2022.02.17 |
---|---|
[Java] 메소드 사용에 있어서의 break, return 의 차이점 (0) | 2022.02.15 |
[Java] 상속, IS-A 관계 (0) | 2022.02.10 |
[Java] Garvage Collection(GC) JVM의 메모리영역 (0) | 2022.02.08 |
[Java] abstract, 자바의 추상 클래스, 추상메소드 개념 정리 (0) | 2022.02.08 |