[우아한테크코스] 2월 15일 TIL
오늘 배운 것
- 자동차 경주 피드백
- 객체의 속성
- 전략패턴
TIL
- 객체의 속성
궁금하게 된 이유: Car 내에 Position이라는 객체는 불변으로 감쌀 수 없는 부분에 대해서 의문이 생겼다. 이에 대해서 데이브에게 질문을 했더니,Position 객체가 VO 특성을 가지고 있어 괜찮다고 생각이 든다고 하였다.
- VO: value object로 DTO와 동일하나 read only 속성을 가진다.
equals()와 hashcode()를 오버라이딩하여 값이 같으면 똑같은 객체로 판별하는 것이 핵심 역할이다. getter/setter도 가질 수 있다. - DTO: data transfer object로 DB의 데이터를 service나 controller 등으로 보낼 때 사용하는 객체이다.
gettter/setter 메서드만을 가진 로직을 가지고 있지 않은 순수한 데이터 객체이다. - DAO: data access object로 여러 사용자가 인터페이스를 사용해 필요한 자료에 접근하도록 한다.
DB에 대한 insert, update, select, delete를 처리한다. 특정 타입의 데이터베이스나 지속적인 메커니즘에 추상 인터페이스를 제공하는 객체로 데이터베이스의 세부 내용을 노출하지 않고 특정 데이터 조작 기능을 제공한다. 단일 책임 원칙 (SRP: 모든 클래스, 기능, 변수 등은 하나의 책임만 가지고 캡슐화되어야 한다는 것)에 기반한다.
- VO: value object로 DTO와 동일하나 read only 속성을 가진다.
- 전략패턴
전략패턴이란? 객체들이 할 수 있는 행위 각각에 대해 전략 클래스를 생성하고 유사한 행위들을 캡슐화하는 인터페이스를 정의하여 직접 행위 자체를 수정하지 않고 전략만 바꿔주어 행위를 확장하는 방법이다.
유연하고 재사용 가능한 객체 지향 소프트웨어 설계하기 위해 반복되는 디자인 구현을 해결할 수 있다.
같은 형식으로 number를 뱉어주는데, RandomNumber이냐, SpecialNumber이냐를 원하는 대로 구현해 사용하는 방식이다.
```java public interface NumberGenerator { int generate(); }
public class RandomNumberGenerator implements NumberGenerator { private static final int MINIMUM_NUMBER = 0; private static final int MAXIMUM_NUMBER = 9;
private static final Random random = new Random();
@Override
public int generate() {
return MINIMUM_NUMBER + random.nextInt(MAXIMUM_NUMBER - MINIMUM_NUMBER + 1);
} }
public class SpecialNumberGenerator implements NumberGenerator { private final int specialNumber;
public SpecialNumberGenerator(final int specialNumber) {
this.specialNumber = specialNumber;
}
@Override
public int generate() {
return specialNumber;
} } ``` 코드의 응집도가 높아지고 의존 관계를 더 이상 이동시킬 필요가 없다는 장점이 있지만, 이 메서드를 수백, 수천 군데에서 사용하고 있다면 부담이 지어지는 것을 고려해야한다. [인터페이스를 분리하여 테스트하기 좋은 메서드 만들기](https://woowacourse.github.io/javable/post/2020-05-17-appropriate_method_for_test_by_interface/)