[Java] 배열 (String 배열, 2차원 배열, Array클래스)

         배열     

    1. 배열의 선언과 생성 → int[] num = new int[ ]

    • 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것.
      배열은 선언과 동시에 크기(공간)을 미리 지정해야 한다.

    int[] score;		// 1. 배열 score를 선언(참조변수 선언  )
    score = new int[5];		// 2. 생성된 배열을 참조변수 score에 저장
    		
    int[] score = new int[5];		// *배열의 선언과 생성을 동시에*
    
    score[3] = 100;             // score[3]에 100 저장
    int value=score[3];
    		
    System.out.println("value의 값 : " + value);

     

    2. 배열의 길이 → 참조변수명.length

    • 배열의 요소의 개수, 값을 저장할 수 있는 공간의 개수
    • 인덱스의 범위 → 0부터 배열길이-1까지
    int [] score = new int[5]  // 길이가 5인 int 배열 -> 인덱스의 범위0부터 4까지 0,1,2,3,4 
    int tmp = score.length;    // score.length의 값 : 5 이고 tmp에 5가 저장된다.

     

    • 배열의 길이를 직접 적는 것보다 ‘참조변수명.length’을 사용하는 것이 좋다. → 코드 관리가 쉽고 에러 발생확률이 적기 때문
    int arr [] = new int[4];	// 길이가 5인 int배열 arr 생성 -> 4로 줄임
    System.out.println("arr.length = " + arr.length);
    	
    	for(int i=0; i<5; i++) {		// 배열의 길이를 4로 줄이고 for문 수정을 안 하면 에러 발생
    
    -> for(int i=0; i<arr.length; i++) {	
    // 따라서 길이를 직접 적기보다 변수명.length으로 쓰기
    ⚠️ Error → 인덱스 범위를 벗어남
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 4 out of bounds for length 4 at javajungsuk.ArrayExam.main(ArrayExam.java:11)
    • 배열은 한 번 생성하면 그 길이를 바꿀 수 없다 (int형 상수)
      • 공간이 부족한 경우 길이 변경하는 방법
        → 1. 더 큰 배열을 새로 생성한다.
             2. 기존 배열의 내용을 새로운 배열에 복사한다.

     

    3. 배열의 초기화

    📌 배열을 생성하고 정수는 0 실수는 0.0 문자열은 null 등으로 초기화시킨다.

    • 타입[] 참조변수명 = new 타입[배열의 길이];
      → int[ ] score = new int[5];
    • 타입[] 참조변수명 ; 참조변수명 = new 타입[배열의 길이] ;
      → int[] score; score = new int[5];
    • 타입[] 참조변수명 = {값1, 값2, …};
       int[ ] score = { 50, 60, 70, 80, 90 }
    • 타입[] 참조변수명 = new 타입[] { 값, 값2, … }
      → [ ]안에 배열의 크기를 지정하지 않음. { }의 값을 통해 크기가 정해지기 때문.
           int[ ] score = new int[ ] {10, 20, 30, 40, 50}
    🔧 타입[ ] 참조변수명;
                     참조변수명 = { 값1, 값2, … } 이렇게 쓸 수 없다.
          int[ ] score; score = {10, 20, 30, 40, 50}
    public static void main(String[] args) {
    
    	int[] num = new int[3]; // []는 앞뒤 자리 상관없음. 배열선언
    
    	num[0] = 10;
    	num[1] = 20;
    	num[2] = 30; // 규칙적인 숫자, 정해진 방갯수 -> for문으로 한번에
    	// num[3 =40; // 에러 ArrayIndexOutOfBoundException 예외, 멈춤
    
    	System.out.println(num[0]);
    	System.out.println(num[1]);
    	System.out.println(num[2]);
    
    	for (int i = 0; i < 3; i++) { // i<3 아니면 num.length; 가능
    		System.out.println("num[" + i + "]=" + num[i]);
    	}
    	// 확인만 - 문자열형태로 확인 Arrays.toString()
    	System.out.println(Arrays.toString(num)); // [10, 20, 30]
    }

     

    4. 배열의 출력

    배열 이름을 바로 prinln()에 넣으면 I@41a4555e와 같은 값이 나온다.
    char[] 배열은 배열 이름을 출력해도 저장된 내용이 출력된다. char[] 배열인 경우만!

     

    1) for문 이용

    • for문을 이용해 배열의 모든 요소 출력
    	public static void main(String[] args) {
    
    	  int[] arr = new int[5];
    	  for (int i = 0; i < arr.length; i++) {
    		  System.out.println("arr [" + i + "] = " + arr[i]);
    		}
    	}

    • 문자열 형채로 출력 → Arrays.toString()
    	public static void main(String[] args) {
    
    		int[] arr = { 60, 70, 80, 90, 100 };
    
    		for (int i = 0; i < arr.length; i++) {
    		}
    		System.out.println(Arrays.toString(arr));
    	}

    toString → 배열의 내용을 문자열로 바꿔준다.

    Arrays.toString()를 하면 import java.util.Arrays; 가 생기는데 만약에 Arrays에 에러가 있으면 import문이 없는 것.
    (단축키)Ctrl + Shift + O 하면 자동으로 import문을 추가해준다.

     

     

    2) for each문 이용

    • 배열 또는 컬렉션과 같이 다수의 원소를 가지고 있는 객체에서 원소를 하나씩 차례로 꺼내는 기능을 반복적으로 수행
    	public static void main(String[] args) {
    
    		int[] arr = { 10, 20, 30, 40, 50 };
    		for (int tmp : arr) {
    			System.out.println(tmp);
    		}
    	}

     


     

         String 배열     

    가위바위보 예제

    	public static void main(String[] args) {
    
    		String[] strArr = { "가위", "바위", "보" };
    		System.out.println(Arrays.toString(strArr));
    
    		for (int i = 0; i < 5; i++) { // 5번 반복
    			int tmp = (int) (Math.random() * 3);
    				// System.out.println(tmp);	그냥 출력하면 숫자로 나온다.
    			System.out.println(strArr[tmp]);
    		}
    	}

     

    Strign 클래스

    • char[ ]와 메서드()를 결합한 것
    • String 클래스는 내용을 변경할 수 없다.
    	public static void main(String[] args) {
    
    //		#1. char charAt(int index)  //문자열에서 해당 인덱스에 있는 문자를 반환
    		
    		String str = "ABCDE";
    		char ch = str.charAt(3); // str의 4번째문자(3번째 인덱스) 'D'를 저장
            System.out.println(ch);	// 실행 결과 : D
    
    //		#2. String substring(int from, int to) : to는 포함 안됨.
    		
    		String str1 = "012345";
    		String tmp = str1.substring(1, 4); // 인덱스 범위 1~4까지의 문자들 반환
    		System.out.println(tmp); // 실행 결과 : 123
    	}

     


         2차원 배열     

    • 가로 및 세로 방향으로 정렬된 배열
    • 메모리는 데이터를 1차원으로만 저장 가능
    • 2차원 데이터를 저장하기 위해서는 1차원(행 단위) 로 나누어 저장 2차원 배열은 1차원 배열의 배열이다.
    📌   형식1) 타입[][] 참조변수명 = new 타입[행의 크기][열의 크기];  
                         int[ ] [ ] arr = new int [2][3]; 
            형식2) 타입[][] 참조변수명 = new 타입[행의 크기][]; //열의 크기 생략 가능
                        행의 길이 : 참조변수명.length
                        열의 길이 : 참조변수명[인덱스번호].length
    	public static void main(String[] args) {
        
    		int[][] arr = new int[2][3];
            
    		// 이중for문 이용
    		// 입력
    		for (int i = 0; i < arr.length; i++) { // 행
    			for (int j = 0; j < arr[i].length; j++) { // 열
    				arr[i][j] = (i + 1) * (j + 1) * 10; // 10, 20, 30, ...
    			}
    		}
    		// 출력
    		for (int i = 0; i < arr.length; i++) { // 행
    			for (int j = 0; j < arr[i].length; j++) { // 열
    				System.out.println(arr[i][j]); // 10, 20, 30, ...
    			}
    		}
    		// 한번에 출력 - Arrays.deepToString()
    		System.out.println(Arrays.deepToString(arr));
    	}

     

    더보기

    홍길동반 학생들의 성적은 다음과 같다.
    이것을 이용하여 총점과 평균을 구하시오.
    { 100, 85, 96, 75,63 }

     

    	public static void main(String[] args) {
    
    		int sum = 0; // 총점 변수
    
    		int[] arr = { 100, 85, 96, 75, 63 };
    
    		// 배열에 담긴 값들을 꺼내와 합계 구하기
    		for (int i = 0; i < arr.length; i++) {
    			sum += arr[i]; // sum = sum + score[i]; 누적해서 더함
    		}
    		// 평균
    		double avg = (double) sum / arr.length;
    
    		// 출력
    		System.out.println("점수 총점 : " + sum);
    		System.out.println("점수 평균 : " + avg);
    
    	}
    더보기

    다음 자료의 최댓값과 최소값을 구하는 프로그램을 만들어라.
    max -> 가장 작은 값을 담거나, 배열일 경우 0번째 인덱스 값을 담기

    min -> 구하려는 범위의 값보다 월등히 큰 값을 담거나, 배열일 경우 0번째 인덱스 값 담기

    점수(score) {73, 83, 96, 20, 15, 64, 72}

     

    	public static void main(String[] args) {
    
    		int[] score = { 73, 83, 96, 20, 15, 64, 72 };
    		int max = score[0]; // 73
    		int min = score[0];
    
    		for (int i = 1; i < score.length; i++) {
    			if (max < score[i]) { // 최대값
    				max = score[i];
    			} else if (min > score[i]) { // 최소값
    				min = score[i];
    			}
    		}
    
    		System.out.println("최대값 : " + max);
    		System.out.println("최소값 : " + min);
    	}

     

    💬

    for문과 if문을 이용.

    max와 min에 0번째 값이 담겨있으므로 1번째 값부터 비교했다.

    score[i]가 max값보다 더 큰 경우 max에 저장하고 다음 인덱스와 비교 반복

    socre[i]가 min값보다 더 작은 경우 min에 담고 비교 반복

     

    더보기

    학생 점수 분석 프로그램 만들기

     

    import java.util.Scanner;
    
    public class StudScoreProgram {
    public static void main(String[] args) {
    
    	Scanner scan = new Scanner(System.in);
    
    	int studCount = 0; // 학생수
    	int[] score = null; // 점수입력 받아 저장할 공간
    	boolean run = true; // while문 실행여부(true-실행, false-종료)
    
    	// 입력 & 출력
    	while (run) {
    		System.out.println("======================================================");
    		System.out.println("1. 학생수ㅣ2. 점수입력ㅣ3. 점수리스트ㅣ4. 분석ㅣ5. 종료");
    		System.out.println("======================================================");
    		System.out.println("메뉴 선택 >>");
    		int selectNo = Integer.parseInt(scan.nextLine()); // 입력한 번호 문자열을 정수로 저장
    
    		if (selectNo == 1) { // 학생수
    			System.out.println("학생 수 입력 >>");
    			studCount = Integer.parseInt(scan.nextLine());
    
    		} else if (selectNo == 2) { // 점수입력
    			score = new int[studCount]; // 입력한 학생 수만큼의 배열을 생성해 score에 저장
    			for (int i = 0; i < score.length; i++) {
    			System.out.println((i + 1) + "번째 학생 점수 입력>>");
    			score[i] = Integer.parseInt(scan.nextLine()); // 점수를 정수로 변경해서 저장
    		}
    
    		} else if (selectNo == 3) { // 점수리스트
    
    			for (int i = 0; i < score.length; i++) {
    				System.out.println((i + 1) + "번째 학생 점수 = " + score[i]);
    			}
    
    		} else if (selectNo == 4) { // 분석 최고점수, 최저점수, 평균
    
    			int max = score[0];
    			int min = score[0]; // 인덱스 0번째로 초기화
    			int sum = 0; // 합계
    
    			for (int i = 0; i < score.length; i++) {
    
    				if (max < score[i]) {
    					max = score[i];
    				}
    				if (min > score[i]) { 
    					min = score[i];
    				}
    				sum += score[i]; // 점수 누적해서 합계 구하기
    			} // end of for
    
    			double avg = (double) sum / studCount; // 평균
    			System.out.println("최고점수: " + max);
    			System.out.println("최저점수: " + min);
    			System.out.printf("평균: %.2f\n", avg);
    
    		} else if (selectNo == 5) { // 종료
    			System.out.println("종료합니다.");
    			run = false; // while문 종료하게.
    
    		} else {// 잘못 입력
    			System.out.println("잘못 입력하셨습니다. 다시 선택하세요>>");
    		}
    	} // end of while
    }}

    💬

    메뉴 반복을 위해 while문을 사용. 실행 여부를 boolean타입으로 실행되거나 종료될 수 있게 함.

    입력 받은 학생 수만큼 배열을 생성해 score 인덱스마다 점수를 입력받아 넣었음!

    일부러 소수점일 때 어떻게 나올지 돌려봤더니 소수점이 끝도 없이 나와서 printf메소드로 출력함.

     

     


     

         Arrays클래스     

    • 1차원 배열 비교 → equals() 
    • 2차원 배열 비교 → deepEquals(arr1,arr2)
    • 배열에 저장된 값을 문자열로 출력 → toString(변수명)
    • 2차원 배열 문자열로 출력 → deepToString(변수명)

     

    배열 복사 → copyOf(), copyOfRange();
                         copyOf(arr, 복사할 요소의 갯수)
                         copyOfRange(arr, from, to) → to 숫자는 불포함

    public static void main(String[] args) {
    
    		int[] arr = { 3, 2, 0, 1, 4 };
    
    		int[] arr1 = Arrays.copyOf(arr, arr.length);
    		System.out.println(Arrays.toString(arr1)); // [3, 2, 0, 1, 4]
    
    		int[] arr2 = Arrays.copyOfRange(arr, 1, 4);
    		System.out.println(Arrays.toString(arr2)); // [2, 0, 1] 4번째 포함X
    	}

     

    배열 정렬 → sort()

    public static void main(String[] args) {
    
    		int[] arr = { 3, 2, 0, 1, 4 };
    		Arrays.sort(arr);
    		System.out.println(Arrays.toString(arr));
    		//결과 : [0, 1, 2, 3, 4]
    	}

     

     

     

     

    댓글