새소식

인기 검색어

개인공부/Java

참조 자료형 1차배열

  • -

자바에서는 8개의 기본 자료형 이외의 모든 자료형은 참조 자료형이다. 대표적인 참조 자료형에는 배열 array, 클래스 class, 인터페이스 interface 등이 있다. 참조 자료형은 개발자가 얼마든지 정의 할 수 있으므로 무한개라 할 수 있다. 먼저 배열을 알아보자.

 

배열이란?


배열은 동일한 자료형을 묶어 저장하는 참조 자료형이다. 생성할 때 크기를 지정해야 하고, 한 번 크기를 지정하면 절대 변경할 수 없는 특징이 있다. 이 2가지 특징은 이후 배열의 선언과 객체 생성에도 적용되므로 반드시 기억하길 바란다.

 

배열 생성하기


1. 배열 선언하기


배열을 선언할 때는 다음과 같이 2가지 방법으로 선언할 수 있다. 배열을 나타내는 대괄호 []는 자료형 뒤에 올 수 있고 변수명 뒤에도 올 수 있다.

배열을 선언하면 스택 메모리에 변수의 공간만 생성하고 공간 안은 비운채로 둔다. 아직 배열의 실제 데이터인 객체를 생성하지 않았기 때문이다. 스택 메모리에 위치하고 있는 참조 자료형 변수의 빈 공간을 초기화 할 때는 null(널) 값을 사용할 수 있다. null 값은 힙 메모리의 위치(번지)를 가리키고 있지 않다는 의미다. 즉, 연결된 실제 데이터가 없다는 것을 의미한다.

 

자바의 메모리 구조


자바의 메모리 구조는 다음과 같이 3개의 영역으로 구성돼 있다.

첫 번째 영역에는 클래스와 메서드가 위치하고 있으며, 스택 영역은 기본 자료형이든 참조 자료형이든 상관 없이 모든 지역 변수가 위치하는 영역이다. 마지막으로 힙 영역은 객체가 위치하는 공간이며 객체는 참조 자료형 변수가 가리키는 실제 데이터쯤으로 생각하면 된다.

 

2. 힙 메모리에 배열의 객체 생성하기

 

모든 참조 자료형의 실제 데이터(객체)는 힙 메모리에 생성된다. 힙 메모리에 객체를 생성하기 위해서는 new 키워드를 사용해야 한다.

new int[3]; // 정수 자료형 3개를 포함할 수 있는 배열 객체 생성 
new double[5]; // 실수 자료형 5개를 포함할 수 있는 배열 객체 생성 
new String[10]; // 문자열 자료형 10개를 포함할 수 있는 배열 객체 생성 
new int[]; // 객체의 크기를 지정하지 않아 오류 발생 

 

3. 배열 자료형 변수에 객체 대입하기
선언된 배열 참조 자료형 변수에 생성한 객체를 대입하는 데는 2가지 방법이 있는데, 변수 선언과 값(참조 자료형은 객체)의 대입을 한 번에 작성해도 되고, 따로 구분해 작성해도 된다.

 

🥨배열 자료형 변수에 객체 대입

 

자료형[] 변수명 = new 자료형 [배열의 길이];

예 int[] a = new int [3];

자료형[] 변수명;
변수명 = new 자료형[배열의 길이];

int[] a;
a = new int[3];

이 때의 메모리 구조는 다음과 같다

지금까지 1차원 배열을 생성하고 값을 대입하는 방법을 알아봤다. 그런데 자바는 앞에서 알아본 방법 외에도 배열을 생성하고 값을 대입하는 다양한 방법을 지원한다. 여기서는 앞의 방법을 포함해 1차원 배열을 생성하거나 값을 대입하는 3가지 방법을 알아본다.

 

방법 ① 배열 객체를 생성하고 값 대입하기

첫 번째 방법은 앞서 알아본 것처럼 배열의 객체를 먼저 선언하고 이후 각 인덱스 위치마다 값을 대입하는 것이다. 객체를 생성할 때는 배열의 길이가 명확히 기술돼야 하고 값을 입력할 때는 가용한 인덱스 (0~ 배열의 길이 -1)만을 사용해야 한다.

📖배열 객체를 생성하고 값 대입하기

자료형[] 참조 변수명 = new 자료형[배열의 길이];
참조 변수명[0] = 값;
참조 변수명[1] = 값;
...
참조 변수명[배열의 길이-1] = 값;

int[] a = new int[3];
a[0] = 3;
a[1] = 4;
a[2] = 5;

