본문 바로가기
Java

문자열 비교 - Equals() 와 == 연산자의 차이

by invelog 2024. 1. 9.
반응형

 업무 중에 문자열 비교를 통하여 처리해야 하는 로직이 있었는데 잘 동작 하다가 어느 순간 해당 로직 안에서 무한 루프로... 때문에 DB에서 해당 테이블에 락 걸리고 난리도 아니였다.

원인을 찾아보는데 Javascript 로 열나게 처리하다가 무심결에 컨트롤러에서 똑같이 부등호로 문자열을 비교하는 코드를 집어넣었더니 해당 로직이 문자열 비교를 하지 못하게 되고 그러다 보니 내가 구현한 로직의 특성상 무한루프를 돌게 되는 것이였다. 

DB에서 받아온 값을 그냥 String으로 변환해서 사용하는 것이였고 때문에 결국 문제가 될 코드였다. 

 

리터럴을 이용할 시에는 String Pool에 저장이 되고 new 연산자를 이용할 시에는 Heap 내부에 저장이 된다. 

 

이때 == 연산자는 문자열이 저장된 주소를 비교하게 되고 equals() 메소드는 문자열의 값 자체를 비교한다. 

 

때문에 내가 처리한 로직에서는 == 연산자를 사용하였기 때문에 정상적으로 동작하면 안되는 코드였지만 한동안 정상적으로 동작하였고 중간에 갑자기 동작을 안하면서 발견하게 되어 그동안 왜 정상적으로 동작했는지가 아직도 의문이긴 하다.

 

추가적으로 알아보니 new 연산자를 사용하여도 String Pool에 저장되게 하여 == 연산자를 사용하게 할 수 있는 intern()이라는 메소드가 있긴 하지만 문자열 비교시에는 equals() 메소드를 사용하는게 맞는거 같다.

 

아주 호되게 배운 기회여서 잊어버리는 일은 없을 것 같다.

반응형

'Java' 카테고리의 다른 글

extends와 implements  (0) 2023.08.24
Spring과 Spring Boot  (0) 2023.08.07
Java의 Annotation  (0) 2023.08.07