배열

정순동·2023년 11월 30일
0

자바기초

목록 보기
14/89

배열

배열이란? 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것을 '배열(array)'이라고 한다.
많은 양의 데이터를 저장하기 위해서, 그데이터의 숫자만큼 변수를 선언해야한다면 매우 혼란스러울 것이다. 이름 정하기 마저 어려울 지경일 것이다. 이럴때 배열을 사용하여 하나의 이름에 여러개의 같은 타입 데이터를 저장할 수 있다.

배열은 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것

만약 민수의 4개과목 시험 점수를 저장하려고 해 보자. 배열을 사용하지 않으면 아래와 같이 변수를 4개 선언해 주어야 한다.

int kor, math, sci, eng;
kor = 74;
math = 21;..

변수 대신 배열을 사용한다면 다음과 같이 간단히 처리할 수 있다. 작명의 고통에서도 벗어나고 그저 배열의 길이만 수정해 주면 된다.

int[] score = new int[4]; // 4개의 int 값을 저장할 수 있는 배열을 생성한다.

배열의 선언과 생성

배열의 선언

배열을 선언하는 방법은 위에서도 봤듯이 간단하다. 원하는 타입의 변수를 선언하고 변수 또는 타입에 배열임을 의미하는 대괄호[]를 붙이면 된다.

배열의 생성

배열을 선언한 다음에는 배열을 생성해야 한다. 배열을 선언하는 것은 단지 생성된 배열을 다루기 위한 참조변수를 이한 공간이 만들어질 뿐이고, 배열을 생성해야만 비로소 값을 저장할 수 있는 공간이 만들어지는 것이다. 배열을 생성하기 위해서는 연산자'new'와 함께 배열의 타입과 길이를 지정해 주어야 한다.

	타입[] 변수이름;				// 배열을 선언(배열을 다루기 위한 참조변수 선언)
	변수이름 = new 타입[길이];	  // 배열을 생성(실제 저장공간을 생성)

아래의 코드는 '길이가 5인 int배열'을 생성한다.

	int[] score;
    score = new int[5];

다음과 같이 배열의 선언과 생성을 동시에 할 수 있다.

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

배열의 인덱스

생성된 배열의 각 저장공간을 '배열의 요소(element)'라고 하며, '배열이름[인덱스]'의 형식으로 배열의 요소에 접근한다. 인덱스(index)는 배열의 요소마다 붙여진 일련번호로 각 요소를 구별하는데 사용한다. index는 0부터 시작한다는것에 유의하자.

	int[] score = new int[5];
	// score[] []안에 0~4의 숫자를 넣으면 해당 칸의 배열을 참조할 수 있다.

배열의 길이(배열이름.length)

자바에서는 자바 가상 머신(JVM)이 모든 배열의 길이를 별도로 관리하며, '배열이름.length'를 통해서 배열의 길이에 대한 정보를 얻을 수 있다.
아래의 코드는 배열의 길이를 arrayLength라는 변수에 저장한다.

	int[] arr = new int[5];
    int arrayLength = arr.length;

이 length라는 상수는 for문등을 만들 때 유지보수하기 쉽게 만드는데 용이하다.
아래 코드처럼 작성하면 배열의 길이가 아무리 달라져도 for문은 인덱스의 범위를 벗어나지 않는다.

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

배열의 초기화

배열은 생성과 동시에 자동적으로 모든칸이 기본값(0)으로 초기화 된다.
for문으로 일정한 규칙이 있는 배열 값을 저장할게 아니라면 다음과같이 생성과 동시에 초기화 해 줄수 있다.

	int[] score = new int[]{50, 60, 70, 80, 90};
	//or
    int[] score = {50, 60, 70, 80, 90};

위와같이 new int{}를 생략할 수도 있다.
다만 아래와 같은 경우는 생략이 불가능하다는 것만 알아두면 된다.

	int[] score;
    score = {50, 60, 70, 80, 90}; // 에러. new int[]를 생략할 수 없음
    score = new int[]{50, 60, 70, 80, 90};	// OK

배열의 출력

배열을 출력하는 방법은 생성할때 쓰던 for문으로 각 인덱스를 참조해서 출력할 수도 있으나
Arrays클래스에서 제공하는 toString()이라는 메서드를 사용하면 해당 배열을 통째로 출력해준다.

	int[] score = {50, 60, 70, 80};
    System.out.print(Arrays.toString(score));  //expected [50, 60, 70, 80]

