class Solution {
public String solution(String phone_number) {
int length = phone_number.length();
String answer = "";
// phone_number는 길이 4 이상, 20이하인 문자열입니다.
if (length < 4 || length > 20) {
throw new IllegalStateException();
}
for (int i = 0; i < length - 4; i++) {
answer += "*";
}
for (int i = length - 4 ; i < length; i++) {
answer += phone_number.charAt(i);
}
// System.out.println(answer);
return answer;
}
}
반복문이 두번 사용되어서 가독성이 좋지 않다.
class Solution {
public String solution(String phone_number) {
char[] ch = phone_number.toCharArray();
for(int i = 0; i < ch.length - 4; i ++){
ch[i] = '*';
}
return String.valueOf(ch);
}
}
toCharArray()라는 함수를 알고있으면 쉽게 풀 수 있는 문제다.
1) toCharArray(): String 문자열을 char형 배열로 바꿔서 반환해주는 메서드이다.
"ABCD" 라는 문자열이 있으면
arr[0] = 'A'
arr[1] = 'B'
arr[2] = 'C'
arr[3] = 'D'
위 값처럼 char 배열을 반환해준다.
2) String.valueOf(): 값을 String으로 바꿔주는 함수다. toString()과 거의 유사한 함수다.
두 메소드 모두 Object의 값을 String으로 변환하지만 변경하고자 하는Object가 null인 경우 다르다.
toString()과 같은 경우 Null PointerException(NPE)을 발생시키지만 valueOf는 "null"이라는 문자열로 처리한다.
즉 비교해서 정리하자면
String.valueOf() - 파라미터가 null이면 문자열 "null"을 만들어서 반환한다.
toString() - 대상 값이 null이면 NPE를 발생시키고 Object에 담긴 값이 String이 아니여도 출력한다.
다시 말해 두가지 메서드의 차이점은 null값에 따른 NPE의 발생 유무이다.
이런 차이점 때문에 valueOf의 null체크 방법은 "null".equals(string) 형태로 체크를 해야한다.
null로 인해 발생된 에러는 시간이 지나고, 타인의 소스인경우 디버깅하기 어렵고 어떤의미를 내포하고 있는지 판단하기 어렵다. 때문에 NPE를 방지하기 위해 toString보다는 String.valueOf를 사용하는 것을 추천한다.