▩ 목 차 ▩
1. 기본자료형의 값 비교
2. 참조 자료형의 값 비교
2-1. 참조 자료형 객체의 값 비교
2-2. 참조 자료형 String 값 비교
2-2-1. 참조 자료형 String에서 == 비교는 주소값을 비교한다.
2-2-2. 참조 자료형 String에서 equals() 비교는 문자열값(내용)을 비교한다.
3. 왜 같은 참조자료형인데 객체와 String의 값 비교는 서로가 다를까?
나는 14장 String 클래스를 배울때 값 비교에 대한 의문이 생겼다.
String 클래스는 신기하게 기본자료형과 같이 == 비교로 주솟값 비교 되고 equlas()메소드로 문자열 값 비교도 되었다.
의문이었던 코드는 아래와 같다.
String text1= "Java Basic";
String text2= "Java Basic";
String text3= new String("Java Basic");
String text4= new String("Java Basic");
MemberDTO obj1 = new MemberDTO("Sangmin");
MemberDTO obj2 = new MemberDTO("Sangmin");
System.out.println(text1==text2);
System.out.println(text1==text3);
System.out.println(text3==text4);
System.out.println(text1.equals(text2));
System.out.println(text1.equals(text3));
System.out.println(text3.equals(text4));
System.out.println(obj1.equals(obj2));
true
false
false
true
true
true
false
String도 참조자료형 즉, 객체라고 생각을 해서 equals() 메소드를 할 때 주소값을 통해 비교를 하는 줄 알았다.
하지만 아니었고, 많은 내용들이 숨어 있었다. 아래에 정리한 내용을 보고 기본자료형과 참조자료형의 값 비교에 대해서 확실히 이해하자.
■ 1. 기본자료형의 값 비교 ■
기본자료형은 == 비교만 가능하고 비교시 주소값을 비교한다.
■ 2. 참조 자료형의 값 비교 ■
■ 2-1. 참조 자료형 객체의 값 비교
참조 자료형(객체) 일 때
- "==" 연산자의 경우 객체의 주솟값을 비교하는 역할을 하기에, 비교하려는 객체가 동일한 객체인지를 판별한다.
- equals()의 경우 Object 클래스의 메서드이고 이는 == 연산자와 동일하게 주소값을 비교를 수행하는 메서드이다.
그렇기에 객체끼리 값을 비교하기 위해서 equals()를 오버라이딩 하여 사용하여야한다. [ equals() 메소드를 오버라이딩 할때 객체의 메모리 주소를 나타내는 hashCode() 메소드도 같이 Overriding해야만 한다. ]
■ 2-2. 참조 자료형 String 값 비교
참조 자료형중에 String에 대해서는 조금 다르다.
■ 2-2-1. 참조 자료형 String에서 == 비교는 주소값을 비교한다.
String 비교에서 == 을 사용할 시에 주소값을 비교한다.
[EX] - 1
String text1="Java Basic"; String text2= "Java Basic"; 를 "==" 비교하면 주소값을 비교한다. 주소 값은 "Java Basic" 라는 한 주소 값에 저장되기 때문에 text1 == text2 는 true 이다.
[EX] - 2
만약 String text1="Java Basic"; String text2= new String("Java Basic");를 "=="비교하면 주소값을 비교한다. new String을 통해 새로운 주소값을 만들었기 때문에 text1과 text2는 주소값이 다르다. 그렇기에 text1 == text2는 false이다.
■ 2-2-2. 참조 자료형 String에서 equals() 비교는 문자열값(내용)을 비교한다.
String 비교에서 equals()를 사용할 시에 문자열값(내용)을 비교한다.
[EX] - 1
String text1= "Java Basic"; String text2= "Java Basic"; 를 "equal()" 비교하면 문자열값(내용)을 비교한다. 즉, 문자열값(내용)이 "Java Basic" 으로 동일해서 text1.equals(text2)는 true이다.
[EX] - 2
만약 String text1="Java Basic"; String text2= new String("Java Basic");를 "equal()" 비교하면 문자열값(내용)을 비교한다. 즉, 문자열값(내용)이 "Java Basic" 으로 동일해서 text1.equals(text2)는 true이다.
■ 3. 왜 같은 참조자료형인데 객체와 String의 값 비교는 서로가 다를까? ■
모든 클래스의 equals() 메소드 즉, 객체와의 equals 비교들은 object class의 equals() 메소드를 사용하기 때문이다.
Object의 equals() 메소드는 코드를 보면 "=="비교이다. 즉 주소값 비교로 되어 있다.
String 클래스의 equals() 메소드, 즉 String과의 equals 비교들은 Ojbect의 equals() 메소드를 재정의(오버라이딩)하여 사용하기 때문이다. 여기서 오버라이딩 하여 문자열값(내용)을 비교한다.
'JAVA > 자바의 신 의문 해결' 카테고리의 다른 글
자바의 자료구조 정리 [ List, Set, Queue, Map ] (0) | 2022.09.19 |
---|---|
Garbage Colletion의 개념 및 동작원리 (1) | 2022.09.16 |
메모리 관점) 기본자료형, 참조자료형(모든 클래스, String 클래스) "==", eqauls() 비교 (0) | 2022.09.14 |
자바) JVM이 운영체제로부터 할당받는 대표적인 메모리 공간(RAM) [ Runtime Data Areas ] 및 구조 + C에서 운영체제로부터 할당받는 메모리 공간[ Code, Data, Stack, Heap ] (0) | 2022.09.14 |