본문 바로가기
> 개발/JAVA

자바의 배열 : 기본배열, 객체배열

by @일리 2023. 7. 27.

배열

arr[0] arr[1] arr[2] arr[3] arr[4] arr[5]

배열은 이 표처럼 리스트 구조, 선형 구조, 연속적인 구조를 가진 자료형이다. 배열의 핵심은 다양한 데이터 타입이 모인 객체와 달리 같은 데이터 타입이 여러 개 담긴다는 점이다.

 

정수형 배열을 생성할 때는 아래와 같이 코드를 작성하면 된다. 

// 배열을 생성만 해놓을 수 있다.
 int[] a = new int[5]
 
 // 혹은 선언과 동시에 바로 초기화할 수 있다.
 
 int[] a = {10, 11, 12, 13, 14} 
 
 // 혹은 잘 사용하는 방법은 아니지만 new 키워드를 사용하여 선언 시 배열을 초기화할 수 있다.
 
 int[] a = new int[]{10, 11, 12, 13, 14}

그리고 C언어처럼 자바에서도 int[][]로 선언해서 2차원 배열을 만들 수 있다. 

 

왜 배열이 필요할까?

 

배열이 없는 경우를 먼저 생각해보자. 하나의 값만 가진 변수를 여러 개 선언하려면 다음과 같이 작성해야 한다.

      int a, b, c;
        a= 10;
        b= 11;
        c= 12;

그리고 이 값들의 합을 구하고 싶다면 int sum = a+b+c 를 해야 하며, 변수가 늘어남에 따라 int sum = a+b+c+d+e... 이렇게 계속 변수를 더해줘야 한다.

하지만 배열이 있다면 

        int[] intArr = {10,11,12};

한 번에 배열 선언과 할당을 할 수 있다. 그리고 이렇게 생긴 배열을 활용해서 반복문을 만들어서 더해야 할 값이 추가되든 줄어들든 쉽게 합산을 구할 수 있다. 정리하면 배열을 이용해서 동일한 유형의 여러 값을 저장하고 조작하는 것을 보다 체계적이고 효율적으로 할 수 있당!!

배열의 종류

1. 기본자료형 배열 : int, float, boolean 등 요소가 기본자료형으로 구성된 배열

2. 객체형 배열 : 객체를 참조하는 참조 변수들의 모음

3. 1차원 배열 : 배열의 요소가 값인 배열

4. 2차원 배열 : 배열의 요소로 1차원 배열을 가지는 배열

객체 배열의 반복문

public class CarPractice {
    public static void main(String[] args) {

        Car[] carArr = new Car[3];
        carArr[0] = new Car();
        carArr[0].model = "Morning";
        carArr[0].price = 2000;
        carArr[0].make = "KiA";
        carArr[0].year = 2023;
        carArr[0].isGasolineModel = true;

        carArr[1] = new Car();
        carArr[1].model = "Seltos";
        carArr[1].price = 2700;
        carArr[1].make = "KiA";
        carArr[1].year = 2021;
        carArr[1].isGasolineModel = true;

        carArr[2] = new Car();
        carArr[2].model = "Genesis";
        carArr[2].price = 6000;
        carArr[2].make = "Hyundai";
        carArr[2].year = 2023;
        carArr[2].isGasolineModel = true;

        for (int i = 0; i < carArr.length; i++) {
            System.out.println("Car " + (i + 1) + ":");
            System.out.println("Model: " + carArr[i].model);
            System.out.println("Price: " + carArr[i].price);
            System.out.println("Make: " + carArr[i].make);
            System.out.println("Year: " + carArr[i].year);
            System.out.println("Is Gasoline Model: " + carArr[i].isGasolineModel);
            System.out.println("-----------------------");
        }
    }
}

// 또는

public class CarPractice {
    public static void main(String[] args) {
        Car carA = new Car();
        carA.model = "Morning";
        carA.price = 2000;
        carA.make = "KiA";
        carA.year = 2023;
        carA.isGasolineModel = true;

        Car carB = new Car();
        carB.model = "Seltos";
        carB.price = 2700;
        carB.make = "KiA";
        carB.year = 2021;
        carB.isGasolineModel = true;

        Car carC = new Car();
        carC.model = "Genesis";
        carC.price = 6000;
        carC.make = "Hyundai";
        carC.year = 2023;
        carC.isGasolineModel = true;

        Car[] carArr = new Car[3];
        carArr[0] = carA;
        carArr[1] = carB;
        carArr[2] = carC;

        for (int i = 0; i < carArr.length; i++) {
        	
            Car car = carArr[i];
            System.out.println("Car " + (i + 1) + ":");
            System.out.println("Model: " + car.model);
            System.out.println("Price: " + car.price);
            System.out.println("Make: " + car.make);
            System.out.println("Year: " + car.year);
            System.out.println("Is Gasoline Model: " + car.isGasolineModel);
            System.out.println("-----------------------");
        }
    }
}

