미새문지

배열과 문자열 본문

공부 키워드/알고리즘 및 데이터 구조

배열과 문자열

문미새 2024. 3. 26. 22:45
728x90

배열

           메모리 주소
            ↓
+---+---+---+---+---+---+
| 5 | 8 | 2 | 7 | 1 | 9 |
+---+---+---+---+---+---+
  0   1   2   3   4   5  
          ↑
       인덱스

배열 arr의 시작 주소: 0x1000
arr의 크기: 6 (요소 개수)
요소 크기: 4바이트 (int 타입)

arr[2]의 메모리 주소 계산:
arr 시작 주소(0x1000) + 인덱스(2) * 요소 크기(4) = 0x1000 + 2 * 4 = 0x1008

배열은 연속적인 메모리 공간에 동일한 데이터 타입의 여러 요소를 저장하는 자료구조이다.

각 요소는 인덱스를 통해 접근할 수 있다.

배열의 특징

  • 메모리 구조
    • 배열은 메모리 상에서 연속적인 공간을 차지한다.
    • 배열의 시작 주소와 각 요소의 크기를 알면 나머지 요소의 메모리 주소를 계산할 수 있다.
  • 인덱싱
    • 배열은 0부터 시작하는 인덱스를 사용해 요소에 접근한다.
    • 주소 계산식 : 배열 시작주소 + (인덱스 * 요소 크기)
  • 정적 메모리 할당
    • 배열의 크기는 컴파일 시점에 결정되며 실행 중에는 변경할 수 없다.
    • 이로 인해 정적 메모리는 크기가 고정되어 있다.
  • 랜덤 액세스
    • 배열은 인덱스 계산으로 O(1) 시간에 접근할 수 있다.
    • 순차 접근 시에도 캐시를 효율적으로 활용해 빠른 데이터 처리가 가능한 자료구조이다.
  • 삽입/삭제
    • 배열에서 특정 위치에 요소를 삽입하거나 삭제하려면 나머지 요소를 이동시켜야 하며, 이 작업의 시간 복잡도는 O(n)이다.

배열은 효율적인 메모리 활용과 빠른 데이터 접근이 필요한 경우에 유용하지만, 크기가 고정되어 있고 삽입/삭제 연산이 비효율적이라는 단점도 있다.

 

문자열

           메모리 주소
             ↓
+---+---+---+---+---+---+
| H | e | l | l | o | \0|
+---+---+---+---+---+---+
  0   1   2   3   4   5
             ↑
          인덱스

문자열 str의 시작 주소: 0x2000
str의 길이: 5 (문자 개수, \0 제외)
요소 크기: 1바이트 (char 타입)

문자열은 문자들의 나열된 집합으로, 프로그래밍에서 텍스트 데이터를 표현하고 처리하는 데 사용된다.

 

문자열의 특징

  • 메모리 표현
    • C/C++에서는 '\0'(NULL 문자)로 끝나는 문자 배열로 표현된다.
    • Java, Python 등에서는 불변(immutable) 객체로 구현되어 있다.
  • 길이와 인덱싱
    • 문자열의 길이는 NULL 문자를 제외한 문자 개수이다.
    • 각 문자는 0부터 시작하는 인덱스를 통해 접근할 수 있다.
  • 문자열 연산
    • 복사, 비교, 연결, 탐색, 패턴 매칭 등 다양한 연산이 가능하다.
    • 이러한 연산들의 시간 복잡도는 일반적으로 O(n)이다. (n : 문자열 길이)
  • 메모리 관리
    • C/C++에서는 문자열 버퍼 오버플로우 문제에 주의해야 한다.
    • 객체 기반 언어에서는 자동 메모리 관리가 되지만, 불필요한 객체 생성은 피해야 한다.
  • 불변성(Immutability)
    • Java, Python 등에서 문자열은 불변 객체이다.
    • 문자열 연산 시 새로운 객체가 생성되고, 기존 객체는 변경되지 않는다.
  • 효율적인 처리 방법
    • 문자열 연산의 효율성을 높이기 위해 StringBuffer, StringBuilder(Java) 등의 가변 문자열 클래스를 사용한다.
    • 단순 문자열 비교에는 hash 함수를 사용하는 것이 효율적이다.

문자열은 프로그래밍에서 필수적인 데이터 타입이며, 효율적인 문자열 처리를 위해서는 언어별 구현 방식과 연산의 시간 복잡도를 잘 이해해야 한다.

728x90

'공부 키워드 > 알고리즘 및 데이터 구조' 카테고리의 다른 글

스택(Stack), 큐(Queue)  (3) 2024.03.29
연결 리스트(Linked List)  (1) 2024.03.29
시간 복잡도(Big-oh Notaion)  (1) 2024.03.28
정렬 알고리즘  (3) 2024.03.27
반복문과 재귀함수  (1) 2024.03.27