언어/JAVA

nextStep - 모든 원시값과 문자열 포장

now0204 2023. 7. 23. 10:20

- 클래스를 분리할 때 좋은 원칙이다.

   > 모든 원시값, 모든 문자열 포장 + 일급 컬렉션 사용

   > 꼭 모든 원시값이랑 문자열을 포장할 필요는 없음  이런 기준으로 쪼개는 것 연습하다보면 감이 온다.

       (클래스 분리에 대한 감)

 

원시값, 문자열 포장의 장점

1. 유효성 체크가 편해진다. -> 객체의 유효범위 조정이 더 안전하다.

2. 로직구현 위임이 쉽다 -> 몇몇 로직은 줘버리자 

3. 불변객체로 만들어서 외부에서 변경 불가능하게 만들기 쉽다.

4. 클래스가 분리되면서 테스트하기 더 쉬운코드 만들어진다

5. 단일 책임 원칙 지키기 쉬워진다.

 

 

1. 원시값 포장

public class Position {

    private final int pos;

    public Position(int pos) {
        this.pos = pos;
    }

    public int getPos() {
        return this.pos;
    }
}

- 일단 간단하게 position객체를 만들었다.

- 여기서 getPos를 잠시 없애보자 (갯터를 지우기)

 

-> 비교할 때 getter없이 하고 싶으면, 값이 아닌 객체 비교를 하자 

@Test
void create(){
    Position ps = new Position(3);
    assertThat(ps).isEqualTo(new Position(3));
}

* Position에 equal이랑 hashcode 오버라이딩 필요

 

-> 값 변경시에도 getter와 setter 구현 주의하자 

public void move(int rand){
    if(rand >= FORWARD_NUM){
        int pos = pos2.getPos();
        pos2.setPos(pos+1);
    }
}
-------------------아래와 같이 변경 --------------------

public void move(int rand){
    if(rand >= FORWARD_NUM){
      pos2 = pos2.move();
    }
}

position 내부 

public Position move() {
    return new Position(++this.pos);
}

//추후에 성능이 문제가 되면 아래와 같이 고칠 수 있다 (가변객체로 변화한다)
public Position move() {
    pos =pos+1;
    return this;
}

* 이런 방식을 통해 불변객체가 된 것을 볼 수 있다.! 

* getter, setter 지양하여 벨류인스턴스 (포장된 원시값, 이름 등등)을 불변객체로 만들었다.

* getter,setter가 아닌 객체에 메시지를 보내서 (메서드 호출)을 통해 해결하려고 해보자