본문 바로가기

Java/Java 기초

추상클래스와 인터페이스

1. 추상 클래스


추상 사전적용어 : 실제간에 공통되는 특성을 추출한 것


(1) 추상클래스


클래스를 구성하는 맴버 중 추상 메소드가 존재하는 클래스를 의미한다
abstreact 키워드가 붙은 클래스는 추상 클래스이며,
추상메소드가 한 개 이상 있는 클래스는 반드시 추상 클래스로 선언해야한다(미완성된 클래스)


(2) 추상메소드(abstract method)


메소드를 선언만하고 구현을 하지 않은 것을 추상메소드라고 한다(미완성된 메소드)
abstract 리턴타입 메소드명(자료형 매개변수);


(3) 추상 클래스 선언


abstract class 클래스명{
           abstract 리턴타입 메소드명(자료형 매개변수);
          *일반 메소드로 선언가능
}

1)abstract  키워드를 사용한다
2)객체화를 시킬 수 없다

※ 미완성된 메소드(추상 메소드)는 상속받은 자식 클래스에서 반드시 재정의하여 구현을 해야만 해당 클래스를 객체화 할 수 있다
그러므로 [강제성]을 부여하기 위해서 추상메소드로 선언한다


(4) 추상클래스를 사용하는 이유


공통되는 속성과 행위를 추상화하여 부모 클래스를 만드는데 반드시 모든 자식클래스에서 구현해야하는 메소드가 있다면 추상 메소드로 선언하는 것이 좋다
추상 클래스를 상속받은 자식 클래스는 추상 메소드를 오버라이딩 하지 않으면 오류가 발생하므로 [강제성]이 생기게 된다
만약 부보클래스에서 메소드를 구현한다면 강제성이 없으므로 자식클래스를 만드는 개발자가 재정의하지 않고 그냥 넘어갈 수 있기 때문이다


2. 인터페이스(interface)


일종의 추상클래스이지만 클래스라고 부르지 않으며 추상화의 정도가 높다
맴버로는 상수와 추상메소드만 가질 수 있다
인터페이스는 객체화 시킬 수 없다
인터페이스는 다른 클래스에서 구현(implements)해서 사용한다(상속과 비슷하다)
구현할 때는 implements 키워드를 사용한다


(1) 인터페이스의 선언


interface 인터페이스명{
          //맴버 : 상수, 추상메소드
}


(2) 인터페이스의 맴버


1) 모든 변수는 public static final이다(생략해도 자동으로 붙음)
2) 모든 메소드는 public abstract이다(생략해도 자동으로 붙음)


(3) 클래스 상속과 인터페이스의 구현


1) 클래스의 단일 상속만 가능하며 인터페이스는 다중 구현이 가능하다
2) 인터페이스는 인터페이스를 상속할 수 있다
3) 상속과 구현은 별개이다
  즉, 하나의 클래스에 상속과 구현을 동시에 할 수 있다


(4) 인터페이스를 사용하는 이유


1) 여러 클래스에서 선언할 맴버들을 일관되게 하기 위해 사용한다(표준화)
2) 관계없는 클래스들을 그룹화 시킬 수 있다(마커 인터페이스)


(5) 인터페이스의 불편함


인터페이스는 강제성이 강하기 때문에 구현하는 클래스에서 일부만 재정의하여 사용하는 것이 불가능하다
이를 해결하기 위해 Adapter라는 추상클래스를 활용한다


3. 어댑터 클래스

 

(1) 어댑터클래스(추상클래스)와 인터페이스


인터페이스의 강제성을 완화시키기 위해 Adapter클래스를 활용한다
어댑터 클래스는 추상클래스로 만들기 때문에 미구현된 메소드와 구현된 메소드가 동시에 존재할 수 있다
그러므로 어댑터 클래스에서 인터페이스를 상속받아 강제성을 없애고 싶은 메소드만 재정의해준다
이후 어댑터 클래스를 상속받는 자식 클래스는 내가 원하는 메소드만 재정의할 수 있게 된다
이때 어댑터클래스의 이름뒤에 Adapter를 붙여주어 목적을 알려주는게 좋다

인터페이스(모든 강제성) --------> 클래스(구현시 모든 메소드 오버라이딩)
인터페이스(모든 강제성) --(일부구현) --> 추상클래스(일부 강제성) ----- 상속 ----> 클래스


(2) 다중상속


여러 부모 클래스를 상속하는 다중상속이라고 한다
JAVA는 모호성 때문에 다중 상속을 지원하지 않는다

JDK8버전부터는 인터페이스에 default 메소드 등을 만드는 것을 허용한다
(특정 메소드의 구현을 허용한다)
여러개를 구현(상속)할 수 있는 인터페이스 특징 때문에 다중상속을 지원하는 것과 다름이 없다

인터페이스의 추가된 기능(JDK 8부터 추가됨)
1) default 메소드를 선언할 수 있다
public abstract void method();
default 리턴타입 메소드명(자료형 매개변수){
             //실행할 코드;
}

2) static 메소드 선언할 수 있다
static 리턴타입 메소드명(자료형 매개변수){
             //실행할 코드;
}

3) private 메소드(JDK 9버전부터 사용가능)


(3)모호성(ambiguity)


다중 상속은 한 클래스가 여러개의 부모클래스로부터 상속을 받는 것을 의미한다
모호성은 자식 클래스에서 어떤 부모 클래스의 맴버를 호출해야하는지 명확하지 않을 때 발생한다

모호성 해결방법
1) 두 개의 인터페이스에 같은 메소드가(메소드명, 매개변수, 리턴타입이 모두 같은 메소드) 선언되어 있는 경우
-> 자식 클래스에서 재정의하여 사용한다

2) 부모클래스의 메소드와 인터페이스의 디폴트 메소드의 이름과 매개변수가 같은 경우
-> 부모클래스의 메소드가 사용된다
구현하는 인터페이스보다 상속받는 부모클래스의 우선순위가 높기 때문이다

※ 인터페이스도 타입이다
   인터페이스는 부모이고 구현한 클래스가 자식이다


4. 마커 인터페이스(Marker Interface)


클래스들을 그룹화하기 위한 목적으로 사용한다
서로 다른 클래스들을 공통되는 타입을 갖도록하는 것이 유일한 목적이기 때문에
마커 인터페이스는 어떠한 맴버도 선언하지 않는다

'Java > Java 기초' 카테고리의 다른 글

예외처리, API  (0) 2023.12.26
내부 클래스, 익명 클래스, 람다식  (0) 2023.12.22
Casting (형변환)  (0) 2023.12.20
상속 세부개념 및 접근 제한자  (0) 2023.12.19
this, static, 상속 개념  (0) 2023.12.18