포스트

Java 데이터의 불변성과 변수의 가변성, 배열, 객체 주소

강의 내용 복습 : 코리아IT 신촌점 자바 강의 (2024-04-22 강의)

  • Tool :
    Java Eclipse


🔔 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 라이센스를 따릅니다.
<>