들어가며
저번 미션부터 원시값 포장에 대한 요구사항들이 많았다. 원시값 포장은 무엇인지에 대해 정리를 해보려고한다.
처음에는 원시값 포장 ? String , int값을 포장한다는 것인가 ? 왜 하지 ? 라는 생각이 많이 들었지만 확실히 원시값 포장을 하는게 더 좋다고 생각이 들었다.
원시값 포장
원시 타입의 변수를 객체로 포장한 것이다.
private final String name;
public Name(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
이번 사다리 타기 미션인데 name이라는 단순 문자열을 Name로 포장, 감싸주었다. 이렇게 감싸 주었기 때문에 name을 모아놓는 List또한 변경이 되었다.
private final List<Name> names = new ArrayList<>();
원시값 포장 이유
- 자신의 상태는 객체 스스로 관리한다.
- 유지보수에 도움이 된다.
- 자료형에 구애를 받지 않는다.
😒 여기서 어라 ~ 저는 그냥 String 쓸건데요 ? 비효율적인 것 같아요
나 또한 그런 생각을 많이 했었다. 왜 사용하는지에 대해 글로 읽었을 때는 이해를 하지 못하였다. 코드를 작성하면서 훨씬 좋다는 것을 느꼈다.
먼저 Name을 모아놓는 List를 만들어보자!
아래 코드는 입력받은 names string을 분할하여 새로운 Name으로 list에 추가해주는 생성자이다.
public Names(String names) {
for (String name : splitNames(names)) {
this.names.add(new Name(name));
}
}
단순하게 names 리스트에 name을 넣는다면 string으로 넣어도 되지만 여기서 원시값 포장의 장점이 나온다. 만약 내가 names 객체에 들어갈 string값을 검증하고 싶다면 ? new Name(name)을 통해서 쉽게 할 수 있다.
public Name(String name) {
validateNameLength(name);
validateNameHasOnlyCharacters(name);
this.name = name;
}
private void validateNameLength(String name) {
if (name.length() > MAXIMUM_NAME_LENGTH) {
throw new IllegalArgumentException(ExceptionMessage.EXCEPTION_NAME_LENGTH.getExceptionMessage());
}
}
private void validateNameHasOnlyCharacters(String name) {
if (name.isBlank() || !name.chars().allMatch(Character::isAlphabetic)) {
throw new IllegalArgumentException(ExceptionMessage.EXCEPTION_NAME_PATTERN.getExceptionMessage());
}
}
names 에 add 되기 전에 validate 단계를 2번 거쳐서 add 될 수 있음을 확인할 수 있다.
객체를 각각 원시값 포장을 해주고 내부에서 예외를 검증하니 더 깔끔해질 수 있다. 그리고 이제 Name은 스스로 객체를 관리할 수 있고 예외도 처리할 수 있는 상태가 된 것이다.
정리
- 자신의 상태는 객체 스스로 관리한다.
- 스스로 string name의 상태를 관리할 수 있게 되었다.
- 유지보수에 도움이 된다.
- 중복코드도 막고 validate를 처리하는 과정이 쉽다.
- 자료형에 구애를 받지 않는다.
- List<Name> names 의 Name이 만약 숫자로 바뀐다고 할지언정 Name 도메인의 name 타입만 변경하면 되기 때문에 구애를 받지 않는다고 할 수 있다.
'코코코딩공부 > JAVA' 카테고리의 다른 글
[JAVA] 예외 처리 (0) | 2023.02.26 |
---|---|
[JAVA] 일급 컬렉션 (0) | 2023.02.25 |
[JAVA] equals와 hashCode를 Override 해야하는 이유 (0) | 2023.02.25 |
[JAVA] 정규표현식 (0) | 2023.02.14 |
[JAVA] static, final, static final 이란 ? (0) | 2023.02.12 |