기본타입(int, double...)배열은 각 항목에 직접 값을 갖고 있지만,
참조타입(클래스, 인터페이스..) 배열은 각 항목에 객체의 번지를 가지고 있다.
예를들어 String은 클래스타입이므로 String[]배열은 각 항목에 문자열이 아니라 String 객체의 주소를 가지고 있다.
String 배열을 만들어보자.
String[] StrArray = new String[3];
StrArray[0] = "java";
StrArray[1] = "C";
StrArray[2] = "C#";
(예제를 보기전에) 비교 연산자 두 가지
== :참조하는 객체의 주소가 같은지 확인 (= 같은 객체를 참조하고 있는가?)
a.equals(b) : 객체a와 b의 문자열이 같은지 확인 (다른 객체를 참조해도 문자열이 같으면 true)
package sec06.exam06_array_reference_object;
public class ArrayReferenceObjectEcample {
public static void main(String[] args) {
String[] strArray = new String[3];
strArray[0] = "자바칩";
strArray[1] = "자바칩"; //문자열이 같으면 같은 객체를 참조
strArray[2] = new String("자바칩"); //new 연산자로 생성: 새로운 String 객체 생성
System.out.println(strArray[0] == strArray[1]); //true
System.out.println(strArray[0] == strArray[2]); //false
System.out.println(strArray[0].equals(strArray[1])); //문자열만 비교-> true
}
}
실행결과:
true
false
true
위의 코드는 메모리상에 이렇게 표현된다 ↓
StrArray[0]과 StrArray[1]은 같은 문자열을 가지고 있어 같은 객체를 참조한다.
그러나 StrArray[3]은 같은 문자열을 가지고 있지만 new 연산자로 생성했다.
new 연산자로 생성하면 무조건 새로운 객체가 생성되기 때문에
StrArray[0]과 StrArray[2]를 비교하는 ==연산자를 수행하면 false가 나온다.
그러나 문자열만을 비교하는 메소드 equals를 쓰면 객체의 주소와 관계없이 true가 나온다.
'5. 참조타입' 카테고리의 다른 글
5.7.1 열거타입 (enumeration type) (0) | 2020.05.01 |
---|---|
5.6.10_ 향상된 for문 (0) | 2020.05.01 |
5.6.7_다차원 배열 (0) | 2020.04.30 |
5.6.6_커맨드 라인 입력 (0) | 2020.04.30 |
5.6.1~5_배열, 배열 선언, 배열길이 (1) | 2020.04.26 |