ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • nextStep - 모든 원시값과 문자열 포장
    언어/JAVA 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가 아닌 객체에 메시지를 보내서 (메서드 호출)을 통해 해결하려고 해보자 

     

     

     

Designed by Tistory.