1. 배열(Array)
1.1 배열이란?
Def) 배열: 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것을 배열이라고 한다.
1.2 배열의 선언과 생성
- 선언 방법
-> 타입[] 변수이름 ex) int[] score; String[] name
-> 타입 변수이름[] ex) int score[]; String name[]
- 배열의 생성
-> 변수이름 = new 타입[길이] // 배열을 생성(실제 저장공간을 생성한다.)
- 배열의 선언과 생성을 동시에 할 수 있다.
1.3 배열의 길이와 인덱스
- 인덱스의 범위는 0부터 '배열 길이 -1'까지
- 인덱스 0부터 시작한다.
- 배열의 범위에 속하지 않는 값을 인덱스로 하여 출력하도록 하면 "ArrayIndexOutOfBoundsException" 발생한다.
-> ArrayIndexOutOfBoundsException : 배열의 index가 유효한 범위을 벗어났다는 에러가 난다.
- 배열 길이는 거의 제약이 없다.
- 배열 길이는 JVM이 관리한다.
- 배열의 길이 변경하기 (변경할 수 없고 새로 만들어야한다. )
(1) 더 큰 배열을 새로 생성한다.
(2) 기존 배열의 내용을 새로운 배열에 복사한다.
1.4 배열의 초기화
- 배열의 길이가 큰 경우에는 요소 하나하나에 값을 지정하기 보다는 for문을 사용하면 좋다.
- 배열의 생성과 초기화를 한 번에 할 수 있다.
- 배열의 선언과 생성을 따로하는 경우는 new int를 생략할 수 없다.
- Arrays.ToString(배열 이름) : 배열의 모든 요소를 '[ 첫번째 요소, 두번째 요소, ...]'와 같은 형식의 문자열로
- 만들어서 반환한다. (모든 요소를 출력한다. )
Ex ) int[] iArr이라는 배열이 있을 때, iArr의 값을 하나씩 출력하거나 또는 Arrays.ToString 메서드를 이용하지 않고
바로 출력하면 오류가 난다.
-> iArr은 참조변수이기 때문에 변수에 저장된 값, 즉 배열의 주소가 출력될 것이기 때문이다.
-> "타입@주소"형식으로 출력된다.
-> 배열을 가리키는 참조변수를 출력해봐야 별로 얻을 정보가 없다.
-> 예외적으로 char배열은 println메서드로 출력하면 각 요소가 구분자 없이 그대로 출력된다.
-> println()메서드가 char배열일 때만 이렇게 동작하도록 작성되었기 때문이다.
1.5 배열의 복사
1) 얕은 복사: 값의 주소를 저장한다.
2) 깊은 복사: 배열의 원소를 하나하나 저장한다.
Ex) ArrayEx2 - 얕은 복사
- 참조변수 arr에 참조변수 tmp의 값을 저장한다.
- arr = tmp 와 같이 대입하고 난 다음에는, 이름만 다를 뿐 완전히 같은 배열이 된다.
- 즉, arr 과 tmp의 주솟값이 같기 때문에 arr == tmp 를 조회하면 true이다.
- 배열은 참조변수를 통해서만 접근가능하므로 자신을 가리키는 참조변수가 없는 배열은 사용할 수 없다. 이렇게 쓸모없게 된 배열은 JVM의 가비지 컬렉터에 의해 자동 제거된다.
Note) 실행 결과

Ex) 얕은 복사, 깊은 복사
Note) 실행 결과

Ex) 배열의 복사
- int [] c1 = {1, 2, 3, 4};
1) int [] c2 = Arrays.copyOf(c1, c1.length);
2) int [] c2 = c1.clone(); // Object.clone();
3) System.arraycopy() : System클래스의 arraycopy()를 사용하면 배열을 복사할 수 있다.
- System.arraycopy( num, 0, newNum, 0, num.length ) : num[0]에서 newNum[0]으로 num.length개의 데이터를 복사한다.
Note) 실행 결과

1.6 배열의 활용
Ex 5-8) 로또 번호 만들기
Note) 실행 결과

- 먼저, 길이가 45인 배열에 1부터 45까지의 값을 담는다.
- 반복문을 이용해서 ball[i]와 random()에 의해서 결정된 임의의 위치에 있는 값과 자리를 바꾸는 것을 6번 반복한다.
- 1 ~ 45번까지 번호가 쓰인 카드를 섞어서 맨 위의 6장을 꺼내는 것과 같다.
Ex 5-10) 버블소트(Bubble Sort)
Note) 실행 결과

