배열(array)이란?
o 배열(array)이란 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것이다. 서로 같은 타입의 변수로만 구성이 가능하며 다른 타입의 변수들은 구성된 배열을 만들 수 없다.
o 변수와 달리 배열은 각 저장공간이 연속적으로 배치되어 있다.
배열의 선언과 생성
o 배열을 선언하는 방법은 변수 타입 뒤 or 변수 명 뒤에 대괄호[]를 붙이면 된다. 주로 변수 타입 뒤에 선언하여 사용한다.
선언 방법 |
선언 예 |
타입[] 변수이름; |
Int[] socre; String[] str; |
타입 변수이름[]; |
Int score[]; String str[]; |
배열의 생성
o 배열을 선언하는 것은 생성된 배열을 다루기 위한 참조 변수의 공간이 만들어지는 것이고, 배열을 생성해야 값을 담을 수 있는 공간을 만드는 것이다.
o 배열의 생성은 ‘new’연산자로 생성하며 배열의 타입과 길이를 지정한다.
타입[] 변수이름; // 배열의 선언 (배열을 다루기 위한 참조변수 선언) 변수이름 = new 타입[길이]; // 배열의 생성 (실제 저장공간을 생성) |
int[] score; // int타입 배열을 다루기 위한 참조변수 score선업
score = new int[5]; // int타입 값 5개를 저장할 수 있는 배열
타입[] 변수이름 = new 타입[길이];
int[] score2 = new int[5]; // 길이가 5인 int배열
|
1. int[] score;
int형 배열 참조 변수 score를 선언하며 데이터를 저장할 수 있는 공간은 아직 마련되지 않았다.
2. score = new int[5];
연산자 ‘new’에 의해서 메모리의 빈 공간에 길이가 5인 int형 배열을 만들었다.
3. 각 배열요소는 생성 시 자동으로 int의 기본값(default)인 0으로 초기화된다.
4. 대입 연산자 ‘=’에 의해 배열의 주소(0x100)가 int형 배열 참조 변수인 score에 저장된다.
배열의 길이와 인덱스
o 생성된 배열의 저장 공간을 배열의 요소(element)라고 하며 배열 이름인 인덱스의 형식으로 배열에 접근을 한다. 인덱스(index)의 범위는 0부터 배열길이 n-1까지이다.
o Int score = new int[5]일 경우 배열의 길이는 5이고 사용 가능한 인덱스 범위는 0~4까지다. 각 배열의 사용은 score[0] = 10; 의 식으로 사용한다.
o 배열을 사용 시 index의 범위를 벗어난 값을 사용하면 안 된다. 인덱스를 변수로 많이 사용하는데 변수의 값은 실행 시에 대입이 되므로 컴파일러가 미리 걸러주지 못하기에 주의해야한다.
o Int[ ] arr = new int[0]처럼 배열의 길이가 0인 배열도 생성 가능하다.
배열의 초기화
o 배열은 생성과 동시에 자동으로 자신의 타입에 해당하는 값으로 초기화되며 원하는 값을 저장하려면 각 요소마다 값을 지정해줘야 한다.
int[] arr = new int[5];
arr[0]= 10; // 각 요소에 값을 저장
arr[1]= 20;
arr[2]= 30;
arr[3]= 40;
arr[4]= 50;
|
o 다음과 같이 괄호{ }안에 쉼표로 구분해서 간단히 생성할 수도 있으며 괄호{ }안의 값의 개수에 의해 길이가 결정되므로 괄호 [ ]안에 배열의 길이는 작성하지 않아도 된다.
o 'new 타입[ ]'을 생략할 수도 있으나 선언과 생성을 따로 하는 경우에는 생략을 할 수 없다.
int[] arr = new int[] {10,20,30,40,50};
int[] arr2 = {10,20,30,40,50};
int[] score;
score = new int[] {10,20,30,40,50}; //OK
score = {10,20,30,40,50}; //에러, 배열 선언과 생성을 따로 하는 경우 new 생략 불가
|
배열의 복사
o 배열은 한번 생성 시 길이를 변경할 수 없기에 더 많은 저장 공간이 필요할 경우 보다 큰 배열을 만들어 내용을 복사해야 한다. 그러나 이러한 작업은 비용이 꽤 들어가기에 처음부터 길이를 넉넉하게 잡아 이러한 상황이 가능한 적게 해야 한다. 새로 생성하는 배열의 길이는 기존의 2배 정도로 하는 것이 좋다.
int[] arr = new int[] {10,20,30,40,50};
int[] tmp = new int[arr.length*2]; //1.
for(int i=0;i<arr.length;i++) { //2.
tmp[i]=arr[i];
}
arr=tmp; //3.
|
1. 배열arr 보다 길이 2배 긴 tmp배열을 생성해준다. tmp배열의 각 요소는 기본값인 0으로 초기화된다.
2. for을 사용하여 배열 arr의 모든 요소를 배열 tmp에 복사해준다.
3. 참조변수 arr에 참조변수 tmp를 저장하게 함으로써 배열 arr은 배열 tmp를 가리키게 된다. 배열 arr은 배열 tmp와 같은 배열을 가리키게 되고 이전에 arr이 가리키던 배열은 사용할 수 없게된다.
System.arraycopy( )를 이용한 배열의 복사
o 배열을 복사할 때 for문 대신 System클래스의 arraycopy()를 사용하면 간단하고 빠르게 복사할 수 있다. arraycopy()는 지정된 범위의 값들을 통째로 복사하는데 각 요소들이 연속적으로 저장되어 있는 특성 때문에 가능하다.
o arraycopy( )를 호출할 때는 어떤 배열의 몇 번째 요소에서 어떤 배열의 몇 번째 요소로 몇 개의 값을 복사 할 것인 것 지정해줘야 한다.
int[] arr = new int[] {10,20,30,40,50};
// int[] newArr; 배열의 선언만 했을 경우 복사 불가
int[] newArr = new int[arr.length*2];
// arr[0]에서 score[0]으로 arr.length개 만큼 복사
System.arraycopy(arr, 0, newArr, 0, arr.length);
|
String배열
String배열의 선언과 생성
o 배열 타입이 String이여도 int배열의 선언과 생성방법은 동일하며 String타입의 참조 변수의 기본값은 null이므로 각 요소들은 null로 초기화 된다.
o 변수 타입에 따른 기본값은 다음과 같다.
자료형 |
기본값 |
boolean |
false |
char |
‘\u0000’ |
byte, short, int |
0 |
long |
0L |
float |
0.0f |
double |
0.0d 또는 0.0 |
참조형 변수 |
null |
String 배열의 초기화
o 초기화 또한 int배열과 동일하다. 특별히 String클래스만 “Kim”과 같이 큰따옴표만으로 간략히 표현하는 것이 허용되지만 원래 String은 클래스이므로 new연산자를 통해 객체를 생성해야 한다.
String[] name = new String[3];
name[0] = "Kim";
name[1] = "Park";
name[2] = "Yi";
String[] name2 = new String[] {"Kim","Park","Yi"};
String[] name3 = {"Kim","Park","Yi"};
String[] name4 = new String[3];
name[0] = new String("Kim");
name[1] = new String("Park");
name[2] = new String("Yi");
|
o String 배열은 배열에 실제 객체가 아닌 주소가 저장되어 있다. 이처럼 참조형 배열의 경우 배열에 저장되는 것은 객체의 주소이며 참조형 배열을 객체 배열이라고도 한다.

