자바에서 추상화는 추상 클래스와 인터페이스를 통해서 구현한다

추상화
- 사물이나 개념의 공통적인 본질을 추출하여 단순화하는 것
- 자바에서는 객체들의 공통적인 속성과 기능을 뽑아 상위 클래스로 정의하는 작업
- 복잡한 개념을 단순하고 명확하게 모델링할 수 있음
가령, 자동차와 오토바이의 공통 기능을 추출해서 Vehicle이라는 상위 클래스를 만들 수 있다
필요성
- 복잡한 시스템을 단순하게 표현할 수 있음
- 핵심 요소만 모델리해서 시스템의 이해도를 높임
- 공통점을 기준으로 설계하면 코드 재사용성이 높아짐
- 중복 코드 제거, 유지보수 비용을 절감할 수 있음
- 유연한 구조 설계 가능
- 구체 구현에 의존하지 않고 인터페이스 기반 설계가 가능해짐
- 기능 확장과 교체가 용이함
- 새로운 클래스가 기존 구조를 따르기만 하면 호환이 가능함
추상화 구현법
추상 클래스와 인터페이스를 통해 추상화를 구현할 수 있다
- 추상 클래스 : 공통 속성과 일부 구현 메서드를 포함할 수 있음
- 인터페이스 : 공통 행위만 정의함
* 자바 8 이후 default 메서드를 추가할 수 있다
추상화 유형
1. 행위 중심 추상화
객체가 수행해야 할 기능에 초점을 맞춘 추상화
우리가 서비스를 구현할 때 인터페이스를 먼저 구현하는 그런 느낌으로 만들면 된다
interface UserService {
User create();
// 등등 CRUD 구현
}
interface Runnable { // 달릴 수 있음
void run(); // 달리는 메서드를 일단 만들어둠
}
예 : 자동차와 전자기기에서의 전원 켜기, 작동하기 등의 메서드를 정의한다
2. 데이터 중심 추상화
객체가 가져야 할 데이터에 초점을 맞춘 추상화
abstract class Shape {
int x, y; // 일단 필드를 정의해둠
}
예 : DTO, VO 객체에서 이름, 나이, 성별 등의 필드를 정의함
행위 중심 추상화 예 : "무엇을 할 수 있나"
1. 요구사항 분석하기
1. 카레이서는 시동걸기, 가속, 정지, 시동끄기 등을 할 수 있다
2. 자동차는 시동걸기, 앞으로 가기, 멈추기, 시동끄기를 할 수 있다
3. 시동이 꺼져 있으면 가속 불가, 달리는 중이면 시동 끄기 불가
2. 클래스 및 메시지 설계하기
// Car 클래스 설계하기
class Car {
private boolean isStarted; // 차가 시동이 걸렸냐 안걸렸냐의 여부
private int speed; // 속도
public void startEngine() {
// 엔진을 시동거는 기능
}
public void goForward() {
// 앞으로 가는 기능
}
public void goForward() { // 앞으로 가는 기능, 오버로딩
if(isStarted) {
speed++;
} else {
System.out.println("시동부터 켜주세요!");
}
}
public void stop() {
// 멈춤 기능
}
public void stopEngine() {
// 엔진을 멈추는 기능
}
}
// 레이서 클래스
class Racer {
private Car car; // 필드에 주입
public void startCar() { // 레이서는 차를 시동걸 수 있다
car.startEngine();
}
public void accelerate() { // 엑셀을 밟을 수 있다
car.goForward();
}
public void brake() { // 브레이크를 밟을 수 있다
car.stop();
}
public void turnOffCar() { // 시동을 끌 수 있다
car.stopEngine();
}
}
데이터 중심 추상화 예시 : "무엇을 가지고 있나"에 집중함
1. MemberDto
public class MemberDto {
private int number; //회원번호
private String name; //회원명
private int age; //나이
private char gender; //성별
private double height; //키
private double weight; //몸무게
private boolean isActivated; //회원탈퇴여부(활성화여부)
// 이에 대한 setter, getter 메서드를 작성하는데
// setter랑 getter는 엔티티에 적어도 좋음, 오히려 엔티티에 적는게 좋을것 같다
// boolean의 접근자는 get으로 시작하지 않고 is로 시작하는게 관례임. true냐 false냐니까
public boolean isActivated() {
return isActivated;
}
}
위의 Dto에 대해
취급하려고 하는 회원정보를 고려해서 필드를 우선 작성한다
주로 화면(UI) 혹은 데이터베이스 테이블을 기준으로 함
회원번호, 회원명, 나이, 성별, 키, 몸무게, 회원탈퇴여부(boolean이니까 활성화 여부)를 관리할 것이다
값 객체가 가지는 속성(필드)를 추출하는 과정 또한 추상화라고 볼 수 있다.
DTO 클래스를 만들기 위해선 모든 필드를 private로 만들어야한다
* setter, getter 표현 관례
// setter
public void set필드명(매개변수) {
필드 = 매개변수;
}
// getter
public 반환타입 get필드명() {
return 반환값;
}
정리
- 추상화는 객체 지향 설계에서 핵심적인 개념으로, 공통성과 본질을 추출하는 작업이다
- 복잡한 현실을 단순화하여 코드의 재사용성, 유연성, 유지보수성을 높인다
- 자바에서는 추상 클래스와 인터페이스를 통해 추상화를 실현한다
- 행위 중심 추상화와 데이터 중심 추상화를 필요에 따라 구분하여 설계할 수 있다
'JAVA > 추상화(Abstraction)' 카테고리의 다른 글
| 추상 클래스와 인터페이스, 선택 기준과 활용 전략에 대해 (0) | 2026.04.21 |
|---|---|
| 인터페이스(interface) (0) | 2026.04.21 |
| final 키워드 (0) | 2026.04.21 |
| 추상 클래스 (0) | 2026.04.20 |
| abstract 제어자 (0) | 2026.04.20 |