[코드스테이츠 백엔드 44기 SEB BE] 8일차

오태호·2023년 2월 22일
0

코드스테이츠

목록 보기
8/22
post-thumbnail

배열

  • 각 값들이 같은 타입을 가지는 경우 배열을 사용하면 여러 개의 변수를 선언하지 않고 단 하나의 변수만으로 값들을 저장하고 참조할 수 있음

배열이란?

  • 배열

    • 동일한 타입의 값들을 하나의 묶음으로 묶은 자료구조
  • 메모리(RAM)

    • 1 byte의 메모리 공간을 가지는 메모리셀들 여러 개로 이루어져 있음
    • 각 메모리셀마다 16진수로 이루어진 메모리 주소가 지정되어 있음
      • 메모리 주소는 오름차순으로 매겨져 있음
  • 각 변수는 개별적으로 선언된 변수

    • 즉, 메모리 공간 상에 흩어져 개별적으로 존재함
  • 배열을 사용하여 값을 저장

    • 메모리 공간 상에 연속적으로 값들이 모여서 저장됨
  • 요소(element)

    • 배열이 가진 각 값
  • 인덱스(index)

    • 배열의 각 요소가 부여받는 순번

배열의 차원이란?

  • 차원

    • 배열이 중첩된 정도
    • 배열이 중첩되었다 == 배열의 요소가 또 다른 배열이다
  • 1차원 배열

    • 배열의 중첩이 없는 경우
      • 즉, 배열의 요소가 배열이 아닌 경우
  • 2차원 배열

    • 배열이 한 번 중첩된 경우
      • 즉, 배열의 요소가 배열인 경우

1차원 배열

선언 및 초기화

  • 1차원 배열
    • 배열의 요소가 배열이 아닌 배열을 의미
    • 선언할 때는 타입 뒤에 대괄호를 붙여서 선언
int[] nums;
nums = new int[10];
  1. int nums[]
    • 배열을 가리킬 참조 변수 nums 선언
  2. new int[10];
    • 총 10개의 int형 값을 저장할 배열을 생성
    • 배열의 모든 요소는 int형의 기본값인 0으로 초기화되어져 있음
  3. nums = new int[10];
    • 대입 연산자(=)에 의해 생성된 배열 첫 번째 요소의 주소값이 참조 변수 nums에 할당됨
    • 참조 변수 nums는 배열의 첫 번째 요소를 가리킴
  • nums는 왜 참조 변수여야 하는가?

    • 자바에서 배열은 참조 타입에 해당함
      • int[] 배열 선언 문법으로 선언한 nums는 선언 이후에 생성될 배열의 주소값을 담을 참조 변수가 됨
    • 기본 타입의 경우, 기본 타입의 값을 저장할 변수를 선언하는 시점에 얼마만큼의 메모리 공간을 확보해야 하는지 컴퓨터가 알 수 있음
      • 타입 별로 크기가 정해져 있으므로
    • 배열을 선언하는 시점에 배열이 몇 개의 요소를 가질지 컴퓨터는 알 수 없음
      • 배열을 선언하면 이후에 생성될 배열의 주소값을 담을 메모리 공간만 확보됨
      • 배열이 생성되고 난 후 해당 배열의 시작 주소값이 참조 변수에 할당됨
  • 선언 및 초기화는 하나의 문장으로 작성 가능

int[] nums = new int[10];

값 접근하기

  • 배열 내 특정 요소에 할당되어있는 값에 접근하려면 배열 참조 변수의 이름과 배열의 인덱스 활용
    • {배열 참조 변수 이름}[인덱스]
int[] nums = {1, 2, 3, ..., 10};
System.out.println(nums[0]); // 1
System.out.println(nums[1]); // 2
System.out.println(nums[2]); // 3
...
System.out.println(nums[9]); // 10
  • 인덱스로 값에 어떻게 접근하는가?
    • 배열이 생성되고 난 후에 참조 변수 nums에 배열 첫 번째 요소의 주소값이 할당됨
    • 배열의 각 요소는 0부터 시작하는 인덱스를 가짐
    • {배열 참조 변수 이름}[인덱스]를 입력하면 참조 변수가 가진 첫 번째 요소의 주소값에 '인덱스 * 요소의 크기'를 더하여 해당 주소에 있는 값을 읽어옴

