우아한 테크코스 레벨1 돌아보기

구동희·2022년 4월 18일
0
post-custom-banner

OOP(객체지향프로그래밍)

객체 지향 프로그래밍은 프로그램을 객체라는 기본 단위로 나누고 이들의 상호작용으로 프로그램을 구현하는 프로그래밍 방식입니다.
객체 지향 프로그래밍을 잘 구현하기 위해서는 객체간의 협력, 책임, 역할을 잘 나누어 주어야 합니다.

인스턴스 변수의 선언 기준

객체간의 협력관계를 만들 때, 아래와 같이 객체 안에 인스턴스 변수를 선언하곤 합니다.

public class LottoMachine {

    private TotalLottoCount totalLottoCount;
    private Lottos lottos;
	
    ...
    
}

인스턴스 변수 선언을 통해 두가지 장점을 얻을 수 있습니다.

  1. 코드 구현을 편리하게 한다.

  2. 가독성을 높힌다.

그래서 인스턴스 변수를 선언한다면, 구현의 편의성과 가독성이라는 장점을 얻을 수 있습니다.
그렇다면 협력을 요청 할 모든 객체를 인스턴스 변수로 선언하는 것이 좋을까요?
상태를 가지지 않는 객체라면 괜찮지만, 상태를 가지는 객체는 인스턴스 변수로 선언하는 것을 신중히 고려해야합니다.
왜냐하면 프로그램이 동작 할 때, 우리가 정해놓은 순서대로 반드시 동작한다는 보장이 없기 때문입니다.

TDD

TDD로 미션을 진행해오면서 TDD의 사용 이유에 대해서 생각해보았습니다.

  1. 프로그램의 기능을 테스트하기 편하게 해줍니다.
    만약 테스트 코드가 없다면 기능을 구현 할 때마다, 매번 프로그램을 실행 시키고 해당 부분이 오류가 없이 정상적으로 작동하는지 확인해야합니다.
    하지만, 테스트 코드를 작성한다면 프로그램을 실행하지 않아도 기능에 대해서 테스트 할 수 있습니다.

  2. 오류를 발견하기 쉽게 해줍니다.
    전체 프로그램을 구현한 이후에 상황에 따라서 로직을 변경하거나 수정 해야 할 수 있습니다. 이때, 테스트 코드가 없다면 로직을 변경하는 과정에서 이전에 없던 오류나 문제가 발생해도 쉽게 파악하고 해결하기가 어렵습니다. 하지만 TDD를 통해서 구현한 테스트 코드와 로직을 가지고 점진적으로 리팩터링을 하면서 테스트 코드를 수정하고 로직을 변경 한다면 발생하는 오류나 문제를 쉽게 파악하고 해결 할 수 있습니다.

  3. 불안한 요소를 제거 할 수 있습니다.
    만약 코드의 양이 많아졌을때 테스트 코드가 없다면 코드들이 문제 없이 잘 작동하는지 파악하기가 어렵습니다. 하지만 TDD를 바탕으로 개발을 진행해왔다면 구현한 기능들에 문제가 없다는 안정감을 얻을 수 있습니다.

불변객체

객체를 구현할 때, 객체의 상태가 가변적인 것보다는 불변적인 것이 좋습니다.
왜냐하면, 원치 않은 외부의 영향으로 객체의 상태가 변화 할 수 있다면 프로그램의 동작 오류의 원인이 될 수 있기 때문입니다.
그래서 객체의 상태를 불변하게 유지하는 것이 좋습니다.

원시 타입

원시 타입(int, double, long 등)은 final키워드를 통해 상태 값의 재할당을 방지하고 불변성을 유지 할 수 있습니다.

참조 타입

참조 타입의 경우에도 원시타입과 같이 final 키워드를 통해 재할당을 방지 할 수 있습니다. 하지만, 상태값 일부를 추가하거나 변경하는 것은 방지하지 못합니다. 그렇기에 참조 타입의 경우 불변성을 유지하기 위해 몇가지 적용해야 하는 부분이 있습니다.
1. 필드에 참조 타입이 있을 경우 해당 객체도 불변성을 보장해야 합니다.
2. 필드에 컬렉션이 존재할 경우 생성자 및 getter에 대해 방어적 복사를 수행해야 합니다.

  • Unmodifiable Collection불변하지 않습니다. -> 원본과의 참조를 끊지 않기 때문에

DTO

DTO(Data Transfer object)는 계층간 데이터 교환 역할을 하는 객체로 MVC 흐름 속에서 데이터가 교환될 수 있도록 하는 객체입니다.
로직을 가지지 않는 순수한 객체로 getter/setter 메서드만을 가집니다.

DTO는 MVC패턴에서 Model의 비지니스 로직을 View에게 노출시키는 것을 방지하여 줍니다.
그렇기에 Model에서 View로 출력할 데이터를 전달 할 때, Dto를 통해 출력에 필요한 데이터를 전달하고 Dto를 View에게 전달 하는 것이 좋습니다.

profile
천천히 배워가는 개발꿈나무
post-custom-banner

0개의 댓글