Java

[Java] 배열

dalooong 2023. 7. 7. 10:50

배열이란?

  • “배열은 같은 타입의 여러변수를 하나의 묶음으로 다루는 것”
  • 배열 선언 : int[] score = new int[5] → int 공간이 5개가 있다는 것
  • 인덱스는 0부터 시작
  • 배열을 다루려면 참조변수가 필요함 → 참조변수에 이름을 붙인 뒤 저장공간을 사용
  • score 참조변수 [0], score[2], score[3], score[4] 이렇게 사용
  • 같은 타입만 사용가능 int[] score = new int[숫자]

배열의 선언과 생성

  • 배열의 선언 - 배열을 다루기 위한 참조변수의 선언

  1. int[] score;, String[] name;
  2. int score [];

타입[] 배열이름; → int [] score;

  • 변수이름 = new 타입[길이]; → score = new int[5]

선언 방법 String[] coffees = new String[4];

package chap_05;

public class _01_Array {
    public static void main(String[] args) {
        // 배열 : 같은 자료형의 값 여러 개를 저장하는 연속된 공간
        String coffeeRoss = "아메리카노";
        String coffeeRachel = "카페모카";
        String coffeeChandler = "라떼";
        String coffeeMonica = "카푸치노";

        System.out.println(coffeeRoss + "하나"); //아메리카노 하나
        System.out.println(coffeeRachel + "하나");
        System.out.println(coffeeChandler+ "하나");
        System.out.println(coffeeMonica+ "하나");
        System.out.println("주세요");

        //배열 선언 첫번째 방법 
	       String[] coffees = new String[4]; //크기 4에 해당하는 똑같은 배열을 만듦
        
        //배열 선언 두번째 방법
      String coffees[] = new String[4]; 위에꺼랑 대괄호의 위치만 다름
	     coffees[0] = "아메리카노"; //인덱스 값은 항상 0부터 시작한다.
	     coffees[1] = "카페모카"; //인덱스 값은 항상 0부터 시작한다.
	     coffees[2] = "라떼"; //인덱스 값은 항상 0부터 시작한다.
	     coffees[3] = "카푸치노"; //인덱스 값은 항상 0부터 시작한다.
      
        //배열 선언 세번째 방법 
        String[] coffees = new String[] {"아메리카노", "카페모카", "라떼", "카푸치노"} ;

        //배열 선언 네번쨰방법
        String[] coffees = {"아메리카노", "카페모카", "라떼", "카푸치노"} ;

        //커피 주문
        System.out.println(coffees[0] + " 하나"); //아메리카노 하나 출력
        System.out.println(coffees[1] + " 하나"); //아메리카노 하나 출력
        //챈슬러 라떼를 에스프레소로 변경할 경우
        coffees[2] = "에스프레소"; // 커피즈 2번째 배열에 에스프레소로 변경
        System.out.println(coffees[2] + " 하나"); //아메리카노 하나 출력
        System.out.println(coffees[3] + " 하나"); //아메리카노 하나 출력
        System.out.println("주세요");

        // 다른 자료형 가능
        // int 타입 
        int[] i = new int[];
        i[0] = 1;
        i[1] = 1;
        i[2] = 1;

        //double 타입 
        double[] d = new double[] {10.0, 11.2, 13.5};

        // boolean 타입
        boolean[] b = {true, true, true};
    }
}
  • 배열 순회
package chap_05;

public class _02_Arrayloop {
    public static void main(String[] args) {
        // 배열의 순회
        String[] coffees = {"아메리카노", "카페모카", "라떼", "카푸치노"} ;
        System.out.println(coffees[0] + " 하나");

        //for 반복문 순회 (i값만 바꿔서 반복문 수행할 수 있음)
        for (int i = 0; i < 4; i++) {
            System.out.println(coffees[i] + " 하나");
        }
        System.out.println("주세요");

        System.out.println("------------------------");

        // 배열의 길이를 이용한 순회 방법 (for i) 
        for (int i = 0; i < coffees.length; i++) {
            System.out.println(coffees[i] + " 하나");
        
        System.out.println("주세요");

        System.out.println("------------------------");

        // enhanced for (for-each) 반복문 (coffees에 있는 배열들을 순서대로 순회하는것)
        for (String coffee : //foreach 사용하면 빠르게 for문 수행 가능 
                coffees) {
            System.out.println(coffee + " 하나");
        } 
        System.out.println("주세요");
    }
}

= for i 문, foreach 사용하면 빠르게 for 문 사용 가능

