본문 바로가기
Java

[Java의 정석/5강정리] 05. 배열

by 상후 2021. 8. 6.
728x90
반응형

자바로 개발을 하지만 자바에 대해 많이 모른다고 느껴질 때가 있습니다.

 

Java의 정석으로 한번 더 학습하면서 간단하게 정리하거나 생각을 기록하려고 합니다.

이 포스트는 자바의 정석을 읽으면서 공부한 내용을 한번 더 정리하며 기록하는 포스트이고,  주관적인 생각이 들어갈 수 있습니다.

 

자바 공부를 하시는 분들이라면 "자바의 정석" 도서를 추천하고, 학습 시 모르는 부분은 저자 남궁성 님께서 운영하시는 카페를 통해 학습하시면 더 좋은 성과가 있을 거라 기대합니다.

 

https://cafe.naver.com/javachobostudy

 

남궁성의 코드초보스터디(자바 java... : 네이버 카페

전문가가 지도하는 스터디카페에요. 프로그래밍언어(자바 java, C언어)를 제대로 배우고픈 분들 오세요.

cafe.naver.com

 

잘못된 내용이나 피드백 및 생각 공유는 언제든 환영입니다. 댓글로 남겨주시면 확인 후 수정하겠습니다.


1-1. 배열(Array)이란?

"배열은 같은 타입여러 변수를 하나의 묶음으로 다루는 것"


1-2. 배열의 선언과 생성

기본형(Primitive) 변수 타입을 제외하고는 모두 참조형 변수 타입임을 기억합시다.

int[] array;			// 배열의 선언(배열을 다루기 위한 참조변수 선언)
array = new int[5];		// 배열을 생성(실제 저장공간을 생성)

int[] array = new int[5];	// 위 코드를 한 줄로 변경

1-3. 배열의 길이와 인덱스

배열의 길이 : 생성한 배열이 담을 수 있는 저장공간의 수를 의미

배열을 생성할 때 배열의 길이를 적어줘야 하는데 "양의 정수이어야 하며 최대값은 int의 최대값인 약 20억"까지

배열의 길이에 대한 정보 : 배열이름.length

 

int[] array = new int[5];		// 길이가 5인 배열을 담는 참조변수 array 

System.out.println(array.length);	// 5 출력

 

인덱스 : 배열의 요소(저장공간)마다 붙여진 일련번호

인덱스의 범위 : "0"부터 "배열의 길이 - 1" 까지

 

int[] array = new int[5]{1, 2, 3, 4, 5};

System.out.println(array[0]);		// 1 출력
System.out.println(array[2]);		// 3 출력
System.out.println(array[4]);		// 5 출력
System.out.println(array[5]);		// ArrayIndexOutOfBoundsException 발생!

 

배열의 길이가 5이지만 인덱스는 0부터 시작하므로 5번째 요소에 접근 시 에러 발생 유의


1-4. 배열의 초기화

배열은 생성과 동시에 자동적으로 자신의 타입에 해당하는 기본값으로 초기화된다. 

출처 : Java의 정석

배열을 기본값으로 초기화하지 않고 임의의 값으로 초기화 할 수 있다. (아래 코드 참조)

 

int[] score = new int[5];				// [0, 0, 0, 0, 0] 기본값 0으로 초기화되어 생성

int[] score = new int[5]{100, 80, 50, 30, 0};		// [100, 80, 50, 30, 0] 저장되어 생성
int[] score = {100, 80, 50, 30, 10};			// new int[5] 생략 가능

 


1-5. 배열의 출력

배열에 저장되어 있는 값을 출력하고 싶을 때가 있다. 

 

int[] nums = {1, 2, 3, 4, 5};

// nums 변수는 참조변수이기 때문에 배열의 주소가 출력된다.
System.out.println(nums);		// 타입@주소

// 1. 일반적인 for문과 배열의 인덱스를 통해 출력
for(int i=0; i<nums.length; i++) {
    System.out.print(nums[i]);		// 12345 출력 
}

// 2. 향상된 for문을 통한 출력
for(int num : nums) {
    System.out.print(num);		// 12345 출력
}

// 3. Arrays.toString(배열이름) 메서드를 사용한 출력
System.out.println(Arrays.toString(nums));

 

Arrays.toString() 메서드를 사용하여 비교적 간단하게 배열의 내용을 출력할 수 있다.

예외적으로 char 배열은 Arrays.toString() 메서드를 사용하지않고 println 만으로도 출력이 가능하다. 


1-6. 배열의 복사

한번 생성한 배열의 길이는 변경할 수 없다.

생성한 배열의 길이보다 더 많은 저장공간 필요하다면 더 큰 배열을 생성하고 복사하여야한다.

 

  • for문을 이용한 배열 복사
  • System.arraycopy()를 활용한 배열 복사
int[] a = {1, 2, 3, 4, 5};	// [1, 2, 3, 4, 5]
int[] b = new int[7];		// [0, 0, 0, 0, 0, 0, 0, 0]

System.arraycopy(a, 0, b, 0, a.length);
System.out.println(Arrays.toString(b));	// [1, 2, 3, 4, 5, 0, 0]

b = new int[7];

System.arraycopy(a, 2, b, 2, 3);
System.out.println(Arrays.toString(b)); // [0, 0, 3, 4, 5, 0, 0]

 

출처 : Java의 정석

배열의 복사는 for문보다 System.arraycopy()를 사용하는 것이 더 효율적이다.


1-7 다차원 배열(2차원 배열)

2차원 배열은 DB의 테이블 또는 행렬로 이해하면 쉽게 이해가 될 것이다."[ ]"의 개수가 차원의 수를 의미한다.

 

출처 : Java의 정석

위 그림은 가장 이해가 잘 되는 그림인 것 같다. 

2차원 배열을 초기화하는 방법과 길이는 아래와 같다. 1차원 배열과 크게 다르지않다. 

// 2차원 배열 초기화
int[][] score = {
          {100, 100, 100}
        , {20, 20, 20}
        , {30, 30, 30}
        , {40, 40, 40}
};

// 2차원 배열의 길이
System.out.println(score.length);	// 4 출력, 행의 수라 생각

System.out.println(score[0].length);	// 3 출력, 0번째 행(배열)의 길이
System.out.println(score[1].length);	// 3 출력
System.out.println(score[2].length);	// 3 출력
System.out.println(score[3].length);	// 3 출력

1-8. 가변배열

가변배열은 다차원 배열에서 마지막 차수의 크기를 정하지 않고 각각 다르게 지정한다.

 

// 가변배열 생성
int[][] score = new int[5][];   // 마지막 차수는 비워둠
score[0] = new int[4];
score[1] = new int[3];
score[2] = new int[2];
score[3] = new int[2];
score[4] = new int[3];


// 가변배열 생성 및 초기화
int[][] score = {
          {100, 100, 100, 100}
        , {20, 20, 20}
        , {30, 30}
        , {40, 40}
        , {40, 50, 50}
};

 

728x90
반응형

댓글