main메소드 선언시 String[] 배열은 크기가 0 인 배열로 자동 생성됨. Null이 아님!
String... args
메소드 선언시, 매개변수가 0개 이상의 전달인자를 받아야 되는 경우 (즉 개수가 정해져있지 않다)
... 기호로 표현할 수 있음.
-> "가변인자"
-> main (String... args) 로 쓸 수 있음.
1) ... => 인덱싱기호 와 같다. 결국 배열과 같음!!
하지만 가변인자를 표현하려면 [] 이 아닌 ...으로만 작성 가능.
([]로 작성하면 한 번 생성한 배열의 크기가 고정적이지만, ... 로 작성하면 가변인자 형식의 매개변수로 이용 가능)
public class MainStringArrayArgument {
public static void main(String... args) {
//add 메소드 호출
int sum = add( 1,2,3,4,5,6,7,8,9,10 ); //1은 int temp 로 저장, 2~sum.length 는 가변인자
log.info("sum : " + sum);
}//main
static int add(int temp, int... ops) { //ops : operands(피연산자들)
log.debug("add(ops) invoked.");
log.info("\t + ops : " + Arrays.toString(ops));
int sum = 0;
for (int i : ops) { //매개변수가 가변인자이므로 반복문의 횟수가 정해지지 않음 >>enhanced for문 쓰는것이 더 좋다.
sum = sum+i;
} //enhanced for
return sum;
} //add
} //end class
Arrays.toString(배열) >> 배열 요소를 [arg1, arg2, arg3, ... argn] 의 형태로 출력. ([] 대괄호까지 출력)
System.exit(0) 메소드 >> JVM 강제종료.
(0) = OS에 전달하는 Exit code.
0은 정상종료. 0 이외의 값은 비정상 종료를 의미함.
WrapperTypeClass.parse~~(String s)
String 타입을 을 int, double, boolean 등으로 변경하는 것.
Promotion, Casting 등의 형변환이 아니라 Mapping 이라고 한다.
int[][] arr1 = new int[2][2];
int[][] arr2 = new int[2][];
배열객체 생성시 arr2 처럼 생성해도 오류 발생하지 않는다.
이렇게 생성할 경우 바깥 배열 요소의 개수만 지정, 내부의 배열은 요소의 크기를 지정하지 않음.
이 경우 내부 크기가 정해지지 않은 배열요소는 아직 힙 영역에 객체로 생성되지 않는다.
int arr[][] = new int[6][];
arr[0] = new int[1];
arr[1] = new int[2];
arr[2] = new int[3];
arr[3] = new int[4];
arr[4] = new int[4];
arr[5] = new int[5];
따라서 사용자가 이렇게 배열크기를 따로 지정해주어야 사용 가능.
배열은 한 번 생성하면 크기 변경이 불가하므로, 더 많은 저장 공간이 필요하다면 보다 큰 배열을 새로 만들고 이전 배열로부터 값을 복사해야 함.
복사의 2가지 방법
1) 얕은 복사(Shadow copy, SHallow copy, Thin copy)
소스 객체를 변경 --> 복사한 타겟 객체도 함께 변경. (참조값을 복사하는 것)
2) 깊은 복사(Deep copy)
원본 객체와 복사된 타겟 객체 간에 연결성 없음. 별개의 객체로 생성됨.
배열 복사 방법
for문 이용
System.ArrayCopy() 메소드 이용
Arrays 클래스 이용
for문 이용 >>Deep Copy
int[] oldIntArray = {1, 2, 3}; //1차원 배열 선언(소스배열)
int[] newIntArray = new int[5]; //1차원 배열 선언(타겟배열 공간 확보)
// 소스배열을 traverse(순회) 하면서
// 타겟배열의 동일한 인덱스 위치에 소스배열의 요소값을 대입
for(int i=0; i<oldIntArray.length; i++) {
newIntArray[i] = oldIntArray[i];
} //for
//원본배열의 요소값 변경
oldIntArray[0] = 100;
log.info("원본 배열 : " + Arrays.toString(oldIntArray));
log.info("타겟 배열 : " + Arrays.toString(newIntArray));
System.arraycopy() 메소드 사용 >> Deep Copy
void System.arraycopy(
Object src, //소스객체(소스배열)
int srcPos, //offset(=시작인덱스)
Object dest, //타겟객체(타겟배열)
int destPos, //offset(=시자긴덱스)
int length //복사할 요소의 개수
)
Arrays.copyOf() 메소드 이용 >>Deep Copy
int[] sourceArray = {1,2,3};
int[] targetArray = Arrays.copyOf(sourceArray, sourceArray.length);
sourceArray[0] = 100;
log.info("원본 : " + Arrays.toString(sourceArray));
log.info("타겟 : " + Arrays.toString(targetArray));