본문 바로가기
IT/김영한의JAVA입문_inFlearn

8. 배열 - 배열의 선언과 생성 / 배열 사용 / 배열 리펙토링 / 2차원 배열 / 2차원 배열 리펙토링 / 향상된 for문 / 문제와 풀이 1~3

by for-learn 2025. 1. 15.

8-1. 배열 시작

Array1.java

package array;

public class Array1 {
    public static void main(String[] args) {
        int student1 = 90;
        int student2 = 80;
        int student3 = 70;
        int student4 = 60;
        int student5 = 50;

        System.out.println("학생1 점수: " + student1);
        System.out.println("학생2 점수: " + student2);
        System.out.println("학생3 점수: " + student3);
        System.out.println("학생4 점수: " + student4);
        System.out.println("학생5 점수: " + student5);
    }
}
  • 배열은 같은 타입의 변수를 반복해서 선언하고, 반복해서 사용하는 문제를 해결할 때 사용

 

8-2. 배열의 선언과 생성

배열: 같은 타입의 변수를 사용하기 편하게 하나로 묶어둔 것.

Array1Ref1.java

package array;

public class Array1Ref1 {
    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]);
    }
}

1. 배열 변수 선언

  • 타입[ ] 변수명;
  • 배열 변수에 10, 20과 같은 값 뿐만 아니라 배열을 담을 수 있다. 

 

 

 

2. 배열 생성

  • 자바는 배열을 생성할 때 내부값을 자동으로 초기화한다. 
  • 생성시 new 입력
  • 숫자는 0 , boolean 은 false , String 은 null (없다는 뜻이다.)로 초기화

 

3. 배열 참조값 보관 (메모리 주소)

  • 배열을 생성하면 배열의 크기만큼 메모리를 확보
    new int[5]일 때, 4byte * 5 => 20byte 확보
  • 배열 생성 후 자바는 메모리 어딘가에 있는 이 배열에 접근할 수 있는 참조값(주소)( x001 )을 반환
  • 앞서 선언한 배열 변수인 int[] students 에 생성된 배열의 참조값( x001 )을 보관
    변수명
    에는 배열의 위치만 들어가 있고 그 위치로 가야지 배열이 있다. 
    ex) students = x001
// 참조값 확인
System.out.println(students); 

  • [I => 인트형 배열
  • @의 뒷부분 => 메모리 주소(참조값)를 16진수로 표현

 

8-3. 배열 사용

인덱스 index

  • 배열은 변수와 사용법이 비슷한데 차이점이 => [ ] 사이에 숫자번호를 넣어 사용
  • 배열의 위치를 나타내는 숫자 => 인덱스

  • 배열은 0부터 시작
    때문에, new int[5] 일때, 사용 가능한 인덱스의 범위0 ~ (n-1) 이다. => 0, 1, 2, 3, 4
  • students[5]를 사용하면 오류(예외) 발생한다. 

배열에 값 대입

  • students[0] = 90; // 1. 배열에 값을 대입
  • x001[0] = 90; // 2. 변수에 있는 참조값을 통해 실제 배열에 접근. 인덱스를 사용해서 해당 위치의 요소에 접근, 값 대입

배열에 값 읽기

  • 대입과 동일한 순서

 

기본형 vs 참조형 (자바 변수의 데이터 타입을 크게 분류)

기본형 Primitive Type

사용하는 값을 직접 넣을 수 있음
int , long , double , boolean 처럼 변수에 사용할 값을 직접 넣을 수 있는 데이터 타입

 

참조형 Reference Type

배열 변수와 같이 메모리의 참조값을 넣을 수 있음
int[ ] students와 같이 데이터에 접근하기 위한 참조(주소)를 저장하는 데이터 타입
=> 객체클래스를 담을 수 있는 변수들도 모두 참조형
  • 기본형은 선언과 동시에 크기가 정적으로 정해진다. => 크기를 동적으로 바꿀 수 없다.
  • 배열과 같은 참조형은 크기를 동적으로 할당할 수 있다. => 동적 메모리 할당

 

8-4. 배열 리펙토링

리펙토링(Refactoring) :

기존 코드 기능은 유지하면서 내부 구조를 개선하여 가독성을 높이고, 유지보수를 용이하게 하는 과정
중복을 제거하고, 복잡성을 줄이며, 이해하기 쉬운 코드로 만드는 과정

Array1Ref2.java

package array;

public class Array1Ref2 {
    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]);
        }
    }
}
  • students.length => 배열의 길이

Array1Ref3.java - 초기화  

package array;

public class Array1Ref3 {
    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]);
        }
    }
}

 

Array1Ref4.java - 간단한 배열 생성

package array;

