Java

Java 기초(배열) - AWS 풀스택 과정 4일차

awspspgh 2024. 7. 18. 18:09

오늘 배열과 배열복사(arraycopy)에 대해서 배워보겠습니다.

 

목차
1. 변수
2. 배열
3. 배열 복사
(arraycopy)
4. 예제 문제
5. 느낀점

 

 

1. 변수

변수 타입

 

변수의 메모리 영억

 

2. 배열

배열

 

배열

 

		/* 배열(Array) : 같은 타입, 같은 의미를 가지는 변수들의 집합 (참조변수)
		 * 객체를 생성하는 키워드 : new
		 * - 배열을 선언하는 방법
		 * 타입 [] 배열이름;
		 * 타입 배열이름[];
		 * 
		 * - 선언하고 생성(new) 초기화 하는 방법 : 객체를 생성하면 자동 초기화 해줌.
		 * 타입 [] 배열이름 = new 타입[길이]; // 가장 많이 사용하는 방식
		 * 타입 [] 배열이름 = new 타입[]{값, 값, 값, 값};
		 * 타입 [] 배열이름 = {값, 값, 값, 값}; // 연습할 때 사용
		 * 
		 * - 배열의 길이는 0 이상이어야 한다.
		 * - 배열의 시작 번지는 0부터 시작
		 * - 배열[5] => 0 1 2 3 4
		 * - index = 배열의 길이 - 1
		 * - 배열의 길이는 length(총 길이)를 이용하면 배열의 길이를 알 수 있음.
		 */
		
		int arr1[]; // 선언만 한 경우
		arr1 = new int[5]; // 선언된 변수에 객체 생성(초기화)
		
		int arr2[] = new int[5]; // 가장 일반적인 경우
		int arr3[] = new int[] {1,2,3,4,5};
		int arr4[] = {6,7,8,9,10};
		
		System.out.println(arr1);
		
		System.out.println(arr1[0]);
		System.out.println(arr1[1]);
		System.out.println(arr1[2]);
		System.out.println(arr1[3]);
		System.out.println(arr1[4]);
		
		arr1[0] = 10;
		System.out.println(arr1[0]);
		arr1[1] = 11;
		arr1[2] = 12;
		arr1[3] = 13;
		arr1[4] = 14;

		System.out.println(arr1[1]);
		System.out.println(arr1[2]);
		System.out.println(arr1[3]);
		System.out.println(arr1[4]);
		// System.out.println(arr1[5]); // 없는 번지는 error
		System.out.println(arr1.length);
		
		
		for(int i = 0; i < arr1.length; i ++) {
			System.out.print(arr1[i] + " ");
		}
		System.out.println();
		System.out.println("---------------");
		
		// arr3을 출력
		for(int i = 0; i < arr3.length; i ++) {
			System.out.print(arr3[i] + " ");
		}
		
		System.out.println();
		System.out.println("---------------");
		
		// arr2 짝수만 삽입
		for(int i = 0; i < arr2.length; i ++) {
			arr2[i] = (i + 1) * 2;
			System.out.print(arr2[i] + " ");
		}
		
		System.out.println();
		System.out.println("---------------");

배열을 사용하는 이유는 관리가 편하고, 반복문을 사용할 수 있기 때문에 많은 양의 데이터를 쉽게 관리할 수 있기 때문입니다.

 

 

- 5명의 점수를 입력 받아 배열에 저장하고, 점수, 합계, 평균을 출력해보기

		Scanner scan = new Scanner(System.in);
        
        int arr1[] = new int[5];
		int sum = 0;
		double avg = 0;
		
		System.out.println("점수 입력");
		for (int i = 0; i < arr1.length; i ++) {
			int msg = scan.nextInt();
			if ((msg >= 0) && (msg <= 100)) {
				arr1[i] = msg;
				sum += arr1[i];				
			} else {
				System.out.println("다시 입력해주세요.");
				i --;
			}
		}
		
		System.out.println("------성적표------");
		
		// 향상된 for문
		for(int a : arr1) {
			System.out.print(a + " ");
		}
		
		avg = sum / (double)arr1.length;
		System.out.println("합계: " + sum + ", 평균: " + avg);
		
		
		scan.close();

 

※  향상된 for문에 대하여

기존의 for문은 번지를 비교할 수 있었지만 향상된 for문의 경우에는 번지에 있는 값을 따른 공간에 불러서 이용하기에 번지가 없다. 그렇기에 향상된 for문을 이용하면 for문 안에 있는 객체 값을 전부 다 차례대로 출력한다.

 

