숑숑이의 개발일기

본글은 'Do it 자바 완전 정복' 책을 통한 공부내용을 정리한 글입니다.

 

자바에서는 8개의 기본 자료형 이외의 모든 자료형은 잠조 자료형이다. 대표적인 참조 자료형에는 배열, 클래스, 인터페이스 등이 있다. 참조 자료형은 개발자의 필요에 의해 얼마든지 정의할 수 있으므로 무한개라 할 수 있다.

 

배열이란?

배열은 동일한 자료형을 묶어 저장하는 참조 자료형이다. 생성할때 크기를 지정해야 한다. 한 번 크기를 지정하면 크기를 변경할 수 없다.

 

배열 생성

배열 선언하기

배열을 선언할 때는 2가지 방법으로 선언할 수 있다. 그러나 다른 여러 자료형의 표현과 일관성을 유지하기 위해 자료형 뒤에 표기하는 것을 권장한다.

// 1번 방법 (권장)
자료형[] 변수명
int[] a;	// int 자료형만 저장가능
double[] b;	// double 자료형만 저장가능

// 2번 방법
자료형 변수명[]
int a[];
double b[];

배열을 선언하면 스택 메모리에 변수의 공간만 생성하고, 공간 안은 비운 채로 둔다. 스택 메모리에 위치하고 있는 참조 자료형 변수의 빈 공간을 초기화시에는 null을 사용할 수 있다. (실제 데이터가 없다는 것을 의미)

 

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

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

new 자료형[];
new int[3];	// 정수 자료형 3개를 포함할 수 있는 배열 생성
new String[5];	// 문자열 자료형 5개를 포함할 수 있는 배열 생성

 

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

// 배열의 선언과 값의 대입을 동시에 할 수도 있다
자료형[] 변수명 = new 자료형[배열의 길이];
int[] a = new int[3];

// 배열의 선언과 값의 대입을 분리할 수도 있다
자료형[] 변수명;
변수명 = new 자료형[배열의길이];
int[] a;
a = new int[3];

힙 메모리는 어떤 상황에서도 빈 공간이 존재하지 않고 초기값을 주지 않으면 컴파일러가 자동으로 값을 초기화한다.

 

객체에 값 입력

참조 변수명[인덱스] = 값;
int[] a = new int[3];
a[0] = 3;	// a배열의 0번 인덱스에 3 저장
a[1] = 4;	// a배열의 1번 인덱스에 4 저장

System.our.println(a[1]);	// 4
System.our.println(a[-1]);	// exception
System.our.println(a[2]);	// exception

배열의 저장 공간에 값을 대입하거나 읽을 때, 없는 인덱스를 사용하면 exception(예외)가 발생하고, 프로그램이 종료된다.

 

1차원 배열을 생성하는 다양한 방법

앞의 방법을 포함한 방법 3가지를 알아보자

// 방법1) 배열 객체를 생성하고 값 대입하기
자료형[] 참조 변수명 = new 자료형[배열의 길이];
참조 변수명[0] = 값;
참조 변수명[1] = 값;
...
참조 변수명[배열의 길이-1] = 값;

// 방법2) 배열 객체 생성과 함께 값 대입하기
자료형[] 참조 변수명 = new 자료형[]{값, 값, ..., 값};

// 방법3) 대입할 값만 입력하기
자료형[] 참조 변수면 = {값, 값, ..., 값};

방법2에서 배열의 길이를 지정하지 않아 오류가 발생한다고 생각할수 있다. 그러나 중괄호 안의 초기화 데이터 개수로 배열의 길이가 결정되므로 문제없다.

방법3은 변수 선언과 값의 대입을 분리할 수 없다. (= 선언과 동시에 값을 대입할 떄만 사용할 수 있다) 이러한 특징으로 메서드의 입력매개변숫값으로는 사용할 수 없다.

 

스택 메모리 변수를 초기화 하지 않으면 메모리 공간이 비어있다. 이 상태에서 해당 변수를 출력할 경우 오류가 발생한다. 참조 자료형 변수는 실제 데이터의 위치를 저장하므로 초기값으로는 실제 데이터 값이 아닌 null을 사용한다.

 

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