위 코드를 작성하면 문자열로 변환하여 [50, 60, 70, 80]이라는 문자열을 반환해준다.
※ 배열이름.toString()이 아니다. 이는 그냥 해당 배열의 참조변수이다.

	System.out.print(score.toString()); // [I@14318bb 와 같은 형식의 문자열이 출력된다.

예외적으로 char배열은 println으로 출력하면 각요소가 구분자 없이 문자열처럼 그대로 출력된다.
이는 println 메서드가 char배열일 때만 이렇게 동작하도록 작성됐기 때문이다

	char[] chArr = {'a', 'p', 'p', 'l', 'e'};
    System.out.println(chArr); // apple출력

배열의 활용(1) - 총합과 평균

배열을 이용하면 총합과 평균을 쉽게 구할 수 있다.

	int sum = 0; 		// 총합 저장
    float average = 0f; // 평균 저장
	
    int[] score = {100, 52, 65, 99, 75};
    
    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);

배열의 활용(2) - 최대값과 최소값

배열에 저장된 값 중에서 최대값과 최솟값을 구하는 방법을 알아보자.
배열의 첫 번째 요소를 기준으로 그 이후의 숫자들을 하나씩 비교하여 작으면 최솟값, 높으면 최대값에 각각 다시 대입한다.

	int[] score = { 5, 8, 7, 9, 15, 90, 1 };
    
    int max = score[0]; // = 5
    int min = score[0]; // = 5
    
    for(int i = 0; i < score.length; i++) {
    	if(score[i] > max) {
        	max = score[i];
        } else if (score[i] < min) {
        	min = score[i];
        }
    }
    System.out.println("최대값 : " + max + ", 최소값 : " + min);

OR

Arrays클래스의 sort() 메서드를 활용하면 더욱 쉽게 최소,대값을 알 수 있다.

	int[] numArr = {2, 5, 7, 1, 3, 8, 4, 9};
    Arrays.sort(numArr);
    System.out.println(Arrays.toString(numArr));

Arrays.sort(numArr)를 하면 오름차순으로 자동으로 정렬을 해 준다.
당연히 0번째 index는 최소값, numArr.length번째 index는 최대값이 된다.

배열의 활용(3) - 섞기(shuffle)

	int[] numArr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    System.out.println(Arrays.toString(numArr));
        
    for (int i =0; i< 100; i++ ) {
        int n = (int)(Math.random() * 10);
        int tmp = numArr[0];
        numArr[0] = numArr[n];
        numArr[n] = tmp;
    }
    System.out.println(Arrays.toString(numArr));

0 ~ 9가 들어있는 배열을 만든다. 해당 배열을 100번 섞을 예정이니 반복문을 100회로 설정하고,
int n에 0 ~ 9의 정수를 랜덤하게 넣어준다.

https://velog.io/@159jsd/%EC%9E%84%EC%9D%98%EC%9D%98-%EC%A0%95%EC%88%98-%EB%A7%8C%EB%93%A4%EA%B8%B0-Math.random
임의의 정수 만들기 Math.random() - 참조

이제 임시로 값을 저장할 tmp 변수를 만들어 주고 해당 값에 배열의 0번째 값을 저장한다.
0번째 값은 아까 랜덤으로 만든 정수로 채워주고, 랜덤하게 얻은 정수로 인덱스 위치를 지정하여 해당 위치에 0번째 값을 저장해 놓았던 tmp 변수의 리터럴을 저장해 준다. 이 과정을 100번 반복하면 예상할 수 없는 값이 될것이다.

String배열의 선언과 생성

배열의 타입이 String인 경우에도 int배열의 선언과 생성 방법은 다르지 않다. 예를 들어 3개의 문자열을 담을 수 있는 배열을 생성하는 문장은 다음과 같다.

	String[] name = new String[3];

String배열의 초기화

초기화 역시 int배열과 동일하다.

	String[] name = new String[3];
    name[0] = "Jung";
    name[1] = "Sun";
    name[2] = "Dong";

또는 괄호{}를 사용해서 다음과 같이 간단하게 초기화 할 수 있다.

	String[] name = new String[] { "Jung", "Sun", "Dong" };
    String[] name = { "Jung", "Sun", "Dong" };

0개의 댓글