JAVA 멍충이 탈출기 7

sein lee·2024년 4월 8일
0

java-study

목록 보기
1/12
post-thumbnail
post-custom-banner

배열

배열시작

배열이 필요한 이유

같은 타입의 변수를 반복해서 선언하고 반복해서 사용하는 문제를 해결하는 것이 바로 배열이다.

배열의 선언과 생성

<ArrayRef1.java>

package array;

public class ArrayRef1 {
    public static void main(String[] args) {
        int[] students; //배열 변수 선언
        students = new int[5]; // 배열생성
        students[0]=90;
        students[1] = 80;
        students[2] = 70;
        students[3] = 60;
        students[4] = 50;

        System.out.println("학생1 점수: " + students[0]);
        System.out.println("학생2 점수: " + students[1]);
        System.out.println("학생3 점수: " + students[2]);
        System.out.println("학생4 점수: " + students[3]);
        System.out.println("학생5 점수: " + students[4]);

        System.out.println(students);
    }
}

배열사용

인덱스

  • 배열은 0부터 시작한다.

기본현 vs 참조형

사용하는 값을 직접 넣을 수 있는 기본형, 배열 변수와 같이 메모리의 참조값을 넣을 수 있는 참조형

  • 기본형(Primitive Type): 우리가 지금까지 봤던 int , long , double , boolean 처럼 변수에 사용할 값을 직접 넣을 수 있는 데이터 타입을 기본형(Primitive Type)이라 한다.
  • 참조형(Reference Type): int[] students 와 같이 데이터에 접근하기 위한 참조(주소)를 저장하는 데이터타입을 참조형(Reference Type)이라 한다. 뒤에서 학습하는 객체나 클래스를 담을 수 있는 변수들도 모두 참조형이다.

배열 리펙토링

리펙토링(Refactoring)은 기존의 코드 기능은 유지하면서 내부 구조를 개선하여 가독성을 높이고, 유지보수를 용이하게 하는 과정을 뜻한다. 이는 중복을 제거하고, 복잡성을 줄이며, 이해하기 쉬운 코드로 만들기 위해 수행된다. 리펙토링은 버그를 줄이고, 프로그램의 성능을 향상시킬 수도 있으며, 코드의 설계를 개선하는 데에도 도움이 된다.
쉽게 이야기해서 작동하는 기능은 똑같은데, 코드를 개선하는 것을 리펙토링이라 한다

<ArrayRef2.java>

package array;

public class ArrayRef2 {
    public static void main(String[] args) {
        int[] students; //배열 변수 선언
        students = new int[5]; // 배열생성
        students[0]=90;
        students[1] = 80;
        students[2] = 70;
        students[3] = 60;
        students[4] = 50;

        for(int i =0;i<students.length;i++){
            System.out.println("학생"+(i+1)+ " 점수 : "+ students[i]);
        }

        System.out.println(students);
    }
}
  • 반복문을 사용하여 효과적으로 변경

<ArrayRef3.java>

package array;

public class ArrayRef3 {
    public static void main(String[] args) {
        int[] students;
        
        students = new int[]{90, 80, 70, 60, 50}; //배열 생성과 초기화
        
        for (int i = 0; i < students.length; i++) {
            System.out.println("학생" + (i + 1) + " 점수: " + students[i]);
        }
    }
}
  • 배열 생성과 초기화를 한줄로도 표현이 가능하다.

<ArrayRef4.java>

package array;

public class ArrayRef4 {
    public static void main(String[] args) {
        //배열 생성 간략 버전, 배열 선언과 함께 사용시 new int[] 생략 가능
        int[] students = {90, 80, 70, 60, 50};
        for (int i = 0; i < students.length; i++) {
            System.out.println("학생" + (i + 1) + " 점수: " + students[i]);
        }
    }
}

int[] students;
students = {90, 80, 70, 60, 50};
=> 오류

2차원 배열 - 시작

2차원 배열은 행과 열로 구성된다.

arr[행][열] , arr[row][column]

<ArrayDi0.java>

package array;

public class ArrayDi0 {
    public static void main(String[] args) {
        int[][] arr = new int[2][3];

        arr[0][0] = 1; //0행, 0열
        arr[0][1] = 2; //0행, 1열
        arr[0][2] = 3; //0행, 2열
        arr[1][0] = 4; //1행, 0열
        arr[1][1] = 5; //1행, 1열
        arr[1][2] = 6; //1행, 2열
        //0행 출력
        System.out.print(arr[0][0] + " "); //0열 출력
        System.out.print(arr[0][1] + " "); //1열 출력
        System.out.print(arr[0][2] + " "); //2열 출력
        System.out.println(); //한 행이 끝나면 라인을 변경한다.

        //1행 출력
        System.out.print(arr[1][0] + " "); //0열 출력
        System.out.print(arr[1][1] + " "); //1열 출력
        System.out.print(arr[1][2] + " "); //2열 출력
        System.out.println(); //한 행이 끝나면 라인을 변경한다
    }
}

2차원 배열 - 리펙토링1