변수의 복사라는말은 변수에 포함되어 있는 스택 메모리의 값을 복사한다는 것이다. 기본 자료형은 스택 메모리에 실제 데이터를 저장하고 있다. 이후 복사된 값을 변경시에 원본 값에 영향을 받지 않는다. 참조 자료형은 스택 메모리에 실제 데이터가 아닌 힙 메모리에 저장된 객체의 위치(주소값)을 저장하고 있다. 따라서 참조 자료형 변수를 이용해 데이터 수정시에는, 다른 참조 변수가 가르키는 데이터도 변하게 된다.

 

반복문을 이용해 배열 데이터 읽기

배열은 동일한 자료형을 여러 개 묶어 저장한다. 반복문을 통해 배열의 모든 데이터를 출력하는 방법을 알아보자

// 배열의 길이 구하기
int[] arr1 = new int[] {3, 4, 5, 6, 7};
System.out.println(arr1.length);	// 5

// 첫번째 방법 : for + length
int[] arr2 = new int[100];
for(int i = 0; i < arr2.length; i++) {
	System.out.println(arr2[i]);
}

// 두번째 방법 : for-each문
for(int k: arr2) {
	System.out.println(k);
}

// 세번째 방법 : toString() 메서드
System.out.println(Arrays.toString(arr2));

 

2차원 정방 행렬 배열

2차원 배열은 가로 및 세로 방향의 2차원으로 데이터를 저장하는 배열을 말한다. 그 중 모든 행의 길이가 같은 배열을 2차원 정방 행렬 배열이라고 한다.

// 2차원 배열의 선언방법
// 1.권장
자료형[][] 변수명
int[][] arr1;
double[][] arr2;

// 2.
자료형 변수명[][]
int arr1[][];
double arr2[][];

// 3.
자료형[] 변수명[]
int[] arr1[];
double[] arr2[];

세가지의 방법 중 맞고 틀린방법은 없다. 그러나 일관성을 고려해 자료형 뒤에 쓰는것을 권장한다.

 

2차원 정방 배열 생성 방법

// 1. 배열 객체의 행 먼저 생성, 이후 열 생성
자료형[][] 참조 변수명 = new 자료형[행의 길이];
참조 변수명[0] = 1차원 배열의 생성;
참조 변수명[1] = 1차원 배열의 생성;

int[][] a = new int[2][];	// 행 생성
a[0] = new int[]{1, 2, 3};	// 열 생성
a[1] = new int[]{4, 5, 6};	// 열 생성

// 2. 배열의 자료형과 함께 대입할 값 입력
자료형[][] 참조 변수명 = new 자료형[][] {{값, ..., 값}, {값, ..., 값}};
int[][] a = new int[][] {{1, 2, 3}, {4, 5, 6}};

// 3. 대입할 값만 입력
자료형[][] 참조 변수명 = {{1, 2, 3}, {4, 5, 6}};

2번 방법은 생성과 선언을 분리할 수 있다. 3번 방법은 선언과 동시에 값을 대입할 때만 사용할 수 있다.

 

2차원 비정방 행렬 배열

2차원 비정방 행렬은 각 행마다 열의 길이가 다른 2차원 배열을 말한다. 각 행별로 들쑥날쑥 하지만 개념은 2차원 정방 행렬과 동일하다. (= 1차원 배열을 원소로 포함하고 있는 1차원 배열)

 

2차원 배열의 출력

2차원 배열은 2개의 인덱스를 사용하기 때문에 2차원 배열의 모든 데이터를 출력하기 위해서는 이중 for문을 사용해야 한다. 또는 for-each문을 사용해 출력할 수 있다.

// 1. 이중 for문을 이용한 2차원 배열 출력
int[][] arr = {{1, 2}, {3, 4, 5}};
for(int i = 0; i < arr.length; i++) {
	for(int j = 0; j < arr[i].length; j++) {
    	System.out.println(arr[i][j]);
    }
}

// 2. for-each문을 이용한 2차원 배열 출력
for(int[] m : arr) {
	for(int n : m) {
    	System.out.println(n);
    }
}

'Backend > JAVA' 카테고리의 다른 글

[Java] #8 클래스 외부 구성 요소  (0) 2023.05.25
[Java] #5.2 참조자료형 - 문자열  (0) 2023.05.21
[Java] #4 제어문과 제어 키워드  (1) 2023.05.15
[JAVA] #3 연산자  (0) 2023.05.10
[JAVA] 변수와 자료형  (0) 2023.04.29
profile

숑숑이의 개발일기

@숑숑-

풀스택 개발자 준비중입니다