본문 바로가기

5. 참조타입

5.6.8_객체를 참조하는 배열

기본타입(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