배열의 길이

  • 배열의 길이(크기)
    • 배열이 가진 요소의 개수
    • {배열 참조 변수 이름}.length로 얻을 수 있음
int[] nums = new int[10];

System.out.println(nums.length); // 10
  • 인덱스는 0부터 시작하므로 배열의 길이가 10이라면 배열 마지막 요소의 인덱스는 9
    • 즉, 배열의 길이 - 1이 배열 마지막 요소의 인덱스

2차원 배열

  • 각 요소가 또 다른 배열인 구조

선언 및 초기화

int[][] nums;
nums = new int[30][20];
  • 한 줄로 줄여서 작성 가능
int[][] nums = new int[30][20];
  • 위 코드가 실행되면 아래와 같은 2차원 배열이 만들어짐
{
    {0, 0, 0, ..., 0, 0},
    {0, 0, 0, ..., 0, 0},
    {0, 0, 0, ..., 0, 0},
    ...
    {0, 0, 0, ..., 0, 0}
}
  • 2차원 배열의 내부 배열은 int형의 기본값인 0을 20개씩 저장하고 있음
  • 외부 배열은 내부 배열을 30개 저장하고 있음
  • 내부 배열은 20개의 0을 요소로 가지지만, 외부 배열의 각 요소는 내부 배열의 주소값들을 저장하고 있음
  • 값을 넣어 초기화하는 경우
int[][] nums = new int[][] {
    {24, 231, 432, 443, ..., 123},
    {235, 35, 433, 431, ..., 432},
    {125, 352, 930, 892, ..., 293},
    ...
    {182, 987, 765, 789, ..., 603}
}

가변 배열

가변 배열

  • 다차원 배열에서 1차원보다 자유로운 형태로 배열을 만들 수 있음
    • 마지막 차수에 해당하는 배열의 길이를 고정하지 않아도 된다

선언 및 초기화

int[][] nums = new int[5][];
  • 외부 배열 크기는 5로 지정했으나, 마지막 차수에 해당하는 내부 배열에는 크기를 지정하지 않음
  • 마지막 차수에 해당하는 배열의 크기를 지정하지 않으면 가변 배열이 생성됨
    • 이 때 생성된 것은 내부 배열의 크기를 자유롭게 지정할 수 있는 외부 배열
      • 즉, 외부 배열만 생성된 상태인 것
  • 내부 배열을 생성하려면 new int[]를 사용하여 외부 배열의 각 요소에 할당해줌
int[][] nums = new int[3][];

nums[0] = new int[3];
nums[1] = new int[2];
nums[2] = new int[5];
  • 가변 배열 역시 생성과 동시에 초기화 가능
int[][] nums = {
	{ 30, 32, 39 },
	{ 12, 51 },
	{ 96, 124, 90, 103, 138 }
};

배열 탐색

  • 인덱스와 배열의 크기(length)를 이용해 탐색
    • 문자열을 반복문으로 순회하고 탐색했던 방법과 비슷한 방법으로 배열을 순회

반복문을 통한 배열 탐색

int[] nums = {105, 293, 223, 100, 29};
  • for문으로 배열을 순회하며 총합을 구함
int[] nums = {105, 293, 223, 100, 29};
int total = 0;

for(int idx = 0; idx < nums.length; idx++) {
    total += nums[idx];
}

System.out.println(total); // 750
  • while문을 통한 배열 순회
int[] nums = {105, 293, 223, 100, 29};
int total = 0;
int index = 0;

while (i < nums.length) {
	total += nums[index++];
}
System.out.println(sum); // 750
  • 향상된 for문으로 배열의 각 요소에 접근
int[] nums = {105, 293, 223, 100, 29};
int total = 0;

for(int num : nums) {
    total += num;
}

System.out.println(total); // 750
  • 향상된 for문을 사용할 때에는
    • 향상된 for문을 통해 배열을 순회하는 것은 배열의 값을 읽어오는 것만 가능
      • 즉, 배열의 값을 수정할 수는 없음
profile
자바, 웹 개발을 열심히 공부하고 있습니다!

0개의 댓글