원시값, 문자열 포장

이호석·2022년 9월 21일
0

원시값, 문자열 포장과 일급 컬렉션란 말들이 어디서 나왔을까? 이 것들은 소트웍스 앤솔러지의 The Thoughtworks Anthology의 책에서 나온 규칙이다. 책에서는 Nine Steps to Better Software Design Today라고 소개하며 한글로는 객체지향 생활체조 원칙으로 불린다. 이것은 코드 컨벤션이지 절대적인 규칙이라고 오해하지 않았으면 좋겠다.

단일 책임 원칙

책에서는 단순 원시값은 의미없는 스칼라값(그냥 숫자)이라고 말한다. 그리고 원시값 형태로 쓰는 것보다는 객체로 포장을 하여 사용하는 것이 더 좋다고 말한다. 어느 부분에서 좋은지 이제 알아보자

public class Time{
	int hour;
    int minute;
    
    public Time(int hour, int minute){
    	this.hour = hour;
        this.minute = minute;
    }
}

우선 위 코드만 보면 평상시 사용하던 코드이고, 잘못된 점은 딱히 없어 보인다.

public class Time{
	int hour;
    int minute;
    
    public Time(int hour){
    	if(hour < 0 || hour > 23){
        	throw new IllegalArgumentException();
        }
    	if(minute < 0 || minute > 60){
        	throw new IllegalArgumentException();
        }
    	this.hour = hour;
        this.minute = minute;
    }
}

하지만 유효성 검사를 위해 코드를 추가 해보니 뭔가 불편한 점이 생긴다. 생성자 코드도 짧고 검증 코드만 private메소드로 빼면 좋은 코드라고 생각할 수도 있지만, 이것은 SOLID에 속하는 단일 책임 원칙에 위배되므로 좋은 코드라 볼 수는 없다.

public class Time{
	Hour hour;
    Minute minute;
    
    public Time(int hour, int minute){
    	this.hour = new Hour(hour);
        this.minute = new Minute(minute);
    }
}

public class Hour{
	int hour;
    
    pulic Hour(int hour){
    	if(hour < 0 || hour > 23){
        	throw new IllegalArgumentException();
        }
    	this.hour = hour;
    }
}

public class Minute{
	int minute;
    
    pulic Minute(int minute){
    	if(minute < 0 || minute > 60){
        	throw new IllegalArgumentException();
        }
    	this.minute = minute;
    }
}

이렇게 각 필드를 객체로 만들면 이 객체들은 문제가 없는 상태(완전한 상태)가 된다. 유효성 검사를 자기 자신이 함으로써, 역할과 책임이 제대로 분배되었다고 할 수 있다.

유지보수

public class Clock{
	Hour hour;
    Minute minute;
    
    public Clock(int hour, int minute){
    	this.hour = new Hour(hour);
        this.minute = new Minute(minute);
    }
}

(조금 억지 코드일 수는 있지만) 이렇게 또 시간과 분을 사용하는 클래스를 만들때, 만약 원시값 포장을 안 했다면 또 유효성 검사를 해야되고, 상황은 개발자들이 매우 싫어하는 코드의 중복으로 이어지게 된다!

이렇게 포장된 객체를 제대로 작성했다면, 이 객체를 사용할 때 별다른 작업없이 편하게 사용할 수 있고, 추가 작업이 없으므로 실수도 줄어들게 되므로 좋은 규칙이라 생각한다.

다음 포스트에서는 원시값 포장을 검색할 때 같이 나오던 VO(Value Object)와 불변 객체에 대해서 알아볼 예정이다.

0개의 댓글