  • for i : 배열의 길이를 이용한 순회 방법
  • foreach : enhanced for (for-each) 반복문 (coffees에 있는 배열들을 순서대로 순회하는것)
  • 다차원 배열

방법1) 1차원배열들을 중괄호로 한줄씩 적는 방법

public class _03_MultiArray {
    public static void main(String[] args) {
        // 다차원 배열 (2차원 배열)

        //소규모 영화관 좌석
        // A1 - A5
        // B1 - B5
        // C1 - C5
        //1차원 배열은 중괄호를 한줄씩 적는것
        String[] seatA = {"A1", "A2","A3","A4","A5"};
        String[] seatB = {"B1", "B2","B3","B4","B5"};
        String[] seatC = {"C1", "C2","C3","C4","C5"

방법2) 1차원 배열들을 중괄호로 감싸서 한줄로 적는 방법

public class _03_MultiArray {
    public static void main(String[] args) {
				//2차원배열은 1차원 배열들을 중괄호로 감싸는 것
        // 3 x 5 크기의 2차원 배열
				String[][] seats = new String[][] {
        {"A1", "A2","A3","A4","A5"},
        {"B1", "B2","B3","B4","B5"},
        {"C1", "C2","C3","C4","C5"},
    };

        //B2에 접근하려면?
        System.out.println(seats[1][1]); // B2 출력됨

        //C5에 접근하려면?
        System.out.println(seats[2][4]);
        System.out.println(seats); //C5출력됨

			//첫 줄에는 3칸, 둘째줄에는 4칸, 셋째줄에는 5칸
        String[][] seats2 = {
          {"A1", "A2", "A3"},
          {"B1", "B2", "B3", "B4"},
          {"C1", "C2", "C3", "C4", "C5"} };

        //A3에 접근하려면?
        System.out.println(seats2[0][2]);

        //A5에 접근하려면?
        System.out.println(seats2[0][4]); //에러 발생:A5가 없기때문에 배열범위가 벗어나 에러
    }
}
		
			/* 3차원 배열 만들기! (세로 x 가로 x 높이)
        String[][][] marray = new String[3][3][3]{
                {{}, {}, {}},
                {{}, {}, {}},
                {{}, {}, {}}
        };
      } 
  • 다차원 배열 순회 방법
package chap_05;

public class _04_MultiArrayLoop {
    public static void main(String[] args) {
        //다차원 배열 순회
//문제1
        String[][] seats = new String[][]{
                {"A1", "A2", "A3", "A4", "A5"},
                {"B1", "B2", "B3", "B4", "B5"},
                {"C1", "C2", "C3", "C4", "C5"},
        };
        // 이중 반복문 : fori 안에 fori문 하나더
        for (int i = 0; i < 3; i++) { //세로  기준
            for (int j = 0; j < 5; j++) { //가로기준
                System.out.print(seats[i][j] + " "); //세로와 가로를 하나씩 순회하면서 출력
            }

            System.out.println();

            //A1 A2 A3 A4 A5
            //B1 B2 B3 B4 B5
            //C1 C2 C3 C4 C5 출력
        }

        System.out.println("----------------------------------");

//문제2
        //첫 줄에는 3칸, 둘째줄에는 4칸, 셋째줄에는 5칸
        String[][] seats2 = {
                {"A1", "A2", "A3"},
                {"B1", "B2", "B3", "B4"},
                {"C1", "C2", "C3", "C4", "C5"}
        };

        for (int i = 0; i < seats2.length; i++) { //세로 기준 seats2.length 사용
            for (int j = 0; j <seats2[i].length; j++) { //가로 기준
                System.out.print(seats[i][j] + " "); //세로와 가로를 하나씩 순회하면서 출력
            }

            System.out.println();
        } 

        //A1 A2 A3 
        // B1 B2 B3 B4
        //C1 C2 C3 C4 C5 출력
    }

//문제3
			System.out.println("---------------------");
        // 세로크기 10 x 가로크기 15에 해당하는 영화관 좌석
        String [][] seats3 = new String[10][15];
        String[] eng = {"A","B","C","D","E","F","G","H","I","J"};
        for (int i = 0; i < seats3.length; i++) { //세로
            for (int j = 0; j < seats3[i].length; j++) { //가로
                seats3[i][j] = eng[i] + (j + 1);
            }
        }
        // 표구매 H9 H10 좌석 나갔다고 가정
        seats3[7][8] = "__";
        seats3[7][9] = "__";

        //영화관 좌석 출력
        for (int i = 0; i < seats3.length; i++) { //세로 기준 seats2.length 사용
            for (int j = 0; j <seats3[i].length; j++) { //가로 기준
                System.out.print(seats3[i][j] + " "); //세로와 가로를 하나씩 순회하면서 출력
            }
            System.out.println();
        }
}

  • 아스키코드
public class _05_ASCII {
    public static void main(String[] args) {
        //아스키 코드(ANSI) : 미국 표준 코드
        char c = 'A'; //알파벳 대문자(A)는 65부터시작, 소문자(a)는 97부터 시작, 숫자(0)는 48부터 시작함
        System.out.println(c);
        System.out.println((int)c); //아스키코드 65가 출력됨

        c = 'B';
        System.out.println(c);
        System.out.println((int)c);

        c++;
        System.out.println(c);
        System.out.println((int)c);
        System.out.println("----------------");

        // 세로크기 10 x 가로크기 15에 해당하는 영화관 좌석
        String [][] seats3 = new String[10][15];
       char ch = 'A';

        for (int i = 0; i < seats3.length; i++) { //세로
            for (int j = 0; j < seats3[i].length; j++) { //가로
                seats3[i][j] = String.valueOf(ch) + (j + 1);
            }
            ch++;
        }
            //영화관 좌석 정보 확인
            for (int i = 0; i < seats3.length; i++) { //세로 기준 seats2.length 사용
                for (int j = 0; j <seats3[i].length; j++) { //가로 기준
                System.out.print(seats3[i][j] + " "); //세로와 가로를 하나씩 순회하면서 출력
                }
                System.out.println();
            }

        }
    }

QUIZ 05

package chap_05;

public class _Quix_05 {
    public static void main(String[] args) {
        int[] size = new int[10] ;
        for (int i = 0; i <size.length; i++) {
            size[i] = 250 + (5 * i);
        }
        for (int sizes: size) {
        System.out.println("사이즈 " + sizes + " (재고 있음)");
        }
    }
}

배열의 인덱스

  • 배열의 인덱스 - 각 요소에 자동으로 붙은 일련 번호
  • “인덱스의 범위는 0부터 ‘배열길이-1’까지 new int[5] 라면 범위는 0~4까지
  • 저장공간 = 배열의 요소

int value = score[3]; //배열 score의 4번쨰 요소의 값을 읽어서 value에 저장

public class Ex5_1_temp {
    public static void main(String[] args) {
//        int[] score; //1. 배열 score 선언 참조변수
//        score = new int[5]; //2. 배열의 생성(int 저장공간이 5)

        int[] score = new int[5]; //배열의 선언과 생성을 동시에 할 수 있음
        score[3] = 100; // 스코어 3에 100저장

//        System.out.println(score[3]);
        System.out.println("score[0]=" + score[0]);
        System.out.println("score[1]=" + score[1]);
        System.out.println("score[2]=" + score[2]);
        System.out.println("score[3]=" + score[3]);
        System.out.println("score[4]=" + score[4]);

        int value = score[3]; //value에 스코어3값 저장 
        System.out.println("value=" + value);
    }
}

배열의 길이

  • 배열이름.length - 배열의 길이(int형 상수-)

int[] arr = new int[5]; //길이가 5인 int 배열

int tmp = arr.length; //arr.length의 값은 5이고 tmp에 5가 저장된다.

  • 배열은 한번 생성하면 그 길이를 바꿀 수 없다.
int[] score = new int[6];

for(int i = 0; i < 6; i++) //인덱스 범위 벗어남 
	System.out.println(score[i]);

int[] score - new int[5];
for(int i = 0; i < **score.length**; i++); //score.length로 사용 -> 인덱스 범위 벗어나지 않게
	System.out.println(score[i]);
public class Ex5_1_temp {
    public static void main(String[] args) {
    int[] arr = new int[10];
        System.out.println("arr.length=" + arr.length);

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

배열의 초기화

  • 배열의 각 요소에 처음으로 값을 저장하는 것
int[] score = new int[5]; //길이가 5인 int형 배열을 생성한다.
score[0] = 50;
score[1] = 60;
score[2] = 70;
score[3] = 80;
score[4] = 90;

⇒ fori문 사용 / 괄호 사용
  • 초기화 방법
  1. int[] score = new int[];
  2. int[] score = {50,60,70,80,90}; // new int[]를 생략할 수 있음 ** 가장 많이 사용

배열의 출력

  • int[]iArr = {100,95,80,70,60};
  • System.out.println(iArr);
1번방법 
for (int i = 0; i < iArr.length; i++) {//배열의 요소를 순서대로 하나씩 출력한다.
    System.out.println(iArr[i]);
}
2번방법 
System.out.println(Arrays.toStringz(iArr)); 
예제) 
import java.util.Arrays;

public class Ex5_1_temp {
    public static void main(String[] args) {
        int[] iArr = {100, 95,  80, 70, 60}; //길이가 5인 int 배열 
        for (int i = 0; i < iArr.length; i++) { //1번 방법
            System.out.println(iArr[i]);
        }
        System.out.println(Arrays.toString(iArr)); //2번 방법 한번에 실행할 수 있음 
    }
}
100
95
80
70
60
[100, 95, 80, 70, 60]
예제2) 
class Ex5_1 {
        public static void main(String[] args) {
            int[] iArr1 = new int[10];
            int[] iArr2 = new int[10];
            int[] iArr3 = {100, 95, 80, 70, 60};
            char[] chArr = {'a', 'b', 'c', 'd'};

            for (int i=0; i < iArr1.length ; i++ ) {
                iArr1[i] = i + 1; //
            }

            for (int i=0; i < iArr2.length ; i++ ) {
                iArr2[i] = (int)(Math.random()*10) + 1; // 1~10의 숫자를 순서대로 배열
            }

            // 배열에 저장된 값들을 출력한다
            for(int i=0; i < iArr1.length;i++) {
                System.out.print(iArr1[i]+",");
            }
            System.out.println();

            System.out.println(Arrays.toString(iArr2));
            System.out.println(Arrays.toString(iArr3));
            System.out.println(Arrays.toString(chArr));
            System.out.println(iArr3);
            System.out.println(chArr);
        }
    }

1,2,3,4,5,6,7,8,9,10,
[5, 6, 8, 10, 2, 8, 2, 2, 6, 8]
[100, 95, 80, 70, 60]
[a, b, c, d]
[I@34a245ab
abcd

배열의 활용

  • 총합과 평균 : 배열의 모든 요소를 더해서 총합과 평균을 구한다.
public class Ex5_2 {
    public static void main(String[] args) {
        int   sum = 0;      // 총합을 저장하기 위한 변수
        float average = 0f; // 평균을 저장하기 위한 변수

        int[] score = {100, 88, 100, 100, 90};

        for (int i=0; i < score.length ; i++ ) {
            sum += score[i];
        }
        average = sum / (float)score.length ; // 계산결과를 float타입으로 얻기위해 형변환

        System.out.println("총합 : " + sum);
        System.out.println("평균 : " + average);
    }
}
총합 : 478
평균 : 95.6
public class Ex5_3 {
    public static void main(String[] args) {
        int[] score = { 79, 88, 91, 33, 100, 55, 95 };

        int max = score[0]; // 배열의 첫번째 값으로 최대값을 초기화한다.
        int min = score[0]; // 배열의 첫번쨰 값으로 최소값을 초기화한다.

        for(int i=1; i < score.length;i++) {
            if(score[i] > max) {
                max = score[i];
            } else if(score[i] < min) {
                min = score[i];
            }
        } // end of for

        System.out.println("최대값 : " + max);
        System.out.println("최소값 : " + min);
    } // end of main
} // end of class

최대값 : 100
최소값 : 33
class Ex5_4 {
        public static void main(String[] args) {
            int[] numArr = {0,1,2,3,4,5,6,7,8,9};
            System.out.println(Arrays.toString(numArr));

            for (int i=0; i < numArr.length; i++ ) {
                int n = (int) (Math.random() * 10);  // 0~9중의 한 값을 임의로 얻는다.
                int tmp = numArr[i];
                numArr[i] = numArr[n];
                numArr[n] = tmp;
            }
                System.out.println(Arrays.toString(numArr));
            }
        } // main의 끝

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[5, 2, 3, 9, 4, 6, 1, 0, 8, 7]

String 배열의 선언과 생성

String[] name = new String[3];

import java.util.Arrays;

public class Ex5_1_temp {
    public static void main(String[] args) {
        String[] strArr = {"가위", "바위", "보"};
        System.out.println(Arrays.toString(strArr));

        for (int i = 0; i < 10; i++) {
            int tmp = (int) (Math.random() * 3);
            System.out.println(strArr[tmp]);
        }
    }
}
[가위, 바위, 보]
가위
보
바위
가위
보
바위
바위
바위
가위
가위

2차원 배열

  • 테이블 형태의 데이터를 저장하기 위한 배열 → 1차원 배열이 여러개 모인개 2차원 배열이다
  • int[][]score = new int[4][3]; //4행 3열의 2차원 배열 생성

2차원 배열의 초기화

int [][] arr = {{1,2,3}, {4,5,6}};
int [][] arr = {{1,2,3}, 
							{4,5,6}};