요즘 부쩍느끼는건데 생각보다 실무하면서 자바 기본지식들을 까먹는경우가 너무 많은것 같다. 프레임워크를 사용하고 항상 코딩하는 방식이 비슷하다보니..
앞으로 예전에 공부했던 자바지식들을 다시 정리하는 시간을 가져야겠다.
오늘 신입개발자분이 문자열과 String 타입의 변수를 equals가 아닌 == 비교를 하여 조건문을 만족하지 못하는 현상으로 고생하시구 계셨다.
나는 스트링을 비교할땐 equals로 데이터값을 비교해야한다고 설명드렸고 당연히 문제는 해결되었는데 ==과 equals비교의 정확한 차이점이 기억이 가물가물했다.. (==은 주소비교다 정도로만 ) 그래서 == 비교와 equals 비교의 차이점을 복습했다.
먼저 String type은 변수 할당 방식이 두가지다.
리터럴 방식과 new 연산자로 생성하는 방식
public class Test {
public static void main(String[] args) {
String s1 = "test";
String s2 = new String("test");
}
}
두가지 할당방식은 큰 차이점이 있는데 리터럴방식은 String constant pool 이라는 영역에 존재하고
new연산자 방식은 다른 참조타입 인스턴스와 마찬가지로 Heap영역에 존재한다.
String을 리터럴로 선언할 경우 내부적으로 String의 intern() 메서드가 호출되게 되고 intern() 메서드는 주어진 문자열이 string constant pool에 존재하는지 검색하고 있다면 그 주소값을 반환하고 없다면 string constant pool에 넣고 새로운 주소값을 반환한다고 한다. 이것에 따르면 같은 문자열을 할당한 리터럴 방식의 스트링 변수 두개는 == 비교시 true가 나와야한다.
public static void main(String[] args) {
String s1 = "123";
String s2 = "123";
System.out.println("s1과 s2는 같나요? : "+ (s1==s2));
}
결과 : s1과 s2는 같나요? : true
예상대로다
이번엔 리터럴방식과 new 연산자 방식을 == 비교와 equals 비교를 해본다
public static void main(String[] args) {
String s1 = "123";
String s2 = new String("123");
System.out.println("s1과 s2는 같나요? : "+ (s1==s2));
System.out.println("s1과 s2는 같나요? : "+ (s1.equals(s2)));
}
s1과 s2는 같나요? : false
s1과 s2는 같나요? : true
첫번째 프린트문은 같은 주소를 참조하는지 비교하므로 각각 string pool, heap영역에 별도의 인스턴스를 참조하므로 false 하지만
두번째 프린트문은 단지 데이터 값만을 비교하기 때문에 true가 출력된다.
대학교다닐때 열심히 봤었던 기억이 있는데 앞으로 좀 개념원리 복습을 철저히 해야겠다
'Java' 카테고리의 다른 글
Enum (0) | 2023.10.27 |
---|---|
Java Stream (0) | 2023.04.20 |
람다 메소드 레퍼런스 (0) | 2023.04.13 |
함수형 인터페이스 와 람다표현식 (0) | 2023.04.11 |