-
[Java]STEP1 - 6) 배열과 배열의 선언, main 함수의 파라미터 String[] args, 다차원 배열, 배열 복사, 열거 타입개발 공부/Java 2020. 9. 6. 00:56
본 게시글은 도서 "이것이 자바다" 동영상 강의를 듣고 기록하는 TIL(Today I Learned) 입니다.
모든 저작권은 출판사 한빛미디어와 신용권님께 있음을 알립니다.👍이번 글에서는 자바에서의 배열과 배열을 어떻게 선언하는지 알아보자.
그리고 main함수의 파라미터인 String[] args가 무엇인지 살펴보고 어떻게 쓰이는지 알아보자.
또한 2차원 이상의 다차원 배열과 배열을 그대로 복사하는 법에 대해서도 알아보자.
마지막으로 한정된 값에 대한 데이터 타입인 열거타입에 대해 알아보고 열거 객체의 메소드를 사용해보자.
1. 배열이란? & 배열의 선언 방법
배열이란 같은 타입의 데이터를 연속된 공간에 나열시키고, 각 데이터에 index를 부여해 놓은 자료구조이다.
변수는 한 개의 데이터만 저장할 수 있기 때문에, 같은 종류의 데이터를 여러 개 저장하려면 그만큼 많은 변수가 필요해서 굉장히 비효율적이게 된다. 배열은 한 번의 선언만으로도 여러개의 데이터를 저장할 수 있는 공간을 만들 수 있기 때문에 이 문제를 해결할 수 있다.
배열은 같은 타입의 데이터만 저장 할 수 있고, 한 번 생성된 배열은 길이를 늘리거나 줄일 수 없다는 특징이 있다.
배열의 선언 방법은 다음과 같다.
▷ int[] array; 혹은 int array[];
배열도 참조 변수이므로 null로 초기화 할 수 있다.
▷ int[] array = null;
혹은 중괄호를 통해서 원하는 값들로 초기화 할 수 있다.
▷ int[] array = { 1, 2, 3, 4 };
이렇게 되면 array의 index 0부터 index 3까지 총 4개의 공간이 1, 2, 3, 4로 채워진다.
이때 주의사항이 있는데,
▷ int[] array;
▷ array = { 1, 2, 3, 4 };
이렇게 배열을 선언하면 컴파일 에러가 난다.
배열 변수를 이미 선언한 후에는 중괄호를 통해서 배열의 값을 넣을 수는 없다.
이 문제는 new 연산자를 통해서 해결할 수 있다.
▷ int[] array;
▷ array = new int[] { 1, 2, 3, 4 };
new 연산자를 통해서 비어있는 배열을 선언할 수 있다.
▷ int[] array = new int[3];
이렇게 배열을 선언하면 array 배열은 index 0부터 index 2까지 총 3개의 빈 공간을 확보한다.
new 연산자를 통해서 선언하면 배열은 자동적으로 기본값으로 초기화 되는데,
int 타입일 때 기본값은 0이고, String 타입일 때 기본값은 null 이다.
참고로 boolean 타입일 때 기본값은 false 이다.배열의 길이는 length 필드를 통해서 읽어올 수 있다.
int[] array = new int[3];
System.out.println(array.length);
결과값은 3이 나온다.
length 필드는 배열의 길이를 제공하므로 for와 같은 반복문에서 효율적으로 쓰일 수 있다.
이때 배열의 마지막 index는 length - 1 임을 항상 인지하고 있어야 한다.
2. main 함수의 파라미터 String[] args
항상 자바 프로그램 코드를 작성 할 때, void main 함수의 파라미터에는 String[] args가 존재한다.
너무나도 당연하게 항상 거기 있었 때문에, 정확히 어떤 쓰임새를 가지는지 잘 몰랐다.
이 String[] args는 어떻게 쓸 수 있는 것일까?
main 함수도 다른 메소드(함수)와 같이 역시 메소드이기 때문에
String[] args를 메소드의 파라미터로 사용할 수 있다.
따라서 String[] args의 값을 미리 저장만 해준다면 main 함수에서 String[] args의 값을 이용해서
코드를 작성할 수 있다는 말이다.
일단 기본적으로 String[] args = { }; 으로 args 배열은 별다른 조치가 없다면 공백 값이 들어간다.
개발자가 별다른 조치를 하기 위해서는 ~~.class 파일을 Run 할 때 args 배열의 값을 지정해 주어야 한다.
<cmd 커맨드 라인에서 실행할 때>
보통 ~~.class 파일을 cmd에서 실행할 때는 "java 클래스명" 이런식으로 실행한다.
이때 "java 클래스명 one two three" 처럼 클래스명 뒤에 문자열을 공백으로 구분하여 나열하면
String[] args = { "one", "two", "three" }; 로 선언한 것과 같아진다.
이제 main함수에서 args[0]의 값을 불러오면 "one"이 나올 것이다.
<이클립스에서 실행할 때>
이클립스 윗 부분에 작업 Bar에서 Run -> Run Configurations를 선택하여 들어간다.
Main class가 개발자가 실행하려는 클래스의 이름과 같은지 확인한다.
Argument 탭을 선택하고 Program arguments에 one two three 를 입력하면
String[] args = { "one", "two", "three" }; 로 선언한 것과 같아진다.
이제 main함수에서 args[0]의 값을 불러오면 "one"이 나올 것이다.
3. 다차원 배열, 배열 복사, 향상된 for문
3-1. 다차원 배열
배열은 단순한 1차원 뿐만 아니라, 2차원 이상의 다차원 배열의 선언도 가능하다.
마치 수학의 행렬과 비슷하여, 가로 인덱스와 세로 인덱스를 사용한다.
물론 실제로도 가로 세로 인덱스를 사용하여 표 처럼 구현하는 방식은 아니다.
자바 내에서는 다차원 배열을 선언할 때, 배열을 중첩하여 구현한다.
다차원 배열은 다음과 같인 선언한다.
int[][] array = new int[5][5];
5 X 5 의 2차원 배열이 선언되었다.
이는 가로 세로가 각각 5인 표와 비슷할 수 있으나, 실제 구현 방식은 그것과는 다르다.
원래 1차원 배열은 각각의 index 안에 하나의 데이터만을 가지지만,
2차원 배열은 1차원 배열의 각각의 index 안에 또다른 하나의 배열을 가진다.
즉 배열을 중첩해서 사용한 것이다.배열은 참조 타입이므로 직접 값을 가지는 것이 아니라, 힙 영역에 생성된 배열 객체를 참조한다.
다차원 배열은 배열 안에 배열이 중첩되어있는 구조이기 때문에,
배열의 각 index가 힙 영역의 다른 배열 객체의 주소를 각각 참조하는 복잡한 형태가 된다.
3-2. 배열 복사
배열은 한 번 생성하면 크기를 변경할 수 없다는 특징이 있다.
따라서 중간에 더 많은 저장 공간이 필요하다면 더 큰 배열을 새로 만들고, 이전 배열에서 내용을 복사해야 한다.
배열 복사에는 for문을 이용한 방법과 System.arraycopy() 메소드를 사용하는 두 가지 방법이 존재한다.
<for문을 이용한 배열 복사>
int[] oldArray = { 1, 2, 3 };
int[] newArray = new int[5];
for (int i = 0; i < oldArray.length; i++) {
newArray[i] = oldArray[i];
}
for문을 이용해서 oldArray의 1, 2, 3을 newArray에 그대로 복사했다.
이때 newArray의 index 3,4 부분에는 공간이 남게되는데, 여기는 기본 초기값인 0이 자리한다.
<System.arraycopy() 메소드를 이용한 배열 복사>
int[] oldArray = { 1, 2, 3 };
int[] newArray = new int[5];
System.arraycopy( oldArray, 0, newArray, 0, oldArray.length );
System.arraycopy( 원본배열, 원본의 시작점, 복사본배열, 복사본의 시작점, 복사할 길이);
메소드를 통해서 배열을 그대로 복사할 수 있다.참조 타입 배열일 경우에는 배열 복사 시, 복사되는 값이 배열 객체의 번지이기 때문에
새 배열의 항목은 이전 배열의 항목이 참조하는 객체와 동일하다. 즉 참조하는 객체의 주소 값이 같다.
이것을 얕은 복사(shallow copy)라고 한다.
반대로 참조하는 객체도 별도로 생성하는 복사는 깊은 복사(deep copy)라고 한다.
3-3. 향상된 for문
자바5부터 향상된 for문 기능을 제공한다.
향상된 for문은 카운터 변수와 증감식을 사용하지 않는다.
int[] array = { 1, 2, 3, 4 };
int sum = 0;
for ( int num : array) {
sum += num;
}
별도의 카운터 변수와 증감식이 필요없이 array 배열의 모든 원소를 for문으로 반복한다.
array 배열의 원소는 index 0 부터 index 3 까지 하나씩 반복되며 num 변수에 들어가고
sum과 더해지는 기능이 실행된다.
4. 열거 타입(enumeration type), 열거 객체 메소드
열거 타입은 한정된 값만을 갖는 데이터 타입을 말한다.
열거 타입은 몇 개의 열거 상수 중에서 하나의 상수를 저장하는 데이터 타입이다.
열거 타입의 특징
- 열거 타입의 이름을 정하고 열거 타입의 이름으로 소스 파일 (열거타입.java)를 생성해야 한다.
- 열거 타입의 이름은 관례적으로 첫 문자는 대문자로 한다.
- 소스 파일 내에서는 public enum 열거타입 { } 형태로 선언해야 한다.
- 열거 상수는 열거 타입의 값인데, 관례적으로 열거 상수는 모두 대문자로 작성한다.
- 열거 상수가 여러 단어로 구성될 경우에는 단어 사이를 밑줄(_)로 연결하는 것이 관례이다.
- 열거 타입도 참조 타입이기 때문에 null 값을 저장할 수 있다.
<열거 타입 입력 예시>
Month.java
public enum Month {
JANUARY,
FABRUARY,
MARCH,
APRIL,
MAY,
JUNE,
JULY,
AUGUST,
SEPTEMBER,
OCTOBER,
NOVEMBER,
DECEMBER
}
파일 이름: Month.java
열거 타입 이름: Month
열거 상수: JANUARY ~ DECEMBER
<열거 타입 변수 선언>
Month thismonth = Month.SEPTEMBER;
열거타입 변수이름 = 열거타입.열거상수; 의 형태로 열거 타입 변수를 선언할 수 있다.열거 객체의 메소드는 다음과 같다.
메소드 리턴 타입 설명 name() String 열거 객체의 문자열을 리턴 ordinal() int 열거 객체의 순번(0부터 시작)을 리턴 compare To() int 열거 객체를 비교해서 순번 차이를 리턴 valueOf(String name) 열거 타입 주어진 문자열의 열거 객체를 리턴 values() 열거 배열 모든 열거 객체들을 배열로 리턴 본 게시글은 여기서 마치겠습니다.
읽어주셔서 감사하고, 혹시나 틀린 부분이나 보완해야할 부분이 있다면 댓글에 남겨주세요~!
'개발 공부 > Java' 카테고리의 다른 글