백엔드/Java

기본중의 기본, 문자열 비교

삐삐에스 2025. 12. 3. 00:03

오늘은 아주 기초적이지만 그렇기에 많이들 놓치는 부분에 대해 알아보려고 한다!

 

오늘 있었던 일화를 먼저 이야기하고 시작하겠다.

나는 아래와 같이 코드를 짜고 있었다.

if (StringUtils.equals("Y", request.getField("YN")) {
	~~~~~
}

...

if (request.getField("USER_INFO") == "13") {
	~~~~~
}

 

그런데 코드를 작성하다보니 "YN"값이 NULL인 상황이 있을 수 있다는 것을 파악하고는 책임자분께 여쭤봤다.

과장님, 만약에 request에 YN이라는 필드가 없으면
StringUtils.equals("Y", request.getField("YN"))false가 되나요? 아니면 이 코드에서 에러가 터지나요?

 

이 질문에 대한 답은 false가 된다. 이다.

 

 

그 답을 주시면서 내 코드를 보시더니

대리님, 문자열에는 == 쓰면 안돼요. 만약에 USER_INFO 값이 NULL이면 저기서 에러날거에요.

라고 하셨다.

 

그 순간 아 맞다! 문자열에는 == 비교를 안쓰지! 라는 생각이 스치면서

근데 왜 못 쓰더라? 라는 생각이 동시에 들었다.

그래서 오늘의 블로그 주제는 '자바에서의 문자열 비교' 가 되었다!

 

 

 

먼저 문자열에 대해 알아보자.

JAVA에서의 문자열은 String 클래스를 이용한다.

쉽게 생각하자면 String 클래스가 문자열 타입이라고 생각하면 된다.

String str = "문자열";

 

그렇다면 String class를 살짝만 뜯어보자.

 

String 클래스는 java.lang 패키지에 속한 클래스인데 java.lang은 자바에서 기본으로 import되기 때문에 따로 선언할 필요는 없다.

또한 모든 클래스가 그렇듯이 String 클래스 역시 java.lang.Object 클래스를 상속받고 있다.

 

Oracle에서 제공하는 문서를 보면 String 클래스는 문자열을 나타낸다고 한다.

자바에서 쓰이는 "abc"와 같은 문자열은 모두 이 String 클래스의 인스턴스로 구현되어 있는 것이다.

 

자바에서는 문자열을 연결하는 연산자문자열이 아닌 어떤 객체를 문자열 객체로 바꿔주는 연산자를 제공하고 있다.

1. 문자열을 연결하는 방법

→ 간단하게 + 연산자를 이용할 수도 있고,

StringBuilder(혹은 StringBuffer) 클래스의 append method를 이용할수도 있다.

2. 문자열 변환 방법

→ Object 클래스에 정의된 toString method를 이용하여 구현되어있다.

 

 

여기서 마지막으로 알아둬야할 점은

String class의 생성자나 method에 NULL값이 전달되면 NullPointerException이 터진다는 것이다.

 

 

 

 

이 String '객체' 를 비교하기 위해서는 어떻게 해야할까?

1차원적으로 생각해보면 == 으로 비교하면 될 것만 같다.

그런데 만약 아래 코드를 실행시켜보면 어떻게 될까?

String str1 = new String("abc");
String str2 = new String("abc");

// case 1
if (str1 == "abc") {
	System.out.println("1: 같음");
} else {
	System.out.println("2: 다름");
}

// case 2
if (str1 == str2) {
	System.out.println("1: 같음");
} else {
	System.out.println("2: 다름");
}

// case 3
if (str1.equals(str2)) {
	System.out.println("1: 같음");
} else {
	System.out.println("2: 다름");
}

 

먼저 case 1을 실행시켜보자.

결과는 2: 다름 이 출력된다.

abc랑 abc는 두 눈을 씻고 쳐다봐도 같은 문자열인데 왜 다름이 출력되는걸까?

 

그럼 다음으로 넘어가서 case 2를 실행시켜보자.

결과는 또 2: 다름 이 출력된다.

abc랑 abc가 다르면 도대체 뭐가 같은 문자열이라는 거냐며 화가 잔뜩 날 수 있다...

 

마지막으로 case 3을 실행해보자.

드!디!어!

1: 같음 이 출력되었다.

 

뭘까?

왜 == 은 안되고 equals는 되는걸까?

이유는 비교 대상에 있다.

 

str1str2는 각각 하나의 '객체'이다.

즉, 같은 내용을 가진 서로 다른 객체라는 뜻이다.

각자의 집에 같은 책을 가지고 있는 상황이라고 이해하면 쉽다.

 

==참조를 비교한다.

==주소를 비교한다.

==같은 객체인지를 비교한다.

 

equals객체 안 내용이 같은 내용인지를 비교한다.

 

이것이 차이점이다.

 

str1과 str2 집이 같은 집인가?

아니다. 

False

 

str1과 str2 집에 있는 책이 같은 책인가?

맞다.

True

 

출처: Oracle

 

위 사진은 Oracle에서 제공하는 String class 정의서의 method 설명 부분이다.

공식 문서 내용도 정리가 잘 되어있어서 공유한다!

 

 

 

 

 


오늘은 문자열 비교 방법에 대해 알아봤다!

다들 대충 알고있는 개념이었겠지만 정확히 짚고 넘어가는 계기가 되었으면 좋겠다.

옛날같았으면 문자열 비교에 == 쓰면 바로 호출이었다던데.... 

여러분들은 나와 같은 실수를 하지 않길 바라면서 오늘 글은 여기서 마무리 짓겠다!

반응형