
Intro ⭐
기본적으로 Java에서는 자료형(Data type) 비교를 위해 같음 연산자(==)를 사용합니다.
개발 업무를 하다 보면, 권한 확인과 같이 문자열(String) 일치 여부를 확인하기 위한 코드를 작성하게 될 경우가 비일비재합니다.
아래 코드는 사용자 ID(userId)가 "홍길동"과 일치하는지를 확인한 뒤, 관리자 권한 여부(isAdmin)를 반환해 주는 프로그램입니다.
@PostMapping(value = "/api/test", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public Map<String, Object> apiTest(@RequestBody Map<String, String> requestData, HttpServletRequest request) {
String userId = requestData.get("userId"); // Rest 연동을 통해 입력받은 사용자 ID
String adminId = "홍길동"; // 관리자 ID
boolean isAdmin;
Map<String, Object> result = new HashMap<String, Object>();
if(userId == adminId) { // 사용자ID가 홍길동일 경우, true를 반환
isAdmin = true;
} else { // 사용자ID가 홍길동이 아닐 경우, false를 반환
isAdmin = false;
}
result.put("adminId", adminId);
result.put("userId", userId);
result.put("isAdmin", isAdmin);
return result;
}
사용자가 해당 API를 호출할 때 사용자 ID(userId)의 값으로 "홍길동"이라는 값을 파라미터로 전달한다면, 우리는 관리자 권한 여부(isAdmin)의 값으로 true가 반환될 것으로 예상할 수 있습니다.
그러나 실제로 해당 API를 호출해 보면 다음과 같은 결과가 반환됩니다.

분명 전달한 userId의 값과 비교 대상인 adminId의 값이 "홍길동"으로 동일하지만 Java는 같지 않다는 결과를 반환하였습니다. 그러한 이유는 String과 같은 클래스의 경우 같음 연산자(==) 를 사용할 경우 해당 변수가 가지고 있는 값("홍길동)이 아닌 참조 주소값(0x0000…)을 비교하기 때문에, 개발자가 생각하는 의도대로 작동하지 않는 경우가 발생하게 됩니다.
String 비교를 Java에서 하고자 하신다면, 아래 메소드 중 개발하고자 하는 프로그램의 목적 및 상황에 따라 선택하시면 됩니다.
equals
기본 문법
equals(Object anObject)
예제
public static void main(String[] args) {
String str1 = "hello world";
String str2 = new String("hello world");
/* String str1과 str2의 값이 같은지 비교 */
System.out.println(str1.equals(str2)); //ture
}
equalsIgnoreCase
기본 문법
equalsIgnoreCase(String anotherString)
예제
public static void main(String[] args) {
String str1 = "hello world";
String str2 = new String("HELLO WORLD");
/* String str1과 str2의 값이 같은지 비교 (대소문자 무시) */
System.out.println(str1.equalsIgnoreCase(str2)); //ture
}
Honey Tip 🍯
일반적으로 기준이 되는 특정 값(에러 코드, 상태 코드, 관리자 코드, batch 서비스 동작 주기 …)은 해당 값이 비교적 가변적일 경우 서비스 재시작 없이 변경된 값을 적용하기 위해 Database에 저장하여 매 호출 시 조회해 오거나, 외부의 Properties 파일을 참조하게끔 구현합니다.
그러나 값의 변동이 거의 없는 고정적인 값(수치)일 경우, 수정이 불가능한 final 키워드를 선언하여 관리하는 것이 유지 보수 측면에서 효율적입니다.
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
public class Solution {
private static final String ADMIN_CODE = "홍길동_0123A";
private static final String RUN_TIME = "17:30";
/* 파라미터로 전달받은 userId가 "홍길동_0123A" 와 같을 경우 true를 반환 */
private boolean isAdmin(String userId) {
return userId.equals(ADMIN_CODE);
}
/* 서비스 동작 시간이 17시 30분일 경우 true를 반환 */
private boolean isRuntime() {
LocalTime time = LocalTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm");
return time.format(formatter).equals(RUN_TIME);
}
}
References
https://docs.oracle.com/javase/8/docs/api/
JDK 21 Documentation - Home
The documentation for JDK 21 includes developer guides, API documentation, and release notes.
docs.oracle.com
해당 게시글은 독학을 통해 얻은 지식들을 취합하여 작성한 글입니다.
잘못된 내용이 있을 경우 댓글을 통해 지적을 해주신다면 저와, 이 글을 참조하게 될 모든 분들께 큰 힘이 됩니다.