public class Array1Ref4 {
    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 = {90, 80, 70, 60, 50}; 는 되지만,
  • int[ ] students;
    students = {90, 80, 70, 60, 50}; 는 안된다.
  • 학생의 점수를 추가해도 {90, 80, 70, 60, 50} 의 내용만 변경하고 나머지 코드는 변경하지 않아도 된다

 

8-5. 2차원 배열 - 시작

  • 2차원 배열은 행(row)열(column)로 구성된다.
  • arr[행][열]
  • 선언 => int[ ][ ] arr = new int[2][3] 
  • 사용 => arr[1][2]

ArrayDi0.java

package array;

public class ArrayDi0 {
    public static void main(String[] args) {
        // 2x3 2차원 배열 만들기
        int[][] arr = new int[2][3]; // 행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(); // 한 행이 끝나면 라인을 변경
    }
}

 

8-6. 2차원 배열 - 리펙토링1

ArrayDi1.java - 구조 개선 (행 출력)

package array;

public class ArrayDi1 {
    public static void main(String[] args) {
        // 2x3 2차원 배열 만들기
        int[][] arr = new int[2][3]; // [row][column]

        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) {
        // 2x3 2차원 배열 만들기
        int[][] arr = new int[2][3]; // [row][column]

        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(); // 한 행이 끝나면 라인을 변경
        }
    }
}

 

 

8-7. 2차원 배열 - 리펙토링2

ArrayDi3.java - 구조 개선 (초기화, 배열의 길이)

package array;

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

        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(); // 한 행이 끝나면 라인을 변경
        }
    }
}
  • 행 길이 => arr.length
  • 열 길이 => arr[row].length

ArrayDi4.java - 구조 개선 (값 입력)

package array;

public class ArrayDi4 {
    public static void main(String[] args) {
        // 선언, 생성: 2차원 배열 만들기
        int[][] arr = new int[10][10];

        // 입력: 순서대로 1씩 증가하는 값을 입력
        int i = 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(); // 한 행이 끝나면 라인을 변경
        }
    }
}

 

8-8. 향상된 for문

향상된 for문(Enhanced For Loop)

각각의 요소를 탐색한다는 의미로 for-each문 이라고도 함
배열을 사용할 때 기존 for문 보다 더 편리하게 사용
for (변수 : 배열 또는 컬렉션) {
    // 배열 또는 컬렉션의 요소를 순회하면서 수행할 작업
    // iter(향상된 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-each문
        for (int number : numbers) { // 단축키 => iter
            System.out.println(number);
        }

        // for-each문을 사용할 수 없는 경우, 증가하는 index 값이 필요할 때
        for (int i = 0; i < numbers.length; i++) {
            System.out.println("number" + i + "번의 결과는: " + numbers[i]);
        }
    }
}
  • 인덱스 값이 필요할 경우, 향상된 for문 (for-each문)사용할 수 없다. 

 

8-9. 문제와 풀이1

ArrayEx1Ref.java

package array.ex;

public class ArrayEx1Ref {
    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 average = (double) total / students.length;