for문을 활용하여 출력방법 개선하기
<ArrayDi1.java>

package array;

public class ArrayDi1 {
    public static void main(String[] args) {
        int[][] arr = new int[2][3];

        arr[0][0] = 1; //0행, 0열
        arr[0][1] = 2; //0행, 1열
        arr[0][2] = 3; //0행, 2열
        arr[1][0] = 4; //1행, 0열
        arr[1][1] = 5; //1행, 1열
        arr[1][2] = 6; //1행, 2열

        for (int row = 0; row < 2; row++) {
            System.out.print(arr[row][0] + " "); //0열 출력
            System.out.print(arr[row][1] + " "); //1열 출력
            System.out.print(arr[row][2] + " "); //2열 출력
            System.out.println(); //한 행이 끝나면 라인을 변경한다.
        }
    }
}

<ArrayDi2.java>

package array;

public class ArrayDi2 {
    public static void main(String[] args) {
        int[][] arr = new int[2][3];

        arr[0][0] = 1; //0행, 0열
        arr[0][1] = 2; //0행, 1열
        arr[0][2] = 3; //0행, 2열
        arr[1][0] = 4; //1행, 0열
        arr[1][1] = 5; //1행, 1열
        arr[1][2] = 6; //1행, 2열

        for (int row = 0; row < 2; row++) {
            for (int column = 0; column < 3; column++) {
                System.out.print(arr[row][column] + " ");
            }
            System.out.println(); //한 행이 끝나면 라인을 변경한다.
        }
    }
}

2차원 배열 - 리펙토링1

2차원배열도 쉽게 초기화 할 수 있다.
for문에서 배열의 길이 활용하기
<ArrayDi3.java>

package array;

public class ArrayDi3 {
    public static void main(String[] args) {
        // 2x3 2차원 배열, 초기화
        int[][] arr = {
                {1, 2, 3},
                {4, 5, 6}
        };

        // 2차원 배열의 길이를 활용
        for (int row = 0; row < arr.length; row++) {
            for (int column = 0; column < arr[row].length; column++) {
                System.out.print(arr[row][column] + " ");
            }
            System.out.println();
        }
    }
}

구조개선 - 값입력

<ArrayDi4.java>

package array;

public class ArrayDi4 {
    public static void main(String[] args) {
        // 2x3 2차원 배열, 초기화
        int[][] arr = new int[2][3];
        int i = 1;
        // 순서대로 1씩 증가하는 값을 입력한다.
        for (int row = 0; row < arr.length; row++) {
            for (int column = 0; column < arr[row].length; column++) {
                arr[row][column] = i++;
            }
        }
        // 2차원 배열의 길이를 활용
        for (int row = 0; row < arr.length; row++) {
            for (int column = 0; column < arr[row].length; column++) {
                System.out.print(arr[row][column] + " ");
            }
            System.out.println();
        }
    }
}

향상된 for문

for (변수 : 배열 또는 컬렉션) {
// 배열 또는 컬렉션의 요소를 순회하면서 수행할 작업
}

<EnhancedFor1.java>

package array;

public class EnhancedFor1 {
    public static void main(String[] args) {
        int[] numbers ={1,2,3,4,5};
        
        //일반 for문
        for(int i=0; i<numbers.length;i++){
            int number = numbers[i];
            System.out.println(number);
        }
        
        //향상된 for문
        for(int number:numbers){
            System.out.println(number);
        }
    }
}
  • 향상된 for문을 사용하지 못하는 경우
    =증가하는 인덱스 값을 직접 사용해야하는 경우

문제와 풀이1

<ArrayEx1.java>

package array.ex;

public class ArrayEx1 {
    public static void main(String[] args) {
        int[] students = {90,80,70,60,50};
        int total = 0;

        for (int i = 0; i < students.length; i++) {
            total += students[i];
        }
        double avg = (double) total / students.length;
        System.out.println("total: "+ total);
        System.out.println("avg: "+avg);
    }
}

<ArrayEx2.java>

package array.ex;

import java.util.Scanner;

public class ArrayEx2 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int[] arr = new int[5] ;
        for(int i = 0; i< arr.length; i++){
            arr[i] = scanner.nextInt();
        }
        for (int i=0; i<arr.length;i++){
            System.out.print(arr[i]);
            if(i< arr.length-1){
                System.out.print(",");
            }
        }
    }
}

<ArrayEx3.java>

package array.ex;

import java.util.Scanner;

public class ArrayEx3 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int[] arr = new int[5] ;
        for(int i = 0; i< arr.length; i++){
            arr[i] = scanner.nextInt();
        }
        System.out.print("기존 배열 : ");
        for (int i=0; i<arr.length;i++){
            System.out.print(arr[i]);
            if(i< arr.length-1){
                System.out.print(",");
            }
        }
        System.out.println();
        System.out.print("역순 배열 : ");
        for(int i =arr.length-1; i>=0 ;i--){
            System.out.print(arr[i]);
            if(i>0){
                System.out.print(",");
            }
        }
    }
}

