배열
"배열은 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것"
같은 타입의 여러 변수를 하나의 묶음으로 다루는 것을 '배열(array)'라고 한다. 예를 들어 10,000개의 데이터를 저장하기 위해 같은 수의 변수를 10,000번 선언해야 한다면 매우 비효율적일 것이다. 중요한 것은 '같은 타입'이어야 한다는 것이며, 서로 다른 타입의 변수들로 구성된 배열은 만들 수 없다.
int[] score = new int[5];
위 코드가 의미하는 뜻은 5개의 int값을 저장할 수 있는 배열을 생성한다는 것이다.
배열의 선언과 생성
선언방법 | 선언 예 |
타입[ ] 변수이름; | int[ ] score; String[ ] name; |
타입 변수이름[ ]; | int score[ ]; String name[ ]; |
배열을 선언하는 방법이다. 원하는 타입의 변수를 선언하고 변수 또는 타입에 배열임을 의미하는 대괄호[ ]를 붙이면 된다.
배열의 인덱스
"인덱스(index)의 범위는 0부터 '배열길이 -1' 까지."
생성된 배열의 각 저장공간을 '배열의 요소(element)'라고 한다. '배열이름[인덱스]'의 형식으로 배열의 요소에 접근한다. 인덱스(index)는 배열의 요소마다 붙여진 일련번호로 각 요소를 구분하는 데 사용된다. 인덱스는 0부터 시작된다.
배열이름. length
int[] arr = new int[5];
int temp = arr.length;
다음과 같은 코드가 있다. 첫 번째 줄은 길이가 5인 int형 배열을 선언하는 것이다.
두 번째 줄은 temp 안에 arr.length을 사용하여 배열의 길이를 temp안에 대입하여 준다. temp는 5가 저장된다.
배열의 초기화
int[] score = new int[]{50, 60, 70, 80, 90}
int[] score = {50, 60, 70, 80, 90}
코드 두줄이 존재한다. 두 개의 코드는 동일한뜻이다. 선언과 동시에 생성을 해주게 되면 new int [ ]은 생략이 가능하다는 것이다.
String배열의 선언과 생성
String[] name = new String[3];
배열의 타입이 String인 경우에도 int배열의 선언과 생성방법은 다르지 않다. 위의 코드는 3개의 문자열(String)을 담을 수 있는 배열을 생성하는 문장이다.
String배열의 초기화
String[] name = new String[]{"Kim", "Park", "Yi"};
String[] name = {"Kim", "Park", "Yi"};
정수형 배열의 초기화와 마찬가지로 초기화해 주면 된다. 이도 역시 new String [ ]을 생략할 수 있다.
String클래스
String클래스는 char배열에 기능(메서드)를 추가한 것이다.
지금까지 여러 문자인 문자열을 저장할 때 String타입의 변수를 사용했다. 사실 문자열이라는 용어는 '문자를 연이어 늘어놓은 것'을 의미하므로 문자배열인 char배열과 같은 뜻이다. 자바에서는 char배열이 아닌 String클래스를 이용해서 문자열을 처리하는 이유는 String클래스가 char배열에 여러 가지 기능을 추가하여 확장한 것이기 대문이다. 그래서 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 |
char[ ] toCharArray() | 문자열을 문자배열(char[ ])로 변환해서 반환한다. |
String클래스는 상당히 많은 문자열을 제공한다. 가장 기본적인 것 몇 가지만 살펴보고 넘어가도록 하겠다.
2차원 배열의 선언
선언 방법 | 선언 예 |
타입[ ][ ] 변수이름; | int[ ][ ] score; |
타입 변수이름[ ][ ]; | int score[ ][ ]; |
타입[ ] 변수이름[ ]; | int[ ] score[ ]; |
2차원 배열을 선언하는 방법은 1차원 배열과 같다. 대괄호[ ]가 하나 추가되었다.
int [ ][ ] score = new int [4][3]; 을 선언하게 되면 4행 3열의 2차원 배열을 선언하게 된다.
2차원 배열의 초기화
int[][] arr = new int[][] { {1, 2, 3}, {4, 5, 6} };
int[][] arr = { {1, 2, 3}, {4, 5, 6} };
2차원 배열도 괄호{ }를 사용해서 생성과 초기화를 동시에 할 수 있다. 1차원 배열보다 괄호{ }를 한번 더 써서 행별로 구분해 준다.
배열의 비교와 출력 - toString(), equals()
toString
int[] arr = {0, 1, 2, 3, 4};
int[][] arr2D = {{11, 12}, {21,22}};
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.deepToString(arr2D));
equals
String[][] str2D = new String[][] {{"aaa", "bbb"}, {"AAA", "BBB"}};
String[][] str2D2 = new String[][] {{"aaa", "bbb"}, {"AAA", "BBB"}};
System.out.println(Arrays.equals(str2D, str2D2));
System.out.println(Arrays.deepEquals(str2D, str2D2));
toString()은 일차원 배열에만 사용할 수 있다. 다차원 배열에서는 deepToString()을 사용하면 된다. deepToString()은 배열의 모든 요소를 재귀적으로 접근해서 문자열을 구성하므로 2차원뿐만 아니라 3차원 이상의 배열에도 동작한다.
equals()은 두 배열에 저장된 모든 요소를 비교해서 같은면 true, 다르면 false를 반환한다.
equals()도 일차원 배열에서만 사용이 가능하다. 따라서 다차원 배열의 비교에는 deepEquals()을 사용하면 도니다.
배열의 복사 - copyOf(), copyOfRange()
int[] arr = {0,1,2,3,4,};
int[] arr2 = Arrays.copyOf(arr, arr.length);
int[] arr3 = Arrays.copyOf(arr, 3);
int[] arr4 = Arrays.copyOf(arr, 7);
int[] arr5 = Arrays.copyOfRange(arr, 2, 4);
int[] arr6 = Arrays.copyOfRange(arr, 0, 7);
copyOf()는 배열 전체를, copyOfRange()는 배열의 일부를 복사해서 새로운 배열을 변환한다. 이 메서드 역시 지정된 범위의 끝은 포함되지 않는다.
배열의 정렬 - sort()
int[] arr = {3, 2, 0, 1, 4};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
배열을 정렬할 때는 sort()를 사용한다.
자바의 정석(기초편) CHAPTER 5. 연습문제
정답은 4, 5번이다.
4번은 대괄호[ ] 안에 배열의 크기를 지정할 수 없다. 괄호{ } 안의 데이터 개수에 따라 자동으로 결정된다.
5번은 배열을 생성할 때는 크기는 지정할 수 없다.
답은 2이다. 각각 [0], [1], [2], [3]의 인덱스가 있다. 따라서 4번째 배열은 {30, 30}이다. 그리고 이것의 길이는 2이다.
class Exercise5_3
{
public static void main(String[] args)
{
int[] arr = {10, 20, 30, 40, 50};
int sum = 0;
(문제)
}
System.out.println("sum="+sum);
}
}
정답은 for(int i=0; i <arr.length; i++) sum += arr [i];을 넣어주면 된다. 간단한 문제이다.
i는 0부터 어레이의 깅리만큼 반복될 것이다. 그리고 배열 안에 있는 요소들을 하나씩 sum에 더해주면 arr에 담긴 모든 값을 더할 수 있다.
class Exercise5_4
{
public static void main(String[] args)
{
int[][] arr = {
{ 5, 5, 5, 5, 5},
{10,10,10,10,10},
{20,20,20,20,20},
{30,30,30,30,30}
};
int total = 0;
float average = 0;
(문제)
System.out.println("total="+total);
System.out.println("average="+average);
}
}
for(int i=0; i<arr.length; i++){
for(int j=0; j<arr[i].lenght; j++){
total += arr[i][j];
}
}
average = total / (float)(arr.lenght * arr[0].length);
정답코드이다. arr [ i ][ j ]을 기준으로 한다. i에는 arr배열의 길이만큼 반복해 줄 것이고, j에는 각각 안의 요소 길이만큼 반복시켜 줄 것이다. 그리고 변수 total안에 arr [i][j] 값을 전부 더해주면 된다.
평균은 arr값을 전부 더한 total에서 어레이의 길이(arr.length * arr [0]. length)만큼 곱해준 것을 나눠주면 된다.
class Exercise5_5 {
public static void main(String[] args) {
int[] ballArr = {1,2,3,4,5,6,7,8,9};
int[] ball3 = new int[3];
// ballArr . 배열 의 임의의 요소를 골라서 위치를 바꾼다
for(int i=0; i< ballArr.length;i++) {
int j = (int)(Math.random() * ballArr.length);
int tmp = 0;
(1)
}
// ballArr 3 ball3 . 배열 의 앞에서 개의 수를 배열 로 복사한다
(2)
for(int i=0;i<ball3.length;i++) {
System.out.print(ball3[i]);
}
System.out.println();
}
}
(1)
tmp = ballArr[i];
ballArr[i] = ballArr[j];
ballArr[j] = tmp;
(2)
System.arraycopy(ballArr, 0, ba113, 0, 3);
정답코드이다.
(1)은 j에 임의의 숫자가 들어가 있기 때문에 우선 tmp에 배열의 첫 번째 요소를 넣어준다. 그리고 배열의 j번째 요소와 바꿔준 후, j번째 배열에 다시 첫 번째 요소에 들어있던 값 tmp를 넣어서 바꿔준다.
(2)는 위에서 배운 arraycopy를 이용해서 복사해 주었다.
import java.util.Scanner;
class Exercise5_6 {
public static void main(String args[]) {
String[] words = { "television", "computer", "mouse", "phone" };
Scanner scanner = new Scanner(System.in);
for(int i=0;i<words.length;i++) {
char[] question = words[i].toCharArray(); // String char[] 을 로 변환
(문제)
System.out.printf("Q%d. %s .>", 의 정답을 입력하세요
i+1, new String(question));
String answer = scanner.nextLine();
// trim() answer , equals word[i] 으로 의 좌우 공백을 제거한 후 로 와 비교
if(words[i].equals(answer.trim()))
System.out.printf(" .%n%n"); 맞았습니다
else
System.out.printf(" .%n%n"); 틀렸습니다
}
}
}
for(int j=0; j<question.length; j++){
int idx = (int)(Math.random() * question.length);
char tmp = question[i];
question[i] = question[idx];
question[idx] = tmp;
}
정답코드이다. idx에 question배열의 길이수만큼의 수를 랜덤 출력한다. 그 후 tmp에 넣어준 뒤 question안의 i번째 요소부터 차례대로 교체시켜 주며 글자의 위치를 섞어줄 수 있다.
정리
챕터 5는 배열에 관해서 배웠다. 배열을 선언하는 방법이 다양한 것을 알고 있었지만 보통 항상 쓰는 거 1가지만 사용하기 때문에 잘 모르고 있었다. 이번기회에 배열선언의 다양한 방법에 대해 자세히 알았고, String에 포함된 유용한 메서드 종류들을 알 수 있었다. 특히 euqals()만 있는 줄 알았는데 deepEuqals이 있는 줄을 몰랐다. 2차원배열이 넘어갈 때 유용하게 사용할 수 있을 것 같다. 예제문제는 반복적인 문제들만 나와서 어려운 부분은 없었다.
'Back-End > JAVA' 카테고리의 다른 글
[JAVA] 자바의 정석(기초편) 공부 - CHAPTER 6 . 객체지향 프로그래밍 I - 연습문제 (0) | 2023.06.02 |
---|---|
[JAVA] 자바의 정석(기초편) 공부 - CHAPTER 6 . 객체지향 프로그래밍 I (1) | 2023.06.02 |
[JAVA] 자바의 정석(기초편) 공부 - CHAPTER 4 . 조건문과 반복문 (0) | 2023.06.01 |
[JAVA] 자바의 정석(기초편) 공부 - CHAPTER 3 . 연산자 (0) | 2023.05.31 |
[JAVA] 자바의 정석(기초편) 공부 - CHAPTER 2 . 변수 (0) | 2023.05.31 |
남건욱's 공부기록