오늘은 배열과 열거타입을 학습했다. 배열은 늘 써왔던 것이기에 모르는 것이 없다고 생각했지만 역시 행복회로였을 뿐이였다. 배열에 대해서 중요하게 생각하는 부분과 몰랐던 부분들에 대해서 알아보자.
JAVA의 배열을 선언하고 배열 내 값들의 참조값을 비교해보니 기존에 알던 C계열의 주소값과 차이가 존재했다.
#include <stdio.h>
int main(){
int num[5] = {1,2,3,4,5};
for(int i = 0; i <5; i++){
printf("%d", &num[i]);
{
// 주소값은 예시입니다.
// num[0] 주소값 : 1000
// num[1] 주소값 : 1004
// num[2] 주소값 : 1008
...
}
C계열은 우선 call by value, call by pointer, call by reference 3가지 방식으로 참조를 할 수 있다. 주소값이 중요한 언어이다.
위 코드처럼 int형 배열의 주소값들을 확인해보면 순차적이다.
public static void main(String args[]){
int[] number = {1,2};
System.out.println(System.identityHashCode(number[0]));
System.out.println(System.identityHashCode(number[1]));
// 주소값은 예시입니다.
// number[0] 주소값 : 1854778591
// number[1] 주소값 : 2054798982
}
JAVA는 Call by value 기반으로 동작한다.
위 int형 배열의 주소값들을 보면 순차적이지 않다. 이렇게 차이가 나는 이유가 무엇일까?
위 사진처럼 스택(Stack)영역에 number 변수가 생성된다.
힙(Heap) 영역에 배열이 생성되고 각각의 배열 인덱스에 값들이 생성된다.
그림만 보았을 땐, 1과 2가 하나의 배열안에 존재하기에 참조값이 연속되지 않을까? 라고 생각할 수 있지만 JAVA의 참조 변수를 다시 살펴보자.
참조 변수는 스택(Stack) 영역에 변수를 생성하고 힙(Heap)영역에 객체를 생성한다.
스택 영의 변수는 힙 영역의 객체 주소를 참조한다.
배열도 동일하다. 스택 영역의 배열 변수는 힙 영역에 생성된 배열의 주소를 참조한다.
힙 영역 내 생성된 배열에 담기는 값들도 객체들이다. 배열 내에는 객체들의 주소를 담고 있는 것과 동일하다.
그렇기 때문에 참조값은 연속되지 않는다. 현재 1과 2는 정수형으로 참조 변수는 아니지만 참조값에 한해서 비슷한 맥락으로 동작한다고 생각한다.
public static void main(String args[]){
//1. 1차원 배열
int[] number = new int[5];
//2. 2차원 배열
int[][] = new int[2][3];
//3. 2차원 배열
int[][] = new int[2][];
}
배열의 선언은 위 코드처럼 진행하면 된다.
2번과 3번의 차이가 있음을 처음 알았다.
3번은 0번 행과 1번 행의 열 개수를 다르게 설정할 수 있다.
'3번이 유용한가'라고 생각이 들긴 하지만 각 열의 개수 차이가 심할 때, 메모리를 아낄 수 있어 어느정도 유용하겠다라고 정리해봤다.
요일 계산을 할 때 열거타입을 사용한 거말곤 크게 사용해 본 기억은 없다.
그런데 JAVA의 열거 타입은 완전한 클래스의 형태이기에 다른 언어들에서 사용하는 것보다 유용했다.
public class Main {
public enum Week{
MONDAY("제일 싫어"),
TUSEDAY("아직도 화요일?"),
WEDNESDAY("죽여줘"),
THURSDAY("이제 하루만!"),
FRIDAY("오늘은 즐거워"),
SATURDAY("휴일이 하루 더!"),
SUNDAY("하..");
private final String str;
private Week(String str){
this.str = str;
}
}
public static void main(String[] args) throws IOException {
System.out.println(Week.MONDAY); // Monday
System.out.println(Week.MONDAY.name()); // Monday
System.out.println(Week.MONDAY.ordinal()); // 0
System.out.println(Week.MONDAY.str); // str
}
}
기존에 열거 타입을 사용할 때는 각 인자의 인덱스만 활용했었다.
Java의 열거 타입은 추가적인 속성들을 사용할 수 있었고 클래스기 때문에 활용하는 면에서 더 쉬웠고 가독성도 좋았다.