방법 ② 배열 객체 생성과 함께 값 대입하기

두 번째 방법은 배열 객체를 생성함과 동시에 값을 대입하는 것이다. 이때 초깃값을 직접 넣어 주므로 컴파일러에 따른 강제 초기화 과정은 생략된다. 두 번째 방법에서는 객체를 생성할 때 오른쪽 항의 대괄호 안에 배열의 길이를 지정하지 않는다. 배열을 생성할 때 배열의 길이를 반드시 지정해야 하는 배열의 두 번째 특징을 만족하지 못하는 것처럼 보일 수도 있다. 하지만 배열의 길이는 다음에 나오는 중괄호 안의 초기화 데이터 개수로 결정되므로 배열의 특징을 모두 만족한다.

📖 배열 객체 생성과 함께 값 대입하기

자료형[] 참조 변수명 = new 자료형[]{값, 값, 값};
-> 배열의 길이를 지정하지 않음, 배열의 길이는 값 개수로 결정

int[] a = new int[]{3, 4, 5};

방법 ③ 대입할 값만 입력하기
마지막 방법은 new 키워드 없이 초기화할 값만 중괄호에 넣어 대입하는 것이다. 초기화 데이터의 개수가 배열의 길이를 결정한다.

자료형[] 참조 변수명 = {값, 값, ..., 값};

int[] a = {3, 4, 5};

변수 선언과 값 대입의 분리 가능 여부
방법 ③은 방법 ②에서 new int[]를 생략한 형태다. 만일 방법 ②와 방법 ③이 완벽히 동일하다면 굳이 상대적으로 복잡한 방법 ②을 쓸 필요는 없을 것이다. 하지만 방법 ③에는 변수 선언과 값의 대입을 분리할 수 없다는 제약 조건이 따른다. 즉, 선언과 동시에 값을 대입할 때만 사용할 수 있다. 이 정도가 뭔 대수냐 할지 모르지만 방법 ③은 선언과 대입을 분리할 수 없다는 특징 때문에 메서드의 입력매개변숫값으로는 사용할 수 없게 된다.

📖 방법 ② 선언과 객체 대입 분리 가능

int[]a = new int[]{3,4,5}; // O
int[]a;
a = new int[]{3,4,5}; // O

📖 방법 ③ 선언과 객체 대입 분리 불가능

int[] a = {3, 4, 5}; // O
int[]a;
a = {3, 4, 5}; // X

 

참조 자료형으로서 배열의 특징

대입 연산자(=)를 이용해 변수가 복사되는 과정을 이해해야 한다. 변수의 어떤 값을 복사한다는 의미일까? 바로 변수에 포함돼 있는 스택 메모리의 값이다. 그런데 기본 자료형과 참조 자료형이 스택 메모리에 저장하는 값의 의미가 다르므로 자연스럽게 둘 사이에 차이가 발생하는 것이다.

먼저 기본 자료형을 살펴보자 기본 자료형은 스텍 메모리에 실제 데이터값을 저장하고 있으므로 기본 자료형 변수를 복사하면 실제 데이터 값이 1개 더 복사된다. 이후 복사된 값을 아무리 변경해도 원본 값은 아무런 영향을 받지 않는다.

🔑기본 자료형 변수 복사

int a = 3;
int b = a;
b = 7; 
System.out.println(a); // 3
System.out.println(b); // 7

그럼 이번에는 참조 자료형을 살펴보자. 참조 자료형은 스택 메모리에 실제 데이터값이 아닌 힙 메모리에 저장된 객체의 위치를 저장하고 있다. 따라서 참조 자료형 변수를 복사하면 실제 데이터가 복사되는 것이 아니라 실제 데이터의 위칫값이 복사된다. 따라서 하나의 참조 변수를 이용해 데이터를 수정하면 다른 참조 변수가 가리키는 데이터도 변하게 되는 것이다.

🔑참조 자료형 변수 복사

int[] a = {3, 4, 5};
int[] b = a;
b[0] = 7;
System.out.println(a[0]); // 7
System.out.println(b[0]); // 7

 

 

출처 :

Do it! 자바 완전 정복 

저자 : '김동형'

https://www.yes24.com/Product/Goods/103389317

'개인공부 > Java' 카테고리의 다른 글

클래스의 내부 구성 요소 : 변수  (0) 2022.07.18
클래스와 객체  (0) 2022.07.18
참조 자료형 String  (0) 2022.07.18
연산자  (0) 2022.07.14
기본 자료구조  (0) 2022.07.11
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.