본문 바로가기
전공 수업/객체 지향 프로그래밍(Java)

[6주 차] - 배열(Array)의 선언과 생성, 초기화, 다차원 배열

by TwoJun 2022. 10. 7.

    과목명 : 객체지향 프로그래밍(Object oriented programming)

수업일자 : 2022년 10월 05일 (수)

 

 

 

 

1. 배열(Array)의 선언과 생성

1-1. 배열(Array)의 정의

- 배열(Array)은 동일한 데이터 타입의 변수들로 이루어진 유한 집합으로 정의되며 컴퓨터 과학(Computer science)에서 배열은 공간의 순서를 나타내는 인덱스 번호를 가지고 연속적으로 나열된 데이터들로 이루어진 자료구조를 의미합니다.

 

 

 

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

(1) 배열의 선언

- 배열을 선언한다는 것은, 배열을 사용하기 위해 배열에 대한 참조변수(Reference variable)을 선언하는 것입니다.

- 참조변수를 선언하는 것이므로 실제로 배열에 대한 메모리 저장 공간이 생성되지 않습니다.

- 참조변수는 배열이 생성되어 만들어진 메모리 공간에 대한 시작 주소를 가지고 있습니다.

 

- 문법

- 데이터 타입[] 변수명;

- 데이터 타입 변수명[];

// 데이터 타입[] 변수명;
// 데이터 타입 변수명[];
int[] studentScore;
String studentName[];

 

 

(2) 배열의 생성, 인덱스 번호(Index number)

- 배열을 생성한다는 것은 위와 같이 배열을 사용하기 위한 참조변수를 생성하고 메모리에 배열을 위한 실제 공간을 생성하는 것을 말합니다.

 

- 문법

- 데이터 타입[] 변수명;

- 변수명 = new 데이터 타입[배열의 길이];

 

- 한 문장을 통해 배열의 선언과 생성이 모두 가능합니다.

- 데이터 타입[] 변수명 = new 데이터 타입[배열의 길이];

- 데이터 타입 변수명[]new 데이터 타입[배열의 길이];

// 배열의 선언과 생성
int[] studentScore = new int[10];

 

 

- 배열은 연속된 공간으로 값이 저장되며, 연속된 공간마다 할당된 번호를 인덱스 번호(Index number)라고 합니다.

 

- 인덱스 번호는 0부터 시작하며, 배열의 길이보다 1이 더 작다는 특징을 가집니다.

 

- 위의 코드를 예시로 들어보면, int[] studentScore = new int[10];이라는 코드를 통해 길이가 10인 배열이 생성되었으며 총 10개의 공간이 있고 첫 번째 공간부터 0번 인덱스이므로, studentScore[0], studentScore[1], studentScore[2] ... studentScore[8], studentScore[9]까지 총 10개의 공간이 존재합니다.

 

 

 

 

 

 

1-3. 배열의 초기화(Initialization)

- 배열의 초기화는, 생성된 배열에 처음으로 데이터를 할당하는 것을 의미합니다.

 

- 배열을 초기화할 수 있는 2가지 구문이 존재합니다.

(1) 데이터 타입[] 변수명 = new 데이터 타입[]{데이터 1, 데이터 2, 데이터 3, ... 데이터 n};

int[] studentScore = new int[]{100, 90, 80, 70, 60};

 

 

(2) 데이터 타입[] 변수명 = {데이터 1, 데이터 2, 데이터 3, ... 데이터 n};

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

 

 

- 반복문을 이용해 데이터를 저장할 수도 있으며 아래 코드는 직접 반복문을 이용한 예시입니다.

public class ArrayTest1 {
    public static void main(String[] args) {
        // 배열에 데이터 할당
        int[] studentScore = new int[5];

        // 배열에 저장할 데이터
        int score = 100;

        for (int index = 0; index <= studentScore.length - 1; index++) {
            // 인덱스에 순서대로 값을 할당한다.
            studentScore[index] = score;

            // 다음에 저장할 값부터 10씩 감소시킨다.
            score -= 10;

            System.out.println(studentScore[index]);
        }
    }
}

/* 실행 결과
100
90
80
70
60
*/

 

 

 

 

 

 

 

2. 다차원 배열(Multi-Dimensional Array)

2-1. 정의

- 다차원 배열이란, 2차원 이상의 배열을 의미하며 배열의 요소(데이터)로 또 다른 요소를 가지는 배열을 의미합니다.

 

 

 

2-2. 2차원 배열(Two dimensional array)

- 2차원 배열은 배열의 요소(데이터)로 1차원 배열을 가지는 배열을 의미합니다.

- 주로 테이블 형태의 데이터를 저장하기 위해 2차원 배열을 사용합니다.

 

 

 

 

2-3. 2차원 배열의 선언

- 2차원 배열은 로 구분되며 선언과 생성은 1차원 배열 방식과 동일합니다.

 

- 문법

- 데이터 타입[][] 변수명;

- 데이터 타입 변수명[][];

// 2차원 배열의 선언
int[][] subjectScore;
int subjectScore[][];

 

 

 

2-4. 2차원 배열의 생성