char배열과 String 클래스
o String클래스는 char배열에 기능(메소드)를 추가한 것이다. 자바에서 String클래스를 이용하여 문자열을 처리하는 이유는 char배열에 여러 가지 기능을 추가하여 확장했기 때문에 문자열을 다루기 더 편리하다.
o char배열과 String배열의 한 가지 중요한 차이점은 String객체(문자열)는 읽을 수만 있고 변경할 수 없다. 변경되는 것처럼 보이지만 문자열은 변경 될 수 없기에 실제로는 새로운 내용의 문자열이 생성되는 것이다.
String str = "JAVA";
str = str + 8; //변경이 아닌 새로운 문자열이 str에 저장
System.out.println(str); // JAVA8
|
String클래스의 주요 메서드
메서드 |
설명 |
char charAt(int index) |
문자열에서 해당 위치(index)에 있는 문자를 반환한다. |
int length( ) |
문자열의 길이를 반환한다. |
string substring(int from, int to) |
문자열에서 해당 범위(from ~ to)에 있는 문자열을 반환한다. (to는 포함되지 않음) |
boolean equals(Object obj) |
문자열의 내용이 obj와 같은지 확인한다. 같으면 true, 다르면 false가 된다. |
char[] toCharArray() |
문자열을 문자배열(char [])로 변환해서 반환한다. |
char배열과 String클래스의 변환
o char배열을 String클래스로 변환한거나 그 반대로 해야하는 경우 다음 코드를 이용하면 된다.
char chArr[] = {'A', 'B', 'C'};
String str = new String(chArr); //char배열 -> String
char[] tmp = str.toCharArray(); // String -> char배열
System.out.println(str);
System.out.print(tmp[0]);
|
커맨드 라인을 통해 입력받기
o Scanner클래스 외에 화면을 통해 사용자 입력 값을 받는 방법이 있는데 커맨드 라인을 이용하는 것이다. 이는 main메서드의 매개 변수(args)에 전달된다. 입력된 매개 변수는 공백으로 구분하기에 입력 값에 공백이 있는 경우 큰 따옴표(“)로 감싸주어야 하며 숫자를 입력해도 문자열로 처리된다는 것을 주의해야 한다.
class HelloWorld {
public static void main(String[] args){
for(int i=0;i<args.length;i++) {
System.out.println(args[i]);
}
}
}
|

o 이클립스에서는 상단 메뉴 Run - Run Configuration - Arguments에서 입력하면 된다.