객체 배열의 반복문 사용도 기본 배열의 반복문 사용과 비슷하다. 

두 번째 방법에서 Car car = carArr[i] 이 부분에서 Car 유형의 car라는 변수를 선언해서 반복문을 진행한다. car 변수는 배열의 현재 인덱스에 Car 개체를 저장하는 데 사용된다. car가 아니라 someCar와 같이 내가 원하는 변수명으로 지어도 된다. 

 

나는 위 두 방법 중 어떤 방법이 더 효율적인 방법인지 궁금했다! 챗지피티 선생님 왈

두 접근 방식 모두 유효하며 동일한 출력을 생성합니다. 그러나 두 번째 접근 방식은 일반적으로 특히 더 큰 배열이나 더 복잡한 개체를 처리할 때 더 효율적이고 유지 관리가 쉬운 것으로 간주됩니다.

첫 번째 접근 방식에서는 먼저 배열을 만든 다음 각 요소에 개별적으로 값을 할당합니다. 이는 특히 배열에 많은 수의 요소가 있는 경우 오류가 발생하기 쉽고 지루할 수 있습니다. 또한 요소에 값을 잘못 할당하면 잘못된 데이터가 생성될 수 있습니다.

반면에 두 번째 접근 방식에서는 Car 개체의 인스턴스를 만들고 배열 요소에 직접 할당합니다. 이것은 더 깨끗하고 읽기 쉽고 오류가 덜 발생합니다. 또한 배열에 영향을 주지 않고 Car 개체의 속성을 쉽게 수정하거나 확장할 수 있습니다.

또한 두 번째 접근 방식을 사용하면 각 Car 객체(carA, carB, carC)에 대해 별도의 변수를 생성할 수 있으므로 필요한 경우 개별 객체로 작업하기가 더 쉽습니다. 또한 코드의 다른 부분에서 개별 Car 객체를 사용할 수 있으므로 코드 재사용성이 향상됩니다.

전반적으로 두 번째 접근 방식은 보다 체계적이고 유연하며 유지 관리가 용이합니다. 일반적으로 Java에서 객체 배열로 작업할 때 두 번째 접근 방식을 사용하는 것이 좋습니다.

라고 한다. 참고하장!!

배열의 요소를 한 번에 출력하려면?

 

자바스크립트를 알고 나서 자바를 배우니 불편하게 느껴지는 것 중 하나는 출력이 불편하다는 점이다. 자바스크립트에서는 그냥 console.log(data)를 하면 그 data가 숫자형 변수든, 객체든, 배열이든 한 번에 출력할 수 있다. 하지만 자바는 그렇지 않다. API를 import해야 할 때도 있고 자바스크립트보다 출력 과정이 복잡하다ㅠ_ㅠ

import java.util.Arrays;

public class ArrayFirst {
    public static void main(String[] args) {
       int[] arr = new int[5];
       arr[0] = 5;
       arr[1] = 10;
       arr[2] = 15;
       arr[3] = 20;
       arr[4] = 25;

        System.out.println("arr = " + arr); 
       // arr = [I@3cda1055
        
       for(int i=0; i<arr.length; i++){ 
       // var, let, const 선언 키워드를 사용하는 자바스크립트와 달리 int로 데이터 타입을 알려줘야 한다.
           System.out.println("arr[i] = " + arr[i]);
       }
       // arr[i] = 5
       // arr[i] = 10
       // arr[i] = 15
       // arr[i] = 20
       // arr[i] = 25
       
       
        System.out.println("Arrays.toString(arr) = " + Arrays.toString(arr));
        // Arrays.toString(arr) = [5, 10, 15, 20, 25]
    }
}

당연히 자바스크립트처럼 println(arr)하면 자바스크립트처럼 [5,10,15,20,25]가 나오겠지?? 했는데 아니었다. [I@3cda1055 ..?? 이게모람🥲 다행히 정처기 공부한 짬밥으로 눈치껏 해시코드로 구성된 arr가 저장된 메모리 주소라는 걸 알아챘다. 

 

그러면 반복문으로는 각 요소들을 볼 수 있을까? 다행히 볼 수 있당!!

 

그러면 내가 원하는 [5,10,15,20,25] 이 형태로 보려면 어떻게 해야 할까? 우리 챗지피티 선생님께서 알려주시길 java.util.Arrays를 import해서 봐야 한다고 한다. 그래서 시키는대로 했더니 원하는 형태로 결과가 출력되었당!!

 

아무래도 자바와 친해지려면 어떤 매소드들이 있는지 머리에 좀 담아놔야할 것 같다...배열의 요소 전체를 출력할 때조차 import가 필요하다닛..자바스크립트에 비하면 까탈스러운 프로그래밍처럼 느껴진다. 얼른 친해지자 자바야...

 

댓글