코딩테스트 기초문제들 연습을 하다가
문자열 비교에선 == 연산자 보단 equals 메서드를 사용해야 한다는 것을 알았다.
하지만 명확한 이유를 모르겠어서 원리를 찾아보았다.틀린 부분이 있다면 댓글부탁드립니다 피드백 환영⭐️
자바에는 원시 데이터 타입과 비 원시 데이터 타입이 존재하고,
그 둘은 메모리상 저장방식과 처리방식에 있어서 차이가 존재한다.
원시 데이터 타입 primitive | 비 원시 데이터 타입 non primitive |
---|---|
boolean | String |
int | Array |
double | Date |
short | File |
long | ... |
float | ... |
char | 등등 |
원시 데이터 타입은 변수들의 동일한 값을 가지고 있을 경우, 메모리 상 같은 주소에 저장된다.
비 원시 데이터 타입은 변수들이 서로 동일한 값을 가지고 있더라도
메모리 상 별개의 공간에 저장이 된다(주소가 다르다).
원시 데이터 타입과 비 원시 데이터 타입의 차이 때문에
메모리 상에서 같은 주소를 가리키고 있는지를 확인하는 ==
연산자를 사용할 때
원시 데이터 타입은 값이 동일하면 true
를 반환한다.
비 원시 데이터 타입은 값이 동일하더라도 주소가 다르기 때문에
false
를 반환한다.
하지만 ❓ String
타입은 워낙 자주 사용되기 때문에 예외적으로
==
동등비교연산자를 사용했을 때 true
가 나오는 경우가 있다.
그러나, 오류가 발생할 수 있으므로 오직 값이 같은지를 비교하는 equls()
메소드를 사용하는 것이 좋다.
개념을 알았다면 직접 코드로 쳐보며 익히는 것이 중요한 것 같다.
이런 저런 경우의 수를 만들어서 궁금증 해결 완료!!!
import java.util.Scanner;
public class Practice {
public static void main(String[] args) {
String a = "hi";
String b = "hi";
String c = new String("hi");
String d = "h" + "i";
String e = new String("h") + "i";
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
System.out.println(a == b); // true
System.out.println(a == c); // false
System.out.println(b == c); // false
System.out.println(a == d); // true
System.out.println(a == e); // false
System.out.println(d == e); // false
System.out.println(a == input); // hi 입력 시 false
System.out.println("hi".equals(input)); // hi 입력 시 true
}
}
⬇ 참고자료
블로그
공식문서 (자바 공식문서는...증말 별루다ㅠ)
생활코딩 유튜브 (10분) -> 이해에 큰 도움됨!!