o 만약 입력이 없는 경우 참조변수 args의 값은 null이 되고 배열 args[]를 사용하는 모든 코드에서 에러가 발생할 것이다. 이러한 에러를 피하려면 if(args!=null) 명령어를 추가해주어야 하나 JVM이 입력된 매개변수가 없을 때, null대신 크기가 0인 배열을 생성해서 args에 전달하도록 구현이 되어있어 입력하지 않아도 된다.
다차원 배열
2차원 배열의 선언과 인덱스
o 2차원 배열은 주로 테이블 형태의 데이터를 담는데 사용되며 5행 3열의 배열을 생성 시 다음과 같다.
int[][] arr = new int[5][3];
|
5행 3열 배열
2차원 배열의 index
o 2차원 배열은 행(row)과 열(columm)로 구성되어 있기에 index도 각각 행과 열로 존재한다. 배열 이름[행 index][열 index]로 되어있다.
o 배열 arr에 5의 값을 0행 2열에 담을 경우 다음과 같이 하면된다.
arr[5][2] = 5;
2차원 배열의 초기화
o 2차원 배열도 괄호{ }를 사용하여 초기화 할 수 있다. 간단히 한 줄로 작성할 수도 있지만 가독성을 위해 행 별로 줄 바꿈을 해주는 것이 좋다.
int[][] arr = new int[][] {{1,2,3},{4,5,6},{7,8,9}}; //초기화
int[][] arr = {{1,2,3},{4,5,6},{7,8,9}}; // new int 생략 가능
int[][] arr = { // 가독성을 위해 행 별 줄 바꿈
{1,2,3},
{4,5,6},
{7,8,9}
};
|
o 2차원 배열을 ‘배열의 배열’로 구성되어 있다. 1차원 배열을 다시 배열로 묶은 것이다. arr.length의 값은 행의 길이인 3이되고 arr[0].length은 배열 참조 변수 arr[0]이 참조하고 있는 배열의 길이 즉, 배열 arr의 열의 길이인 3이 된다.
가변 배열
o 2차원 이상의 다차원 배열을 생성할 때 마지막 차수의 길이를 지정하지 않고 추후 각기 다른 배열을 생성함으로써 고정형태가 아닌 유동적으로 가변 배열을 구성할 수 있다.
o 마지막 차수를 입력하여 배열을 생성할 경우 직사각형 테이블 형태의 고정적인 배열만 생성이 가능하나 마지막 차수를 입력하지 않으면 행마다 각기 다른 길기의 배열을 생성할 수 있다. 가변 배열도 마찬가지도 생성과 초기화를 동시에 하는 것이 가능하다.
int[][] arr = new int[5][]; arr[0] = new int[4]; arr[1] = new int[1]; arr[2] = new int[3]; arr[3] = new int[2]; arr[4] = new int[5]; |
int[][] arr = { {10,11,12,13}, {25}, {33,38,34}, {41,45}, {50,52,59,57,56}, }; |
다차원 배열의 활용
o 주어진 9x9 배열에서 배(1)의 위치를 찾는 코드 작성
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
final int SIZE = 10;
int x=0, y=0;
char[][] board= new char[SIZE][SIZE]; // 화면에 출력되는 보드 판(배열)
int[][] shipboard = { // 배(1)의 위치를 가지고 있는 배열
{0,1,0,0,0,0,0,0,1},
{0,0,1,0,0,0,0,0,0},
{0,0,0,1,0,0,0,0,0},
{0,0,0,1,0,0,0,1,0},
{0,0,0,1,0,0,0,0,0},
{0,0,1,0,0,1,0,1,0},
{0,0,0,0,0,0,1,0,0},
{0,0,0,0,1,0,0,0,0},
{0,0,0,0,0,1,0,0,1},
};
for(int i=1;i<SIZE;i++) {
board[0][i] = board[i][0] = (char) (i+'0'); // 숫자를 문자 출력으로 변환
}
Scanner scanner = new Scanner(System.in);
while(true) {
System.out.print("좌표를 입력 하세요. (종료는 00) > ");
String input = scanner.nextLine();
if(input.length()==2) { // 입력 값을 char로 변환 후 각각 저장(행,열)
x=input.charAt(0)-'0'; // 문자를 숫자 출력으로 변환
y=input.charAt(1)-'0';
if(x==0 && y==0) break;
}
if(input.length()!=2||x<=0||x>=SIZE||y<=0||y>=SIZE) {
System.out.println("잘못된 입력 입니다. 다시 입력해주세요.");
continue;
}
// 입력한 값의 위치에 배(1)가 존재하는 경우 보드 판에 O표시
board[x][y] = (shipboard[x-1][y-1] == 1)? 'O':'X' ;
// 보드판 출력
for(int i=0;i<SIZE;i++) {
System.out.println(board[i]);
}
}
}
}
|
'언어 > 자바의 정석' 카테고리의 다른 글
[자바의 정석] Chapter 6 객체 지향 프로그래밍 요약(2) (0) | 2021.02.03 |
---|---|
[자바의 정석] Chapter 6 객체 지향 프로그래밍 요약(1) (0) | 2021.02.03 |
[자바의 정석] Chapter 3 연산자(Operator) (0) | 2021.01.21 |
[자바의 정석] Chapter 2 변수 (0) | 2021.01.19 |
[자바의 정석] Chapter 1 자바를 시작하기 전 (0) | 2021.01.18 |