배열

Byeonghyeon Kim·2021년 4월 19일
0

자바

목록 보기
6/20
post-thumbnail

배열

  • 인덱스를 활용해 자료형이 같은 데이터를 관리하는 것
  • 인덱스는 0부터 시작
    • 파이썬과 동일

배열의 사용

  • 변수처럼 선언과 초기화 필요
  • 자료형[] 배열이름 = new(객체생성) 자료형[배열크기] 의 모양
  • 파이썬과 달리 처음 선언한 자료형의 데이터만 할당할 수 있음
    • int[] 로 선언하고 char 자료형 할당 불가능
  • new : 객체생성을 위한 명령어
int[] arr1 = new int[5]; // 배열 선언
arr1[0] = 100; // 배열의 인덱스에 자료 할당
arr1[1] = 200;
arr1[2] = 300;
arr1[3] = 400;
arr2[4] = 500;
  • 배열의 선언과 초기화를 동시에 할 수 있음
int[] arr2 = {10, 20, 30, 40, 50};
  • 파이썬은 리스트에 [] 사용, 자바의 경우 {}
  • 자바의 경우 배열은 한번 크기가 정해지면 크기를 변경할 수 없음
    • 파이썬의 list가 동적으로 크기를 변경하는 것과는 다름

배열의 메모리 크기

  • 배열을 구성하는 데이터의 자료형에 따라 배열의 메모리 크기가 결정
  • int[] arr = new int[3];
    • 이 경우 int 형 이 3개 존재함
    • 따라서 4byte * 3 = 12 byte

배열을 가리키는 배열 이름

  • 기본 자료형 데이터를 담고 있는 변수와 달리 배열 변수는 배열 데이터(객체)의 주소를 담고 있음
  • int[] i = new int[3];
    • 이 경우 i[]에 배열의 첫번째 인덱스의 주소를 갖고 있음
    • 배열의 경우 메모리를 연속해서 사용하기 때문에 첫번째 인덱스의 주소 만으로 전체 주소를 알 수 있다.

배열 기본속성

  • 배열의 기본 속성
int[] arrAtt1 = {10, 20, 30, 40, 50, 60};
int[] arrAtt2 = null; //메모리에 배열만 선언하고 아직 주소값은 없는 상태
int[] arrAtt3 = null;
  • 배열 길이
    • 배열이름.length
System.out.println(arrAtt1.length);

//출력
//5
  • 배열 요소 출력
    • Arrays.toString(배열이름)
System.out.println(Arrays.toString(arrAtt1));

//출력
//[10, 20, 30, 40, 50, 60]
  • 배열 요소 복사
    • 새로운배열이름 = Arrays.copyOf(복사하려는배열, 복사하려는배열크기)
    • 새로운 배열 이름은 상단에 이미 생성해주었어야 함
arrAtt3 = Arrays.copyOf(arrAtt1, arrAtt1.length);

System.out.println(Arrays.toString(arrAtt3));

//출력
//[10, 20, 30, 40, 50, 60]
  • 이 경우 복사한배열은 기존배열의 주소값을 갖고있는 것이 아님
    • 동일한 배열을 메모리 공간 다른곳에 옮겨서 그곳의 주소를 갖고 있음
    • 즉, 둘은 다른 객체임
  • 배열 레퍼런스
    • 새로운배열 = 기존배열
    • 배열의 값이 아닌 주소값을 복사해옴
arrAtt2 = arrAtt1;
System.out.println(arrAtt1);
System.out.println(arrAtt2);
System.out.println(arrAtt3);

//출력
//[I@2f92e0f4
//[I@2f92e0f4
//[I@28a418fc
  • 배열1과 배열2가 갖은 배열을 레퍼런스 하게됨
    • 배열3과 주소가 다른 것을 확인할 것!

다차원 배열

  • 배열의 요소가 배열
  • 자료형[][] 배열이름 = new 자료형[행의크기][열의크기]
    • 앞의 []가 바깥의 배열, 뒤의 []가 안의 배열
int[][] arrMul = new int[3][2];
arrMul[0][0] = 10;
arrMul[0][1] = 100;
arrMul[1][0] = 20;
arrMul[1][1] = 200;
arrMul[2][0] = 30;
arrMul[2][1] = 300;
  • 이런식으로 배열 선언과 동시에 초기화 가능
int[][] arrMul = new int[][] {
    {10, 100},
    {20, 200},
    {30, 300}
};

		System.out.println(Arrays.toString(arrMul[0]));
System.out.println(Arrays.toString(arrMul[1]));
System.out.println(Arrays.toString(arrMul[2]));
System.out.println(arrMul[0][0]);
System.out.println(arrMul[0][1]);
System.out.println(arrMul[2][1]);

//출력
//[10, 100]
//[20, 200]
//[30, 300]
//10
//100
//300

실수하기 쉬운 부분

  • 복사와 레퍼런스 헷갈리지 말것!
    • 레퍼런스는 새로운 객체를 만드는 것이 아님!!
profile
자기 주도 개발전 (개발, 발전)

0개의 댓글