배열_

2024. 1. 7. 16:02JAVA

배열이란?

같은 타입의 변수를 하용하기 편하게 하나로 묶어둔 것

 

배열이 필요한 이유?

- 동일 타입 변수의 생성과 사용의 불편함을 해소하기 위해!!

문제점

1. 정보량에 따라 늘어나게 되는 코드량

2. 반복 사용상의 어려움

 

고객 100명을 상대해야 한다고 가정 해보자.

 

변수를 사용해서 상품 변수에 값을 등록하게 되면 다음과 같은 코드가 펼쳐질 것이다.

int customer1 = 10;
int customer2 = 20;
int customer3 = 30;
int customer4 = 40;
int customer5 = 50;
int customer6 = 60;
int customer7 = 70;

System.out.println("customer1 = " + customer1);
System.out.println("customer2 = " + customer2);
System.out.println("customer3 = " + customer3);

이걸.. 100 번까지? 100번???

노가다가 따로 없다.

 

customer + i 를 통해 가능하지 않을까.. 싶지만.. 유감스럽게도 할 수 없다.

더욱이, 고객 수가 1000명으로 늘어나면 이런 작업을 1천번이나 반복해야 하며, 문서도 장대하게 늘어날테니 비효율적이지 않을 수 없다.

 

이런 예시와 같이 같은 타입 변수를 반복해서 선언 및 사용하는 데 불필요한 낭비를 막아주는 것이 바로 배열이다

 

배열 선언 및 생성

int[] customers; // 배열 변수 선언 - 변수명은 복수형으로 선언하는 것이 암묵적 국룰이라 함. 알아먹기도 쉬움.
customers = new int[7];  // 배열 초기화 - 여기서는 int 타입을 7개 넣을 수 있는 배열임.

int[] customers = new int[]{10,20,30,40,50,60,70};  // 배열 생성과 초기화 - 이렇게도 되고
int[] customers = {10,20,30,40,50,60,70};  // 배열 생성과 초기화 - 이렇게도 된다.

// 다만 이렇게는 안 된다.
int[] customers = new int[7];
customers = {1,2,3,4,5,6,7};	// JAVA가 대입하려는 값들이 뭔지 식별하지 못하기 때문이라는 모양이다.

 

코드 블럭에 주석으로 있지만 구태여 다시 한 번 읇어보자.

배열은 동일 데이터의 집합이다. 변수명은 복수명으로 짓는 것이 국룰이다. 알기 쉽고, 이치에 맞고~

 

 

*  new int[7] 과 같이 입력하면 아래와 같은 배열이 생성된다. - new 는 새롭게 생성한다는 키워드이다. 일단 이건 넘어간다.
*      int [0] [1] [2] [3][4] [5][6] - 7개를 담을 수 있는데, 끝이 6인 이유? 컴퓨터는 0부터 인식한다. 1~7 이 아닌 0~6 이다.
*          [값][값][값][값][값][값][값] - 해당 인덱스(주소)마다 다른 값들을 할당할 수 있다.
*
*  자바는 배열을 생성할 때 그 내부 값을 자동으로 초기화 한다.
*  숫자는 0, boolean은 false, String = null 이다.
*  따라서, 위의 예시의 값은 int 형 (숫자) 이므로 0으로 초기화 돼 있다.
   int[] exArray = new int[3];
       System.out.println("exArray[0] = " + exArray[0]);   //  0
       System.out.println("exArray[1] = " + exArray[1]);   //  0
       System.out.println("exArray[2] = " + exArray[2]);   //  0

   참조값 보관
   new int[7]로 배열을 생성하면 배열의 크기만큼 메모리를 확보함.
   int[7] 이므로 4byte *7  28byte 의 메모리를 사용하게 됨.
   이를 배열 변수 int[] customer 에 대입하게 되면서 28 byte 에 대한 참조값이 customer 변수에 저장됨.

   즉, 변수는 배열에 대한 참조 변수를 갖고 있는 것이지. 실제 배열을 저장하고 있는 것은 아님.
   실제 배열은 다른 곳에 저장되는 모양.
   아무튼, 우리는 배열 변수에 저장된 참조값을 통해 배열에 접근하여 사용할 수 있게 되는 것임.

       int[] exArray = new int[3];
       System.out.println("exArray = " + exArray); // [I@5b6f7412
   배열을 그대로 출력 해보면 I@5b6f7412 라는 값이 출력 되는데, I는 int형 을 의미하고 @ 다음은 주소값을 16진수로 변환한 것이라 함.

       double[] exDoubleArray = new double[2];
       System.out.println("exDoubleArray = " + exDoubleArray); // [D@5b6f7412
                                                                   Double 의 D. 깨알 지식으로 알아두면 쓸모 있을지도..
    왜 16진수로 계산하는지는 나도 모름. 지금 필요한 내용 아니니 건너 뛰겠음.

*      new int[7] 의 구조는 아래와 같다.
*      int [0][1][2][3][4][5][6] 7개를 담을 수 있는데, 끝이 6인 이유? 컴퓨터는 0부터 인식한다. 1~7 이 아닌 0~6 이다. -> n-1
      7을 입력하게 되면 범위 밖 예외처리가 발생한다.

       int[] outOfBoundException = new int[7];
       outOfBoundException[7] = 3;
       System.out.println("outOfBoundException[7] = " + outOfBoundException[7]);   // ArrayIndexOutOfBoundsException

       Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 7 out of bounds for length 7
       IDE 인텔리제이에서 [7] 에 노란 밑줄 그어주면서 알려주기도 하니, 노란 밑줄 보이면 확인 해보자.
*/

 

기본형 ? 참조형?
   기본형 변수 - int, long, double, boolean 등은 변수에 값을 직접 넣을 수 있었다. 이를 기본형(Primitive Type) 이라 한다.
   참조형 변수 - 반면, 배열과 같이 변수에 주소(참조값)를 통해 데이터에 접근하는 것도 있다. 이를 참조형(Reference Type) 이라 한다. 추후 학습할 객체, 클래스 등은 모두 참조형이다.

 

배열 사용

배열 선언과 생성에 대해 알아봤으니 사용 해보자.

int[] customers;
customers = new int[7];

// 변수 값 대입
customers[0] = 10;
customers[1] = 20;
customers[2] = 30;
customers[3] = 40;
customers[4] = 50;
customers[5] = 60;
customers[6] = 70;

customer1 ,2 , 3 , 4 , 5 와 별 다를 바 없어 보이지만, 작성자가 숫자에 개입할 수 있는 여지가 보인다.

[0] , [1], [2] ...

이거 작성할 때 반복문으로 넣을 수 있겠네?

전체 출력도 반복문으로 할 수 있겠네?

// 7 줄이 3줄로 줄었다 고객 수가 천명이든 만명이든 3줄로 끝난다. 아주 달달하다 꿀꿀
for (int i = 0; i < customers.length; i++) {
    System.out.println("customer " + i + " = " + customers[i]);
}

혁명.. 이건 혁명이다.
N 개가 3줄이 됐다. 너무 좋다.

 

 

'JAVA' 카테고리의 다른 글

Method_정의  (0) 2024.01.07
Method  (0) 2024.01.07
기초예제_배열과 반복문을 사용한 관리 프로그램  (0) 2024.01.07
반복문_향상된 for문  (0) 2024.01.07
배열_2차원  (0) 2024.01.07