TIL 2021.02.18

Kyu·2021년 2월 18일
0

TIL

목록 보기
39/322

🧐 TIL (Today I Learned)

1. 정적 팩토리 메서드

미션 진행 중에 private 생성자를 가지도록하고 객체를 생성하는 팩토리 메소드를 구현하라고 하길래, 어떻게 private 생성자로 객체를 만든다는 거지? 하고 의구심이 들었었다. "팩토리 메소드" 라는 말도 단순히 공장을 비유해서 메소드의 이름을 네이밍한거라고 생각해서 힌트도 얻을 수 없었다.

질문해서 얻은 대답은 정적 팩토리 메서드에 대해서 알아보라고 했다. 팩토리 메서드라는 개념이 존재했던 것이다. 팩토리 메서드는 뭘까?

정적 팩토리 메서드는 생성자를 통해서 객체를 만드는 게 아니라 메서드를 통해서 객체를 만드는 것을 의미한다. 예를들어 enum에서 enum의 요소를 찾는 valueOf도 정적 팩토리 메서드의 일종이다.

공부가 필요함 Value Object와 연결됨

2. Value Object

한글로 직역하면 값 객체. 말에서 오는 어감은 객체로서 가지는 값을 의미하는 것 같아 보인다. 그리고 실제로 공부해보면 거의 비슷하다.

예를 들어서, Age 는 어떤 데이터 타입에 넣어줘야할까? 아마 나같은 초보자들은 백이면 백 int라고 대답할 것 같다. 근데 대답은 No.

int에 넣으면 실수로 Age 를 변경할 여지는 없을까?
int에 넣은 Age를 사칙연산으로 계산하려고 사용할까?
int에 넣은 Age가 음수값을 가질때가 있을까?

그래서 바로 Age 라는 직접 정의한 데이터 타입에 넣어줘야한다. 이것을 Value Object라고 한다. 왜 이것이 Value Object인지는 특징을 살펴보면 더 잘 이해할 수있다.

Immutability라는 특징

Value Object (이하 VO) 는 불변이다. 이 말은 한번 값을 넣으면 값을 변경할 수 없다는 의미이고 setter을 가질 수 없다는 의미이다.

Immutability는 좋은 이점을 가져다 준다.

  1. 불변이라는 특징을 가지기 때문에, 한번 Age 값을 생성자에 넣으면 이 값이 바뀐다는 것을 걱정할 필요없다.

  2. 다른 말로, 어떤 VO이든 참조 형식으로 공유할 수 있다. 불변이라는 것은 다른 곳에서 값이 바뀌지 않는다. 특히, 멀티스레드 환경에서 그 이점은 더 증폭된다.

final class Name {
    private String value;

    public Name(String value) {
        this.value = value;
    }
}

위 코드는 생성자를 거쳐 값이 만들어진 후에 밖에서 value에 접근할 수 없다. 불변성👍

Value Object를 조작하는 방법

  1. 생성자나 정적 메서드를 이용해서 새로운 인스턴스를 만든다.
  2. 그 인스턴스를 이용해서 또 다른 VO를 만든다.
  3. 생성된 인스턴스에서 내부 데이터를 추출한다
final class ComplexNumber {
    private float realPart;
    private float complexPart;

    // 1. 생성자나 정적 메서드를 이용해서 새로운 인스턴스를 만든다
    public static ComplexNumber zero() {
        return new ComplexNumber(0, 0);
    }

    // 1. 생성자나 정적 메서드를 이용해서 새로운 인스턴스를 만든다
    public ComplexNumber(float realPart, float complexPart) {
        this.realPart = realPart;
        this.complexPart = complexPart;
    }

    // 2. 그 인스턴스를 이용해서 또 다른 Value Object를 만든다.
    public ComplexNumber add(ComplexNumber anotherComplexNumber) {
        return new ComplexNumber(
                realPart + anotherComplexNumber.realPart,
                complexPart + anotherComplexNumber.complexPart
        );
    }

    // 3. 생성된 인스턴스에서 내부 데이터를 추출한다 
    public String toString() {
        return String.format("%f + %f i", realPart, complexPart);
    }
}

그런데 참고로 이 // 2. 그 인스턴스를 ... 항목 코드를 자세히 보면 다른 VO 의 private 필드를 불러 올수있는 것도 확인할 수 있다.

참고
Value Objects Like a Pro


📚일기

취업 어떻게 해야하나 걱정이다. 갑자기 걱정이 되는건 오늘 수업시간 마지막에 그런 얘기가 나와서이다. 무시하고 공부에만 집중하고 싶은데 지금 조금 시간이 흘렀다보니 뭔가 명확히 보이는 어떤 목표같은 게 없으니 더 불안한것 같다.

프로그래밍 공부하기 시작한 중요한 계기 중 하나는 취업이었다. 그런만큼 조금 지치더라도 꾸준히 할 정도의 여력이 남을 정도의 한에서 힘을 낼 수 있을만큼 열심히하고 있는 중이다. 블로그 제목처럼 천천히라도 꾸준하게만 한다면 뭔들 못하겠느냐 싶지만 그래도 걱정이되는 건 어쩔 수 없나보다.

코드스쿼드 졸업하기 한달 전 정도 부터 자기소개서나 이력서 같은 부분을 조금씩 만들어보고, 졸업하면 일단 인턴쉽이나 스타트업 위주로 문을 두드려봐야겠다. 회사들 신입 채용 페이지를 보면 그들이 요구하는 기술이나 언어 등을 볼 수 있는데, 졸업 후에 많은 회사들이 공통적으로 요구하는 것을 연구해서 그것들을 중점적으로 공부해서 취업준비를 해야겠다. 년말까지 취업이 힘들 것 같으면 SI업체들도 찾아봐야겠다.


✅투-두

미션 4 PR 하기가 오늘의 주 To-do 였으나, 진행 과정에서 필요한 개념들이 꽤 공부시간을 요구하는 것이어서 하지 못했다.

내일은 정적 팩토리 메서드에서 좀 간략하게 더 알아보고 미션 진행 예정.

나중에 해야 할 To-do 링크

profile
TIL 남기는 공간입니다

0개의 댓글