[JAVA] 추상클래스/인터페이스 (+Kotlin)
#Abstract Class / Interface
1)개념 및 사용형태
2)차이점
3)쓰임새
에 대해 정리해보도록 하겠습니다
#1 - Abstract Class
'추상화'라는 건 공통 된 특성을 추출한다는 의미입니다
ex) 웹개발자, 서버개발자, 모바일개발자 공통점은 '개발'이라는 라는 특성을 추출
추상 클래스는 공통적 특성을
1) 추출/구현해서 자식 클래스들에게 제공 하고
2) 추상 메소드를 선언하고 자식 클래스들에게 각각의 구현을 강제함으로써(overriding)
1)코드를 재사용 2)필드와 함수 이름을 통일 시키는 역할을합니다
즉, 미완성된 클래스를 자식 클래스에게 완성 하도록 유도하는, 상속을 위한 클래스 입니다
- 추상 클래스는 인스턴스를 생성하지 못하고 부모 클래스로만 사용 된다
- 일반 클래스와 마찬가지로 필드,생성자,메소드 선언을 할 수 있다
- 상태를 저장 할 수 있다
- 클래스이므로 다중 상속이 불가 하다
사용 형태 Java
public abstract class AbstractClass {
public AbstractClass() { /*생성자*/}
//일반 필드
public String commonField;
//일반 함수
public void commonFun() { /*구현*/}
//추상 메소드 -> 하위 클래스 오버라이딩 강제
abstract void abstractFunc();
}
사용 형태 Kotlin
코틀린에서 '추상 프로퍼티' 개념이 추가 되었다
abstract class AbstractClass {
//일반 프로퍼티
var commonProperty: String ="state"
//일반 메소드
fun commonFun(){/*구현*/}
//추상 프로퍼티 -> 하위 클래스 오버라이딩 강제
abstract val abstractProperty: String
//추상 메소드 -> 하위 클래스 오버라이딩 강제
abstract fun abstractFun()
}
#2 - Interface
- 인터페이스는 한마디로 객체 기능 설명서 이다 (== 객체 사용 설명서)
- 상수와 메소드만 가질 수 있고 데이터(상태값)나 생성자를 가질 수 없다
- JAVA 8부터 디폴트 메소드, 정적 메소드가 추가 되었다
1) 상수 필드(Constant Field)
-'public static final'이 생략된 형태로 사용한다
2) 추상 메소드(Abstract Method)
-추상 클래스의 추상 메소드와 동일한 기능을 한다
-'public abstract'이 생략된 형태로 사용한다
3) 디폴트 메소드(Default Method) - JAVA 8 추가
-구현체가 있는 일반 메소드 형태에 default 키워드를 추가해 사용한다
-'public'이 생략된 형태로 사용한다
-인터페이스 구현 객체에 기본으로 들어가는 메소드라고 보면 된다
-인터페이스 구현 객체에서 재정의 해 쓸 수도 있다
4) 정적 메소드 (Static Method) - JAVA 8 추가
- 일반 Static Method와 동일한 형태이며 구현 객체 생성 없이 '인터페이스명.메소드' 호출로 사용 가능하다
-'public'이 생략된 형태로 사용한다
사용 형태 JAVA
public interface TestInterface {
//상수 필드 선언
int CONSTANT = 10;
//추상 메소드 선언 : 구현 객체에게 오버라이딩 강제
void abstractFun();
//디폴트 메소드 선언 : 구현 객체에서 오버라이딩 가능
default void defaultMethod(){
Log.i("syTest", "this is default");
}
//Static 메소드 선언 : 오버라이딩 불가
static void staticMethod(){
Log.i("syTest", "this is staticMethod");
}
}
사용 형태 Kotlin
-코틀린에서 인터페이스에 '프로퍼티 선언이 들 어갈 수 있다
-코틀린은 JAVA 6과 호환되게 설계됐기 때문에, 코틀린의 '디폴트 메소드'는 내부적으로, 인터페이스에 메소드 선언만 들어가고, 인터페이스와 함께 생성되는 클래스에 모든 디폴트 메소드 구현이 들어간다.
(그래서 JAVA 파일에서 코틀린 인터페이스 사용시, 디폴트 메소드 구현체를 사용할 수 없고 다시 재정의 해서 써야 함)
interface KotlinInterface {
//추상 프로퍼티 선언 (내부적으로 String getProperty(); 메소드가 생성됨 )
val property: String
//추상 메소드 선언
fun abstractMethod()
//디폴트 메소드 선언
fun defaultMethod() {
Log.i("syTest", "defaultMethod")
}
}
#3- 차이점
1)상속
추상 클래스 : 클래스이므로 단일 상속
인터페이스 : 다중 상속
2)상태값
추상 클래스 : 클래스이므로 상태값 데이터를 가질 수 있음
인터페이스 : 상태값을 가질 수 없으며, 상수값만 가질 수 있음
#4 - 쓰임새
여러 상황이 있겠지만
아래의 경우를 특정지어 생각해 볼 수 있겠습니다
1)추상 클래스
- '하위 클래스는 상위 클래스이다' 가 성립 할 때 사용 ex) 웹 개발자는 개발자이다 -> '개발자'를 추상클래스로 선언
- 단일 상속으로 해결이 가능한 경우에 사용
2)인터페이스
- '하위 클래스는 상위 클래스를 할 수 있다'가 성립 할 때 사용, 이 때 하위 클래스는 할 수 있는 기능이 여러 개 일 수 있다 ex)어떤 웹 개발자는 '개발 + 수영+ 테니스' 를 할 수 있다 -> 개발, 수영, 테니스 를 각각 인터페이스로 선언
- 2개 이상의 클래스에 기능 명세 정의가 공통으로 필요하지만, 이미 전혀 다른 특성의 부모 클래스를 각각 상속 받고 있다면 추상 클래스를 다중으로 상속 받을 수 없으니, 이 경우 인터페이스를 사용
잘못된 내용이나 궁금한 내용 있으시면 댓글 달아주세요
좋은 하루 되세요!
참고 사이트 : https://myjamong.tistory.com/150
출처 : 이것이 자바다 - 한빛미디어
(위 도서를 학습하고 개인 학습용으로 정리한 내용입니다)