▣  문자 배열

		// 문자 배열
		 
		String arr[] = new String[5];
		arr[0] = "hong";
		arr[1] = "kim";
		arr[2] = "lee";
		arr[3] = "park";
		arr[4] = "choi";
		
		// 일반 for문을 이용하여 arr 출력
		
		for (int i = 0; i < arr.length; i ++) {
			System.out.print(arr[i] + " ");
		}
		
		System.out.println("");
		
		// 향상된 for문을 이용하여 arr 출력
		
		for (String temp : arr) {
			System.out.print(temp + " ");
		}

 

3. 배열 복사

		/* 배열은 처음 선언할 때 정한 개수를 변경할 수 없음.
		 * 배열은 추가 / 삭제 불가능.
		 * 배열의 값을 추가하려면 기존 배열을 버리고, 더 큰 배열로 교체
		 */
		
		// 한 배열을 공유
		int arr[] = new int[] {1,2,3,4};
		int arr1[] = arr;
		int arr2[] = new int[5];
		
		arr[0] = 10;
		arr1[1] = 20;
		
		// arr 출력
		for(int i : arr) {
			System.out.print(i + " ");
		}
		System.out.println();
		
		// arr1 출력
		for(int i : arr1) {
			System.out.print(i + " ");
		}
		System.out.println();
		
		// arr를 arr2로 복사
		for(int i = 0; i < arr.length; i ++) {
			arr2[i] = arr[i];
		}
		
		arr[0] = 100;
		for(int i : arr1) {
			System.out.print(i + " ");
		}
		System.out.println();
		
		
		for(int i : arr2) {
			System.out.print(i + " ");
		}

 

▣ System.arraycopy

배열 복사

		int arr[] = new int[] {50, 78, 48, 59, 63};
		int arr1[] = new int[] {85, 97, 58};
		
		// 두 개의 배열을 합쳐 하나의 배열로 생성 후 출력
        
        	int arr2[] = new int[arr.length + arr1.length];
		System.arraycopy(arr, 0, arr2, 0, arr.length);
		System.arraycopy(arr1, 0, arr2, arr.length, arr1.length);
		
		
		
		for(int i : arr2) {
			System.out.print(i + " ");
		}

 

▣ 랜덤 생성

		/* arr1 숫자 10개를 담을 수 있는 배열 생성
		 * 1 ~ 50까지의 랜덤수를 추출하여 입력 후 출력
		 */
		
		int arr1[] = new int[10];
		for (int i = 0; i < arr1.length; i ++) {
			int ran = (int)((Math.random()*50)+1);
			arr1[i] = ran;
		}
		for (int tmp : arr1) { 
			System.out.print(tmp + " ");			
		}

 

▣ 숫자 정렬(오름차순, 내림차순)

    // 정렬하여 출력
    /* 작은 수부터 = 오름차순
     * 큰 수부터 = 내림차순
     * 8 41 19 35
     * 
     */

    System.out.println();
    System.out.println("---정렬 후--");
    for (int i = 0; i < arr1.length - 1; i ++) {            // n번째하고 n+1번째랑 비교해야하기 때문에 (length-1)번째까지 해야함
        for(int j = i + 1; j < arr1.length; j ++) {
            if(arr1[i] > arr1[j]) {                         // 오름차순 > / 내림차순 <
                // 두 수의 교환
                int tmp = arr1[i];
                arr1[i] = arr1[j];
                arr1[j] = tmp;
            }
        }
    }

    for(int a : arr1) {
        System.out.print(a + " ");
    }

 

▣ 랜덤으로 섞기

		/* 정렬되어있는 arr 배열을 섞는 코드
		 * 랜덤 번지를 선택하여 순차적으로 하나씩 교환
		 * 0 ~ 9번지를 랜덤으로 출력
		 * (int)(Math.random()*10);
		 */
		
		for(int i = 0; i < arr.length; i ++) {
			int r = (int)(Math.random()*10);
			int tmp =arr[i];
			arr[i] = arr[r];
			arr[r] = tmp;
		}
		
		System.out.println();
		System.out.println("--arr 교환 후--");
		for(int a : arr) {
			System.out.print(a + " ");
		}

 

▣ 다차원 배열

다차원 배열

 

		/* 2차원 배열
		 * 10 20 30
		 * 40 50 60
		 * 70 80 90
		 * 100 110 120
		 * 130 140 150
		 * 자료형 배열명[][] = new 자료형[5][3]; // 5행 3열
		 */
		
		int arr[][] = new int[5][3];
		
		int cnt = 1;
		for(int i = 0; i < arr.length; i ++) { // 0 ~ 4행 반복
			for(int j = 0; j < arr[0].length; j ++) { // 첫 행의 열 length
				arr[i][j] = cnt*10;
				cnt++;
				System.out.print(arr[i][j] + " ");
			}
			System.out.println(); // 한 행마다 줄바꿈
		}

 

4. 예제 문제

