본문 바로가기
공부/java

자바(java)의 배열

by 샤샤샤샤 2023. 1. 23.

배열(Array) 만들기

배열은 데이터 나열이 하나로 묶어 연속된 메모리 주소에 저장하는 것이다. 파이썬의 인덱스와 같은 개념.

같은 타입의 데이터를 연속된 공간에 나열한 뒤, 각 데이터에 순차적으로 인덱스를 부여해 다루기 쉽게 만든 데이터 구조다.

만약 1,2,3,4,...10의 숫자가 있다고 가정 하면, 이것을 하나 하나 새로운 변수에 할당하는 대신 10칸으로 나눠진 하나의 통에 넣는거라고 생각하면 된다.

정수형, 문자형 데이터 모두 배열형으로 표현할 수 있지만, 타입이 다른 두 데이터를 하나의 배열에 넣는 것은 불가능하다.

 

정수형 배열

1. 선언과 동시에 초기화.

        int[] arrayNum1 = { 10, 20, 30 };
        System.out.println( arrayNum1[0] ); //인덱스 0       출력값 => 10
        System.out.println( arrayNum1[1] ); //인덱스 1                 20
        System.out.println( arrayNum1[2] ); //인덱스 2                 30

 

2. 배열의 길이만 지정.

        int[] arryNums2 = new int[5]; //길이가 5인 배열선언
        arryNums2[0] = 10;
        arryNums2[1] = 30;
        arryNums2[2] = 20;
        arryNums2[3] = 40;
        arryNums2[4] = 50;

만약 1~1000까지의 숫자를 배열형으로 만든다고 할때 2번과 같이 길이만 만든 이후, for문을 이용해 연속된 데이터를 지정한다.

int는 담기는 데이터의 타입을 의미한다. 만약 string형식의 데이터를 담으려고 하면 오류가 발생한다.

대괄호( [ ] )는 배열의 선언을 의미하며, 배열 이름 앞에 쓰건, 뒤에 쓰건 상관없다.

new int [ ] 는 클래스의 객체 선언과 마찬가지로 새로운 배열을 사용하겠다고 선언하는 것이며, 대괄호 안의 [5]은 만드는 배열의 크기가 10칸이라는 것을 선언하는 것이다.

이렇게 만들어진 배열에 원하는 데이터 값을 넣으면 된다. 배열은 0부터 ~n-1번째까지 인덱스 번호로를 부여받게 되며, 배열이름[인덱스 번호] = 값, 형식으로 넣을수 있다.

int thousand [] = new int[1000];       //길이가 1000인 배열
    for(int i=1; i<=1000; i++){            // 1~1000까지 i에 넣기
        thousand[i] = i;                   // a[i]에 i값 저장
        }
    System.out.println( arrayNum1.length );  // 배열의 개수 출력
       출력값 => 1000

다량의 데이터를 다루기 좋은 배열문의 특성상, 다량의 데이터를 만들어내는 반복문과 궁합이 좋다. 1씩 늘어나는 인덱스 역시 일정하게 증가 또는 감소하는 반복문과 아주 잘 어울린다.

 

 

 

문자열 배열형

 

1. 배열의 순환

위의 코드처럼 for문을 활용하여 모든 배열을 출력할수 있지만, 너무 번거롭기에 나온 방식이 있다.

       for(int i=0; i<thousand.length; i++){
            System.out.println( thousand[i] );
            
            
        for( String name : thousand ){
            System.out.println( name );
        }
        
          둘 모두 똑같은 결과를 도출한다. a[0] ~ a[999]까지 모두 출력한다.

향상된 for문이라고도 부른다. 둘의 차이는 없으니 편한 방식을 사용하면 된다.

(for each문이라고도 불린다.)

 

 

배열의 오름/ 내림차순 정리 (Arrays.sort함수)

Arrays.sort() : 괄호 안에 정리하고자 하는 배열을 넣으면 오름차순 정리가 된다.

반면 내림차순 정리는 살짝 복잡하다.

Arrays.sort( (배열), Collections.reverseOrder() ) : 내림차순 정리 방법. 오름 차순과 똑같지만, 배열 뒤에 Collections.reversOrder() 함수를 한번 더 넣어줘야 한다.

 

영어 뿐만 아니라 한글도 적용 가능하다.

      Arrays.sort( names ); 
        for( String name : names ){
            System.out.println( name );
        }
                                                  출력값 => 가
                                                            나
                                                            다



String[] names = { "다", "가", "나" };
 Arrays.sort( names, Collections.reverseOrder() );
      for( String name : names ){
                System.out.println( name );       
      }          
                
                                                   출력값 => 다
                                                             나
                                                             가
import java.util.Arrays;
import java.util.Collections;

public class ex57 {
    public static void main(String[] args) {
        //문자열 배열
        String[] names = { "장미", "수선화", "들국화" };

        //배열의 순환
        //1. for
        for(int i=0; i<names.length; i++){
            System.out.println( names[i] );
        }
        //2. 향상된 for
        for( String name : names ){
            System.out.println( name );
        }

        //배열의 오름차순 정렬(작은 값부터 큰 값까지)
        Arrays.sort( names ); //가나다 순으로
        for( String name : names ){
            System.out.println( name );
        }
        //배열의 내림차순 정렬
        Arrays.sort( names, Collections.reverseOrder() );
        for( String name : names ){ //가나다 역순으로
            System.out.println( name );
        }
    }
}
import java.util.Arrays;
import java.util.Random;

public class ex58 {
    public static void main(String[] args) {
        //배열의 선언 방법
        //1. 값 초기화하면서 선언하면서
        int[] nums = { 10, 30, 20, 40, 50 };
        //2. 배열의 길이만 선언하면서
        int[] nums2 = new int[5]; //길이가 5인 배열선언
        nums2[0] = 10;
        nums2[1] = 30;
        nums2[2] = 20;
        nums2[3] = 40;
        nums2[4] = 50;

        //로또 번호 6개를 추첨해서 배열에 넣어보자.
        //중복된 수가 발생해도 허용!
        int[] lotto = new int[6];
        Random rand = new Random();
        for(int i=0; i<lotto.length; i++) {
            lotto[i] = rand.nextInt(45) + 1;
        }
        //연습문제 39
        //1. lotto 배열을 오름차순 정렬하여 출력하시오.
        Arrays.sort( lotto );
        for (int num : lotto) {
            System.out.println( num );
        }
        //2. 로또번호중 가장 작은 수와 가장 큰 수를 출력하시오.
        System.out.println( lotto[0] );
        System.out.println( lotto[5] );
        System.out.println();
        //3. 로또 번호 중복된 수가 추첨되었을때, 재추첨하시오.
        //  중복안되도록 하시오.
        // 힌트) 재추첨시 반복변수 i-- 하나 빼고 continue하면 됩니다.
        for(int i=0; i<lotto.length; i++) {
            lotto[i] = rand.nextInt(45) + 1;

            System.out.println( lotto[i] );
            //중복되었는지 확인하는 반복문
            for(int j=0; j<i; j++){
                //현재 추첨값 vs 이전 추첨값 비교
                if(lotto[i] == lotto[j]){
                    //중복된 값이 있으면 재추첨
                    System.out.println("중복된 값:"+lotto[i]);
                    if(i==0){
                         continue;
                    }
                    i--;
                    continue;
                }
            }
        }
    }
}