<ArrayEx4.java>

package array.ex;

import java.util.Scanner;

public class ArrayEx4 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int[] arr = new int[5] ;
        int sum =0;

        for(int i = 0; i< arr.length; i++){
            arr[i] = scanner.nextInt();
        }

        for (int i=0; i<arr.length;i++){
            sum += arr[i];
        }
        System.out.println("합 : " + sum);
        System.out.println("평균 : "+ (double)sum / arr.length );

    }
}

<ArrayEx5.java>

package array.ex;

import java.util.Scanner;

public class ArrayEx5 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("입력받을 숫자의 개수 : ");
        int count = scanner.nextInt();

        int[] arr = new int[count] ;
        int sum =0;

        for(int i = 0; i< arr.length; i++){
            arr[i] = scanner.nextInt();
        }

        for (int i=0; i<arr.length;i++){
            sum += arr[i];
        }
        System.out.println("합 : " + sum);
        System.out.println("평균 : "+ (double)sum / count );

    }
}

문제와 풀이2

<ArrayEx5.java>

package array.ex;

import java.util.Scanner;

public class ArrayEx5 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("입력받을 숫자의 개수 : ");
        int count = scanner.nextInt();

        int[] arr = new int[count] ;

        for(int i = 0; i< arr.length; i++){
            arr[i] = scanner.nextInt();
        }

        int max = arr[0];
        int min = arr[0];

        for(int i =0;i< arr.length;i++){
            if (arr[i] < min) {
                min = arr[i];
            }
            if (arr[i] > max) {
                max = arr[i];
            }
        }
        System.out.println("가장 작은 정수: " + min);
        System.out.println("가장 큰 정수: " + max);

    }
}

<ArrayEx7.java>

package array.ex;

import java.util.Scanner;

public class ArrayEx7 {
    public static void main(String[] args) {
        int[][] arr = new int[4][3];
        String[] sub = {"국어","영어","수학"};
        Scanner scanner = new Scanner(System.in);


        for(int row=0; row<arr.length; row++){
            System.out.println((row+1)+"번 학생의 성적을 입력하세요 : ");
            for(int col=0; col< arr[row].length;col++){
                System.out.print(sub[col]+ " : ");
                arr[row][col] = scanner.nextInt();
            }
        }

        for(int row=0; row< arr.length; row++){
            int sum =0;
            for(int col=0; col<arr[row].length;col++){
                sum += arr[row][col];
            }
            System.out.println((row+1)+ "번 학생의 총점 : "+sum);
            System.out.println((row+1)+ "번 학생의 평균 : "+ ((double)sum / sub.length));
        }

    }
}

<ArrayEx8.java>

package array.ex;

import java.util.Scanner;

public class ArrayEx8 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("학생 수 입력 : ");
        int count = scanner.nextInt();
        int[][] arr = new int[count][3];
        String[] sub = {"국어","영어","수학"};

        for(int row=0; row<arr.length; row++){
            System.out.println((row+1)+"번 학생의 성적을 입력하세요 : ");
            for(int col=0; col< arr[row].length;col++){
                System.out.print(sub[col]+ " : ");
                arr[row][col] = scanner.nextInt();
            }
        }

        for(int row=0; row< arr.length; row++){
            int sum =0;
            for(int col=0; col<arr[row].length;col++){
                sum += arr[row][col];
            }
            System.out.println((row+1)+ "번 학생의 총점 : "+sum);
            System.out.println((row+1)+ "번 학생의 평균 : "+ ((double)sum / sub.length));
        }

    }
}

문제와 풀이3

<ProductAdminEx.java>

package array.ex;

import java.util.Scanner;

public class ProductAdminEx {
    public static void main(String[] args) {
        int maxProducts = 10;
        String[] productNames = new String[maxProducts];
        int[] productPrices = new int[maxProducts];
        int productCount = 0;
        Scanner scanner = new Scanner(System.in);

        while (true) {
            System.out.print("1. 상품 등록 | 2. 상품 목록 | 3. 종료\n메뉴를 선택하세요:");
            int menu = scanner.nextInt();
            scanner.nextLine();
            if (menu == 1) {
                if (productCount >= maxProducts) {
                    System.out.println("더 이상 상품을 등록할 수 없습니다.");
                    continue;
                }
                System.out.print("상품 이름을 입력하세요:");
                productNames[productCount] = scanner.nextLine();
                System.out.print("상품 가격을 입력하세요:");
                productPrices[productCount] = scanner.nextInt();
                productCount++;
            } else if (menu == 2) {
                if (productCount == 0) {
                    System.out.println("등록된 상품이 없습니다.");
                    continue;
                }
                for (int i = 0; i < productCount; i++) {
                    System.out.println(productNames[i] + ": " + productPrices[i]
                            + "원");
                }
            } else if (menu == 3) {
                System.out.println("프로그램을 종료합니다.");
                break;
            } else {
                System.out.println("잘못된 메뉴를 선택하셨습니다.");
            }
        }
    }
}
profile
개발감자
post-custom-banner

0개의 댓글