CH 5. 배열
1. 배열
1.1. 배열(array)란?
-같은 타입의 여러 변수를 하나의 묶음으로 다루는 것
-서로 다른 타입의 값들을 하나로 묶으려면 ‘클래스’를 정의하면 된다.
-int[] score = new int[5];
-변수 score는 배열을 다루는데 필요한 참조변수
1.2. 배열의 선언과 생성
-대괄호 []는 타입 뒤에 붙여도 되고 변수이름 뒤에 붙여도 된다.
-배열의 생성
● 배열을 선언하는 것은 단지 생성된 배열을 다루기 위한 참조변수를 위한 공간이 만들어질 뿐.
● 연산자 ‘new’와 함께 배열의 타입과 길이를 지정해 주어야 한다.
● I.e. int[] = score;
score = new int[5];
● 배열의 선언과 생성을 동시에 하면 간략히 한 줄로 할 수 있다.
● I.e. int[] score = new int[5];
-배열의 생성 과정
1. int[] score; –> int형 배열 참조변수 score를 선언한다.
2. score = new int[5]; –> 연산자 ‘new’에 의해서 메모리의 빈 공간에 5개의 int형 데이터를 저장할 수 있는 공간 마련한다.
3. 각 배열요소는 자동적으로 int의 기본값인 0으로 초기화된다.
4. 대입 연산자 ‘=’에 의해 배열의 주소가 int형 배열 참조변수 score에 저장된다.
1.3. 배열의 길이와 인덱스
-배열의 요소: 생성된 배열의 각 저장공간
-배열이름[인덱스]의 형식으로 배열의 요소에 접근한다.
-인덱스: 배열의 요소마다 붙여진 일련번호
-인덱스의 범위: 0부터 배열길이-1까지
-인덱스로 상수 대신 변수나 수식을 사용할 수도 있다.
-cf. 배열과 달리 변수는 배열처럼 for문을 사용해서 각 변수에 접근할 수 있다.
-유효한 범위를 벗어난 값을 index로 사용할 경우 컴파일러에서 걸러주지 못하고 실행 시에 에러 발생한다. (ArrayIndexOutOfBoundException)
-배열의 길이: 값을 저장할 수 있는 공간의 개수
● 최대값은 int 타입의 최대값
● 배열의 길이는 0일 수도 있다.
-배열이름.length: 배열은 한번 생성하면 길이를 변경할 수 없기 때문에 배열이름.length는 상수이다.
-배열의 길이 변경하기:
1. 더 큰 배열을 새로 생성한다.
2. 기존 배열의 내용을 새로운 배열에 복사한다.
3. 처음부터 배열의 길이를 넉넉하게 잡는다. 기존의 2배정도의 길이
1.4. 배열의 초기화
-기본 값으로 초기화되므로 따로 초기화를 해주지 않아도 되지만 원하는 값을 저장하려면 아래와 같이 각 요소마다 값을 지정해 줘야 한다.
-int[] score = new int [5];
score[0] = 50;
-배열을 간단히 초기화 할 수 있는 방법도 있다.
-int[] score = new int[]{50, 60, 70};
-int[] score = {50, 60, 70};
-배열의 선언과 생성을 따로 하는 경우에는 생략할 수 없다.
-배열을 매개변수로 받는 메서드 호출 시에도 new타입 []을 생략할 수 없다.
-괄호 {} 안에 아무 것도 넣지 않으면, 길이가 0인 배열이 생성된다.
-배열의 출력
● for문 사용
● Array.toString(배열이름) 메서드 사용
● 배열 이름 바로 출력할 경우 타입@주소의 형식으로 출력됨
● 배열을 가리키는 참조변수를 출력해봐야 별로 얻을 정보가 없다.
● char배열은 println메서드로 출력하면 각 요소가 구분자없이 그대로 출력된다.
1.5. 배열의 복사
-보다 큰 배열을 만들고 이전 배열로부터 내용을 복사해야 한다.
1. for문을 이용한 배열 복사법
int[] arr = new int[5];
int[] tmp = new int[arr.length * 2];
for (int num = 0; num < arr.length; num ++){
tmp[num] = arr[num];
}
arr = tmp;
-전에 arr이 가리키던 배열은 더 이상 사용할 수 없게 된다.
-쓸모없게 된 배열은 JVM의 가비지 컬렉터에 의해서 자동적으로 메모리에서 제거된다.
2. System.arraycopy()를 이용한 배열의 복사
-지정된 범위의 값들을 한번에 통째로 복사한다.
-더 효율적인 방법
System.arraycopy(num, 0, newNum, 0, num.length);
--> num[0]에서 newNum[0]으로 num.length개의 데이터를 복사
1.6. 배열의 활용
-따로 포스트를 작성하여 올리도록 하겠다.
2. String배열
2.1. String배열의 선언과 생성
String[] name = new String[5];
-참조형 변수의 기본값은 null이므로 각 요소의 값은 null로 초기화 된다.
-변수의 타입에 따른 기본값
● boolean: false
● char: ‘\u0000’
● byte, short, int: 0
● long: 0L
● float: 0.0f
● double: 0.0d 또는 0.0
● 참조형 변수: null
2.2. String 배열의 초기화
-일반 배열과 비슷함
-특별히 String 클래스만 “Kim”과 같이 큰 따옴표만으로 간략히 표현하는 것이 가능
String[] name = new String[3];
name[0] = new String[“Kim”];
-참조형 배열의 경우 배열에 저장되는 것은 객체의 주소이다.
-객체의 메모리에 저장된 주소인 4 byte의 정수값 또는 null 저장된다.
2.3. char 배열과 String 클래스
-String 클래스는 char 배열에 기능을 추가한 것
-char배열과 그에 관련된 기능들을 함께 묶어서 클래스에 정의한다.
-String객체는 읽을 수만 있을 뿐 내용을 변경할 수는 없다.
-변경 가능한 문자열을 다루려면 StringBuffer 클래스를 사용한다.
-String 클래스의 주요 메서드
● char charAt(int index)
● int length()
● String substring(int from, int to): 문자열의 일부를 뽑아낼 수 있다.
● boolean equals(String str), equalsIgnoreCase()
● char[] toCharArray()
-char배열과 String클래스의 변환
char[] chArr = {‘A’, ‘B’, ‘C’};
String str = new String(chArr);
char[] tmp = str.toCharArray();
2.4. 커맨드 라인을 통해 입력받기
-화면을 통해 사용자로부터 값을 입력받을 수 있는 간단한 방법
-클래스이름 뒤에 공백문자로 구분하여 여러 개의 문자열을 프로그램에 전달할 수 있다.
-String 배열에 담겨서 main 메서드의 매개변수에 전달된다.
-입력될 값에 공백이 있는 경우 큰따옴표로 감싸주어야 한다.
-숫자를 입력해도 숫자가 아닌 문자열로 처리된다.
-매개변수를 입력하지 않으면 length값이 0이 되므로 배열 args를 사용하는 모든 코드에서 에러 발생한다.
but JVM이 입력된 매개변수가 없을 때 null 대신 크기가 0인 배열을 생성해서 넣어준다.
3. 다차원 배열
3.1. 2차원 배열의 선언과 인덱스
-테이블 형태의 데이터 담는 데 사용
int[][] = new int[4][3];
-2차원 배열의 index
● 행의 범위: 0 ~ 행의 길이 –1
● 열의 범위: 0 ~ 열의 길이 –1
3.2. 2차원 배열의 초기화
int[][] arr = new int[][]{{1,2,3}, {4,5,6}};
-가능하면 행별로 줄바꿈 해주는 것이 보기에 좋다.
-2차원 배열은 배열의 배열로 구성되어 있다.
-향상된 for문으로 배열의 각 요소에 저장된 값들을 순차적으로 읽어올 수는 있지만, 배열에 저장된 값을 변경할 수는 없다.
3.3. 가변 배열
-보다 자유로운 형태의 배열을 구성할 수 있다.
-마지막 차수의 길이를 지정하지 않고, 추후에 고정된 형태가 아닌 보다 유동적인 가변 배열을 구성할 수 있다.
int[][] score = new int[3][];
score[0] = new int[4];
score[1] = new int[3];
score[2] = new int[5];
3.4. 다차원 배열의 활용
-따로 포스트를 작성하여 올리도록 하겠다.