728x90
추상 클래스 ( abstract class ) ?
- 상속 전용 클래스
public abstract class 클래스명{}
- 상속을 목적으로 만들어진 클래스로 직접적인 인스턴스 생성 불가능
- abstract method는 구현이 되어있지 않고 선언만 되어있는 메서드이고, abstract 로 선언되어있다.
- abstract method를 포함한 추상 클래스
public abstract class Object{ abstract void draw(); }
- 추상 클래스가 하위 클래스일 경우, 부모 클래스의 abstract 메서드들을 모두 구현한다.
- 만약 abstract 메서드들을 구현하지 않은 경우, 하위 클래스에 반드시 abstarct를 표시해야한다.
사용이유
- 빨간 네모 표시 → 추상 클래스
- 사실 추상클래스 대신 일반 클래스로 작성해도 오류가 발생하지 않는다. 하지만, 의미적인 부분에서 알 수 있다.
- 객체 지향의 개념
- 추상 : 무엇인가 덜 구체화 된 것.
- 객체 : 상태와 행동을 가진 것.
- 클래스 : 객체를 만들기 위한 틀
- 초기화 : 클래스를 이용하여 객체 생성
- 객체 지향의 개념
- 클래스를 이용한 객체의 생성
- Dog 클래스를 이용하여 dog 객체(상태와 행동 정의)를 만든다
- Wolf 클래스를 이용하여 wolf 객체(상태와 행동 정의)를 만든다.
- Animal 클래스를 만든다. —> 어떤 객체를 만들 수 있는건가 ?
- → 자바에서 클래스 계층구조의 상위 클래스들 중 추상적인 클래스들에 대해서 객체를 생성할 수 없도록한다. 이 때 사용되는 키워드가
abstract
,interface
이다. - 그래서 추상클래스란 ?
- 해당 클래스를 통해 만들어낸 객체가 전혀 객체의 모습을 띄지 못할 때, 해당 클래스가 객체를 생성할 수 없도록 하는 키워드.
- 넌 객체(non-object)를 만들기에는 너무 추상적이라는 의미.
인터페이스 ( Interface ) ?
- 자바 프로그래밍 언어에서 클래스들이 구현해야 하는 동작을 지정하는데 사용되는 추상형
interface
키워드를 통해 선언하며, 구현되지 않은 메서드 시그니처만 포함 가능- 모든 메서드들은 암묵적으로 public 사용
- 모든 메서드들은 암묵적으로 abstract method로 취급
- 상속과는 달리 한 클래스에서 여러 인터페이스 구현 가능.
추상 클래스와 인터페이스의 차이점
- 기능적 부분
- 인터페이스
- 변수 : public static final
- 메서드 : public abstract
- 구현 : 다중구현
- 생성자 : 생성자 정의 X
- 추상 클래스
- 변수 : static final이 아닌 필드도 가능
- 메서드 : public, private , protected
- 구현 : 단일구현
- 생성자 : 생성자 정의 O
- 인터페이스
- 역할적 부분
- 인터페이스 : 동일한 기능을 다른 방식으로 구현하고자 할 때 사용 가능
- 구현 객체가 동일한 동작을 하는 것을 보장
- 추상클래스 : 밀접하게 연관된 클래스들 간에 공통된 코드를 사용하고자 할 때 사용 가능
- 상속받은 객체가 확장된 동작을 실행
- 인터페이스 : 동일한 기능을 다른 방식으로 구현하고자 할 때 사용 가능
Java 8에서 Interface
- Java 8 이전에서는
interface
를 다중 상속해도 구현은 구현 클래스에서 하기 때문에 문제가 없었다. - Java8 이후에는
interface
가 동일한 메서드를 지닌 인터페이스를 다중 상속 할 경우, default method로 구현이 이루어질 수 있기 때문에Diamond Problem
이 발생할 수 있다.Diamond Problem
: 동일한 메서드의 구현으로 인한 충돌
- 즉, Java 8 이전에서 인터페이스는 메서드 구현부를 가질 수 없었다. 하지만 Java 8 부터 default 키워드를 사용해 메서드를 구현할 수 있게 됐다.
Enum ?
- 서로 관련된 상수를 편리하게 선언하고 관리하기위한 수단
//Enum의 등장 전 : 정수 열거 패턴 사용
private final int a = 1;
private final int b = 2;
private final int c = 3;
private final int d = 4;
- 문제점
- 가독성이 낮아 관리에 용이하지 않다.
- 정수 열거 패턴을 위한 네임스페이스 공간이 없어 타입 세이프를 하지 않았다.
- 정수 상수는 문자열로 출력하기 어렵다.
- 정수 열거 그룹에 속한 모든 상수를 순회하는 방법이 마땅치 않다.
//Enum 적용
public enum Number{
a, b, c, d
}
- 장점
- 타입 비교가 가능해 타입 세이프한 코드를 짤 수 있다.
- 깔끔한소스 작성을 할 수 있어 소스 유지보수하기가 쉽다.
- 정수 열거 패턴의 단점들을 모둔 보완하여 사용할 수 있다.
-Reference
https://yaboong.github.io/java/2018/09/25/interface-vs-abstract-in-java8/
https://github.com/heesuk-ahn/today-I-learned/blob/master/java/java-8-interface-vs-abstract.md