[TIL] 배열은 연속된 메모리 공간을 차지한다.

김대진·2024년 7월 9일

[TIL]

목록 보기
1/8

왜 배열을 공부할까?

자바에서 배열을 왜 공부하는지 의구심이 들었습니다. 그래서 챗GPT에 물어봤더니 아래의 결과가 나왔습니다.

위 사진이 내가 공부하고자 하는 내용이자 결론입니다!
이제 하나씩 자세히 알아보고자 합니다.


1. 데이터 관리 효율성 -> 반복문

알게 된 점 - 반복문을 사용할 수 있어 더 효율적이구나!!!

// 배열을 사용하지 않은 경우
int student1 = 85;
int student2 = 90;
int student3 = 78;
// 학생 점수 평균 구하기
int average = (student1 + student2 + student3) / 3;

// 배열을 사용한 경우
int[] students = {85, 90, 78};
// 반복문을 이용해 학생 점수 평균 구하기
int sum = 0;
for (int i = 0; i < students.length; i++) {
    sum += students[i];
}
int average = sum / students.length;

위의 코드랑 달리 변수를 더 많이 입력하게 된다면 비효율적인 코드가 될 것이라 판단됩니다.


2. 고속 데이터 접근 -> 연속된 공간 저장

알게 된 점 - 연속된 저장공간이니 인덱스를 통해 접근가능할 수 있구나!!!

// 배열 선언 및 초기화
int[] numbers = {10, 20, 30, 40, 50};

// 특정 인덱스에 빠르게 접근
int number = numbers[2]; // numbers[2]는 30을 반환

시간복잡도

  • 배열의 특정 인덱스에 있는 원소를 접근하는 것은 상수 시간 복잡도 O(1)을 가집니다. -> 이것이 장점이구나!! 접근이 빠르다는 것을 알게되었습니다.
  • 그러나 배열의 탐색, 삽입/삭제 같은 경우 O(n) 시간 복잡도를 가집니다.*

3. 메모리 관리 -> 캐시적중률 높임

알게 된 점 -

  • 캐시(Cache) - 데이터나 값을 임시로 저장해두는 고속의 메모리 공간입니다. 캐시의 주요 목적은 데이터에 대한 접근 속도를 높이는 것입니다.
  • 캐시 적중률(Cache Hit Rate) - 프로그램이 데이터를 요청했을 때 그 데이터가 캐시에 존재하는 비율을 의미합니다. 즉, 캐시에서 데이터를 찾아 사용할 수 있었던 비율을 나타냅니다.
// 배열 선언 및 초기화
int[] array = new int[100];
// 배열 초기화
for (int i = 0; i < array.length; i++) {
    array[i] = i;
}

// 캐시 적중률 예시
for (int i = 0; i < array.length; i++) {
    System.out.println(array[i]);
}

연속된 메모리 공간 덕분에 CPU 캐시가 배열의 여러 요소를 한 번에 로드할 수 있습니다.


4. 알고리즘 구현의 기본 요소 -> (2. 고속데이터 내용을 참고)

알게 된 점 - 배열의 단순한 구조와 빠른 데이터 접근성 덕분이구나!!!

그래서 배열은 정렬, 검색, 행렬 연산 등 다양한 알고리즘에서 기본적인 데이터 구조로 사용된다고 합니다.


5. 다양한 활용성

알게 된 점 -

  • 스택: 후입선출(LIFO) 구조로, 나중에 들어온 데이터가 먼저 나갑니다. 함수 호출 관리, 뒤로 가기 기능 등**에 사용됩니다.

  • 큐: 선입선출(FIFO) 구조로, 먼저 들어온 데이터가 먼저 나갑니다. 작업 대기열, BFS 알고리즘 등***에 사용됩니다.


앞으로 공부해야할 것들

* 배열의 탐색, 삽입/삭제 같은 경우 O(n) 시간 복잡도를 가지는 데 보완한 방법들이 무엇이 있을까?

** 함수 호출 관리, 뒤로 가기 기능 등 스택이 어떻게 적용되는가?

*** 작업 대기열, BFS 알고리즘 등 큐가 어떻게 적용되는가?

0개의 댓글