        System.out.println("점수 총합: " + total);
        System.out.println("점수 평균: " + average);
    }
}
  • 평균을 계산할 때, total을 double로 형변환 해줘야 한다. 

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[] numbers = new int[5];

        System.out.println("5개의 정수를 입력하세요:");
        for (int i = 0; i < numbers.length; i++) {
            numbers[i] = scanner.nextInt();
        }

        System.out.println("출력");
        for (int i = 0; i < numbers.length; i++) {
            System.out.print(numbers[i]);
            if (i < numbers.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[] numbers = new int[5];

        System.out.println("5개의 정수를 입력하세요:");
        for (int i = 0; i < numbers.length; i++) {
            numbers[i] = scanner.nextInt();
        }

        System.out.println("입력한 정수를 역순으로 출력");
        for (int i = numbers.length-1; i >= 0; i--) {
            System.out.print(numbers[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[] numbers = new int[5];
        int total = 0;

        System.out.println("5개의 정수를 입력하세요:");
        for (int i = 0; i < numbers.length; i++) {
            numbers[i] = scanner.nextInt();
            total += numbers[i];
        }
        double average = (double) total / numbers.length;

        System.out.println("입력한 정수의 합계: " + total);
        System.out.println("입력한 정수의 평균: " + average);
    }
}

 

ArrayEx5.java

package array.ex;

import java.util.Scanner;

public class ArrayEx5 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int[] numbers;
        int total = 0;
        double average;

        System.out.print("입력받을 숫자의 개수를 입력하세요: ");
        int count = scanner.nextInt();
        numbers = new int[count];

        System.out.println(count + "개의 정수를 입력하세요:");
        for (int i = 0; i < numbers.length; i++) {
            numbers[i] = scanner.nextInt();
            total += numbers[i];
        }
        average = (double) total / numbers.length;

        System.out.println("입력한 정수의 합계: " + total);
        System.out.println("입력한 정수의 평균: " + average);
    }
}

 

8-10. 문제와 풀이2

ArrayEx6.java

package array.ex;

import java.util.Scanner;

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

        int[] numbers = new int[count];

        System.out.println(count + "개의 정수를 입력하세요:");
        for (int i = 0; i < numbers.length; i++) {
            numbers[i] = scanner.nextInt();
        }
        int min = numbers[0];
        int max = numbers[0];
        // minNumber = maxNumber = numbers[0]; 강의자료

        for (int i = 0; i < numbers.length; i++) {
            if (min > numbers[i]){
                min = numbers[i];
            } else if (max < numbers[i]) {
                max = numbers[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) {
        Scanner scanner = new Scanner(System.in);

        int[][] scores = new int[4][3];

        for (int row = 0; row < scores.length; row++) {
            System.out.println((row+1)+"번 학생의 성적을 입력하세요:");

            for (int column = 0; column < scores[row].length; column++) {
                if (column == 0) {
                    System.out.print("국어 점수: ");
                    scores[row][column] = scanner.nextInt();
                }
                if (column == 1) {
                    System.out.print("영어 점수: ");
                    scores[row][column] = scanner.nextInt();
                }
                if (column == 2) {
                    System.out.print("수학 점수: ");
                    scores[row][column] = scanner.nextInt();
                }
            }
        }

        for (int row = 0; row < scores.length; row++) {
            int total = 0;
            double average;
            
            for (int column = 0; column < scores[row].length; column++) {
                total += scores[row][column];
            }
            average = (double) total / scores[row].length;
            System.out.println((row + 1) + "번 학생의 총점: " + total + ", 평균: " + average);
        }

    }
}

 

강의풀이 => 과목명을 배열로 만들어서 돌림

public class ArrayEx7 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int[][] scores = new int[4][3];
        String[] subjects = {"국어", "영어", "수학"};
        for(int i=0; i<4; i++){
            System.out.println((i+1) + "번 학생의 성적을 입력하세요:");
            for(int j=0; j<3; j++){
                System.out.print(subjects[j] + " 점수:");
                scores[i][j] = scanner.nextInt();
            }
        }
        for(int i=0; i<4; i++){
            int total = 0;
            for(int j=0; j<3; j++){
                total += scores[i][j];
            }
            double average = total / 3.0;
            System.out.println((i+1) + "번 학생의 총점: " + total + ", 평균: " +
                    average);
        }
    }
}

 

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[][] scores = new int[count][3];
        String[] subject = {"국어", "영어", "수학"};

        for (int row = 0; row < scores.length; row++) {
            System.out.println((row+1)+"번 학생의 성적을 입력하세요:");

            for (int column = 0; column < scores[row].length; column++) {
                System.out.print(subject[column] + " 점수: ");
                scores[row][column] = scanner.nextInt();
            }
        }

        for (int row = 0; row < scores.length; row++) {
            int total = 0;
            for (int column = 0; column < scores[row].length; column++) {
                total += scores[row][column];
            }
            double average = (double) total / scores[row].length;
            System.out.println((row + 1) + "번 학생의 총점: " + total + ", 평균: " + average);
        }

    }
}

 

8-11. 문제와 풀이3

ProductAdminEx.java

package array.ex;

import java.util.Scanner;

public class ProductAdminEx {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int maxProduct = 10; // 제약조건: 상품은 최대 10개
        String[] productNames = new String[maxProduct];
        int[] productPrices = new int[maxProduct];
        int productCount = 0; // 등록된 상품 개수 저장 변수

        while (true) {
            System.out.print("1. 상품 등록 | 2. 상품 목록 | 3. 종료\n메뉴를 선택하세요: ");
            int i = scanner.nextInt();
            scanner.nextLine(); // 숫자 입력 후 줄바꿈 처리

            if (i == 1) {
                if (productCount < maxProduct) {
                    System.out.print("상품 이름을 입력하세요: ");
                    productNames[productCount] = scanner.nextLine();
                    System.out.print("상품 가격을 입력하세요: ");
                    productPrices[productCount] = scanner.nextInt();

                    productCount++;
                } else {
                    System.out.println("더 이상 상품을 등록할 수 없습니다.");
                }
            }

            if (i == 2) {
                if (productCount == 0) {
                    System.out.println("등록된 상품이 없습니다.");
                } else {
                    for (int j = 0; j < productCount; j++) {
                        System.out.println("상품명: "+productNames[j]+", 가격: "+productPrices[j]);
                    }
                }
            }

            if (i == 3) {
                System.out.println("프로그램을 종료합니다.");
                break;
            }
        }

    }
}
  • scanner.nextLine(); // 숫자 입력 후 줄바꿈 처리