본문 바로가기

Java를 자바

[Java] 배열 Array

Array

비슷한 변수를 여러 개 만들어야 할 때 유용하게 사용된다.

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

        System.out.println("학생1 점수: " + student1);
        System.out.println("학생2 점수: " + student2);
        System.out.println("학생3 점수: " + student3);
        System.out.println("학생4 점수: " + student4);
    }
}

이런식의 코드가 있을 때 변수를 하나씩 생성하고, 학생 뒤의 숫자와 출력할 변수를 하나하나 바꾸기가 귀찮음. 반복문으로 할 수 있지 않을까? ⇒ 못함

그래서 배열이란 것을 쓰면 편리하게 이용할 수 있음

public class Array1 {
    public static void main(String[] args) {
        int[] students; //배열 변수 선언
        students = new int[4]; //배열의 크기를 4로 초기화

        //변수 값 대입
        students[0] = 90;
        students[1] = 80;
        students[2] = 70;
        students[3] = 60;

        //변수 값 사용
        System.out.println("학생1 점수: " + students[0]);
        System.out.println("학생2 점수: " + students[1]);
        System.out.println("학생3 점수: " + students[2]);
        System.out.println("학생4 점수: " + students[3]);
    }
}

위의 코드와 같은 결과값이 출력됨

  • int[] students; 배열 변수를 선언한 것이지 배열 안은 비어있음
  • new int[숫자] 를 하게되면 새로운 배열을 숫자 크기만큼으로 만든다는 뜻이다.(배열의 크기만큼 메모리 확보) 내부값은 0으로 자동으로 초기화됨
  • booleanfalse , Stringnull 로 초기화 된다.
  • students 는 배열이 생성된 위치를 나타낸다. (메모리 주소)

배열 사용

인덱스

: 배열은 0부터 시작한다. (인덱스는 0부터 시작한다.)

ex. 배열의 크기가 5라면 인덱스는 0, 1, 2, 3, 4까지 존재한다.

배열에 값 대입

배열명[인덱스] = 값;

기본형 vs 참조형

  • 기본형
    • 변수에 사용할 값을 직접 넣을 수 있는 데이터 타입
    • 이때까지 우리가 사용했던 변수 개념 (int a = 5;)
    • 선언과 동시에 사이즈가 정적으로 정해짐
  • 참조형
    • 데이터에 접근하기 위한 참조(주소)를 저장하는 데이터 타입
    • ex. 배열, 객체 (int[] students)
      • students가 저장된 배열의 참조를 저장하는 것
    • 동적으로 크기가 변할 수 있음

배열 리펙토링

리펙토링 : 코드를 개선하는 것

public class Array1 {
    public static void main(String[] args) {
        int[] students; //배열 변수 선언
        students = new int[4]; //배열의 크기를 4로 초기화

        //변수 값 대입
        students[0] = 90;
        students[1] = 80;
        students[2] = 70;
        students[3] = 60;

        //변수 값 사용
        System.out.println("학생1 점수: " + students[0]);
        System.out.println("학생2 점수: " + students[1]);
        System.out.println("학생3 점수: " + students[2]);
        System.out.println("학생4 점수: " + students[3]);
    }
}

⬇️

public class Array1 {
    public static void main(String[] args) {
        int[] students; //배열 변수 선언
        students = new int[4]; //배열의 크기를 4로 초기화

        //변수 값 대입
        students[0] = 90;
        students[1] = 80;
        students[2] = 70;
        students[3] = 60;

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

출력은 똑같지만 간단하게 코드가 개선되었다.

students.length : 배열의 길이를 제공해줌

⬇️

public class Array1 {
    public static void main(String[] args) {
        int[] students = new int[]{90, 80, 70, 60};
        //int[] students = {90, 80, 70, 60}; 윗줄과 같은 코드임

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

배열 선언과 동시에 초기화 진행

 

오류

int[] students;
students = {90, 80, 70, 60};

이렇게 나눠서 적을 때에 new int[] 는 생략하면 안됨

이제 배열의 값을 추가해도 나머지 코드를 변경할 필요가 없다. 알아서 크기가 늘어난다~!

2차원 배열

생성

int[][] arr = new int[크기][크기];

행(row), 열(column)

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

        arr[0][0] = 1;
        arr[0][1] = 2;
        arr[0][2] = 3;
        arr[1][0] = 4;
        arr[1][1] = 5;
        arr[1][2] = 6;

        System.out.print(arr[0][0] + " ");
        System.out.print(arr[0][1] + " ");
        System.out.print(arr[0][2] + " ");
        System.out.println();
        System.out.print(arr[1][0] + " ");
        System.out.print(arr[1][1] + " ");
        System.out.print(arr[1][2] + " ");
    }
}

⬇️리펙토링

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

        arr[0][0] = 1;
        arr[0][1] = 2;
        arr[0][2] = 3;
        arr[1][0] = 4;
        arr[1][1] = 5;
        arr[1][2] = 6;

        for(int row = 0; row < 2; row++){ //행 출력
            for(int col = 0; col < 3; col++) { //열 출력
                System.out.print(arr[row][col] + " ");
            }
            System.out.println();
        }
    }
}

