추상화란?
= 일반화 시킨다. 공식화 시킨다. 단순하게 만든다.
어떤 양상, 세부사항, 구조를 좀 더 명확하게 이해하기 위해 특정 절차나 물체를 의도적으로 생략하거나 감춤으로써 복잡도를 극복하는 방법이다.
(예시)
커피가루를 녹인다.
티백을 우린다.
⇒ x를 y한다.
추상클래스 적용 사례
public abstract class Beverage() {
protected void prepare() {
boilWater();
brew();
pourInCup();
}
private void boilWater() {
// ...
}
private void brew() {
// ...
}
private void pourInCup() {
// ...
}
}
public class Coffee extends Beverage {
public Coffee() {
prepare();
addSugarAndMilk();
}
private void addSugarAndMilk() {
// ...
}
}
public class Tea extends Beverage {
}
=> 중복된 코드를 줄여준다.
인터페이스 적용 사례
public interface Beverage() {
private void prepare();
private void boilWater();
private void brew();
private void pourInCup();
}
public class Coffee implements Beverage {
public Coffee() {
prepare();
addSugarAndMilk();
}
@Override
private void prepare() {
boilWater();
brew();
pourInCup();
}
@Override
private void boilWater() {
}
@Override
private void brew() {
}
@Override
private void pourInCup(){
}
}
public class Tea implements Beverage {
public Tea() {
prepare();
}
@Override
private void prepare() {
boilWater();
brew();
pourInCup();
}
@Override
private void boilWater() {
}
@Override
private void brew() {
}
@Override
private void pourInCup(){
}
}
=> 골격을 잡아준다.
인터페이스와 추상클래스의 차이
인터페이스
- 미완성 설계도
- 구현해야 할 메소드를 지정해준다.
- implements 키워드로 구현한다. (다중 상속 가능)
추상클래스
- 부분설계도
- 중복 메소드와 필드를 제거해준다.
- abstract 메소드를 생성하여 Override할 수 있다.
- extends 키워드로 구현한다. (다중 상속 불가능)
상속이 필요한 경우
상속이 적절한 경우란 언제일까? 클래스의 행동을 확장(extend)하는 것이 아니라 정제(refine)할 때다. 확장이란 새로운 행동을 덧붙여 기존의 행동을 부분적으로 보완하는 것을 의미하고 정제란 부분적으로 불완전한 행동을 완전하게 만드는 것을 의미한다.
굳이 추상클래스로 상속해야 하나?
보통 일반클래스의 상속은 지양하고 추상클래스의 상속을 사용하라는 이야기가 있다.
어떤 차이가 있길래 저런 이야기가 나오는 걸까?
두 방법 모두 부모의 내부 내용을 알게되는 것은 같지만, 기본클래스는 new 키워드로 객체를 생성할 수 있으므로 위험하다.
반면에 추상 클래스 자체로는 객체를 생성할 수 없기 때문에 추상 클래스 내부 내용을 함부로 조작할 수 없다는 것이다.
'개발 > 자바' 카테고리의 다른 글
기본형 특화 스트림(IntStream, LongStream, DoubleStream) (3) | 2022.10.09 |
---|---|
함수형 인터페이스 (Functional Interface) (6) | 2022.03.30 |
compareTo()가 0을 반환하면 어떤 순서로 정렬되나? (0) | 2022.02.19 |
Java Stream.max() 사용법 (0) | 2022.02.14 |
Comparable의 compareTo() 파헤치기 (0) | 2022.02.14 |
이전 댓글