본문 바로가기

JAVA/추상화(Abstraction)

추상화(Abstraction)

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

 

 

추상화

 

추상화

  1. 사물이나 개념의 공통적인 본질을 추출하여 단순화하는 것
  2. 자바에서는 객체들의 공통적인 속성과 기능을 뽑아 상위 클래스로 정의하는 작업
  3. 복잡한 개념을 단순하고 명확하게 모델링할 수 있음

가령, 자동차와 오토바이의 공통 기능을 추출해서 Vehicle이라는 상위 클래스를 만들 수 있다

 


필요성

  1. 복잡한 시스템을 단순하게 표현할 수 있음
    • 핵심 요소만 모델리해서 시스템의 이해도를 높임
  2. 공통점을 기준으로 설계하면 코드 재사용성이 높아짐
    • 중복 코드 제거, 유지보수 비용을 절감할 수 있음
  3. 유연한 구조 설계 가능
    • 구체 구현에 의존하지 않고 인터페이스 기반 설계가 가능해짐
  4. 기능 확장과 교체가 용이함
    • 새로운 클래스가 기존 구조를 따르기만 하면 호환이 가능함

추상화 구현법

추상 클래스인터페이스를 통해 추상화를 구현할 수 있다

  • 추상 클래스 : 공통 속성과 일부 구현 메서드를 포함할 수 있음
  • 인터페이스 : 공통 행위만 정의함

* 자바 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 반환값;
}

정리

  1. 추상화는 객체 지향 설계에서 핵심적인 개념으로, 공통성과 본질을 추출하는 작업이다
  2. 복잡한 현실을 단순화하여 코드의 재사용성, 유연성, 유지보수성을 높인다
  3. 자바에서는 추상 클래스와 인터페이스를 통해 추상화를 실현한다
  4. 행위 중심 추상화와 데이터 중심 추상화를 필요에 따라 구분하여 설계할 수 있다

'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