Java 및 JSP

[Java] 참조형 변수와 배열

jane.dev 2021. 7. 27. 23:44
반응형
참조형 변수
기본형 변수에는 값이 저장
참조형 변수에는 메모리 주소 값이 저장

 

자바는 문자열이 동일하다면 String의 객체를 공유 - 메모리가 절약됨

→ 각자 다른 변수로 같은 문자열을 생성하면 해당 변수에는 같은 주소 값이 저장 

String str1 = "Hello";
String str2 = "Hello";

아래와 같이 주소값을 비교해도 true값을 반환함

// 주소 값을 비교
System.out.println(str1 == str2);	// true
// 문자 비교
System.out.println(str1.equals(str2));	// true

 

하지만 new 키워드를 이용해 객체를 생성하면 위 변수들과 같은 문자열을 가지고 있어도 다른 주소 값을 가짐 → 별도의 공간에 저장됨

String str3 = new String("Hello");		// 위 변수들과 같은 문자로 객체 생성
System.out.println(str1.equals(str3));		// true
System.out.println(str1 == str3);		// false

 

그림으로 설명하면 아래와 같음

 

숫자 배열도 동일

예제) 

int [] arr1 = {1, 2, 3, 4, 5};
int [] arr2 = arr1;
int [] arr3 = {1, 2, 3, 4, 5};

arr1이 생성되고 arr2는 arr1의 주소값을 받아 저장

arr1[0] = 10;

arr1 배열 0번째 자리에 10으로 변경하여 저장하고 값을 조회하면

System.out.println(arr1[0]);		// 10
System.out.println(arr2[0]);		// 10
System.out.println(arr3[0]);		// 1

arr1 과 arr2 는 같은 주소 값을 공유하고 있기 때문에, arr1의 값이 변경되면 arr2의 값도 변경됨

arr3은 같은 문자열이라고 하더라도 다른 주소 값을 가지고 있기 때문에, arr1 값 변경에 영향을 받지 않음

 

+

아스키 코드를 이용해 a ~ z 알파벳을 출력하는 char형 배열을 생성

char [] alphabet = new char[26];
for(int a = 0; a < alphabet.length; a++){
	alphabet[a] = (char)(a + 97);
}

출력

System.out.println(alphabet);					
System.out.println(Arrays.toString(alphabet));	// 배열 내용 출력

콘솔창

 

위 배열로 문자열을 생성

String getAlphabet1 = alphabet.toString();
String getAlphabet2 = new String(alphabet);
String getAlphabet3 = String.valueOf(alphabet);
String getAlphabet4 = alphabet + "";

출력

System.out.println(getAlphabet1);	// 주소값 출력됨
System.out.println(getAlphabet2);	// 문자열 출력됨
System.out.println(getAlphabet3);	// 문자열 출력됨
System.out.println(getAlphabet4);	// 주소값 출력됨

콘솔창

 

alphabet이라는 변수는 char형 배열로 참조형 변수 → 변수 자체에 저장된 값은 주소 값

alphabet.toString() : 변수 자체에 toString 명령으로 변수를 문자열로 반환

alphabet + "" : alphabet 변수에 든 값을 문자열화

 

반면,

아래 내용은 해당 명령을 실행함에 있어 각각의 주체가 String을 매개로 명령받음 - 괄호 내부에 alphabet

new String(alphabet)

String.valueOf(alphabet) 

→ String의 경우, 기본적으로 참조형 변수이기 때문에 내부 설계가 변수의 주소 값으로 접근 시 나오는 자료들을 처리하도록 되어있음