[Java] 참조형 변수와 배열
참조형 변수
기본형 변수에는 값이 저장
참조형 변수에는 메모리 주소 값이 저장
자바는 문자열이 동일하다면 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의 경우, 기본적으로 참조형 변수이기 때문에 내부 설계가 변수의 주소 값으로 접근 시 나오는 자료들을 처리하도록 되어있음