4. 객체와 자료구조

GamSa Ham·2023년 1월 3일

4. 객체와 자료구조

자료의 추상화

public interface Vehicle {
	double getFuelTankCapacityInGallons();
	double getGallonsOfGasoline();
}
public interface Vehicle {
	double getPercentFuelRemaining();
}

자료를 세세하게 공개하기 보다는 추상적인 개념으로 표현하는 편이 좋다.

자료/객체 비대칭

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

interface Shape {
    double area();

}

@Getter
@Setter
@AllArgsConstructor
class Point {
    private int x;
    private int y;
}

public class Square implements Shape{
    private Point topLeft;
    private double side;

    @Override
    public double area() {
        return side * side;
    }
}

위는 다형적은 도형 구조를 택한 예이다.

절차적인 코드는 새로운 함수를 추가하기 쉽다.

객체지향 코드는 기존 함수를 변경하지 않으면서 새 클래스를 추가하기 쉽다.

반대도 참이다.

절차적인 코드는 자료 구조를 추가하기 어렵다.

객체지향 함수는 새로운 함수를 추가하기 어렵다.

다시 말해 객체 지향 코등서 어려운 변경은 절차적인 코드에서 쉬우며, 절차적인 코드에서 어려운 변경은 객체 지향 코드에서 쉽다.

디미터 법칙

모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 법칙이다.

디미터의 법칙은 결합도와 관련된 것이며, 객체의 내부 구조가 외부로 노출되는지에 대한 것이다

기차 충돌

final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();

흔희 위와 같은 코드를 기차 충돌이라 부른다. 여러 객차가 한 줄로 이어진 기차처럼 보이기 때문이다.

일반적으로 조잡하다 여겨지는 방식이므로 피하는 편이 좋다.

위코드는 다음과 같이 나누는 편이 좋다.

Options options = ctxt.getOptions();
File scratchDir = options.getScratchDir();
final String outputDir = scratchDir.getAbsolutePath();

잡종구조

절차지향적인 구분과 객체지향직구분이 석여서 새로운 함수추가도 어렵고 자료구조도 추가하기 어려운 구조를 말한다.

자료 전달 객체

DTO는 데이터베이스와 통신하거나 소켓에서 받은 메시지의 구문을 분석할 때 유용하다. 점도 일반적인 형태는 bean 구조 이다.

public class Address {
    private String street;
    private String city;
    private String state;
    private String zip;

    public Address(String street, String city, String state, String zip) {
        this.street = street;
        this.city = city;
        this.state = state;
        this.zip = zip;
    }

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    public String getZip() {
        return zip;
    }

    public void setZip(String zip) {
        this.zip = zip;
    }
}

결론

객체는 동작을 공개하고 자료를 숨긴다. 그래서 동작을 변경하지 않으면서 새 객체 타입을 추가하기는 쉬운 반면 기존 객체에 새 동작을 추가하기는 어렵다. 자료 구조는 별다른 동작 없이 자료를 노출한다. 새 동작을 추가하기는 쉬우나, 기존 함수에 새 자료 구조를 추가하기는 어렵다.

profile
안녕하세요. 자바를 좋아하고 디자인 패턴, Refactoring, Clean Code에 관심이 많은 백엔드 개발자입니다.

0개의 댓글