본문 바로가기
JAVA

[JAVA] 배열(1차원 배열, 배열 생성, 초기화)

by 정공자씨 2024. 4. 16.

 

배열


배열이란?

  • 같은 타입의 데이터들을 한 공간에 저장하여 사용



 

배열이 필요한 이유

  • 배열이 없다면, 같은 타입의 변수를 여러 개 선언하여 데이터를 저장해야 함
int score1, score2, score3, score4, score5

  • 배열을 선언하여, 같은 타입의 변수를 한꺼번에 관리할 수 있음
int [] score = new int[5] // 5개의 int 데이터를 저장할 수 있음

 
  

특징

  • 배열의 요소들이 메모리에 연속적으로 생성
  • 배열의 생성 시에, 배열의 크기를 지정해야 함(고정)
    • 한번 생성된 배열의 길이는 변경할 수 없음
    • 생성한 배열의 크기를 변경하고 싶다면 : 새로 생성해야 함
  • 배열 자체는 객체
  • 같은 타입의 데이터만 저장 가능
  • 대괄호( [ ] ) 내부에 변수의 인덱스를 지정하여, 각 변수에 접근할 수 있음
    • 인덱스는 0부터 시작

 

 

1차원 배열 생성하는 방법

  • 실제 배열을 생성하려면, new 연산자를 이용해야 함
  • new연산자를 사용하여 배열을 생성하면, 배열 선언과 초기화를 따로 할 수 있음
int [] score; // 배열 선언
score = new int [5] // 배열 생성

 

  • 배열의 선언과 생성을 동시에 할 수 있음
int [] score = new int [5] // 선언 및 배열 생성

 
 
 

1차원 배열 초기화

  • 인덱스 번호에 해당하는 배열 요소(배열명[idx])에 우측 값을 저장
  • 배열 선언 시에 지정한 데이터 타입과 동일한 데이터만 저장할 수 있음
String [] nameArr = new int[3];

// 배열명[index] = 저장할 값;
name[0] = "홍길동";
name[1] = "이순신";
name[2] = "임꺽정";

 

  • 배열 선언 시에 지정한 데이터 타입과 다른 데이터는 저장 불가
int [] intArr = new int[3];

intArr[0] = “정공자”; // 에러, “정공자”는 String타입
intArr[1] = 10001;  // 가능, int타입

 

 

배열 선언과 동시에 값 목록을 초기화하기

int [] score2 = {50,60,70,80,90}

 

int [] score = new int[] {10,20,30,40,50};

 
 
 
 

값 목록을 이용해서 배열을 생성할 때 주의할 점

1. 반드시 배열 선언과 초기화를 같은 행에서 해야 함

int [] score2 = {50,60,70,80,90}

 

[ 에러 발생 ]

  • 배열의 선언과 초기화를 따로 하는 경우
int [ ] score;  // 배열 선언
score = {50, 60, 50, 80, 90};  // 초기화 - 에러 발생!

[ 배열 선언과 초기화를 따로 할 때, 에러가 발생하는 이유 ]
- 배열의 참조 변수를 생성(score)한 경우, 해당 변수는 stack 메모리 영역에 생성되는데
  (참조변수는 배열 인스턴스의 위치값(주소값)을 저장하는 변수)
- 배열은 객체이고, 객체는 heap 영역에 저장을 하여야 하는데
   배열의 인스턴스가 생성되지 않아서(배열이 생성되지 않아서) 값을 초기화 할 수 없음

 
2. 배열 선언을 한 이후에, 초기화를 하는 경우 : new 생성자를 사용하여 값 초기화

int [] score; // 배열 선언
score = new int[] {10,20,30,40,50}; // new 연산자 이용하여 값 초기화

System.out.println(score[1]); //20


[ 주의할 점 ]

new 연산자를 이용하여 값을 초기화 하는 경우에는, 배열 크기를 지정 x




 

❓ ❓ ❓ 객체는 Heap(힙) 영역에 저장

int [] score = new int[5];

<stack 영역>
- 배열 참조 변수인 score 초기화
- score에는 주소가 저장됨
- score는 참조 변수 = 8byte

<heap 영역>
- 배열의 생성
- 메모리 크기 : 4byte(int) * 5개 = 20byte
- 기본형 타입의 데이터(int)의 값 자체가 저장됨


String [] name = new String[3];

<stack 영역>
- 배열 참조 변수인 name초기화
- name에는 주소가 저장됨
- name은 참조 변수 = 8byte

<heap 영역>
- 배열의 생성
- 메모리 크기 : 8byte(주소값을 저장하기 때문에) * 3개 = 24byte
- 참조형 타입의 데이터(String)가 저장된 주소가 저장