JAVA

배열

옝옹 2022. 9. 26. 16:44

배열

- 같은 타입의 데이터를 연속된 공간에 나열하고, 각 데이터에 인덱스를 부여해놓은 자료구조

- score 배열의 각 인덱스는 각 항목의 데이터를 읽거나 저장하는데 사용

- 배열 이름 옆에 대괄호에 [] 기입된다. 인덱스는 0부터 시작한다. score[인덱스]

  1. 배열은 같은 타입의 데이터만 저장할 수 있다.
  2. 한번 생성된 배열은 길이를 늘리거나 줄일 수 없다

배열 선언

- 배열을 사용하기 위해서는 우선 배열 변수를 선언해야 한다.

int[] intArray;
double[] doubleArray;
String[] strArray;
int intArray[];
double doubleArray[];
String strArray[];

배열 생성

1) 값 목록으로 배열 생성

타입[] 변수 = {값0, 값1, 값2, ...};

- 중괄호 {}는 주어진 값들을 항목으로 가지는 배열 객체를 힙에 생성하고, 배열 객체의 번지를 리턴한다. 배열 변수는 리턴된 번지를 저장함으로써 참조가 이루어진다.

2) new 연산자로 배열 생성

- 값의 목록을 가지고 있지 않지만, 향후 값들을 저장할 배열을 미리 만들고 싶다면 new 연산자로 다음과 같이 배열 객체를 생성할수 있습니다.

타입[] 변수 = new 타입[길이]; // 길이는 배열이 저장할 수 있는 값의 개수

int[] intArray = new int[5] // 길이가 5인 int[]배열 생성

- int 배열 이므로 모두 기본값 0으로 초기화됨 -> String 배열을 생성한다면 null값으로 초기화 된다.

배열 길이

- 배열의 길이란 배열에 저장할 수 있는 전체 항목의 개수

- 배열 변수.length;

- length 필드는 읽기 전용 필드이기 때문에 값을 바꿀 수 없음. (ex) intArray.length = 10; //잘못된 코드

다차원 배열

- 값들이 행과 열로서 구성된 배열을 2차원 배열이라고 한다.

 

int[][] scores = new int[2][3];
scores.length //2
scores[0].length //3
scores[1].length //3

 

int[ ][ ] scores = { {95, 80}, {92, 96} };
95 80
92 96

객체를 참조하는 배열

- 참조 타입(클래스, 인터페이스) 배열은 각 항목에 객체의 번지를 가지고 있다.

(ex) String은 클래스이므로 String[] 배열은 각 항목에 문자열이 아니라, String 객체의 번지를 가지고 있다. 따라서 String[] 배열의 항목도 결국 String 변수와동일하게 취급되어야 한다.

배열 복사

-  for문을 사용하거나 System.arraycopy() 메소드를 사용해 배열 간의 항목 값들을 복사한다.

System.arraycopy(arrl, 0, arr2, 0, arrl.length);

->원본 배열이 arr1이고 새 배열이 arr2일 경우 arr1의 모든 항목(0부터)을 arr2(0부터)에 복사

향상된 for문

-  for문의 괄호 ()에는 배열에서 꺼낸 항목을 저장할 변수 선언과 콜론(:) 그리고 배열을 나란히 작성합니다. 배열 및 컬렉션 항목의 개수만큼 반복하고, 자동적으로 for문을 빠져나간다.

 

  1. for문이 처음 실행될 때 배열(①)에서 가져올 첫 번째 값이 존재하는지 평가합니다.  
  2. 가져올 값이 존재하면 해당 값을 변수(②)에 저장합니다.
  3. 실행문(③)을 실행합니다.
  4. 블록 내부의 실행문(③)이 모두 실행되면 다시 루프를 돌아 배열 (①)에서 가져올 다음 값이 존재하는지 평가합니다
  5. 만약 다음 항목이 존재하면 ② 一 ③ — ① 순서로 루프를 다시 진행하고, 가져올 다음 항목이 없 으면 for문이 종료됩니다.
