Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- userprog
- 백준
- 사이드프로젝트
- 자바
- 오블완
- 4기
- TiL
- 자바스크립트
- 나만무
- 핀토스
- CSS
- Java
- 스택
- 큐
- 코드트리
- pintos
- 리액트
- defee
- 크래프톤정글
- 소켓
- 티스토리챌린지
- 크래프톤 정글
- 모션비트
- Flutter
- JavaScript
- corou
- HTML
- 알고리즘
- Vue.js
- 시스템콜
Archives
- Today
- Total
미새문지
배열과 문자열 본문
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 |