◎ 문제 1번

		/* arr 배열의 합계와 평균을 출력
		 * 최대값, 최솟값 출력
		 * 합격자 수 출력 (점수가 70이상이면 합격) => 전체 몇 명중에 몇 명이 합격하였습니다!
		 * 배열 = {10, 45, 59, 60, 12, 3, 75, 20, 35}
		 */

 

◎ 문제 2번

		// 과제
		/* 가위바위보 게임
		 * 가위바위보를 랜덤으로 선택( 0 = 가위, 1 = 바위, 2 = 보)
		 * 내가 가위바위보 중 하나를 입력
		 * 승 / 패 / 무의 결과를 출력
		 * ex
		 * com = 0(가위)
		 * user = 가위
		 * com : 가위, user : 가위 => 무승부
		 */

 

정답:

◎ 문제 1번

		int arr[] = new int[] {10, 89, 96, 45, 59, 60, 12, 3, 75, 20, 35};
		
		
		int max = 0;       // 최댓값
		int min = 0;       // 최솟값
		int sum = 0;       // 합계
		double avg = 0;    // 평균
		int count = 0;     // 합격자 수
		max = arr[0];      // 최댓값의 초기값
		min = arr[0];      // 최솟값의 초기값
		
		// 계산
		for(int i = 0; i < arr.length; i++) {
			sum += arr[i];
			avg = sum / (double)arr.length;
			if (arr[i] > max) {              // 최댓값 계산
				max = arr[i];
			}
			if (arr[i] < min) {              // 최솟값 계산
				min = arr[i];
			}
			if (arr[i] >= 70) {              // 합격자 수
				count += 1;
			}
		}
		
		
		System.out.println("합계: " + sum + " / " + "평균: " + avg);
		System.out.println("최댓값: " + max + " / " + "최솟값: " + min);
		System.out.println("전체 " + arr.length + "명중에 " + count + "명이 합격하였습니다!");

 

▣ Math

		// Math.max / Math.min
		
//		max = Math.max(max, arr[i]); 
//		min = Math.min(min, arr[i]);

Math.max와 Math.min을 활용하면 if문을 활용하지 않아도 최댓값과 최솟값을 바로 구할 수 있습니다.

 

 

◎ 문제 2번

		Scanner scan = new Scanner(System.in);
		
		int com = (int)(Math.random()*2);                       // 0 ~ 2까지의 랜덤 정수 & 플레이어의 가위바위보 입력값
		String arr[] = new String[] {"가위", "바위", "보"};        // 가위, 바위, 보 출력
		int user = 0;                                           // 플레이어의 가위바위보 입력값
		
		System.out.println("가위바위보 게임");
		while(true) {
			System.out.println("(가위 / 바위 / 보)중에 한 가지를 입력해주세요.");
			String msg = scan.next();                                        // 플레이어 가위바위보 입력
			
			// 플레이어가 가위바위보 입력 시, user 변수에 숫자 입력 (잘못 입력될 시, 게임 종료)
			if(msg.equals("가위")) {
				user = 0;
			} else if(msg.equals("바위")) {
				user = 1;
			} else if(msg.equals("보")) {
				user = 2;
			} else {
				System.out.println("잘못 입력하셨습니다.");
				System.out.println("게임을 종료합니다.");
				break;
			}
			
			if (user == com) {                                                // 가위바위보 출력 & 무승부, 패배, 승리 출력
				System.out.println("com = " + arr[com]);
				System.out.println("user = " + arr[user]);
				System.out.println("com : " + arr[com] + " / user : " + arr[user] + " => 무승부");
			} else if (((user == 0) && (com == 1)) || ((user == 1) && (com == 2)) || ((user == 2) && (com == 0))) {
				System.out.println("com = " + arr[com]);
				System.out.println("user = " + arr[user]);
				System.out.println("com : " + arr[com] + " / user : " + arr[user] + " => 패배");
			} else if (((user == 0) && (com == 2)) || ((user == 1) && (com == 0)) || ((user == 2) && (com == 1))) {
				System.out.println("com = " + arr[com]);
				System.out.println("user = " + arr[user]);
				System.out.println("com : " + arr[com] + " / user : " + arr[user] + " => 승리");
				break;
			} 
		}
		
		
		scan.close();

 

 

5. 느낀점

오늘 배웠던 개념이 어려워 보였지만 막상 활용해보니 쉬웠던 것 같다. 오늘 문제들을 풀면서 최댓값, 최솟값, 정렬(오름차순, 내림차순)의 조건들을 바로 떠오르지 못해서 문제를 푸는 과정 중에 차질이 생겼다. 오늘 복습을 통해서 Math, 정렬에 대해 집중적으로 공부를 해야겠다고 생각하게 되었다.