- 길이가 10인 배열에 0 ~ 9사이의 임의 값으로 채운 다음에 버블 소트 알고리즘을 통해서 크기순으로 배열한다.
- 배열의 길이가 n일 때, 배열의 첫 번째부터 n - 1까지의 요소에 대해 근접한 값과 크기를 비교해서 자리 바꿈을 반복.
- for문을 비교할수록 비교해야 하는 범위는 하나씩 줄어든다.
- 그래서 원래는 numArr.length - 1 번을 비교해야 하는데
- 매 반복마다 비교횟수가 1씩 줄어들므로 바깥쪽 for문의 제어 변수 i를 빼주는 것이다.
- 자리 바꿈이 없다는 건 정렬이 완료됨을 뜻한다. 자리바꿈 없으면 break로 반복문으로 빠져나간다.
2. String 배열
2.1 String배열의 선언과 생성
String[] name = new String[3]; // 3개의 문자열을 담을 수 있는 배열을 생성한다.
- 3개의 String타입의 참조변수를 저장하기 위한 공간이 마련되도 참조형 변수의 기본 값은 null이므로 각 요소의 값은 null로 초기화 된다.
- String은 클래스이므로 new 연산자를 이용해서 객체를 생성해야만 한다.
2.2 String 배열의 초기화
Ex 5-13) 16진수를 2진수로 변환
Note) 실행 결과

- 변환하고자 하는 16진수를 hex에 나열한다.
- 문자 배열 binary에는 0000~1111까지 모두 16개의 값을 문자열로 저장한다.
- for문을 이용하여 배열 hex에 저장된 문자를 하나씩 읽어서 그에 해당하는 이진수 표현을
- 배열 binary에서 얻어 result에 덧붙이고 그 결과를 화면에 출력한다.
2.3 char배열과 String 클래스
- 자바에서는 char 배열이 아닌 String클래스를 이용해서 문자열을 처리한다.
- 그 이유는 String클래스가 char배열에 여러 가지 기능(메서드)을 추가하여 확장한 것이기 때문이다.
- 그러므로 char보다 String을 사용하는 게 문자열을 다루기 더 편하다.
- String클래스의 주요 메서드
-> 문자열이름.charAt(int index) : 문자열에서 해당 위치(index)에 있는 문자를 반환한다.
-> int length() : 문자열의 길이를 반환한다.
-> 문자열이름.substring(int from, int to) : 문자열에서 해당 범위(from~to)에 있는 문자열을 반환한다. (to는 포함 X)
-> char[] toCharArray() : 문자열을 문자 배열(char[])로 변환해서 반환한다.
- String과 char의 변환
Ex 5-14)
Note) 실행 결과

- char[] chArr = src.toCharArray(); String src를 char[]로 변환
2.4 커맨드 라인을 통해 입력받기
- 커맨드 라인을 이용해서 프로그램을 실행할 때 클래스 이름 뒤에 공백 무자로 구분하여
- 여러 개의 문자열을 프로그램에 전달할 수 있다.
- Integer.parseInt(): 문자열을 숫자로 바꾸는 메서드
3. 다차원 배열
3.1 2차원 배열의 선언과 인덱스
- 2차원 배열을 선언하는 방법은 1차원 배열과 같다. 괄호[]가 하나 더 들어간다.
- 아래 코드는 4행 3열의 2차원 배열을 생성.
int [][] score = new int[4][3];
3.2 2차원 배열의 초기화
Ex 5-18)
Note) 실행 결과

- 2차원 배열score의 모든 요소의 합을 구하고 출력하는 예제이다.
3.3 가변 배열
- 2차원 이상의 다차원 배열을 생성할 때. 전체 배열 차수 중 마지막 차수의 길이를 지정하지 않고
- 추후에 각기 다른 길이의 배열을 생성함으로써 고정된 형태가 아닌 보다 유동적인 가변 배열을 구성할 수 있다.
3.4 다차원 배열의 활용
Ex 5-20) 입력한 2차원 좌표의 위치에 X를 표시
Note) 실행결과


- 둘이 마주 앉아 다양한 크기의 배를 상대방이 알지 못하게 배치한 다음, 번갈아가며
- 좌료를 불러서 상대방의 배의 위치를 알아내는 게임의 예제이다.
- 2차원 배열 char배열 board는입력한 좌표를 표시하기 위한 것이다.
- 2차원 배열 byte배열 shipBoard에는 상대방의 배의 위치를 저장한다.
- 0은 바다, 1은 배가 있는 것이다.
- char배열이라서 println메서드를 사용가능하다.
'Java > Java의 정석' 카테고리의 다른 글
Chapter 07 객체지향 프로그래밍 II (0) | 2022.02.22 |
---|---|
Chapter 06 객체지향 프로그래밍 I (0) | 2022.02.22 |
Chapter 04 조건문과 반복문 (0) | 2022.02.19 |
Chapter 03 연산자(Operator) (0) | 2022.02.19 |
Chapter 02 변수(Variable) (0) | 2022.02.17 |