일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- mybatis
- request
- Filter
- OOP
- http
- RestControllerAdvice
- 스프링부트
- Redis
- 객체지향프로그래밍
- Spring Security
- java
- exception
- spring boot
- 디자인패턴
- response
- 트랜잭션
- 관점지향프로그래밍
- network
- aop
- 스프링 시큐리티
- SQL
- Interceptor
- git
- aspect
- proxy pattern
- 스프링
- 자바
- Spring
- MYSQL
- 인터셉터
- Today
- Total
장쫄깃 기술블로그
[Java] 추상화(Abstraction)란? 본문
추상화(Abstraction)란?
컴퓨터 과학에서 추상화는 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려내는 것을 말한다.
추상화는 이처럼 구체적인 사물들 간의 공통점을 취하고 차이점을 버리는 일반화를 사용하거나, 중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거함으로써 단순하게 만드는 것을 말한다.
핵심은 불필요한 코드를 제거하고 중요한 부분을 살려 단순하게 만드는 것이다.
추상화 예제
추상화란 공통적인 부분을 취하고 차이점을 버리는 것이라고 했다. 예를 들어 SuperCar, SnowCar, FastCar가 있다고 하자.
public class SuperCar {
public void move() {
System.out.println("슈퍼하게 달립니다.");
}
}
public class SnowCar {
public void move() {
System.out.println("겨울에 잘 달립니다.");
}
}
public class FastCar {
public void move() {
System.out.println("빠르게 달립니다.");
}
}
그리고 이들을 움직이게 하기 위하여 아래와 같이 코드를 작성한다.
public class Main {
public static void main(String[] args) {
final SuperCar superCar = new SuperCar();
final SnowCar snowCar = new SnowCar();
final FastCar fastCar = new FastCar();
superCar.move();
snowCar.move();
fastCar.move();
}
}
여기서 움직인다(move)라는 행위는 공통적인 부분이므로 공통 속성인 'move'를 상위 클래스로 뽑아낼 수 있다. 똑같은 자동차들이므로 Car라는 상위 클래스를 두어 상속관계를 만들어도 무방할 것이다.
public abstract class Car {
public abstract void move();
}
public class FastCar extends Car{
@Override
public void move() {
System.out.println("빠르게 달립니다.");
}
}
public class SnowCar extends Car {
@Override
public void move() {
System.out.println("겨울에 잘 달립니다.");
}
}
public class SuperCar extends Car {
@Override
public void move() {
System.out.println("슈퍼하게 달립니다.");
}
}
그리고 하위 클래스들은 추상 메소드를 재정의하면 된다. 사용자 입장에서 아래와 같이 소스 코드를 작성할 수 있다.
public class Main {
public static void main(String[] args) {
final List<Car> cars = Arrays.asList(new SuperCar(), new SnowCar(), new FastCar());
for (final Car car : cars) {
car.move();
}
}
}
결과적으로, 좀 더 상위 타입을 정의함으로써 공통적인 부분을 취할 수 있었고, 불필요한 부분을 제거할 수 있었다. 차의 공통적인 부분인 'move'를 상위 타입으로 정의함으로써 사용자(개발자)로 하여금 공통적인 부분에 대해서 재정의해야 하는 부분을 명시하고, 불필요하게 중복되던 인스턴스화 부분을 간소화할 수 있었다.
정리하며
핵심은 불필요한 것을 지우고 핵심을 남겨둔다는 것이다. 추상화를 이용해 여러 상황에서 공통적인 부분을 취하는 이점을 적용하면 좋다고 생각한다.
실무에서 종종 관리자가 추상화된 메소드를 개발자들에게 제공하면, 개발자들이 추상화된 메소드의 파라미터, 리턴 값, 기능에 맞게 개발을 하는 방식으로 추상화를 사용하는 경우가 있다. 한 가지 사고에 갇히지 않고 추상화를 사용할 수 있는 다양한 방법을 생각해보면 좋을 것 같다.
참고
'Programming Language > Java' 카테고리의 다른 글
[Java] 상속(Inheritance)이란? (0) | 2022.04.19 |
---|---|
[Java] 캡슐화(Encapsulation)란? (0) | 2022.04.19 |
[Java] 객체 지향 프로그래밍 (0) | 2022.04.19 |
[Java] IP 주소 검색 (0) | 2022.04.14 |
[JAVA] 자바 예외(Exception) 구분 - Checked Exception, Unchecked Exception (0) | 2022.04.14 |