이번에는 배열과 문자열 인코딩에 관한 내용을 잠깐 살펴볼 것이다. 필기시험이나 면접에서 질문받은적은 거이 없지만 기본내용이고 책에서 소개하고 있기에 간단하게 정리하였다. 책 내용을 바탕으로 또 알아야 할 부분에 대해 잠깐 살펴보자
배열 : 어떤 메모리 블록에 연속적으로 나열된 같은 유형의 변수모음
연결리스트와 마찬가지로 선형적 저장, 특징은 다르다
탐색 연산은 O(1) - 인덱스만 알면 바로 찾음, 삭제ㅡ삽입이 느림 O(n),
*포인터 상수 : char *const ptr -> 다른 위치를 가리키는걸 바꿀 수 없다, 포인터가 가리키는 메모리 내용(char) 변경가능
상수 포인터 : const char* ptr -> 다른 위치를 가리키는걸 바꿀 수 있지만, 그 메모리의 내용을 변결할 순 없다.
문자열 : C/C++ char : 1byte JAVA, C# char : 2byte
인코딩
ASCII : 7bit구성, 128개(2^7)개의 문자표현 ->(확장) ANSI : 8bit, 언어별로 code값 줌 code page를 통해 다른언어 사용가능'
EUC-KR : 완성형 코드, 완성된 문자 하나하나마다 코드번호 부여 --> (확장) CP949(MS949) : 한글지원을 위한 윈도우즈 계열 확장 완성형 코드조합
UTF-8 : 유니코드를 위한 가변길이 문자 인코딩(멀티바이트) 방식, 멀티 바이트개념으로 하나의 Charator set에 모든 문자 넣음
최대 4개까지 8bit char로 모든 유니코드 인코딩
네트워크를 통해 전송되는 텍스트나 파일에 저장된 테스트 용도
*멀티바이트*
표현해야하는 문자에 따라 글자 크기를 가변으로 변경하여 사용, UTF-8은 1~4byte로 변함, 한글언어는 3byte이상을 사용
UTF-16 : JAVA, C#에서 사용, 16bit를 기반으로 저장하는 UTF-8 변형
UTF-32 : 모든 문자를 4byte로 인코딩, 비효율적으로 메모리 사용
*UTF-8, UTF-16 모두 유니코드를 지원하기 위한 인코딩 방식
유니코드 : 전 세계 모든 문자를 컴퓨터에서 일관되게 표현하도록 만들어진 코드조합
위 내용이 책에서 언급한 내용들이다. 자료구조 파트에서 배열에 대해 설명하였는데 작년에 많이 봤던 문항은 Vector와 List의 차이를 많이 물었다. 그 내용을 찾아보면
출처 : Stack Overflow 번역본 및 기타정리
Vector : 연속적인 메모리, 즉, iterator 뿐 아니라 position index(operator [])로도 접근이 가능하다는 것이다.
- 개별 원소들을 position index로 접근이 가능하다 (상수 복잡도)
- 원소를 컨테이너의 끝에 삽입/제거 하는 것이 빠르다 (상수-아모타이즈드 복잡도) -> 다른 위치는 O(n)
- 어떠한 순서로도 원소들을 순회할 수 있다. 즉, Random access iterating이 가능함. (로그 복잡도)
- 동적으로 컨테이너의 크기가 확장/축소되는 것이 편하기는 하나, 확장시의 reallocation은 비용이 꽤 크다.
- capacity를 확장 시켜줄 수 있는 적절한 크기의 reserve로 인한 메모리 확보가 중요.
원소들간 상호 연결 정보를 위해 추가적인 메모리가 사용된다.
추가와 제거에 비용이 싸고, 리스트 어디서든 일어날 수 있다.
요소를 추가할 때, 전체 리스트의 메모리를 재할당할 필요가 없다.
컨테이너 내 원소 순회는 forward / reverse 순회만 가능하며, 느리다. (선형 복잡도)
결론 : 순차적인 컨테이너 타입을 사용할지 신경쓰지 않을 땐 벡터를 사용해라, 그러나 컨테이너의 끝 이외의 곳에 추가와 제거가 많이 일어난다면 리스트를 사용하길 원할 것이다. 혹은 네가 랜덤 접근이 필요하다면, 벡터를 원할것이고 이외의 경우는 리스트이다.
만약 요소를 추가하는 게 빈번하지 않는다면, 벡터가 더 효율적일 것이다. 벡터는 리스트 보다 더 좋은 CPU 캐시 지역화를 가진다. 다르게 말하자면, 한 요소에 접근하는 것은 캐시 안에 다음 요소가 존재하고 다음 캐시가 느린 RAM을 읽을 필요 없이 검색 될 수 있을 가능성이 높게 만든다.
다만, 자료구조의 성능을 비교할 때는 원소의 크기, 지역성에 의한 캐시 미스를 잊지 말자, 또한 어떤 상황이고 원하는 작업이 무엇인지 등을 파악하여 생각해야 한다.
그 외, 다른 자료구조의 내용이 필요하다면 링크를 남겨놓겠다.
자료구조 내용 링크 : https://geekhub.tistory.com/61?category=722520
'프로그래밍 면접 이렇게 준비한다?' 카테고리의 다른 글
[필기,면접] 디자인패턴 (0) | 2019.04.10 |
---|---|
[필기,면접]운영체제_스레드 (0) | 2019.04.10 |
[필기,면접] 정렬 (0) | 2019.03.21 |
[필기,면접]재귀호출과 메모리 영역 (0) | 2019.03.17 |
[필기+면접] 연결리스트, 트리 (0) | 2019.03.11 |