public class AdvancedForExample {
    public static void main(String[] args) {
        int[] scores = { 95, 71, 84, 93, 87 };

        int sum = 0;
        for (int score : scores) {
            sum = sum + score;
        }
        System.out.println("점수 총합 = " + sum);
        
        double avg = (double) sum / scores.length;
        System.out.printin("점수 평균 = " + avg);
    }
}

//점수 총합 = 430 
//점수 평균 = 86.0

► 확인 문제
1. 배열을 생성하는 방법으로 틀린 것은 무엇입까?

② int[] array; array = {1, 2, 3 };

-> 배열 변수를 이미 선언한 후에 다른 실행문에서 중괄호를 사용한 배열 생성은 허용되지 않음

변수 = new 타입 [] {값0, 값1, 값2, ... }; // new 연산자를 사용해 값 지정

2 배열의 기본 초기값에 대한 설명으로 틀린 것은 무엇입니까? 

③ boolean 타입 배열 항목의 기본 초기값은 tme이다.

-> false임

3. 배열의 길이에 대한문제입니다. array.length의 값과 array[2].length의 값은 얼마입니까?

array.length -> 3,   array[2].length -> 5

4. for문을 이용해서 주어진 배열의 항목에서 최대값을 구해보세요.

package sec02.verify.exam04;

public class Exam04 {
    public static void main(String[] args) {
    int max = 0;
    int[] array = { 1, 5, 3, 8, 2 };
    
    //시작
    for (int i = 0; i < array.length; i++) {
        if (max < array[i]) {
       		max = array[i];
        }
    }
    System.out.println("max: " + max);
    }
}

5. 중첩 for문을 이용해서 주어진 배열의 전체 항목의 합과 평균값을 구해보세요.

package sec02.verify.exam05;

public class Exam05 {
    public static void main(String[] args) {
        int[][] array = { 
        	{ 95, 86 }, 
            { 83, 92, 96 }, 
            { 78, 83, 93, 87, 88 } 
        };
        
        int sum = 0;
        double avg =0.0;
        
        //시작
        int count = 0;
        for (int i = 0; i < array.length; i++) {
        	for (int j = 0; j < array[i].length; j++) {
        		sum += array[i][j];
        		count++;
        	}
        }
        avg = (double) sum / count;
        
        System.out.println("sum: " + sum);
        System.out.println(”avg: " + avg);
    }
}

6. 다음은 키보드로부터 학생 수와 각학생들의 점수를 입력받아서, 최고 점수 및 평균 점수를 구 하는 프로그램입니다. 실행결과를 보고 알맞게 작성해보세요.

package sec02.verify.exam06;

import java.util.Scanner;

public class Exam06 {
	public static void main(String[] args) { 
		boolean run = true;
        
    	int studentNum = 0;
    	int[] scores = null;
        
    	Scanner scanner = new Scanner(System.in);
    
    	while (run) { 
        	System, out. println("-------------------------------------------------- ");
   			System.out.println("l.학생수 | 2.점수입력 ! 3.점수리스트 | 4.분석 | 5.종료");
            System, out. println("-------------------------------------------------- ");
            System.out.print("선택> ");
            int selectNo = Integer.parselnt(scanner.nextLine());
            
            if (selectNo == 1) {
				
                //시작
                System.out.print("학생수> ");
                studentNum = Integer, parselnt (scanner. nextLine());
                scores = new int[studentNum];
            } else if (selectNo == 2) {
            
            	//시작
              for (int i = 0; i < scores.length; i++) { 
              	System.out.print("scores[" + i + "]> "); 
                scores[i] = Integer.parselnt(scanner.nextLine());
              }
            } else if (selectNo == 3) {
            
            	//시작
                for (int i = 0; i < scores.length; i++) {
                System.out.printlnC"scores[" + i + "]: " + scores[i]); 
              }
            } else if (selectNo == 4) {
            
            	//시작
                int max = 0;
                int sum = 0;
                double avg = 0;
                for (int i = 0; i < scores.length; i++) { 
                    max = (max < scores[i]) ? scores[i] : max; 
                    sum += scores[i];
            	}
                avg = (double) sum / studentNum;
                System.out.println("최고 점수: " + max);
                System.out.println("평균 점수: " + avg);
            } else if (selectNo == 5) { 
            run = false;
        }
    }
    System.out.println("프로그램 종료");
    }
}