1. 배열
1) 배열(Array)이란?
- 배열 : 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것
- 배열은 '같은 타입'이어야 하며, 서로 다른 타입의 변수들로 구성된 배열은 만들 수 없다
- 변수와 달리, 배열은 각 저장 공간이 연속적으로 배치되어 있다는 특징이 있다
int[] score = new int[5]; // 5개의 int 값을 저장할 수 있는 배열을 생성한다
2) 배열의 선언과 생성
배열을 선언하는 방법은 원하는 타입의 변수를 선언하고 변수 또는 타입에 배열임을 의미하는 대괄호[]를 붙이면 된다
대괄호는 타입 뒤에 붙여도 되고, 변수 이름 뒤에 붙여도 되지만 전자를 선호한다
선언 방법 | 선언 예 |
타입[] 변수이름; | int[] score; String[] name; |
타입 변수이름[]; | int score[]; String name[]; |
배열을 선언하는 것은 단지 생성된 배열을 다루기 위한 참조변수를 위한 공간이 만들어질 뿐이고, 배열을 생성해야만 비로소 값을 저장할 수 있는 공간이 만들어지는 것이다. 배열을 생성하기 위해서는 연산자 'new'와 함께 배열의 타입과 길이를 지정해 주어야 한다
타입[] 변수이름; // 배열을 선언 (배열을 다루기 위한 참조변수 선언)
변수이름 = new 타입[길이]; // 배열을 생성 (실제 저장공간을 생성)
3) 배열의 길이와 인덱스
생성된 배열의 각 저장공간을 '배열의 요소(element)'라고 하며, '배열이름[인덱스]'의 형식으로 배열의 요소에 접근한다.
인덱스는 배열의 요소마다 붙여진 일련번호로 각 요소를 구별하는데 사용된다. 다만, 인덱스는 1이 아닌 0부터 시작한다.
score[3] = 100; // 배열 score의 4번째 요소에 100을 저장
int val = score[3]; // 배열 score의 4번째 요소에 저장된 값을 읽어서 val에 저장
배열의 길이
배열의 길이는 배열의 요소의 개수, 즉 값을 저장할 수 있는 공간의 개수다. 배열의 길이는 0도 가능하다
배열이름.length
자바에서는 JVM이 모든 배열의 길이를 별도로 관리하며, '배열이름.length'를 통해서 배열의 길이에 대한 정보를 얻을 수 있다. 배열은 한 번 생성하면 길이를 변경할 수 없기 때문에, 이미 생성된 배열의 길이는 변하지 않는다. 즉, 배열의 길이는 상수이다
배열의 길이 변경하기
배열이 한번 선언되고 나면 길이를 변경할 수 없다. 그렇다면 배열에 저장할 공간이 부족할 때는 어떻게 해야할까?
이 때는 더 큰 배열을 새로 생성하고 기존 배열의 내용을 새로운 배열에 복사하면 된다. 그렇다고 배열의 길이를 너무 크게 잡으면 메모리를 낭비하게 되므로, 기존의 2배 정도 길이로 하는 것이 좋다
4) 배열의 초기화
배열은 생성과 동시에 자동적으로 자신의 타입에 해당하는 기본값으로 초기화되므로 배열을 사용하기 전에 따로 초기화할 필요는 없지만, 원하는 값으로 저장하려면 각 요소마다 값을 지정해줘야 한다
하나하나 지정하는 방법도 있고, for문을 사용해서 배열을 초기화하는 방법도 있지만 이러한 방법에는 제약이 존재한다.
지정된 값들을 괄호{} 안에 쉼표로 구분해서 나열하면 되며, 괄호 안의 값의 개수에 의해 배열의 길이가 자동으로 결정되기 때문에 괄호[] 안에 배열의 길이를 적지 않아도 된다. 또한 'new 타입[]'을 생략하는 것도 가능하다.
int[] score = new int[]{50,51,52,53,54};
int[] score = {50,51,52,53,54};
5) 배열의 복사
배열을 복사하는 방법에는 두 가지가 있다.
먼저 for문을 이용해서 배열을 복사하는 방법은 다음과 같다.
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의 값을 tmp에 저장
}
arr = tmp; // 참조변수 arr가 새로운 배열을 가리킨다
두 번째 방법은 System.arraycopy()를 이용한 배열의 복사이다.
for문은 배열의 요소 하나하나에 접근해서 복사하지만, arraycopy()는 저장된 범위의 값들을 한 번에 통째로 복사한다. 각 요소들이 연속적으로 저장되어 있다는 배열의 특성 때문에 이렇게 처리하는 것이 가능하다.
// for문으로 배열을 복사
for(int i=0; i<num.length; i++){
newNum[i] = num[i];
}
// arraycopy()로 배열을 복사
System.arraycopy(num, 0, newNum, 0, num.length);
2. String 배열
1) String 배열의 선언과 생성
다음과 같이 선언하면, 3개의 String 타입의 참조 변수를 저장하기 위한 공간이 마련되고 참조형 변수의 기본값을 null이므로 각 요소의 값은 null로 초기화된다.
String[] name = new String[3];
2) String 배열의 초기화
초기화 역시 int 배열과 동일한 방법으로 한다. 배열의 각 요소에 문자열을 지정하면 된다.
String[] name = new String[3];
name[0] = "kim";
name[1] = "kang";
name[2] = "park";
또는 괄호를 사용해서 간단히 초기화할 수도 있다
String[] name = {"kim", "kang", "park"};
String[] name = new String[] {"kim", "kang", "park"};
기본형 배열이 아닌 경우, 즉, 참조형 배열의 경우 배열에 저장되는 것은 객체의 주소라는 점을 기억하자
3) char 배열과 String 클래스
사실 문자열이라는 용어는 '문자를 연이어 늘어놓은 것'을 의미하므로 문자 배열인 char 배열과 같은 뜻이다. 그런데 자바에서 char 배열이 아닌 String 클래스를 이용해서 문자열을 처리하는 이유는 String 클래스가 char 배열에 여러 가지 기능을 추가하여 확장한 것이기 때문이다.
char 배열과 String 클래스의 한 가지 중요한 차이가 있는데, String 객체(문자열)은 읽을 수만 있을 뿐 내용을 변경할 수 없다는 것이다.
String str = "JAVA";
str = str + "8";
위 문장에서 문자열 str의 내용이 변경된 것 같지만, 문자열은 변경할 수 없으므로 새로운 내용의 문자열이 생성된다.
String 클래스의 주요 메서드
메서드 | 설명 |
char chatAt(int index) | 문자열에서 해당 위치에 있는 문자를 반환한다 |
int length() | 문자열의 길이를 반환한다 |
String substring(int from, int to) | 문자열에서 해당 범위(from ~ to)에 있는 문자열을 반환한다 (to는 범위에 포함 되지 않음) |
boolean equals(Object obj) | 문자열의 내용이 obj와 같은지 확인한다 대소문자를 구분한다 (대소문자를 구분하지 않고 비교하려면 equalsIgnoreCase() 메서드를 사용하자) |
char[] toCharArray() | 문자열을 문자배열로 변환해서 반환한다 |
char 배열과 String 클래스의 변환
char 배열을 String 클래스로 변환하거나, 또는 그 반대로 변환해야하는 경우가 있다
char[] charArr = {'A', 'B', 'C'};
String str = new String(charArr); // char 배열 -> String
char[] tmp = str.toCharArray(); // String -> char 배열
4) 커맨드 라인을 통해 입력받기
Scanner 클래스의 nextLine()외에도 화면을 통해 사용자로부터 값을 입력받을 수 있는 방법이 있다. 바로 커맨드라인을 이용한 방법인데, 프로그램을 실행할 때 클래스 이름 뒤에 공백 문자로 구분하여 여러 개의 문자열을 프로그램에 전달할 수 있다.
만일 실행할 프로그램의 main 메서드가 담긴 클래스의 이름이 MainTest라고 가정하면 다음과 같이 실행할 수 있다
c:\jdk1.8\work\ch5>java MainTest abc 123
커맨드 라인을 통해 입력된 두 뭄ㄴ자열은 String 배열에 담겨서 MainTest클래스의 main 메서드의 매개변수(args)에 전달된다. 그리고 main 메서드 내에서 args[0], args[1]과 같은 방식으로 커맨드라인으로부터 전달받은 문자열에 접근할 수 있다
3. 다차원 배열
1) 2차원 배열의 선언과 인덱스
2차원 배열을 선언하는 방법은 1차원 배열과 같다. 다만 괄호[]가 하나 더 들어갈 뿐이다
선언 방법 | 선언 예 |
타입[][] 변수이름; | int[][] score; |
타입 변수이름[][]; | int score[][]; |
타입[] 변수이름[]; | int[] score[]; |
2차원 배열은 행과 열로 구성되어 있기 때문에 index도 행과 열에 각각 하나씩 존재한다.
행의 범위는 '0 ~ 행의 길이-1'이고, 열의 범위는 '0 ~ 열의 길이-1'이다.
2) 2차원 배열의 초기화
2차원 배열도 괄호[]를 사용해서 생성과 초기화를 동시에 할 수 있다. 다만, 1차원 배열보다 괄호[]를 한 번 더 써서 행별로 구분해 준다.
int[][] arr = new int[][]{ {1,2,3}, {2,3,4}, {3,4,5}};
3) 가변 배열
2차원 이상의 다차원 배열을 생성할 때 전체 배열 차수 중 마지막 차수의 길이를 지정하지 않고, 추후에 각기 다른 길이의 배열을 생성함으로써 고정된 형태가 아닌 보다 유동적인 가변 배열을 구성할 수 있다.
int[][] score = new int[5][];
score[0] = new int[3];
score[1] = new int[4];
score[2] = new int[2];
score[3] = new int[5];
score[4] = new int[1];
'백엔드 > JAVA' 카테고리의 다른 글
[JAVA의 정석] Ch 8. 예외 처리 (0) | 2025.04.07 |
---|---|
[JAVA의 정석] Ch 7. 객체 지향 프로그래밍 2 (0) | 2025.04.05 |
[JAVA의 정석] Ch 6. 객체 지향 프로그래밍 1 (0) | 2025.03.30 |
[JAVA의 정석] Ch 3. 연산자(operator) (0) | 2025.03.11 |
[JAVA의 정석] Ch 2. 변수(Variable) (0) | 2025.03.01 |
1. 배열
1) 배열(Array)이란?
- 배열 : 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것
- 배열은 '같은 타입'이어야 하며, 서로 다른 타입의 변수들로 구성된 배열은 만들 수 없다
- 변수와 달리, 배열은 각 저장 공간이 연속적으로 배치되어 있다는 특징이 있다
int[] score = new int[5]; // 5개의 int 값을 저장할 수 있는 배열을 생성한다
2) 배열의 선언과 생성
배열을 선언하는 방법은 원하는 타입의 변수를 선언하고 변수 또는 타입에 배열임을 의미하는 대괄호[]를 붙이면 된다
대괄호는 타입 뒤에 붙여도 되고, 변수 이름 뒤에 붙여도 되지만 전자를 선호한다
선언 방법 | 선언 예 |
타입[] 변수이름; | int[] score; String[] name; |
타입 변수이름[]; | int score[]; String name[]; |
배열을 선언하는 것은 단지 생성된 배열을 다루기 위한 참조변수를 위한 공간이 만들어질 뿐이고, 배열을 생성해야만 비로소 값을 저장할 수 있는 공간이 만들어지는 것이다. 배열을 생성하기 위해서는 연산자 'new'와 함께 배열의 타입과 길이를 지정해 주어야 한다
타입[] 변수이름; // 배열을 선언 (배열을 다루기 위한 참조변수 선언)
변수이름 = new 타입[길이]; // 배열을 생성 (실제 저장공간을 생성)
3) 배열의 길이와 인덱스
생성된 배열의 각 저장공간을 '배열의 요소(element)'라고 하며, '배열이름[인덱스]'의 형식으로 배열의 요소에 접근한다.
인덱스는 배열의 요소마다 붙여진 일련번호로 각 요소를 구별하는데 사용된다. 다만, 인덱스는 1이 아닌 0부터 시작한다.
score[3] = 100; // 배열 score의 4번째 요소에 100을 저장
int val = score[3]; // 배열 score의 4번째 요소에 저장된 값을 읽어서 val에 저장
배열의 길이
배열의 길이는 배열의 요소의 개수, 즉 값을 저장할 수 있는 공간의 개수다. 배열의 길이는 0도 가능하다
배열이름.length
자바에서는 JVM이 모든 배열의 길이를 별도로 관리하며, '배열이름.length'를 통해서 배열의 길이에 대한 정보를 얻을 수 있다. 배열은 한 번 생성하면 길이를 변경할 수 없기 때문에, 이미 생성된 배열의 길이는 변하지 않는다. 즉, 배열의 길이는 상수이다
배열의 길이 변경하기
배열이 한번 선언되고 나면 길이를 변경할 수 없다. 그렇다면 배열에 저장할 공간이 부족할 때는 어떻게 해야할까?
이 때는 더 큰 배열을 새로 생성하고 기존 배열의 내용을 새로운 배열에 복사하면 된다. 그렇다고 배열의 길이를 너무 크게 잡으면 메모리를 낭비하게 되므로, 기존의 2배 정도 길이로 하는 것이 좋다
4) 배열의 초기화
배열은 생성과 동시에 자동적으로 자신의 타입에 해당하는 기본값으로 초기화되므로 배열을 사용하기 전에 따로 초기화할 필요는 없지만, 원하는 값으로 저장하려면 각 요소마다 값을 지정해줘야 한다
하나하나 지정하는 방법도 있고, for문을 사용해서 배열을 초기화하는 방법도 있지만 이러한 방법에는 제약이 존재한다.
지정된 값들을 괄호{} 안에 쉼표로 구분해서 나열하면 되며, 괄호 안의 값의 개수에 의해 배열의 길이가 자동으로 결정되기 때문에 괄호[] 안에 배열의 길이를 적지 않아도 된다. 또한 'new 타입[]'을 생략하는 것도 가능하다.
int[] score = new int[]{50,51,52,53,54};
int[] score = {50,51,52,53,54};
5) 배열의 복사
배열을 복사하는 방법에는 두 가지가 있다.
먼저 for문을 이용해서 배열을 복사하는 방법은 다음과 같다.
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의 값을 tmp에 저장
}
arr = tmp; // 참조변수 arr가 새로운 배열을 가리킨다
두 번째 방법은 System.arraycopy()를 이용한 배열의 복사이다.
for문은 배열의 요소 하나하나에 접근해서 복사하지만, arraycopy()는 저장된 범위의 값들을 한 번에 통째로 복사한다. 각 요소들이 연속적으로 저장되어 있다는 배열의 특성 때문에 이렇게 처리하는 것이 가능하다.
// for문으로 배열을 복사
for(int i=0; i<num.length; i++){
newNum[i] = num[i];
}
// arraycopy()로 배열을 복사
System.arraycopy(num, 0, newNum, 0, num.length);
2. String 배열
1) String 배열의 선언과 생성
다음과 같이 선언하면, 3개의 String 타입의 참조 변수를 저장하기 위한 공간이 마련되고 참조형 변수의 기본값을 null이므로 각 요소의 값은 null로 초기화된다.
String[] name = new String[3];
2) String 배열의 초기화
초기화 역시 int 배열과 동일한 방법으로 한다. 배열의 각 요소에 문자열을 지정하면 된다.
String[] name = new String[3];
name[0] = "kim";
name[1] = "kang";
name[2] = "park";
또는 괄호를 사용해서 간단히 초기화할 수도 있다
String[] name = {"kim", "kang", "park"};
String[] name = new String[] {"kim", "kang", "park"};
기본형 배열이 아닌 경우, 즉, 참조형 배열의 경우 배열에 저장되는 것은 객체의 주소라는 점을 기억하자
3) char 배열과 String 클래스
사실 문자열이라는 용어는 '문자를 연이어 늘어놓은 것'을 의미하므로 문자 배열인 char 배열과 같은 뜻이다. 그런데 자바에서 char 배열이 아닌 String 클래스를 이용해서 문자열을 처리하는 이유는 String 클래스가 char 배열에 여러 가지 기능을 추가하여 확장한 것이기 때문이다.
char 배열과 String 클래스의 한 가지 중요한 차이가 있는데, String 객체(문자열)은 읽을 수만 있을 뿐 내용을 변경할 수 없다는 것이다.
String str = "JAVA";
str = str + "8";
위 문장에서 문자열 str의 내용이 변경된 것 같지만, 문자열은 변경할 수 없으므로 새로운 내용의 문자열이 생성된다.
String 클래스의 주요 메서드
메서드 | 설명 |
char chatAt(int index) | 문자열에서 해당 위치에 있는 문자를 반환한다 |
int length() | 문자열의 길이를 반환한다 |
String substring(int from, int to) | 문자열에서 해당 범위(from ~ to)에 있는 문자열을 반환한다 (to는 범위에 포함 되지 않음) |
boolean equals(Object obj) | 문자열의 내용이 obj와 같은지 확인한다 대소문자를 구분한다 (대소문자를 구분하지 않고 비교하려면 equalsIgnoreCase() 메서드를 사용하자) |
char[] toCharArray() | 문자열을 문자배열로 변환해서 반환한다 |
char 배열과 String 클래스의 변환
char 배열을 String 클래스로 변환하거나, 또는 그 반대로 변환해야하는 경우가 있다
char[] charArr = {'A', 'B', 'C'};
String str = new String(charArr); // char 배열 -> String
char[] tmp = str.toCharArray(); // String -> char 배열
4) 커맨드 라인을 통해 입력받기
Scanner 클래스의 nextLine()외에도 화면을 통해 사용자로부터 값을 입력받을 수 있는 방법이 있다. 바로 커맨드라인을 이용한 방법인데, 프로그램을 실행할 때 클래스 이름 뒤에 공백 문자로 구분하여 여러 개의 문자열을 프로그램에 전달할 수 있다.
만일 실행할 프로그램의 main 메서드가 담긴 클래스의 이름이 MainTest라고 가정하면 다음과 같이 실행할 수 있다
c:\jdk1.8\work\ch5>java MainTest abc 123
커맨드 라인을 통해 입력된 두 뭄ㄴ자열은 String 배열에 담겨서 MainTest클래스의 main 메서드의 매개변수(args)에 전달된다. 그리고 main 메서드 내에서 args[0], args[1]과 같은 방식으로 커맨드라인으로부터 전달받은 문자열에 접근할 수 있다
3. 다차원 배열
1) 2차원 배열의 선언과 인덱스
2차원 배열을 선언하는 방법은 1차원 배열과 같다. 다만 괄호[]가 하나 더 들어갈 뿐이다
선언 방법 | 선언 예 |
타입[][] 변수이름; | int[][] score; |
타입 변수이름[][]; | int score[][]; |
타입[] 변수이름[]; | int[] score[]; |
2차원 배열은 행과 열로 구성되어 있기 때문에 index도 행과 열에 각각 하나씩 존재한다.
행의 범위는 '0 ~ 행의 길이-1'이고, 열의 범위는 '0 ~ 열의 길이-1'이다.
2) 2차원 배열의 초기화
2차원 배열도 괄호[]를 사용해서 생성과 초기화를 동시에 할 수 있다. 다만, 1차원 배열보다 괄호[]를 한 번 더 써서 행별로 구분해 준다.
int[][] arr = new int[][]{ {1,2,3}, {2,3,4}, {3,4,5}};
3) 가변 배열
2차원 이상의 다차원 배열을 생성할 때 전체 배열 차수 중 마지막 차수의 길이를 지정하지 않고, 추후에 각기 다른 길이의 배열을 생성함으로써 고정된 형태가 아닌 보다 유동적인 가변 배열을 구성할 수 있다.
int[][] score = new int[5][];
score[0] = new int[3];
score[1] = new int[4];
score[2] = new int[2];
score[3] = new int[5];
score[4] = new int[1];
'백엔드 > JAVA' 카테고리의 다른 글
[JAVA의 정석] Ch 8. 예외 처리 (0) | 2025.04.07 |
---|---|
[JAVA의 정석] Ch 7. 객체 지향 프로그래밍 2 (0) | 2025.04.05 |
[JAVA의 정석] Ch 6. 객체 지향 프로그래밍 1 (0) | 2025.03.30 |
[JAVA의 정석] Ch 3. 연산자(operator) (0) | 2025.03.11 |
[JAVA의 정석] Ch 2. 변수(Variable) (0) | 2025.03.01 |