2021-06-10 강의록_참조타입(배열)

MIN.DI·2021년 6월 10일
0

강의록

목록 보기
2/54

main(String[] args)

  • Argument, Parameter
    메소드 선언시,
    Argument ----> "전달인자"
    Parameter ---> "매개변수"
  • 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 클래스 메소드

Arrays.toString(배열) >> 배열 요소를 [arg1, arg2, arg3, ... argn] 의 형태로 출력. ([] 대괄호까지 출력)

System.exit()

System.exit(0) 메소드 >> JVM 강제종료.
(0) = OS에 전달하는 Exit code.
0은 정상종료. 0 이외의 값은 비정상 종료를 의미함.

Mapping

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));
profile
내가 보려고 쓰는 블로그

0개의 댓글