일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- log
- Spring
- Trino
- Python
- Packet
- kubernetes
- CSV
- Network
- Operating System
- Vision
- aws s3
- MAC address
- EC2
- PostgreSQL
- CVAT
- OS
- ip
- zookeeper
- jvm
- helm
- airflow
- kubectl
- java
- tcp
- AWS
- kubeadm
- Kafka
- JavaScript
- grafana
- docker
- Today
- Total
JUST WRITE
Interface vs Abstract 본문
이 글은 Baeldung 사이트 'Using an Interface vs Abstract Class in Java'를 해석, 정리한 글입니다.
Abstraction(추상화)는 OOP(Object-Oriented Programing)에서 중요한 컨셉 중 하나이다.
Java에서는 Interface와 Abstract Class를 통해서 Abstraction을 보여줄 수 있다.
Class vs Interface
Concrete Class와 Interface의 차이점을 먼저 살펴보려 한다.
Class는 객체 생성을 위한 청사진으로 Property와 Method를 가진다.
Interface는 Class와 유사하지만 구현이 없고 선언만 하는 Method(Abstract Method)를 가질 수 있다.
Interface를 상속받은 Class에서 Abstract Method를 구현한다.
Java 8부터는 Interface에서 Static, Default Method를 제공한다.
Java 9부터는 Interface에서 Private Method를 제공한다.
Interface에서 Method 기본 제어자 Public입니다.
Interface vs Abstract Class
Abstract Class
Abstract Class는 선언 시 abstract 키워드를 사용한 Class이다.
Interface처럼 구현이 없고 선언만 하는 Method(Abstract Method)를 가질 수 있다.
Field, Method 생성자에 제한이 없고 Instance/Static 초기화 Block, 생성자도 가질 수 있다.
public abstract class TestAbstract {
int field1;
int field2;
int field3;
{
field1 = 1;
field2 = 2;
field3 = 3;
}
public TestAbstract (int field1, int field2) {
this.field1= field1;
this.field2= field2;
}
}
Java 8에서는 Functional Interface를 소개하는데, Abstract Method를 1개로 제한하는 Interface이다.
Abstract Class에서는 자유롭게 Abstract Method를 정의할 수 있다.
공통점
- Abstract Class, Interface 모두 객체 생성할 수 없고, 구현을 한 Class에서 객체를 생성한다.
- 둘 다 Abstract Method를 정의할 수 있으며 구현을 해야 된다.
Interface 사용
Interface는 'A is capable of [doing this]'가 성립할 때 사용한다.
(예) Clonable is capable of cloning an object)
좀 더 상세하게 아래와 같은 상황에서 사용한다.
- 다양한 Class의 상속을 받아 Class를 구현해야 될 경우(다중 상속)
- Comparable처럼 Class와 관련 없는 Interface를 만들어야 될 경우
- Class를 기능적으로 제약을 두는 경우(Abstract Method를 무조건 구현)
public interface Sender {
void send(File fileToBeSent);
}
public class ImageSender implements Sender {
@Override
public void send(File fileToBeSent) {
// image sending implementation code.
}
}
Abstract Class 사용
Abstract Class는 'A is B'가 성립할 때 사용한다.
(예) Dog is an Animal)
좀 더 상세하게 아래와 같은 상황에서 사용한다.
- 관련된 Class가 여러 개 있어 공통 Method를 제공하는 경우
- 요구사항이 명시되어 있고 일부만 구현되어 있는 경우
- 몇 가지 공통 Field와 Method가 있는 경우
public abstract class Vehicle {
protected abstract void start();
protected abstract void stop();
protected abstract void drive();
protected abstract void changeGear();
protected abstract void reverse();
// standard getters and setters
}
public class Car extends Vehicle {
@Override
protected void start() {
// code implementation details on starting a car.
}
@Override
protected void stop() {
// code implementation details on stopping a car.
}
@Override
protected void drive() {
// code implementation details on start driving a car.
}
@Override
protected void changeGear() {
// code implementation details on changing the car gear.
}
@Override
protected void reverse() {
// code implementation details on reverse driving a car.
}
}
'Programing > Java' 카테고리의 다른 글
Optional (0) | 2021.10.31 |
---|---|
Log4j vs Logback (0) | 2021.10.26 |
Generic (0) | 2021.10.15 |
LinkedList (0) | 2021.10.11 |
ArrayList (0) | 2021.10.10 |