자바에서는 8개의 기본 자료형 이외의 모든 자료형은 참조 자료형이다. 대표적인 참조 자료형에는 배열, 클래스, 인터페이스 등이 있다. 참조 자료형은 개발자가 얼마든지 정의할 수 있으므로 셀 수 없다. 먼저 배열에 대해서 알아보겠다.
1. 배열이란?
배열은 동일한 자료형을 묶어 저장 하는 참조 자료형이다. 생성할 때 크기를 지정해야 하고, 한번 크기를 지정하면 절대 변경할 수 없는 특징이 있다. 이 2가지 특징은 이후 배열을 사용할때 적용되기때문에 계속 기억해야한다.
1 - 1. 배열 생성하기
배열을 선언할 때는 2가지 방법으로 선언할 수 있다.
자료형[ ] 변수명 자료형 변수명[ ]
여기서 배열의 첫번째 특징이 나타난다. 배열은 동일한 자료형만 묶을 수 있는 자료형이기 때문에 반드시 배열을 생성할 때는 자료형을 같이 선언해주어야 한다.
int[] a; // int 자료형만 저장 가능한 배열
double[] a; // double 자료형만 저장 가능한 배열
String[] a; // String 자료형만 저장 가능한 배열
배열을 선언하면 스택 메모리에 변수의 공간만 생성하고, 공간 안은 비운 채로 둔다. 아직 배열의 실제 데이터인 객체를 생성하지 않았기 때문이다. 스택 메모리에 위치하고 있는 참조자료형 변수의 빈 공간을 초기화할 때는 null 값을 사용할 수 있다. null값은 힙 메모리의 위치를 가리키고 있지 않다는 의미다.
이 메모리에 대해서는 추후에 글로 설명하도록 하겠다.
1 - 2. 배열의 객체 생성하기
힙 메모리에 객체를 생성하기 위해서는 new 키워드를 사용하여 스택 메모리의 참조자료형 변수와 연결할 수 있다.
new int[3]; // 크기가 3 인 int 자료를 담을 수 있는 배열 생성
new String[5]; // 크기가 5 인 String 자료를 담을 수 있는 배열 생성
new int[ ]; //크기를 지정하지 않아 오류 발생
객체 생성 과정에서 배열의 두번째 특징을 알 수 있다. 배열을 생성할 때 new int[3] 처럼 배열의 길이를 반드시 지정해야한다는 것이다. 이때문에 길이를 지정하지 않고 명령하면 오류가 발생한다.
1 - 3 배열의 자료형 변수에 객체 대입
선언된 배열 참조 자료형 변수에 생성한 객체를 대입하는 데는 2가지 방법이 있다.
변수 선언과 값 ( 참조 자료형은 객체 ) 의 대입을 한 번에 작성해도 되고, 따로 구분해 작성해도 된다.
int[] a = new int[3]; // 크기가 3 인 int 자료를 담을 수 있는 배열을 생성하고 참조변수 a에 저장
int[] b;
b = new int [3];
이렇게 처음 배열을 선언하고 객체를 생성하면 객체의 값이 초기화 되는데, 이때 배열의 자료형이 int (정수) 이므로 0으로 초기화된다.
1 - 4 객체에 값 입력하기
이제 생성한 객체에 값을 입력할 수 있는데, 배열에는 값을 저장할 수 있는 공간마다 방번호가 있다. 이를 인덱스 라고 한다.
인덱스는 0부터 시작하며, 1씩 증가한다. 예를 들어 배열의 크기가 3이면 인덱스는 0 ,1 ,2 이다.
개발자들이 숫자를 0부터 센다는 얘기가 바로 여기서 시작 되었다.
배열 객체에 값을 입력하기 위해서는 해당 인덱스에 값을 지정해주면 된다.
int[] a = new int[3];
a[0] = 3;
a[1] = 4;
a[2] = 5;
지금까지 배열의 참조변수, 객체 생성, 객체에 값 대입 을 했는데 이를 한번에 하는 방법도 있다.
int[] a = new int[]{3, 4, 5};
int[] b = {1, 2, 3};
이렇게 간단하게 작성하면 코드를 줄일 수 있겠지만 배열을 이런식으로 사용하지는 않는다.
왜냐하면 배열에 어떤값이 들어올지 모르고, 앞으로 들어올 값을 저장하는 용도로 더 많이 사용하기 때문이다.
또한, 마지막 방법은 배열의 선언과 대입을 분리할 수 없다는 특징이 있다. 따라서 메서드의 입력 매개변수 값으로는 사용할 수 없다.
1 - 5 배열 데이터 읽기
배열은 동일한 자료형을 여러개 묶어 저장하는 공간이다. 따라서 배열의 모든 데이터를 출력하려면 다음처럼 배열의 길이만큼 출력해야한다.
int[] a = new int[10];
a[0] = 1, a[1] = 2, a[2] = 3, .., a[9] = 10;
for(int i = 0; i < a.length; i++){
System.out.println(a[i]);
}
// i 가 0부터 10까지 반복된다.
조건식에 .length라는 함수는 '배열 의 길이' 를 알 수있는 함수이다. 따라서 이 코드는 배열의 길이만큼 배열의 각 인덱스에 있는 값을 출력하라는 의미이다.
for each문을 사용하는 방법도 있는데 배열이나 컬렉션등의 집합객체에서 원소들을 하나씩 꺼내는 과정을 반복하는 구문이다.
/* for(원소 자료형 변수명: 집합 객체) {
}
*/
int[] = a = new int[100];
a[0] = 1, a[1] = 2, a[2] = 3, .., a[99] = 100;
for(int k:a) {
System.out.println(k);
}
배열의 각 원소값을 출력하는 마지막 방법은 Arrays 클래스의 toString( ) 정적 메서드를 사용하는 것이다.
어려운 말은 생각하지말고 아래 코드로 이해하자
int[] = a = new int[100];
a[0] = 1, a[1] = 2, a[2] = 3, .., a[99] = 100;
System.out.println(Arrays.toString(a));
// [1, 2, 3, 4 .., 100]
2. 참조 자료형으로써 배열의 특징
지금까지의 포스팅만으로 기본 자료형과 참조 자료형의 차이를 이해할 수 있다.
예를 들어 대입 연산자로 변수를 복사하는 과정으로 설명할 수 있는데, 변수의 어떤 값을 복사한다는 것은 변수의 스택 메모리의값을 복사한다는 것이다.
기본자료형의 경우 스택 메모리에 실제 데이터 값을 저장하고 있으므로 기본자료형 변수를 복사하면 실제 데이터 값이 1개 더 복사된다. 이후 복사된 값을 변경해도 원본 값은 영향을 받지 않는다.
int a = 3;
int b = a;
b = 7;
System.out.println(a); // 3
System.out.println(b); // 7
이번에는 참조 자료형을 복사해 보겠다.
참조 자료형은 스택 메모리가 실제 데이터가 아닌 힙 메모리에 저장된 객테의 위치를 저장하고 있다. 따라서 참조 자료형 변수를 복사하면 실제 데이터가 복사되는 것이 아니라 실제 데이터의 위칫값이 복사된다.
하나의 참조 변수를 이용해 데이터를 수정하면 다른 참조변수가 가리키는 데이터도 변하게 되는 것이다.
int[] a = {3, 4, 5};
int[] b = a;
b[0] = 7;
System.out.println(a[0]); // 7
System.out.println(b[0]); // 7
'java' 카테고리의 다른 글
[JSP] 장바구니 기능 session을 사용하여 구현하기 (0) | 2022.09.20 |
---|---|
[JAVA] 야구게임 맞추기 (0) | 2022.07.30 |
[JAVA] 제어문 (1) | 2022.07.09 |
[JAVA] 연산자의 종류 (0) | 2022.07.09 |
[JAVA] 기본 자료형간의 타입변환, 연산 (0) | 2022.07.09 |