1. 배열
자바에서 배열은 같은 타입의 여러 변수를 하나의 묶음으로 다루기 위해 사용됩니다. 이는 단일 이름으로 여러 값을 저장하고, 인덱스를 통해 이러한 값들에 접근할 수 있습니다. 배열의 각 요소는 배열 이름과 함께 대괄호( [] ) 안에 요소의 위치를 나타내는 인덱스를 사용하여 참조됩니다. 인덱스는 0부터 시작합니다. 예를 들면, 5개의 정수를 저장할 수 있는 배열을 생성하고 싶다면 다음과 같이 선언합니다.
int[] myArray = new int[5];
이는 정수형 값을 저장할 수 있는 길이가 5인 배열을 생성합니다. 배열의 각 요소에는 기본값으로 0이 할당됩니다. 배열의 특정 위치에 값을 할당하거나 읽어오려면 인덱스를 사용합니다.
myArray[0] = 10; // 배열의 첫 번째 요소에 10을 할당
int firstValue = myArray[0]; // 배열의 첫 번째 요소를 읽어와서 firstValue 변수에 저장
또한 배열을 선언하면서 각 요소의 값을 초기화 할 수 있는데, 이는 각 요소의 값을 중괄호( { } ) 안에 콤마( , )로 구분하여 직접 지정할 수 있습니다. 이 방법은 배열의 길이를 명시적으로 선언하지 않아도 되며, 초기화 시점에 배열 요소의 값을 바로 설정할 수 있는 간편한 방법입니다.
int[] = numbers = {10, 20, 30, 40, 50};
이 예제에서는 배열 numbers를 선언함과 동시에 { 10, 20, 30, 40, 50 }으로 초기화합니다.
다음은 배열을 사용하는 예제를 살펴보겠습니다.
배열을 역순으로 정렬하기
import java.util.Arrays;
import java.util.Scanner;
public class InvertArray {
static void swap(int[] a, int idx1,int idx2) {
int temp = a[idx1];
a[idx1] = a[idx2];
a[idx2] = temp;
}
//--- 배열 a의 요소를 역순으로 정렬 ---//
static void reverse(int[] a) {
for(int i = 0; i < a.length / 2; i++)
swap(a, i, a.length - i - 1);
}
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
System.out.println("점수의 개수: ");
int num = stdIn.nextInt(); // 점수의 개수를 입력받음
int[] scores = new int[num];
for(int i = 0; i < num; i++) {
System.out.println("scores[" + i + "] : ");
scores[i] = stdIn.nextInt(); // 점수 입력
}
reverse(scores);
System.out.println("점수를 역순으로 정렬했습니다.");
System.out.println("scores = " + Arrays.toString(scores));
}
}
이 코드에서 swap 함수는 배열의 두 요소의 값을 교환합니다. reserve 함수는 배열의 요소를 역순으로 정렬하는 기능을 수행합니다. 사용자로부터 입력받은 점수의 개수에 따라 배열을 생성하고, 각 점수를 입력받은 후 reserve 함수를 호출하여 배열을 역순으로 정렬합니다. 마지막으로, 역순으로 정렬된 배열의 모든 요소를 출력합니다.
for each 문
for(타입 변수명 : 배열명) {
......
}
예제
public class Array12 {
public static void main(String[] args) {
int[] array = {1,2,3,4,5};
for(int i : array){
System.out.println(i);
}
}
}
Arrays 유틸리티
import java.util.Arrays;
| 제어자 및 타입 | 메서드 | 설명 |
| static int | binarySearch(*, int num) | 배열에서 매개변수로 전달받은 값을 검색한 후 인덱스를 반환 |
| static *[] | copyOf(*[] original, int len) | original 배열을 len 길이만큼 복사한 배열을 반환 |
| static boolean |
equals(*[] a, *[] a2) | 매개변수로 전달받은 두 배열이 같은지 비교 |
| static void |
sort(*[] a) | 배열 내용을 정렬 |
| static String |
toString(*[] a) | 배열 내용을 문자열로 반환 |
2. 다차원 배열
2차원 배열은 배열의 배열로 생각할 수 있습니다. 즉, 각 요소가 또 다른 배열을 참조하는 구조입니다. 2차원 배열을 사용하면 행렬이나 데이터 테이블과 같은 구조를 효과적으로 표현할 수 있습니다.
2차원 배열 선언
2차원 배열을 선언하는 기본 문법은 다음과 같습니다.
타입[ ][ ] 배열이름 = new 타입 [ 행의 수 ][ 열의 수 ];
여기서 타입 은 배열에 저장하려는 데이터의 타입을 의미합니다. 2차원 배열을 선언할 때에는 각 차원의 크기를 지정해야 합니다. 예를 들어, new int [3][4] 는 정수형 값을 저장할 수 있는 3행 4열의 배열을 생성합니다. 이 때, 첫 번째 대괄호 안의 숫자는 행의 수를 두 번째 대괄호 안의 숫자는 열의 수를 나타냅니다.
예제) 다차원 배열
public class TwoDimensionalArrayInitialization {
public static void main(String[] args) {
// 3명의 학생과 각 학생의 4과목 점수를 초기화하면서 2차원 배열 선언
int[][] scores = {
{90, 80, 70, 60}, // 첫 번째 학생의 점수
{80, 70, 60, 50}, // 두 번째 학생의 점수
{70, 60, 50, 40} // 세 번째 학생의 점수
};
// 배열의 내용 출력
for (int i = 0; i < scores.length; i++) {
System.out.println((i + 1) + "번째 학생의 과목 점수:");
for (int j = 0; j < scores[i].length; j++) {
System.out.println(scores[i][j]);
}
System.out.println();
}
}
}
이 예제는 학생들의 과목별 점수를 2차원 배열로 선언하고 초기화하는 코드입니다. 여기서는 3명의 학생과 각 학생의 4과목 점수를 저장합니다. 이 예제에서 보는 것처럼, 2차원 배열을 선언하면서 동시에 초기화할 때는 다음과 같은 형식을 사용합니다.
타입[ ][ ] 배열이름 = {
{ 값1, 값2, ... },
{ 값A, 값B, ... },
...
};
이 구조를 사용하면, 배열이 선언될 때 각 행에 해당하는 배열이 동시에 초기화됩니다. 각 행의 배열은 중괄호 {} 로 둘러싸여 있으며, 행과 행 사이는 쉼표 , 로 구분됩니다. 이 방법을 사용하면 각 행의 열 수가 다를 수 있으며, 이를 통해 비정형(또는 불규칙) 2차원 배열도 쉽게 생성할 수 있습니다.
명령 행 아규먼트(Command-Line Arguments)
- 자바에서 많이 사용된 배열이 무엇인지 물어본다면 그것은 바로 main메소드에 있는 String[] args
- main메소드는 JVM이 실행하는 메소드이다.
- JVM이 main메소드를 실행할 때 String[]을 아규먼트로 넘겨 준다는 것을 의미한다.
예제1
public class EmptyCommandLineArgumentExam {
public static void main(String[] args){
System.out.println(args.length);
}
}
예제2
public class CommandLineArgumentExam {
public static void main(String[] args){
if(args.length == 0){
System.out.println("사용법 : CommandLineArgumentExam 값 값 ....");
System.exit(0); // return; 으로 변겯 가능
}
for(String arg : args){
System.out.println(arg);
}
}
}
제한 없는 아규먼트(unlimited arguments)
- 경우에 따라서 메소드 아규먼트를 가변적으로 전달하고 싶은 경우가 있다.
- 메소드에 정수값을 경우에 따럿 3개, 어떤 경우엔 5개를 넘기고 싶다면 어떻게 해야 할까?
리턴타입 메소드이름(타입... 변수명){
......
}
예제
public class UnlimitiedArgumentsExam {
public static void main(String[] args){
System.out.println(sum(5,10));
System.out.println(sum(1,2,4,2));
System.out.println(sum(3,1,2,3,4,1));
}
public static int sum(int... args){
System.out.println("print1 메소드 - args 길이 : " + args.length);
int sum = 0;
for(int i = 0; i < args.length; i++){
sum += args[i];
}
return sum;
}
}
'개념정리(JAVA)' 카테고리의 다른 글
| 검색 알고리즘 (0) | 2024.03.27 |
|---|---|
| 클래스 (0) | 2024.03.27 |
| 선형 검색과 보초법 (0) | 2024.03.21 |
| 제어문 (0) | 2024.03.13 |
| 논리형 타입과 연산자 (0) | 2024.03.13 |