[Java의 정석] 배열(array)

younghyun·2022년 7월 3일
1

Java의 정석

목록 보기
1/12
post-thumbnail

배열이란

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

배열의 선언과 생성

// 길이가 100인 int 배열 선언, 생성
int[] array = new int[100];

배열의 길이

int[] array = new int[5]

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

for문의 조건식에 배열의 길이를 직접 적는 것보다 배열이름.length를 사용하는 것이 좋다.

  • ArrayIndexOutOfBoundsException 예외가 발생하기 쉽다.
  • 배열의 길이가 변경되면 for문의 조건식을 변경해주어야 한다.

배열의 초기화

int[] array = new int[]{50, 60, 70, 80, 90};
int[] array = {50, 60, 70, 80, 90};

배열의 출력

  • Arrays.toString(배열이름)
    : 파라미터로 지정한 배열의 내용을 문자열(String) 타입의 데이터로 반환해주는 메서드
int[] array = {100, 95, 80, 70, 60};

// 1. for문을 이용한 배열의 출력
for (int i = 0; i < array.length; i++) {
    System.out.println(array[i]);    // [100, 95, 80, 70, 60]
}

// 2. Arrays.toString(배열이름) 메서드 이용
System.out.println(Arrays.toString(array));  // [100, 95, 80, 70, 60]

// 잘못된 코드: 배열을 가리키는 참조변수 arr의 값을 출력한다. 
System.out.println(array);   // I@14318bb


int [] char_array = {'a', 'b', 'c', 'd'}

// char 배열은 다른 배열과 달리 for문을 사용하지 않고도 println()으로 각 요소를 그대로 출력한다.
System.out.println(char_array);  // abcd

배열의 복사

1. for문을 이용한 배열의 복사

// 배열 arr 복사하기
int[] arr = new int[5]

// 1. 복사하려는 배열보다 길이가 2배인 배열을 생성한다.
int[] tmp = new int[arr.length*2];

// 2. for문으로 배열 arr의 값을 하나씩 배열 tmp에 복사한다.
for (int i = 0; i < arr.length; i++) {
    tmp[i] = arr[i];
}

// 3. 참조변수 arr에 참조변수 tmp의 값을 저장한다.
arr = tmp;

/*
참고: arr은 tmp를 가리키게 되면서 그 전에 arr이 가리키던 배열은 사용할 수 없게 된다. 
이렇게 쓸모없게 된 배열은 가비지 컬렉터에 의해 메모리에서 제거된다.
*/

2. System.arraycopy()를 이용한 배열의 복사

배열의 복사는 for문보다 System.arraycopy()를 사용하는 것이 효율적이다.

int[] arr = new int[5]

// '배열 arr'의 '0번째' 요소에서 '배열 newArr'의 '0번째' 요소로 'arr.length개'의 값을 복사한다.
System.arraycopy(arr, 0, newArr, 0, arr.length);

배열의 활용

총합과 평균

public class ArrayEx5 {
    public static void main(String[] args) {
    
        int[] score = {100, 88, 100, 100, 90};
        
        // 총합, 평균 초기화
        int sum = 0;
        float average = 0f;  
        
        // 총합 구하기
        for (int i = 0; i < score.length; i++) {
            sum += score[i]
        }
        
        // 평균 구하기
        average = sum / (float)score.length
    }
}

/* 
실행 결과
sum: 478
average: 95.6 (소수점까지 구하기 위하여 float로 변환)
*/

최댓값과 최솟값

public class ArrayEx6 {
    public static void main(String[] args) {
        
        int[] score = {100, 88, 91, 55, 90};
        
        // 최댓값, 최솟값 초기화
        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]
            }
        }
    }
}

섞기 (shuffle)

// 카드 섞기
public class ArrayEx7 {
    public static void main(String[] args) {
        
        // 카드 숫자 배열 생성
        int[] cardNum = new int[10];
        
        // 카드 숫자 배열을 0~9로 초기화
        for (int i = 0; i < cardNum.length; i++) {
            cardNum[i] = i;
        }
        
        // 섞기 (임의의 카드 두 장을 카드 숫자 개수만큼 바꾸기)
        for (int i = 0; i < cardNum.length; i++) {
        
            // 0~9 중 임의의 숫자 n 구하기
            int n = (int)(Math.random() * 10); 
            
            // cardNum[i]과 cardNum[n]을 바꾼다.
            int tmp = cardNum[i];    
            cardNum[i] = cardNum[n]; 
            cardNum[n] = tmp;
        }
    }
}
// 로또 번호 생성기
public class ArrayEx8 {
    public static void main(String[] args) {
        
        // 로또 번호 배열 생성
        int[] ball = new int[45];
        
        // 로또 번호 배열을 1~45로 초기화
        for (int i = 0; i < ball.length; i++) {
            ball[i] = i + 1;
        }

        // 섞기 (임의의 공 두 개를 6번 바꾸기)
        for (int i = 0; i < 6; i++) {
        
            // 0~44 중 임의의 숫자 j 구하기
            int j = (int)(Math.random() * 45);
            
            // ball[i]과 ball[j]을 바꾼다.
            int tmp = ball[i];    
            ball[i] = ball[j]; 
            ball[j] = tmp;
        }
    }
}

임의의 값으로 배열 채우기

// 주사위를 10번 던져서 나올 경우의 수
public class ArrayEx9 {
    public static void main(String[] args) {
        
        // 주사위 배열, 10번 던져서 나올 경우의 수 arr 배열 생성
        int[] dice = {1, 2, 3, 4, 5, 6};
        int[] arr = new int[10];
        
        // 주사위 수 중 무작위로 골라 배열 arr에 넣기
        for (int i = 0; i < arr.length; i++) {
            int tmp = (int)(Math.random() * dice.length);
            arr[i] = dice[tmp];
        }
        
        System.out.println(Arrays.toString(arr);  // [1,3,2,6,4,2,1,5,4,5]
}

정렬하기 (sort)

// 버블정렬 알고리즘으로 오름차순 정렬
public class ArrayEx10 {
    public static void main(String[] args) {
        
        // 배열 생성
        int[] arr = new int[10];
        
        // 0~9 중 임의의 숫자로 배열 초기화
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int)(Math.random() * 10);    // 1344213843
        }
        
        // 버블 정렬 (서로 인접한 두 원소를 검사하여 정렬)
        for (int i = 0; i < arr.length-1; i++) {
        
            boolen changed = false;  // 자리 바꿈 여부
            
            for (int j = 0; j < arr.length-1-i; j++) {
                if (arr[j] > arr[j+1]) {   // 왼쪽 값이 크면 자리 바꾸기
                    int temp = arr[j];
                    int arr[j] = arr[j+1];
                    int arr[j+1] = temp;
                    changed = true;
                }
            }
            
            if (!changed) break;
            
            for (int k = 0; k < arr.length; k++) {
                System.out.print(arr[k]);         // 1123334448
            }

빈도 수 구하기

public class ArrayEx11 {
    public static void main(String[] args) {
        
        // 길이가 10인 배열 생성
        int[] arr = new int[10];
        
        // 0~9 중 임의의 숫자로 배열 초기화
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int)(Math.random() * 10);
        }
        
        // count[arr의 값] = arr의 값의 빈도수
        for (int i = 0; i < arr.length; i++) {
            count[arr[i]]++;
        }
        
        // 빈도 수 출력 
        for (int i = 0; i < arr.length; i++) {
            System.out.println(i + "의 개수: " + count[i]);
        }
profile
🌱 주니어 백엔드 개발자입니당

0개의 댓글