TIL - null 값 처리 | 정규식

su·2023년 6월 9일
0

TIL

목록 보기
18/93
post-thumbnail

문제1 - null 값이면 이후의 메소드를 실행하지 않도록 하기

1) 문제

우리 팀 과제에서는, 문자열 타입, 객실 타입, 고객 타입을 각각 리턴받아 예약 타입에 넣어주어야 한다. 만약 고객 타입이 null 이라면 예약 완료 메소드에서 예약 불가하다는 문장을 한 번 더 출력해주게 된다.

customer가 null인지 아닌지 판단할 때는, if문을 사용해서 조건문을 작성해주었었는데,
팀원분께서 Optional 이라는 클래스를 알려주셨다 !

null 여부를 판단할 것들이 많아진다면 Optional을 사용하는 것이 더 편리할 수 있다고 생각해서 코드를 수정해보았다!

2) 시도

출처: https://juno-juno.tistory.com/51
모르는 내용이니 찾아봐야한다 ..

Optional은 존재할 수 있지만 하지않을 수도 있는 객체 ,, 라고 한다.
Null이 될 수 도 있는 객체를 감싸는 Wrapper 클래스를 말한다.

Optional 타입의 객체는 모든 타입의 참조변수를 담을 수 있다고 한다 !

1) get(): Optional 객체에 저장된 값을 가져온다
2) orElse(): null일 경우 NPE가 발생하기 때문에 이를 대비해 사용한다 (orElseGet(), orElseThrow())
3) isPresent(): 객체 값이 null이 아니면 true, null이면 false를 반환
4) ifPresent(): null이 아니면 주어진 람다식 실행, null 이면 아무것도 하지 않는다.

사용해서 조건문을 작성해보자 !

if (Optional.ofNullable(참조값).isPrsent()) { }
else { 다음메소드(); }

이렇게 실행해봤더니 원하는 대로 나오지 않았다.
그냥 메인화면으로 다시 돌아가야 하는데, 다음 메소드가 실행되었다.

3) 해결

그 이유는?

isPresent() 반환값을 헷갈린 덕분이다..
null이 아니면 true 인데 반대로 헷갈려서 작성해버렸다.
두 가지로 수정이 가능하다 !

1)

if (!Optional.ofNullable(참조값).isPrsent()) { } // 값이 false라면 (null 이라면)
else { 다음메소드(); }

2)

if (Optional.ofNullable(참조값).isPrsent()) { 다음메소드(); } // 값이 true라면 (null이 아니라면)
else { }

이렇게 사용할 수 있다 !

그리고 또 한가지 방법이 있었다.

Optional.ofNullable(customer1).ifPresent(다음메소드));

이렇게 한 줄에도 작성이 가능한데, 나는 다음 메소드를 넣었더니 오류가 발생했다.
오류 내용을 찾아보니, 반환 타입이 void인 경우는 사용이 불가능한 것 같았다.
따라서 3번째의 경우 우리쪽 코드에서는 사용할 수 없었다.

4) 배운 점

Optional 클래스를 사용해서 null여부를 판단할 수 있다는 것을 알게 되었다.
지금은 조건이 하나였지만, null 여부를 판단해야 하는 것들이 많아진다면 if 조건문을 중첩하여 사용하는 것보다, 훨씬 코드가 간결해질 것 같다.

문제2 - 전화번호 정규식

1) 문제

팀과제 선택 사항에 전화번호 정규식을 포함하는 부분이 있었다.
다른 팀원분께서 이 부분도 구현해주셔서 다시 한번 보려고 한다.
지난번에는 숫자, 문자를 판별하는 정규식만 봤었는데, 전화번호 정규식은 처음이라 ..

2) 시도

먼저, 패턴 일치 여부를 판단할 때는

Pattern.matches(정규식, 입력한 값)

이렇게 판단할 수 있다.

정규식 안에 판단하고자 하는 경우를 적어주면 된다.

정규식 기본 문법 몇 가지를 찾아보았다

1) ^ : 문자열의 시작
2) $ : 문자열의 종료
3) [] : 문자열의 집합이나 범위, 두 문자 사이는 - 기호로 범위 표현.
4) | : 패턴 안에서 or 연산 수행 시 사용
5) \d : 숫자[0-9] 와 동일
6) () : 소괄호 안의 문자를 하나로 인식
7) {} : 횟수 또는 범위

출처: https://ddolcat.tistory.com/245

3) 해결

위에서 본 내용을 바탕으로 팀원분께서 적어주신 정규식을 분석해보려고 한다 !

String pattern = "^01(?:0|1|[6-9])-(?:\\d{3}|\\d{4})-\\d{4}$";

우선 시작과 끝에 ^ , $ 가 적혀있다.

중간에 - 기호를 기준으로 세 덩어리로 나눠보면,

01(?:0|1|[6-9]): 앞에 두 자리는 01로 고정이고, 뒤에는 0또는 1또는 6,7,8,9 중에 하나를 받는다.

(?:\\d{3}|\\d{4}): [0-9]의 숫자 범위 내에서 3개 혹은 4개의 숫자를 받는다.

\\d{4}: [0-9]의 숫자 범위 내에서 4개의 숫자를 받는다.

이렇게 볼 수 있을 듯 하다.

4) 배운 점

정규 표현식을 사용할 때, 사용해야 하는 기호가 많아서 한 번에 외우기는 어렵지만,
필요한 부분을 하나씩 파악하다 보면 금방 사용할 수 있을 것 같다.
그리고 Pattern.matches() 메소드를 사용할 때는 앞 쪽에 무조건 정규식을 먼저 넣어주어야 한다!
(지난 번에 배운 내용)

profile
(❁´◡`❁)

0개의 댓글