- 1차원 배열의 초기화 방식과 동일합니다.

 

- 문법

- 데이터 타입[][] 변수명;

- 변수명 = new 데이터 타입[행의 길이][열의 길이];

 

- 한 문장을 통해 2차원 배열의 선언과 생성이 모두 가능합니다.

- 데이터 타입[][] 변수명 = new 데이터 타입[행의 길이][열의 길이];

// 5행 3열의 2차원 배열 생성
int[][] subjectScore = new int[5][3]

 

 

 

 

 

2-5. 2차원 배열의 초기화(Initialization)

- 1차원 배열과 동일하게 생성된 2차원 배열에 데이터를 할당하는 것을 의미합니다.

 

- 아래 코드는 반복문을 통해 각 테이블을 순회하며 데이터를 저장하는 코드를 작성했습니다.

public class MultipleArray {
    public static void main(String[] args) {
        // 2행 3열의 2차원 배열 생성
        int[][] studentScore = new int[2][3];

        // 반복문으로 각 테이블에 데이터 저장
        for (int number1 = 0; number1 < studentScore.length; number1++) {
            // 저장할 데이터
            int score = 100;

            for (int number2 = 0; number2 < studentScore[number1].length; number2++) {
                studentScore[number1][number2] = score;
                System.out.printf("studentScore[%d][%d] = %d%n", number1, number2, score);
                score -= 10;
            }
        }
    }
}

/* 실행 결과
studentScore[0][0] = 100
studentScore[0][1] = 90
studentScore[0][2] = 80
studentScore[1][0] = 100
studentScore[1][1] = 90
studentScore[1][2] = 80
*/

 

 

 

 

 

 

3. 사용자로부터 입력받기 - 커맨드 라인(Command Line)

- 사용자가 커맨드 라인에 입력한 값이 문자열 배열에 담겨서 전달됩니다.

- 사용자가 커맨드 라인에 입력한 값을 프로그램에서 사용할 수 있게 됩니다.

- 배열에 담기므로 배열의 인덱스로 접근해서 각 값에 접근할 수 있습니다.

 

 

 

- 사용자로부터 매개변수를 문자열의 배열로 받아서 출력할 수 있는 코드의 형태입니다.

public class CommandLines {
    public static void main(String[] args) {
        System.out.printf("매개변수의 개수 : %d%n", args.length);

        for (int index = 0; index < args.length; index++) {
            System.out.printf("args[%d] = %s%n", index, args[index]);
        }
    }
}
/* 실행 결과
매개변수의 개수 : 0
*/

 

 

 

- Windows 운영체제 기준으로 cmd를 열고 아래와 같이 위의 소스코드가 바이너리 코드로 컴파일된 클래스 파일이 위치하는 디렉토리로 이동합니다.

 

 

 

- java CommandLines 뒤에 문자열을 입력하여 매개변수로 문자열 데이터를 넘겨주고 프로그램 실행 시 넘겨준 문자열 배열이 인덱스 순서대로 출력되는지 확인합니다.

 

 

 

 

 

4. 실습 내용

4-1. 다차원 배열을 이용하여 학생의 성적 평균을 계산하는 프로그램 

public class StudentScore {
    public static void main(String[] args) {
        // 학생의 국어, 영어, 수학, 점수 배열
        int[][] score = { {100, 90, 80}, {90, 80, 70}, {70, 80, 70}, {90, 90, 90}};

        // 각 과목별 평균
        float koreaAvg, englishAvg, mathAvg;

        // 각 과목별 총점
        int koreaSum = 0, englishSum = 0, mathSum = 0;

        System.out.println("번호  국어  영어  수학  총점  평균");
        System.out.println("=========================================");
        for (int i = 0; i < score.length; i++) {
            // 개인별 모든 과목 총점
            int sum = 0;

            // 개인별 전체 과목 평균
            float allAvg = 0f;
            
            // 각 과목별 총점 계산
            koreaSum += score[i][0];
            englishSum += score[i][1];
            mathSum += score[i][2];
            
            // 번호 출력
            System.out.printf("%3d", i + 1);

            for (int j = 0; j < score[i].length; j++) {
            	// 개인별 전체 과목 총점
                sum += score[i][j];
                System.out.printf("%5d", score[i][j]);
            }
            // 개인별 전체 과목 평균
            allAvg = sum / (float) score[i].length;
            System.out.printf("%5d %5.1f%n", sum, allAvg);
            }
        System.out.println("=========================================");
        System.out.printf("총점 : %4d %4d %d%n", koreaSum, englishSum, mathSum);

        koreaAvg = (float) koreaSum / score.length;
        englishAvg = (float) englishSum / score.length;
        mathAvg = (float) mathSum / score.length;
        System.out.printf("평균 : %5.1f%5.1f%5.1f%n", koreaAvg, englishAvg, mathAvg);
    }
}

<실행 결과>

상기 소스코드의 실행 결과

 

 

 

 

 

- 학부에서 수강했던 전공 수업 내용을 정리하는 포스팅입니다.

- 내용 중에서 오타 또는 잘못된 내용이 있을 시 지적해 주시기 바랍니다.

댓글