⬇️

2차원 배열 선언 부분 수정

public class ArrayDi0 {
    public static void main(String[] args) {
        int[][] arr = new int[][]{
            {1,2,3},
            {4,5,6}
        }; //행: 2, 열: 3

        for(int row = 0; row < 2; row++){
            for(int col = 0; col < 3; col++) {
                System.out.print(arr[row][col] + " ");
            }
            System.out.println();
        }
    }
}

new int[][] 생략 가능

⬇️

반복할 때 배열의 크기만큼 반복되도록 length 사용

public class ArrayDi0 {
    public static void main(String[] args) {
        int[][] arr = new int[][]{
            {1,2,3},
            {4,5,6}
        }; //행: 2, 열: 3

        for(int row = 0; row< arr.length; row++){
            for(int col = 0; col< arr[row].length; col++) {
                System.out.print(arr[row][col] + " ");
            }
            System.out.println();
        }
    }
}

for-each문

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-each문
        for(int number : numbers){
            System.out.println(number);
        }
    }
}

iter 단축키 : for-each문 만들어주는 단축키

for-each문을 사용할 수 없는 경우

: 인덱스 값이 필요할 때는 사용X

for(int i=0; i<number.length; i++){
    System.out.println("number" + i + "번의 결과는 " + number[i]);
}

이런 식으로 i값(인덱스값)이 필요한 경우에는 for-each를 사용할 수 없다.

예제

배열을 사용해서 개선하자.

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

             int total = student1 + student2 + student3 + student4 + student5;
             double average = (double) total / 5;

             System.out.println("점수 총합: " + total);
             System.out.println("점수 평균: " + average);
     }
}

⬇️

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

        int total = 0;
        for (int student : students) {
            total += student;
        }

        double avg = (double) total/students.length;

        System.out.println("점수 총합 : " + total);
        System.out.println("점수 평균 : " + avg);

    }
}

입력 받은 값 배열에 넣고 출력

import java.util.Scanner;

public class ex {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int[] students= new int[5];

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

        System.out.println("출력");
        for(int i=0; i<students.length; i++){
            System.out.print(students[i]);
            if(i < students.length-1){
                System.out.print(", ");
            }
        }

    }
}

배열 역순 출력

import java.util.Scanner;

public class ex {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int[] students= new int[5];

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

        System.out.println("입력한 정수 역순으로 출력");
        for(int i = students.length - 1; i >= 0; i--){
            System.out.print(students[i]);
            if(i > 0){
                System.out.print(", ");
            }
        }

    }
}

입력 받은 개수만큼 수를 입력받고 합계와 평균 구하기

import java.util.Scanner;

public class ex {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

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

        int[] students= new int[cnt];

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

        int sum = 0;

        for(int output : students){
            sum += output;
        }

        System.out.println("입력한 정수의 합계: " + sum);
        System.out.println("입력한 정수의 평균: " + (double)sum/students.length);

    }
}

2차원 배열 학생들 점수 합계, 평균 구하기

import java.util.Scanner;

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

        int[] sum = new int[4];
        double avg = 0;

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

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

    }
}

'Java를 자바' 카테고리의 다른 글

JDK 설치하기, 환경변수 설정  (0) 2024.06.19
메서드(Method)  (0) 2024.05.06
[Java] Scanner(사용자 입력받기)  (0) 2024.04.30
[Java] 형변환  (0) 2024.04.11
[Java] 스코프  (2) 2024.04.11