티스토리 뷰
추상클래스와 인터페이스
추상 메소드의 구현 강제성
추상 클래스
- 추상 클래스는 클래스 내에 추상 메소드가 하나 이상 포함거나 abstract로 정의된 경우를 말한다.
인터페이스
- 인터페이스는 모든 메소드가 추상 메소드인 경우를 말한다.
추상 클래스와 인터페이스는 상속받는 하위 클래스 혹은 구현 클래스에서 추상 메소드를 구현하도록 강제한다
추상클래스와 인터페이스 목적
그렇다면 의문이 들 수 있다. 인터페이스는 왜 필요하지? 그냥 추상 클래스로 인터페이스 역할까지 하면 되는거 아닌가? 둘은 존재 목적이 다르다.
- 추상클래스는 해당 추상 클래스를 상속받아서 확장하기 위해 존재하는 것이다.
- 추상 클래스는 단일 상속만 받아서 확장을 하고자 하는 것이다.
- 인터페이스는 구현한 객체들이 동일한 동작을 약속하기 위해 존재하는 것이다.
- 인터페이스는 다중 상속이 가능하여 동일한 개념의 기능을 하는 클래스들을 묶는다는 개념을 가지고 있다.
추상클래스와 인터페이스 특징
추상 클래스
-
추상 클래스는 abstract와 final을 동시에 사용할 수 없다.
-
추상 클래스를 상속 받는 클래스는 추상 메소드를 강제적으로 구현해야하는데, 만약 상속받는 클래스 또한 추상 클래스라면 강제적으로 구현하지 않아도 된다.
-
추상 클래스에서도 인터페이스를 구현할 수 있는데, 이때 인터페이스의 추상 메소드를 구현하지 않고 냅둘 수 있다.
-
추상 클래스는 생성자를 가질 수 있으나, 인스턴스화를 할 시에는 추상 클래스를 상속받는 하위 클래스에서 인스턴스화를 해야한다. 아니면, main에서 추상 메소드를 구현해야 한다.
//추상 class : Circle //구현 class : Point Circle circle = new Point(1, 2); //main에서 추상 메소드 구현 public static void main(String[] args) { Circle circle = new Circle(3) { @Override public int printCircle(Point point) { return 0; } }; }
인터페이스
-
인터페이스는 final을 붙일 수 없고, 인터페이스의 변수들은 static이어야만 한다. 즉, 인터페이스는 일반 변수를 가질 수 없다.
-
인터페이스는 하나 이상의 인터페이스를 상속 받을 수 있다.
public interface InterfaceA extends InterfaceB, InterfaceC
- 이 것은 클래스에서 상속받은게 아니라 인터페이스에서 상속받은 것이니 추상 메소드를 구현하지 않고 그대로 둘수 있다.
-
*인터페이스는 생성자를 가질 수 없다. *
- 인터페이스를 구현한 클래스를 통해 인스턴스화 할 수 있다.
//인터페이스 : InterfaceA //구현 클래스 : BookA InterfaceA interA = new BookA();
-
인터페이스의 접근 제한자는 public 혹은 abstract만 가능하다.
-
인터페이스는
변수 앞에 static final
과메소드 앞에 abstract
를 생략할 수 있다. 단, 코드 가독성을 위해 생략하는 습관을 버려라.
인터페이스보다 추상 클래스의 속도가 더 빠르다! 이유는 인터페이스는 관련된 메소드를 찾기 위해 부가적인 일을 많이 하기 때문이다.
추상클래스와 인터페이스 사용 시 확실한 차이
추상 클래스
- 추상 클래스를 사용할 때는 필요에 의해서 일반 메소드와 덧붙여 추상화 기능을 더하고자 할 때 추상 클래스를 사용한다.
- Ex. 사람은 뛴다라는 공통적인 기능이 있고, 뛸 때 팔에 위치나 호흡이 달라질 수 있다. 이 때 팔에 위치나 호흡은 사람마다 다르므로 추상 메소드로 두어 각 사람 객체마다 다르게 구현하면 되는 것이다.
- 추상 클래스는 상속에 대한 계층 구조가 명확히 표현될 때 사용한다.
인터페이스
- 인터페이스는 디자인을 구성하는 요소가 자주 바뀔 때 쓰면 유용하다.
- 인터페이스는 사용빈도가 높은데, 그 이유는 동시개발이 가능하기 때문이다.
- 인터페이스 추상 메소드를 접근하는 클래스는 해당 추상 메소드의 파라미터와 리턴값 그리고 메소드 이름(메소드의 목적)을 이미 알고 있으니 추상 메소드가 구현되기 전에도 개발을 진행할 수가 있다.
- 인터페이스를 사용할 시 해당 추상 메소드의 내용을 변경하더라도, 해당 인터페이스를 상속 받는 여러 클래스에는 영향을 받지가 않는다.
'Java > Java 기초' 카테고리의 다른 글
[Java 기초] 배열과 리스트의 관계 (0) | 2020.01.14 |
---|---|
[Java 기초] String 객체를 알아보자 (0) | 2020.01.10 |
[Java 기초] 접근제한자 (0) | 2020.01.04 |
[Java 기초] 상속과 구성 (2) | 2020.01.04 |
[Java 기초] 오버로딩 (0) | 2020.01.03 |
- Total
- Today
- Yesterday
- Spring
- springboot
- 연관관계
- 이펙티브 자바
- ifPresent
- 복사 팩토리
- package-private
- @Lazy
- java
- 스프링부트
- JPA
- 이펙티브자바
- try with resources
- 생성자
- junit
- 빈 순환 참조
- 빌더 패턴
- 김영한
- java8
- 점층적 생성 패턴
- 팩토리 메소드 패턴
- Effective Java
- 정적팩터리메서드
- 자바8
- try catch finally
- 인프런
- jdk버전
- flatMap
- mustache
- effectivejava
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |