이전 내용
배열
배열: 같은 자료형의 값 여러 개 저장
// 문법: 자료형 [] 변수명 = new 자료형 [크기 또는 길이];
int [] numbers = new int[5];
String [] names = new String[3];
▶ 자바의 경우, 하나의 배열의 여러 자료형이 올 수 없다.
물론 위치를 다르게 할 수도 있다.
int numbers [] = new int[5];
String names [] = new String[3];
★ 문자열의 length, 정수의 length
문자열의 length()는 메서드이며 문자열에서만 사용하며, 정수의 length 는 속성으로 배열의 개수를 구할 때 주로 사용. ()가 있으면 안 된다.
int[] num = {10, 52, 13, 7, 79, 35};
for (int i=0; i<num.length; i++) {
System.out.println("num[" + i + "]=" + num[i]);
}
◆ 배열문 선언 (new 연산자)
인덱스를 지정하여 해당 위치에 값을 넣을 수도 있다.
// 변수명[인덱스] = 값;
int [] numbers = new int[5];
numbers[0] = 1;
numbers[1] = 10;
numbers[2] = 5;
numbers[3] = 12;
numbers[4] = 13;
System.out.println(numbers[2]); // 3번째 숫자 출력
또한, 크기나 길이를 지정하지 않고 뒤에 값을 넣어도 되며, 자료형을 생략할 수도 있다.
// 자료형[] 변수명 = new 자료형[] {값1, 값2, ..};
int [] num3 = new int[] {1, 10, 5, 12, 13};
String [] name3 = new String[] {"가", "나", "다"};
// 자료형 생략
int [] num3 = {1, 10, 5, 12, 13};
String [] name3 = {"가", "나", "다"};
만약, arr 라는 5개의 배열을 만들고, 각 배열에 10까지의 짝수를 넣는 코드를 작성할 경우
arr[0] = 2
arr[1] = 4
arr[2] = 6
arr[3] = 8
arr[4] = 10
int[] arr = {2, 4, 6, 8, 10};
for(int i=0; i<arr.length; i++) {
System.out.println("arr[" + i + "] = " + arr[i]);
}
와 같이 직접 배열 내의 값을 지정해줄 수도 있지만, new[] 와 같은 배열 버전 new 연산자를 사용하면 된다.
int [] arr = new int [5];
for (int i=0; i<arr.length; i++) {
arr[i] = i*2+2;
System.out.println("arr[" + i + "] = " + arr[i]);
}
아래와 같이 해도 된다.
int [] arr = new int [5];
int num = 0;
for (int i=0; i<arr.length; i++) {
num += 2;
arr[i] = num;
System.out.println("arr[" + i + "] = " + arr[i]);
}
배열문 순회
배열문 순회: 반복문을 이용한 배열의 각 요소 접근
int [] num5 = {1, 2, 3, 4, 5};
// 배열순회 1
for (int i = 0; i < num5.length; i++) {
System.out.println(num5[i]);
}
// 배열순회 2
for (int i : num5) {
System.out.println(i);
}
▶ 두 번째 방법의 경우, 코드가 길어지면 헷갈릴 수 있으므로, 변수명을 통일해 주는 게 좋다.
int [] num5 = {1, 2, 3, 4, 5};
for (int num5: num5) {
System.out.println(num5);
}
앞서, arr라는 10이하의 짝수 배열을 만드는 문제에서 각 배열의 합을 구하려고 하면,
int [] arr = new int [5];
int num = 0;
int tot = 0; // 배열의 합
for (int i=0; i<arr.length; i++) {
num += 2;
arr[i] = num;
System.out.println("arr[" + i + "] = " + arr[i]);
// 배열의 합 누적
tot += arr[i];
}
System.out.println("배열의 합:" + tot);
위와 같은 코드처럼 배열을 더하여 값을 계산할 수도 있다.
◆ 예제
Q1. 5개짜리 정수형 배열에 키보드로 1~100 사이의 정수를 입력받아 배열에 저장하고, 그 배열 값 중에서 3과 5의 공배수 출력하기
Scanner sc = new Scanner (System.in);
int[] arr = new int [5];
for (int i=0; i<arr.length; i++) {
System.out.println("1~100 사이의 정수");
arr[i] = sc.nextInt();
// if 문을 반복문 밖으로 넘어가면
// for문 밖에서는 i라는 변수를 인식하지 못하므로 에러 출력
if (arr[i] % 3 == 0 && arr[i] % 5 == 0) {
System.out.println("3과 5의 공배수:"+arr[i]);
}
}
// arr 배열의 전체 값 출력
// System.out.println(arr); // 배열의 주소값이 출력됨.
System.out.println("전체 배열의 값:" + Arrays.toString(arr));
▶ 사용자가 키보드로 입력한 정수 중 3과 5의 공배수일 경우에만, "3과 5의 공배수:" 항목에 숫자가 출력되며, 마지막에는 해당 배열의 전체 값이 출력된다.
또한, print(ln)으로 배열(arr)을 출력하면, 배열 내의 값이 아닌, 배열의 주소가 출력된다.
따라서, Arrays.toString(배열)을 통해 배열 내의 값을 출력한다.
※ 만약, 하단의 전체 배열 뿐 아니라 공배수에 속하는 수의 배열을 보고 싶다면, 코드를 더 추가해야 한다.
(이는 현재 내 수준에서 난이도가 있는 편이라, 챗gpt의 도움을 받았다.)
int [] arr = new int[5]; // 원본 배열 선언
int [] multiples = new int[5]; // 공배수 저장할 배열 선언
int count = 0; // 공배수 개수를 셀 변수
Scanner sc = new Scanner(System.in); // 키보드 입력 받기 위한 스캐너
for (int i=0; i<arr.length; i++) {
System.out.println("1과 100사이의 정수:");
arr[i] = sc.nextInt();
if(arr[i] % 3 == 0 && arr[i] % 5 ==0) {
multiples[count] = arr[i]; // 공배수 배열에 저장
count++; // 공배수 개수 증가
System.out.println(arr[i] + "는 3과 5의 공배수 입니다.");
}
}
// 전체 배열 수 출력
System.err.println("전체 배열:" + Arrays.toString(arr));
// 공배수 배열 출력
System.out.println("전체 배열 중 3과 5의 공배수 배열:" + Arrays.toString(Arrays.copyOf(multiples, count)));
- int [] multiples = new int[5]; : 공배수를 저장할 배열을 추가해 준다
- int count = 0; : 공배수의 개수를 셀 변수를 추가 및 초기화해 준다
- multiples[count] = arr[i]; : for 반복문 내에 조건에 맞는 수(공배수)를 배열에 저장한다
- count++; : for 반복문 내에서 반복 실행되며 조건에 맞는 개수가 증가한다
- System.out.println("전체 배열 중 3과 5의 공배수 배열:" + Arrays.toString(Arrays.copyOf(multiples, count))); : 공배수의 배열을 출력한다
★ Arrays.copyOf()
Arrays.copyOf()는 특정 배열의 원하는 길이만큼 새로운 배열로 복사하는 메소드 함수로,
새로운 배열 = Arrays.copyof(원본 배열, 원본 배열에서 복사하고 싶은 요소들의 길이);
식으로 사용된다.
Q2.1부터 10 사이의 임의의 수를 발생시켜 arr 배열에 저장하여 출력하기
int [] arr = new int[5];
for (int i=0; i<arr.length; i++) {
double num = Math.floor(Math.random() * 10+1);
arr[i] = (int)num;
}
System.out.println("전체 배열의 값:" + Arrays.toString(arr));
▶ Math.radnom() 에 10을 곱하는 이유: random 메서드는 0과 1 사이의 실수만 출력되니, 곱하기 10으로 1 이상의 수로 만들어준다.
그리고 1을 더하는 이유:
10만 곱해줄 경우에는, 0과 10 미만(9)의 수만 생성되나, 1을 더해주면 1과 11 미만(10)의 수가 생성된다.
또한, 코드 일부를 아래와 같이 수정할 수 있다.
int num=0;
for (int i=0; i<arr.length; i++) {
num = int(Math.floor(Math.random() * 10+1);
arr[i] = num;
}
Q2.1부터 100 사이의 정수 데이터 6개를 키보드로 입력하여 배열의 값 중 최댓값과 최솟값 구하기
int [] arr = new int[6];
int max = 0;
int min = 999;
Scanner sc = new Scanner(System.in);
for (int i=0; i<arr.length; i++) {
arr[i] = sc.nextInt();
}
System.out.println("전체 배열의 값:" + Arrays.toString(arr));
// 최댓값, 최솟값 구하여 max, min에 저장
for (int j=0; j<arr.length; j++) {
if (max < arr[j]) {
max = arr[j];
}
if (min > arr[j]) {
min = arr[j];
}
}
System.out.println("배열에서 최댓값:" + max);
System.out.println("배열에서 최솟값:" + min);
[최댓값과 최솟값 구하는 공식]
arr[0] 시작 전에 max=0, min=999로 초기화가 설정되어 있는 상태이며,
arr[i] 배열에는 이미 [54, 12, 98, 99, 24, 38] 의 숫자가 들어 있음.
1) max < arr[j] - 배열 j 의 각 인덱스에 들어있는 숫자가 max 보다 크면 배열에 넣음.
min > arr[j] - 배열 j 의 각 인덱스에 들어있는 숫자가 min 보다 작으면 배열에 넣음.
2) for 문을 통해 배열의 각 인덱스를 돌아가면서 if 문 실행
- 첫번째 회전: 54는 0보다 크고(true) 999보다 작으니 (true) max와 min에 54가 입력됨.
- 두번째 회전: 12는 54보다 크지 않고(false) 54보다 작으니 (true) max에는 54가 그대로 있고, min은 12로 바뀜.
- 세번째 회전: 98은 54보다 크고 (true) 12보다 작지 않으니 (false) max=98, min=12
- 네번째 회전: 99는 98보다 크고(true) 12보다 작지 않으니 (false) max=99, min=12
- 다섯번째 회전: 24는 99보다 크지 않고(false) 12보다 작지 않으니 (false) max=99, min=12
- 여섯번째 회전: 38은 99보다 크지 않고(false) 12보다 작지 않으니 (false) max=99, min=12
▶ 최종 값은 max=99, min=12
이를 표로 표현해 보면 다음과 같다.
입력값 | max (true / false) | min (true / false) | max | min |
초깃값 | 0 | 999 | 0 | 999 |
54 | true (0보다 큼) | true (999보다 작음) | 54 | 54 |
12 | false (54보다 크지 않음) | true (54보다 작음) | 54 | 12 |
98 | true (54보다 큼) | false (12보다 작지 않음) | 98 | 12 |
99 | true (98보다 큼) | false (12보다 작지 않음) | 99 | 12 |
24 | false (99보다 크지 않음) | false (12보다 작지 않음) | 99 | 12 |
38 | false (99보다 크지 않음) | false (12보다 작지 않음) | 99 (최종) | 12 (최종) |
다차원 배열
다차원 배열: 2차원 이상의 배열
// 자료형 [][] 변수명 = new 자료형[세로][가로];
int [][] num6 = new int[2][5];
다차원 배열 역시 선언하면서 초기화할 수 있다.
int [][] num7 = new int [][] {
{1, 2, 3, 4, 5}
{6, 7, 8, 9, 10}
}; // 세로2: 가로5 배열의 데이터
1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 |
★ 다차원 배열 순회
for (int i=0; i < 세로; i++){
for (int j=0; j < 가로; j++) {
...
}
}
int [][] num7 = new int [][] {
{1, 2, 3, 4, 5},
{6, 7, 8, 9, 10}
}; // 세로2, 가로5 배열의 데이터
for (int i=0; i<num7.length; i++) { // 세로 크기
for (int j=0; j<num7[i].length; j++) { // 가로 크기
System.out.print(num7[i][j] + "");
}
System.out.println();
}
다음 내용
[출처]
나도코딩 유튜브
https://sno-machinelearning.tistory.com/18
'프로그래밍 및 기타 > Java' 카테고리의 다른 글
[Java] 1월 10일 자바 기초 - 클래스, 인스턴스 (0) | 2025.01.10 |
---|---|
[Java] 25년 1월 8일 자바 기초 - 문자열 (0) | 2025.01.07 |
[Java] 25년 1월 7일 - 자바 기초(조건문, scanner) (0) | 2025.01.07 |
[Java] 25년 1월 3일 - 자바 기초 (반복문) (0) | 2025.01.03 |
[Java] 25년 1월 2일 - 자바 기초 (변수, 연산자) (1) | 2025.01.02 |