JAVA의 정석 5장 - 배열(Array)

김동환·2023년 12월 25일

JAVA의 정석

목록 보기
5/8
post-thumbnail

제 5장 - 배열(Array)


1. 배열(Array)

배열

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

  • 각 저장공간이 연속적으로 배치.
  • int[] score = new int[5]; //배열의 선언
  • int[] score = new int[]{10, 20, 30, 40, 50};
  • int[] score = {10, 20, 30, 40, 50};
  • 인덱스 범위 : 0 ~ '배열길이-1'까지
  • 에러 주의(ArrayIndexOutOfBoundesException)
  • 배열의 길이는 int범위의 양의 정수(0도 가능).(배열이름.length)

배열 선언과 생성

선언방법선언 예
타입[]변수이름int[] score;
타입 변수이름[ ]int score[];

배열을 선언하는 것은 단지 생성된 배열을 다루기 위한 참조변수를 위한 공간이 만들어질 뿐이고,
배열을 연산자 'new'와 함께 생성해야만 비로소 값을 저장할 수 있는 공간이 만들어지는 것이다.

타입[ ] 변수이름;
변수이름 = new 타입[길이];

int[] score = new int[5];
  • 배열의 길이는 int범위의 양의 정수(0도 포함)이어야 한다.
  • 배열은 한번 생성하면 길이를 변경할 수 없다.
  • 초기화하지 않은 경우 기본값으로 초기화 된다.

변수 타입에 따른 기본값

자료형기본값
booleanfalse
char'\u0000'
byte, short, int0
long0L
float0.0f
double0.0
참조형 변수null

배열 초기화

int[] score = new int[]{ 50, 60, 70, 80, 90};
int[] score = { 50, 60, 70, 80, 90};
  • 단, 배열의 선언과 생성을 따로하는 경우에는 생략할 수 없다.
int[] score;
score = new int[]{ 50, 60, 70, 80, 90};	//OK
score = { 50, 60, 70, 80, 90};			//에러

배열의 길이를 변경하는 방법

  1. 더 큰 배열을 새로 생성한다.(보통 2배)
  2. 기존 배열의 내용을 새로운 배열에 복사한다.
  3. 참조변수의 주소를 저장
  • 반복문
int[] arr = new int[5]; //기존 배열

int[] tmp = new int[arr.length * 2] //2배 길이 배열 생성

for(int i=0; i < arr.length; i++)
	tmp[i] = arr[i]; //arr[i]의 값을 tmp[i]에 저장
    
arr = tmp; //참조변수 arr이 새로운 배열 tmp를 가리키게 함.
  • System.arraycopy()
char[] abc = {'A', 'B', 'C', 'D'};
char[] num = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};

//배열 abc와 num을 붙여서 하나의 배열(result)로 만든다.
char[] result = new char[abc.length + num.length];
System.arraycopy(abc, 0, result, 0, abc.length);
System.arraycopy(num, 0, result, abc.length, num.length);
System.out.println(result);

//배열 abc를 배열 num의 첫 번째 위치부터 배열 abc의 길이만큼 복사
System.arraycopy(abc, 0, num, 0, abc.length);
System.out.println(num);

2. String 배열

  • String 클래스는 cahr배열에 기능을 추가한 것이다.

  • String객체는 읽을 수만 있을 뿐 내요을 변경할 수 없다.

  • char배열과 String은 서로 변환이 가능하다.

char[] chArr = { 'A', 'B', 'C' };
String str = new String(chArr);
char[] tmp = str.toCharArray();
  • 커맨드라인을 통해 입력된 문자열은 String 배열에 담겨서 main매서드의 매개변수(args)에 전달된다.
public static void main(String[] args) {...}
String str = "abc";
String str1 = new String("abc");
//전자는 HEAP의 메모리 영역인 String Constant Pool에서 관리되므로
//HEAP에 바로 할당되는 후자보다 유리.
//왜냐하면 String은 기본적으로 불변의 성질을 가져야 함.
//String Constant Pool에 할당된 객체는 재활용이 됨.
//따라서 전자가 유리.

Char 배열

  • String클래스는 char배열에 기능(메서드)을 추가한 것.
  • String객체(문자열)은 읽기만 가능, 변경 불가 - 불변성

String 클래스의 주요 메서드

char charAt(int index) //index에 있는 문자를 반환
int length() //문자열 길이 반환
String substring(int from, int to) //(from~to)에 있는 문자열을 반환.(to는 미포함)
boolean equals(Object obj) //문자열 같은지 비교. true, false 반환
boolean equalsIgnoreCase(Object obj) //대소문자 구분없이 비교
char[] toCharArray() //문자열을 문자배열로 변환해서 반환

3. 다차원 배열

2차원 배열

  • 배열의 배열로 구성됨. -- 1차원 배열의 묶음
int[][] score = new int[4][3]; //선언
int[][] arr = new int[][]{{1, 2, 3}, {4, 5, 6}}; //선언과 초기화-1
int[][] arr = {{1, 2, 3}, {4, 5, 6}}; //선언과 초기화-2

2차원 배열의 선언과 인덱스

선언방법선언 예
타입[ ][ ]] 변수이름int[][] score;
타입 변수이름[ ][ ]int score[][];
타입[ ] 변수이름[ ]int[] score[];

2차원 배열의 초기화

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

가변 배열

각 행마다 다른 길이를 가지고 있는 배열
다차원 배열을 생성할 때 마지막 차수의 길이를 지정하지 않고,
추후에 각기 다른 길이의 배열을 생성함으로써 가변 배열을 구성할 수 있다.

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];
//가변 배열 선언 - 0으로 자동 초기화
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},
					{50, 50, 50}
				}

[참고 문헌]
https://velog.io/@pjoon357/%EC%9E%90%EB%B0%94%EC%9D%98-%EC%A0%95%EC%84%9D-5%EC%9E%A5-%EC%A0%95%EB%A6%AC#2-string-%EB%B0%B0%EC%97%B4
https://velog.io/@tone8943/%EC%9E%90%EB%B0%94%EC%9D%98%EC%A0%95%EC%84%9D-5%EC%9E%A5-%EB%B0%B0%EC%97%B4-%EC%9A%94%EC%95%BD#string

profile
신입 백엔드 개발자입니다!

0개의 댓글