ON/개발지식

[책리뷰] 자바의 신 3판 - 7장. 여러 데이터를 하나에 넣을 수는 없을까요?

박도비 2023. 12. 8. 12:36
728x90

들어가기 전

해당 내용은 자바의 신 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차원 배열의 위치를 모른다는 단점이 있다. 그래서 그 위치를 확인하려면 임시 변수를 둬야한다. 

 

 

 

정리해보자.

책에 있는 질문에 대한 나의 정답을 적은 것이다. 

 

Q. 배열을 선언할 때 어떤 기호를 변수명의 앞이나 뒤에 사용해야 하나요?*
 

 

Q.  배열의 첫번째 위치는 0인가요? 1인가요?*
 
Q.  배열을 선언할 때 boolean 배열의 크기만 지정했다면 boolean 배열의 [0] 위치에 있는 값은 무엇인가요?*
 
Q.  ArrayIndexOutOfBoundsException 이라는 것은 언제 발생하나요?*
 
Q.  중괄호를 이용하여 배열을 초기화 할 때 중괄호 끝에 반드시 어떤 것을 입력해 주어야 하나요?*

 

Q.  2차원 배열을 정의할 때에는 대괄호를 몇 개 지정해야 하나요?*
 
Q.  배열을 쉽게 처리해주는 for 문의 문법은 어떻게 되나요?*
Q.  자바 프로그램에 데이터를 전달해 주려면 클래스 이름 뒤에 어떻게 구분하여 나열하면 되나요?*
 
Q.  자바 프로그램이 시작할 때 전달 받는 내용은 어떤 타입의 배열인가요?*

: String

728x90