JAVA

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

eehdev 2023. 1. 12. 03:07

     배열     

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]
	}