최근 소규모 프로젝트를 진행하며 예상치 못하게 약 20분간? 난항을 겪었던 부분이 있었다.
클라이언트 단에서 ID값을 던지면, 해당 값으로 DB에 저장되어 있는 Row를 찾아서
안에 있는 isChecked값이 Y면 N으로, N이면 Y로 바꾸는 것이었는데
계속 조건문이 실행되지 않았다.
이런 걸 까먹고 있었다니...
==는 주소값을 대조하는 것이기때문에 당연히 안되었던 게 맞다.
equals로 대상의 내용 자체를 비교해야했었다.
배웠으면서 이런 부분에서 난항을 겪은 게 참 부끄럽다.
그런 의미에서, 두 번 착각하지 않으려고 equlas와 ==의 차이점에 대해 글을 쓰려고 한다.
아래는 기존에 작성한 코드이다. 정정 코드도 아래에 기술해두었다.
@Transactional
public FixedCheckResponseDto fixedChecked(Long fixedId) {
FixedExtension fixedExtension = fixedRepository.findById(fixedId).orElseThrow(
() -> new CustomCommonException(ErrorCode.FIXED_ID_FOUND)
);
log.info(fixedExtension.getFixedExtensionName());
log.info(fixedExtension.getIsChecked().getClass().getName());
fixedExtension.changeChekced();
log.info("업데이트 완료");
return new FixedCheckResponseDto(fixedExtension);
}
public void changeChekced() {
if (this.isChecked == "N") {
this.isChecked = "Y";
} else {
this.isChecked = "N";
}
}
▼ 정정 코드 ▼
public void changeChekced() {
if (this.isChecked.equals("N")) {
this.isChecked = "Y";
} else {
this.isChecked = "N";
}
}
equals와 ==의 차이점은?
공통점
> 기본적으로 둘 다 양 쪽에 있는 내용을 비교한 값을 boolean type으로 반환한다.
차이점
1. 형태의 차이
> equals() 는 객체끼리 내용을 비교해주는 메소드이다.
> ==은 비교를 위한 연산자이다.
2. 주소값 비교와 내용 비교
> equals() 메소드는 비교하고자 하는 대상의 내용 자체를 비교해준다.
> == 연산자는 비교하고자 하는 대상의 주소값을 비교해준다.
참고예시
String a = "aaa";
String b = a;
String c = new String("aaa");
a, b, c 모두 "aaa"라는 내용을 가지고 있다.
하지만 주소값에 대해서는? 다른 값을 가지고 있다.
각자 주소값에 대한 내용은 아래 그림과 같다.

아래는 조건문에 따른 결과 내용을 기술하였다.
System.out.println( a.equals(b));
a와 b가 가지고 있는 내용을 비교하였으므로 true
System.out.println( a == b);
a와 b가 가지고 있는 주소값을 비교하였으므로 true
System.out.println( a ==c );
a와 c가 가지고 있는 주소값을 비교하였으므로 false
System.out.println( a.equals(c));
a와 c가 가지고 있는 내용을 비교하였으므로 true
다음번엔 또 까먹고 이런 실수하지말자!
'개인공부' 카테고리의 다른 글
2023.01.13 TIL (0) | 2023.01.13 |
---|---|
2023.01.05 TIL (0) | 2023.01.04 |
2022.12.27 TIL (0) | 2022.12.27 |
2022.12.26 TIL (0) | 2022.12.26 |
2022.12.24 TIL (0) | 2022.12.24 |
댓글