TOP
class="layout-aside-left paging-number">
본문 바로가기
프로그래밍 및 기타/Java

[Java] 25년 1월 9일 자바 기초 - 배열

by 기록자_Recordian 2025. 1. 7.
728x90
반응형
이전 내용
 

[Java] 자바 기초 - 문자열

이전 내용 [JAVA] 25년 1월 7일 - 자바 기초이전 내용 [JAVA] 25년 1월 3일 - 자바 기초이전 내용 [JAVA] 25년 1월 2일 - 자바 기초◆ 새 프로젝트 만들기 New - java project - 프로젝트명: java_ex02 ◆ 클래스 만

puppy-foot-it.tistory.com


배열

 

배열: 같은 자료형의 값 여러 개 저장

// 문법: 자료형 [] 변수명 = 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();
}


다음 내용

 

 

[Java] 1월 10일 자바 기초 - 클래스, 인스턴스

이전 내용 [Java] 25년 1월 9일 자바 기초 - 배열이전 내용 [Java] 자바 기초 - 문자열이전 내용 [JAVA] 25년 1월 7일 - 자바 기초이전 내용 [JAVA] 25년 1월 3일 - 자바 기초이전 내용 [JAVA] 25년 1월 2일 - 자

puppy-foot-it.tistory.com


[출처]

나도코딩 유튜브

https://sno-machinelearning.tistory.com/18

 

728x90
반응형