들어가기 전
해당 내용은 자바의 신 3판을 읽고 내용 정리 및 공부한 내용을 정리한 글입니다!
자바의 신 Vol 1: 기초 문법편 | 이상민 - 교보문고
자바의 신 Vol 1: 기초 문법편 | 현장 전문가가 쓴 자바 기초 입문서다. NAVER, NHN, SKPlanet 등에서 성능 전문가의 풍부한 경험을 바탕으로 자바를 실무에 맞게 제대로 쓸 줄 알게 해주는 입문서를 목
product.kyobobook.co.kr
7장. 여러 데이터를 하나에 넣을 수는 없을까요?
1. 배열
한 변수에 여러 개의 값을 넣을 수 있는 것이 바로 배열이며 가장 일반적인 자료 구조 중 하나이다.
💡 자료구조란?
데이터를 저장하기 위한 구조를 이야기한다.
(1) 1차원 배열
💭 선언방법
int[] array; // 권장
int array[];
💭 초기화 - new
(1) 선언과 초기화를 같이 진행
int[] array = new int[];
(2) 선언과 초기화를 따로 진행
int array;
array = new int[]
- [ ] 안에는 int크기를 지정해준다.
- 생성 시 new를 붙여야 한다.
💭 초기화 { } 와 대입
중괄호를 사용하면 한 번에 선언과 값 초기화를 할 수 있다. 이 중괄호 뒤에는 세미콜론을 필수로 붙인다.
// 선언과 초기화를 같이
int[] array = {1, 2, 3, 4, 5, 6, 7};
// 선언과 초기화를 따로
int[] array;
array = {1, 2, 3, 4, 5, 6, 7};
💭 배열선언 위치 와 static
얼마나 자주 사용하는지, 어디에서 사용하는지를 확인하여 메소드에서 선언하여 사용할지 클래스의 인스턴스 변수로 선언하여 사용할지 결정하면 된다.
- 절대 변경되지 않는 값
- 중괄호를 선언하여 사용한다.
- 변하지 않는 값은 클래스 변수 (static)로 선언하여 사용하는것이 좋다.
⚠ static은 잘못 사용했다가 심각한 문제를 야기시킬 수도 있으니 절대 남용금지 ⚠ - 특정 메소드에서만 배열 사용
- 반드시 메소드 밖으로 빼낼 필요가 없다.
💭 값대입
변수명 뒤에 대괄호를 열고 그 대괄호 안에 데이터를 넣고자 하는 위치[인덱스(index)]를 지정한다.
인덱스는 0부터 시작하므로, 크기가 3이라면 0부터 2까지 있다는 것을 명심하자!
int array = new int[3]
array[0] = 1;
array[1] = 2;
array[2] = 3;
만약 System.out.println(array[3]) 이라고 한다면 ArrayIndexOutOfBoundsException 오류가 발생한다.
이는 배열의 위치를 벗어난 예외가 발생했다 라는 뜻이다.
💭 배열의 기본값
기본 자료형 배열의 기본 값은 각 자료형의 기본값과 동일하며 자세한 것은 아래 내용을 확인하길 바란다.
byte []byteArray = new byte[1];
short []shortArray = new short[1];
int []intArray = new int[1];
long []longArray = new long[1];
float []floatArray = new float[1];
double []doubleArray = new double[1];
char []charArray = new char[1];
boolean []booleanArray = new boolean[1];
String [] strings new String[2];
출력결과 ([0] 출력했다고 가정)
byteArray[0] = 0
shortArray[0] = 0
intArray[0] = 0
longArray[0] = 0
floatArray[0] = 0.0
doubleArray[0] = 0.0
charArray[0] = [ ] // char 배열 기본 값은 ₩u0000임으로 출력 시 한 칸의 공백으로 보인다.
booleanArray[0] = false // boolean 기본값은 false이다.
Strings[0] = null
다른 자료형과 다르게 String 과 같은 참조 자료형은 초기화를 하지 않을 경우 null 값이 출력된다.
💡 null이란 ?
무소유의 개념이라고 보면 된다. 아무런 값도 설정되어 있지 않고 초기화 되어 있지도 않은 상태가 null이다.
그래서 배열과 같은 참조 자료형을 선언할 때 명시적으로 무소유의 상태임을 나타내기 위해서 다음과 같이 선언할 수 있다.
String[] strings = null;
❗ 이와 같이 배열은 크기를 지정하여 배열 객체를 초기화만 하면 기본값이 지정되며
참조 자료형 배열의 각각의 값은 반드시 각각의 값을 초기화 해줘야만 null이 되지 않는다는 것을 꼭 기억해두자
배열을 그냥 출력했을 경우
public class ArrayPrint{
// main 메소드 생략
...
public void printString {
System.out.println("strings="+new String[0]);
System.out.println("array="+new ArrayPrint[0]);
}
}
// 출력 결과
strings=[Ljava.lang.String;@1540e19d
array=[LArrayPrint;@677327b6
- [L
: 가장 앞의 [ 는 해당 객체가 배열이라는 의미이며, 그 다음에 있는 L은 해당 배열은 참조 자료형이라는 의미이다. - java.lang.String;
: 해당 배열이 어떤 타입의 배열인지를 보여준다. - @1540e19d
: 해당 배열의 고유 번호다. (이 번호를 써먹을 데는 없다.)
기본 자료형의 배열을 그냥 출력 했을 경우엔, 대괄호 뒤에 해당 타입을 대표하는 문자가 출력된다.
기본자료형의 대표 문자
boolean | byte | char | double | float | int | long | short |
Z | B | C | D | F | I | J | S |
long / boolean 배열만 J / Z로 구분되어 있는데 이는 long 의 배열을 L로 해버리면 참조 자료형의 배열과 구분이 안되기 때문에 남아 있는 J로 선정했다. boolean는 byte가 있기에 Z로 선정하였다.
(2) 2차원 배열
💭 선언방법
[선언방법]
int[][] array; // 권장
int[] array[];
int array[][];
2차원 배열 array[][]에서,
array[0] = int 배열
array[0][0] = int 값
1차원 배열에선 array[0] 의 값은 int였다. 하지만 2차원 배열에선 array[0]의 값은 배열이다. (반드시 외워라)
1차원과 2차원의 크기를 모두 지정하지 않거나 2차원의 크기만 지정하는 것은 불가능하다.
int[][] array = new int[2][3];
int[][] array = new int[2][];
int[][] array = new int[][]; // error
int[][] array = new int[][2]; // error
처음 선언할 때 2차원의 크기를 지정하면 모든 2차원의 크기가 똑같이 고정되는데,
다음과 같이 사용하면 2차원 1ㅐ열의 크기를 서로 다르게 지정할 수 있다.
int[][] array = new int[2][];
array[0] = new int[3]; // 크기가 3인 2차원 배열
array[1] = new int[2]; // 크기가 2인 2차원 배열
💭 초기화 및 값 지정
중괄호를 이용한 배열 선언을 2차원 배열에서도 사용할 수 있다.
int[][] array = {{1, 2, 3}, {1, 2, 3}};
또한 아래와 같이 사용할 수도 있다.
int[][] array = int[2][3];
array[0][0] = 1;
array[0][1] = 2;
array[0][2] = 3;
array[1][0] = 4;
array[1][1] = 5;
array[1][2] = 6;
💭 배열의 길이
배열의 길이를 알아내는 방법은 배열 이름에.length를 붙여주면 된다.
int[] array1 = new int[3];
int[][] array = new int[4][2];
System.out.println(array1.length);
System.out.println(array2.length);
// 결과
3
4
- 1차원의 배열의 경우 1차원의 크기 반환( 3 )
- 2차원이 배열의 경우 1차원의 크기 반환 ( 4 )
- 2차원의 배열의 크기를 알고 싶다면 각 1차원 배열에 .length를 붙여야 한다.
array[0].length;
array[1].length;
❗ 기본 자료형에는 .length와 같이 점을 찍어서 기능을 호출하거나 계산을 할 수 없다
배열과 같은 참조 자료형에서만 점(.)을 찍을 수 있다.
💭 for문으로 출력
(1) length 출력
for(int i =0; i<arrary.length; i++){
for(int j = 0; j<array[i].length; j) {
System.out.println(array[i][j];
}
}
배열의 크기가 가변적이라고 할지라도 정확하게 데이터를 출력해 줄 수 있다.
하지만, 이렇게 length를 사용하면 for 루프가 수행될 때마다 길이를 얻어와서 성능적 측면에서 별로 좋지 않다.
int iLength = array.length;
for(int i=0; i<iLength; i++) {
int jLength = array[i].length;
for(int j=0; j<jLength; j++) {
System.out.println(array[i][j];
}
}
(2) 배열을 위한 for 루프
반드시 배열만이 아니라 자바에서 제공되는 Collection이라는 자료구조를 처리할 때를 위해
for루프를 보다 쉽게 사용할 JDK 5부터 다음과 같은 문법이 추가되었다.
for(타입이름 임시변수명 : 반복대상객체) {
}
[응용]
// 1차원 배열
int [] one = new int[] {1,2,3,4,5}
for( int data : one ) {
System.out.println(data);
}
// 2차원 배열
int[][] two = new int[] {{1, 2, 3}, {4, 5, 6}};
for (int[] towArray : two) {
for (int data : towArray) {
System.out.println(data);
}
}
1차원 배열과 2차원 배열의 위치를 모른다는 단점이 있다. 그래서 그 위치를 확인하려면 임시 변수를 둬야한다.
정리해보자.
책에 있는 질문에 대한 나의 정답을 적은 것이다.
: String
'ON > 개발지식' 카테고리의 다른 글
[책리뷰] 자바의 신 3판 - 9장. 자바를 배우면 패키지와 접근 제어자는 꼭 알아야 해요 (0) | 2023.12.12 |
---|---|
[책리뷰] 자바의 신 3판 - 8장. 참조 자료형에 대해서 더 자세히 알아봅시다. (0) | 2023.12.11 |
[책리뷰] 자바의 신 3판 - 6장. 제가 조건을 좀 따져요 (1) | 2023.12.07 |
[책리뷰] 자바의 신 3판 - 5장.계산을 하고 싶어요 (1) | 2023.12.05 |
[책리뷰] 자바의 신 3판 - 4장.정보를 어디에 넣고 싶은데 (0) | 2023.12.04 |