Java 데이터의 불변성과 변수의 가변성, 배열, 객체 주소
강의 내용 복습 : 코리아IT 신촌점 Java 강의 (2024-04-22 강의)
🔔 Java의 배열(1차 배열)
📌 배열(Array)
- 배열이란 동일한 유형의 변수를 여러 개 담을 수 있는 저장 구조를 의미합니다.
- 배열은 자료구조(data structure)라고도 하며 데이터를 연속적으로 처리할 수 있습니다.
- 배열은 알고리즘 등과 같은 데이터 처리 작업에서 필수적입니다.
- 참고로 배열(Array)은 String, Class, Interface와 같은 참조형 데이터 유형입니다.
📌 배열의 정의(선언)
- 배열을 정의하는 방법은 데이터 유형을 명시 후에 대괄호를 사용하면 됩니다.
📌 배열의 생성
- 배열 선언 후에는 배열을 실제로 생성시키고 메모리에 할당시킬 수 있습니다.
- 이때 new 키워드가 사용됩니다.
- 배열의 정의 및 생성은 아래와 같이 코드 한 행으로 정리됩니다.
1
2
// int 데이터 10개를 담을 수 있는 배열을 생성하였습니다.
int[] arr1 = int[10];
📌 배열의 초기화
- 배열 생성 단계에서 아래와 같이 초기값을 설정할 수 있습니다.
1
2
// int 1, 2, 3 데이터 3개를 담을 수 있는 배열을 생성하였고 값을 할당하였습니다.
int[] arr2 = {1, 2, 3};
📌 인덱스(배열의 위치)
- Java에서는 배열의 위치를 인덱스 형식으로 나타내며 인덱스는 0부터 시작됩니다.
- 상기 정의 및 생성한 arr2 배열에 대한 인덱스의 현재 상태는 아래와 같습니다.
1
2
3
arr2[0] = 1;
arr2[1] = 2;
arr2[2] = 3;
📌 데이터 변경
- 배열에 저장된 데이터는 아래와 같이 변경할 수 있습니다.
1
2
3
arr2[0] = 10;
arr2[1] = 20;
arr2[2] = 30;
📌 배열의 길이
- 배열의 길이는 배열 변수명 우측에 아래와 같이 ‘length’ 속성을 사용하면 알 수 있습니다.
- 아래와 같이 입력한 결과는 3입니다.
1
System.out.println(arr2.length);
📌 배열의 구현
- 배열은 ‘로또 번호 생성 및 당첨 결과 출력 프로그램’으로 구현될 수 있습니다.
- 구현된 프로그램의 상세 코드는 문장에 링크된 글에 잘 작성되어 있습니다.
🔔 데이터의 불변성과 변수의 가변성
📌 데이터의 불변성
- 데이터는 int, double, String 등의 변수로 생성됩니다.
- 그런데 한 번 생성된 데이터는 컴퓨터 메모리에 저장되며 변경되지 않습니다.
- 데이터 불변의 개념은 안전한 데이터 관리와 효율적인 메모리 사용에 목적이 있습니다.
- 변수는 단지 데이터가 저장된 메모리의 주소를 참조할 뿐입니다.
- 그래서 참조형 데이터 변수라는 용어가 존재하는 것입니다.
📌 변수와 데이터의 관계
- 변수를 이용하여 데이터를 생성시킬 때 데이터를 저장하는 것과 같이 보여집니다.
- 하지만 프로그래밍 관점에서 데이터는 생성만 되고 저장되지는 않습니다.
- 그리고 저장된 데이터는 변하지 않지만 변수는 변합니다..
📌 데이터 주소
- 변수는 데이터 자체를 저장하는 것이 아닙니다.
- 변수는 ‘데이터의 주소’를 저장합니다.
- 변수는 실제 데이터가 저장된 메모리의 주소를 참조(reference)합니다.
- 그래서 변수는 데이터를 저장하는 것이 아니라 바라본다는 표현이 존재하는 것입니다.
- 데이터가 저장된 메모리의 주소는 System.identityHashCode 메서드로 알 수 있습니다.
📌 저장된 데이터
- 데이터는 컴퓨터의 메모리에 저장됩니다.
- 저장된 데이터는 메모리의 특정 장소에 위치하며 이 장소는 고유한 주소로 식별됩니다.
- 변수는 이 주소를 참조하여 데이터에 접근할 수 있고 데이터를 읽고 수정할 수 있습니다.
📌 변수 및 데이터 관계의 예시
- 아래의 str 변수는 1행에서 “Hello” 문자열 데이터를 생성하고 참조합니다.
- 그리고 2행에서 참조할 문자열을 “World”로 변경하고 World 문자열을 생성합니다.
- 이때 str 변수는 컴퓨터 메모리에 생성 및 저장된 데이터의 주소를 참조합니다.
- 아래의 경우 str1변수는 그대로이지만 데이터 및 데이터의 주소는 변경됩니다.
- str2 변수의 경우 새로운 변수가 정의 되었지만 데이터 주소는 동일합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 메인 메서드 내용
public static void main(String[] args) {
// "Hello" 문자열 데이터의 주소 출력
String str1 = "Hello";
System.out.println("Hello 주소 = " + System.identityHashCode(str1));
// "World" 문자열 데이터의 주소 출력
str1 = "World";
System.out.println("World 주소 = " + System.identityHashCode(str1));
// str2 변수가 참조하는 데이터의 주소 출력
String str2 = "World";
System.out.println("str2 변수가 참조하는 데이터 = " + System.identityHashCode(str2));
}
// 출력 내용
// Hello 주소 = 933699219
// World 주소 = 1128032093
// str2 변수가 참조하는 데이터 = 1128032093
// str2 변수가 참조하는 데이터는 출력된 주소로 보아 "World" 문자열임을 알 수 있습니다.
📌 객체의 주소
- 변수는 데이터가 저장된 컴퓨터 메모리의 주소를 참조한다고 말씀드렸습니다.
- 그런데 new 메서드로 생성된 배열 등의 객체의 경우 데이터가 아닌 배열의 주소를 갖게 됩니다.
- 관련된 Java 코드 내용은 아래와 같습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public static void main(String[] args) {
// 3개의 데이터를 갖는 배열을 생성하였습니다.
int[] arr = new int[3];
// arr 배열의 주소를 출력하였습니다.
System.out.println("컴퓨터 메모리에 저장된 배열의 주소 = " + System.identityHashCode(arr));
// arr 배열에 3개의 정수를 할당하였습니다.
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
// 데이터를 참조하는 arr 배열의 주소를 다시 출력하였습니다.
System.out.println("컴퓨터 메모리에 저장된 배열의 주소 = " + System.identityHashCode(arr));
// arr 배열의 각 인덱스가 참조하는 데이터의 주소를 출력하였습니다.
System.out.println("arr[0] 주소 = " + System.identityHashCode(arr[0]));
System.out.println("arr[1] 주소 = " + System.identityHashCode(arr[1]));
System.out.println("arr[2] 주소 = " + System.identityHashCode(arr[2]));
// arr 배열의 각 인덱스가 참조하는 각 데이터의 주소를 출력하였습니다.
System.out.println("정수 10의 주소 = " + System.identityHashCode(10));
System.out.println("정수 20의 주소 = " + System.identityHashCode(20));
System.out.println("정수 30의 주소 = " + System.identityHashCode(30));
}
// 출력 내용
// 컴퓨터 메모리에 저장된 배열의 주소 = 933699219
// 컴퓨터 메모리에 저장된 배열의 주소 = 933699219
// arr[0] 주소 = 1128032093
// arr[1] 주소 = 1066516207
// arr[2] 주소 = 443308702
// 정수 10의 주소 = 1128032093
// 정수 20의 주소 = 1066516207
// 정수 30의 주소 = 443308702
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.