일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Matrix
- Math
- java
- database
- two pointers
- Method
- array
- SQL
- 파이썬
- Binary Tree
- Class
- Data Structure
- Number Theory
- Tree
- hash table
- 코딩테스트
- implement
- 자바
- geometry
- 구현
- Binary Search
- Stack
- string
- 코테
- sorting
- simulation
- greedy
- Counting
- dynamic programming
- bit manipulation
- Today
- Total
코린이의 소소한 공부노트
배열 (1) 선언과 생성, 인덱스 본문
배열이란 같은 타입인 여러 개의 변수를 하나로 묶어놓은 것을 말한다. 쉽게 말하면 변수들이 줄줄이 소시지처럼 붙어있는 것이다.
배열을 선언할 때는 다음 2가지 방법 중 하나를 골라서 하면 된다. 배열을 선언한다는 것은 배열을 다루기 위한 참조변수를 선언한다는 것이다.
// 1) 타입[] 변수이름;
int[] num;
String[] text;
// 2) 타입 변수이름[];
int num[];
String text[];
1) 자바에서는 배열기호 [ ]를 타입의 일부분으로 보기 때문에 대괄호를 타입 옆에 쓴다. 이 설명을 듣고 봐서 그런지 코드를 읽을 때도 int배열 num으로 읽히니 더 편한 것 같은 생각이 든다.
2) C언어에서 쓰는 방법을 함께 지원한다.
배열을 선언했을 때 배열을 다루기 위한 참조변수를 생성했으니, 이제는 실제 배열을 생성해보자. 배열을 생성하면 실제 저장공간이 생긴다. 그 저장공간의 첫 부분의 주소가 배열의 참조변수에 저장된다.
num = new int[5];
// int 타입의 변수 5개로 이루어진 배열 num 생성
// 정수 5개를 담을 저장공간 생성
text = new String[10];
// String 타입의 변수 10개로 이루어진 배열 text 생성
// 메모리 주소 10개를 담을 저장공간 생성
// 물론, 배열의 생성과 선언을 같이 할 수 있다.
int[] num = new int[5];
String[] text = new String[10];
// 배열의 참조변수에는 저장공간의 시작주소가 저장되어있다.
System.out.println(num); // [I@53bd815b
System.out.println(text); // [Ljava.lang.String;@2401f4c3
// [은 배열, I는 int, Ljava.lang.String은 문자열,
// @은 위치(at), @ 뒷부분은 주소를 의미한다.
이제 배열을 생성해서 저장공간도 만들었으니, 값을 넣어볼 차례다.
아까도 말했듯이 배열은 줄줄이 소시지처럼 변수들이 붙어있다. 그렇다고 소시지라고 부를 수는 없는 노릇이다. 그래서 맨 앞부터 번호를 붙여서 부른다. 이 번호를 인덱스(index)라고 하고, 인덱스는 0번부터 시작한다. num 배열의 0번을 부르겠다고 0번만 외치면 안 된다. 사람이 바글바글한 공항에서 이름이 단무지인 친구를 부른다고 "무지야!" 했다가 김무지, 이무지, 박무지, 정무지, 조무지, 서무지, 심무지 등등이 다 쳐다보는 현상이 발생하기 때문이다. 당연하지만 배열의 이름과 함께 인덱스를 불러야 한다. 0번이 맨 앞이라 첫 번째지만, 헷갈리기 때문에 0번은 그냥 영 번째라고 부른다.
num[2] = 7;
// int 타입의 배열 num을 찾아가서
// 앞에서부터 0, 1, 2번 저장공간에 7을 저장한다.
// 2번이지만 3번째 저장공간
// 그래도 우리는 2번째라고 부른다.
text[5] = "hi";.
// String 타입의 배열 num을 찾아가서
// 앞에서부터 0, 1, 2, 3, 4, 5번 저장공간에 "hi"를 저장한다.
// 5번이지만 6번째 저장공간
// 그래도 우리는 5번째라고 부른다.
num[6] = 4; // 에러
// java.lang.ArrayIndexOutOfBoundsException: Index 6 out of bounds for length 5
// num 배열 선언시 크기가 5라고 했는데, 6번째에 값을 저장하려니
// 배열의 크기를 넘어섰기 때문에 에러 발생
- 인덱스는 배열을 만들면 각 저장공간(요소, element)에 자동으로 붙는 번호이다.
- 저장공간이 연속되어있기 때문에, 인덱스도 연속적인 번호로 나온다.
- 시작이 0이기 때문에, 크기가 n인 배열의 인덱스의 범위는 0부터 n-1까지다.
in타입 배열 num을 선언한 것과 int타입 변수 5개를 선언한 것에는 어떤 차이가 있을까?
// 1) 선언
int num1, num2, num3, num4, num5; // 선언과 동시에 생성
int[] num; // 선언만 된 상태
// 2) 생성
// 변수는 따로 할 필요 없음
num = new int[5];
// 3) 초기화
num1 = 1;
num2 = 2;
// 나머지 변수는 초기화X
// 배열은 생성과 동시에 0으로 자동 초기화
num[2] = 7;
1. 변수는 선언과 동시에 생성이 이루어지지만, 배열은 선언과 생성이 분리되어있다.
2. 변수는 생성 후 초기화를 해야 하지만, 배열은 생성과 동시에 0으로 초기화가 된다.
3. 변수 여러 개를 동시에 선언해도 메모리상에서 저장공간이 불연속적이지만, 배열은 연속적인 저장공간을 갖는다.
4. 배열의 요소는 따로 선언하지 않아도 이름이 자동으로 붙는다.
5. 반복문을 시행할 때 배열이 훨씬 편하다.
위 코드를 실행하고 나면 메모리는 대충 이런 상황이다.
int타입 변수 num3, num4, num5는 초기화가 되지 않아 print()문을 실행하면 에러가 발생하지만, num[2]를 제외한 배열 요소는 0으로 자동 초기화가 되어있기 때문에 print()문을 실행하면 다 0이 나온다. 믿을 수 없다면 한번 확인해보자.
for (int i=0 ; i<5 ; i++)
System.out.print(num[i] + " ");
// 0 0 7 0 0
System.out.println(num1); // 1
System.out.println(num2); // 2
// java.lang.Error: Unresolved compilation problem:
System.out.println(num3); // The local variable num3 may not have been initialized
System.out.println(num4); // The local variable num4 may not have been initialized
System.out.println(num5); // The local variable num5 may not have been initialized
[쿠키글] 참조형인 String의 배열은 어떻게 생겼을까?
참조형인 String은 변수에 값을 넣는 게 아니라 그 값이 들어있는 곳의 주소를 저장한다. 그림으로 나타내면 어떨까?
왼쪽처럼 표현하는게 맞으나, 간단하게 표현할 때는 오른쪽처럼 그린다.
'Java' 카테고리의 다른 글
배열 (3) 활용 예시 (0) | 2022.01.20 |
---|---|
배열 (2) 초기화, 출력 (0) | 2022.01.19 |
제어문 (2) 반복문 - while, do-while (0) | 2022.01.08 |
제어문 (2) 반복문 - for (0) | 2022.01.07 |
제어문 (1) 조건문 - switch (0) | 2022.01.05 |