객체 지향 프로그래밍의 특징
1. 추상화
- 객체에서 공통된 속성과 행위를 추출 하는 것
- 추상화는 불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 프로그램을 간단하게 만드는 것
생성일자 ,수정일자 ,생성자, 수정자는 대부분의 엔티티에 필요한 'BaseEntity'에 해당된다. BaseEntity 라는 추상화 집합을 만들어두고 BaseEntity가 가진 공통적인 특징들을 만들어서 활용한다.
추상화가 왜 필요할까?
- 개발을 하면서 추가 기능이 요구되어 엔티티가 추가될 수도 있다. 이때 추상화로 'BaseEntity'를 구현 해놓았다면 추상화 된 공통된 정보 외에 추가할 정보만 입력해주면 된다.
- 중복 코드의 양을 줄일 수 있다.
2. 캡슐화
- 데이터 구조와 데이터를 다루는 방법들을 결합 시켜 묶는 것 (변수와 함수를 하나로 묶는 것을 뜻함)
- 낮은 결합도를 유지할 수 있도록 설계하는 것
접근제어자를 활용하면 getter/setter 혹은 객체의 내부 메서드를 통해서만 외부에서의 접근이 가능하도록 제한하여 정보은닉을 활용 할 수도 있다.
(무분별하게 Setter를 열어두는건 좋지 않지만 예시로 사용하고자 한다.)
@Entity
@Table(name = "orders")
@Getter @Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Order {
==============================윗부분 생략==============================
//==생성 메서드==// 여기서 주문 생성 관련을 완결해놔서 나중에 추가할게 생겨도 이 부분만 바꾸면 됨
public static Order createOrder(Member member, Delivery delivery, OrderItem... orderItems) {
Order order = new Order();
order.setMember(member);
order.setDelivery(delivery);
for (OrderItem orderItem : orderItems) {
order.addOrderItem(orderItem);
}
order.setStatus(OrderStatus.ORDER);
order.setOrderDate(LocalDateTime.now());
return order;
}
/**
* 주문 취소
*/
public void cancel() {
if (delivery.getStatus() == DeliveryStatus.COMP) {
throw new IllegalStateException("이미 배송완료된 상품은 취소가 불가능합니다.");
}
this.setStatus(OrderStatus.CANCEL);
for (OrderItem orderItem : orderItems) {
orderItem.cancel();
}
}
Order 엔티티 내에서 createOrder나 cancel과 같은 내부 메서드를 만들어서
객체 내부의 동작을 외부로의 노출을 최소화하여 각 객체의 자율성을 높이고, 객체 간 결합도를 낮추어 변경이 용이한 객체 지향의 핵심적인 이점을 잘 살리는 방법으로 프로그램을 설계할 수 있다.
3. 상속
- 클래스의 속성과 행위를 하위 클래스에 물려주거나 하위 클래스가 상위 클래스의 속성과 행위를 물려받는 것을 말한다
- 새로운 클래스가 기존의 클래스의 데이터와 연산을 이용할 수 있게 하는 기능
상속을 하게 된다면 장단점이 존재하는데 이는 다음과 같다.
장점 단점
- 재사용으로 인한 코드가 줄어든다 - 범용적인 사용이 가능하다 - 자료와 메서드의 자유로운 사용 및 추가가 가능하다 |
- 상위 클래스의 변경이 어려워진다 - 불필요한 클래스가 증가할 수 있다 - 상속이 잘못 사용될 수 있다 |
4. 다형성
- 하나의 변수명, 함수명이 상황에 따라 다른 의미로 해석 될 수 있는 것
- 어떠한 요소에 여러 개념을 넣어 놓는 것
객체 지향 프로그래밍은 하나의 클래스 내부에 같은 이름의 행위를 여러개 정의하거나 상위 클래스의 행위를 하위 클래스에서 재정의하여 사용할 수 있기 때문에 다형성이라는 특징을 갖는다.
오버라이딩
- 상위 클래스가 가지고 있는 메소드를 하위 클래스가 재정의해서 사용하는 것
오버로딩
- 같은 이름의 메서드가 인자의 개수나 자료형에 따라 다른 기능을 하는 것
- 생성자 오버로딩을 생각하면 쉽다
다형성의 본질
- 인터페이스를 구현한 객체 인스턴스를 실행 시점에 유연하게 변경할 수 있다
- 클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있다
'CS' 카테고리의 다른 글
클라이언트와 서버 (0) | 2023.04.03 |
---|---|
MSA(Microservice Architecture)란? (0) | 2023.03.29 |
의존성 주입(Dependency Injection) 이란? (0) | 2023.03.28 |
OOP 3: SOLID 객체 지향 설계 5원칙 (0) | 2023.03.28 |
OOP 1: 객체 지향 프로그래밍(OOP) 이란? (0) | 2023.03.27 |