분류 전체보기 290

C++ Hash와 Map의 차이점

Hash와 Map의 차이점STL에 보면 Map이라는 컨테이너가 있습니다.이전에 정리한걸 다시 보면.. map - 특정 키(key)로 데이터를 접근하고 관리할 수 있다. - 키로 값에 접근하며 삽입과 삭제가 빠르다.이와 같이 정리를 했었습니다.  - 키로 값에 접근한다고 했는데 이것은 이진 탐색 트리(Binary Search Tree)에서 사용되는 키값을 의미합니다. - 이진 탐색 트리(BST)입니다. 이진 트리 아닙니다. (최근엔 Red-Black Tree를 사용한다고 합니다)Map에서 자료를 접근하려 할 때 이진 탐색 트리를 사용한다는 점에서 차이가 있습니다. - 이진 탐색 트리는 O(log n)의 속도를 보여줍니다. 하지만 이것보다 더 빠른 탐색 시간을 원할 때 Hash Map을 사용하게 됩니다. (..

빅엔디안 리틀엔디안

빅엔디안과 리틀엔디안 바이트 오더라하여 바이트의 정렬 순서를 이야기합니다. 프로그래밍 하는 과정에서 많이 헷갈리기도 하는데요. 리틀엔디안부터 알아보도록 하겠습니다. 리틀엔디안 (Little Endian) 리틀엔디안은 주로 인텔 프로세스에서 사용하는 바이트오더 입니다. 리틀이라는 말 처럼 메모리 시작 주소를 하위 바이트부터 기록한다는 뜻입니다. - 빅엔디안은 그럼 반대겠죠? 리틀 엔디안의 바이트 오더 기록 순서입니다. 레지스터에 기록된 내용을 하위바이트부터 메모리에 넣는 것을 보실 수 있습니다. - 오른쪽 -> 왼쪽의 순서로 읽습니다. 리틀엔디안은 메모리에 저장된 값의 하위 바이트들만 사용할 때에는 별도의 계산이 필요 없다는 장점이 있습니다. - 앞의 두 바이트나 한 바이트를 떼어내면 바로 하위 16비트나..

Basics/Programming 2014.10.13

C++와 Java의 차이점

C++과 Java의 차이점C++은 이름에서도 알 수 있듯이 C를 확장하여 만든 프로그래밍 언어입니다. (이후로는 C#도 있죠)C는 절차적 프로그래밍 언어인데 이를 효율적으로 실행할 수 있도록 개선한 언어입니다. - 객체 지향 프로그래밍, 예외처리, 제네릭 프로그래밍 등을 지원합니다. - 제네릭 프로그래밍은 따로 포스팅 하겠습니다. Java는 처음 가전제품에 탑재되어 네트워크 컴퓨팅을 하기 위해 만들어졌습니다. - 자바 가상 머신 위에서 실행되며 안전하고 이식성이 높습니다. - 자바는 C와 비슷한 언어를 사용할 뿐 둘 사이의 호환성은 없습니다.   C++ Java C 코드와의 하위 호환성 다른 언어와 호환성은 없음 직접적인 시스템 라이브러리 호출 가능 Java Native Interface를 이용  저수준..

C++ STL

STL (Standard Template Library)C++가 제공하는 템플릿 기반 표준 라이브러리 입니다.STL 라이브러리는 크게 STL 컨테이너와 STL 알고리즘으로 구성되어 있습니다. - STL 컨테이너 : 클래스 템플릿으로 정의되는 일종의 컬렉션 클래스.  * 컬렉션 : 같은 종류의 데이터 모임, 즉, 같은 데이터형의 데이터를 저장하고 읽어오기 위한 자료구조 클래스를 컬렉션 클래스라고 합니다. - STL 알고리즘 : 함수 템플릿으로 정의되는 유용한 알고리즘.  * 자주 사용하는 유용한 알고리즘들을 함수 템플릿으로 정의해 둔 것입니다. STL은 성능이 우수하고 안전성이 검증된 라이브러리이기 때문에 프로그래머는 필요한 기능을 매번 구현하는 대신 라이브러리를 믿고 사용할 수 있기 때문에 개발 기간도 ..

C++ 템플릿

템플릿 (Template)C++의 템플릿을 이용하면 함수나 클래스를 정의할 때 특정 데이터형을 사용하는 대신 범용형을 사용할 수 있습니다. - 정의된 함수 템플릿이나 클래스 템플릿은 여러가지 데이터형에 대해 함수 정의나 클래스 정의를 생성할 수 있습니다. 프로그램을 개발하다보면 같은 기능을 여러가지 데이터형에 대해서 구현해야 할 때가 있습니다. - 예 : Stack 클래스라면 정수 값을 넣을 수 있는 Stack을 구현했다고 가정했을 때, 실수형을 비롯한 다른 값을 넣을 수 없습니다. 따라서 각각 다른 형태의 Stack 클래스를 만들어야하는 불편함과 비효율이 있습니다. 바로 이런 경우에 해결책이 될 수 있는 것이 템플릿입니다. - 처리 알고리즘은 같고, 처리할 값의 데이터형이 다양할 때 템플릿을 이용하는 ..

C 헤더파일 중복검사

같은 헤더 파일을 여러번 포함하지 않도록 하려면?분할 컴파일을 이용해 프로젝트를 구현할 때 하나의 소스 파일에서 같은 헤더 파일을 여러번 포함하는 경우가 가끔 발생합니다. 선행처리기가 처리하는 문장 중 #if, #else, #endif 문을 이용하면 조건식을 검사해서 코드를 컴파일하거나 컴파일 하지 않도록 설정할 수 있습니다. 조건식을 검사하는 #if문 외에도 매크로가 정의되었는지를 검사하는 #ifdef, 매크로가 정의되지 않았는지를 검사하는 #ifndef가 있습니다. 정리#if, #else, #endif : 조건식 검사 후 코드 컴파일 or 컴파일 하지 않기#ifdef : 매크로가 정의되었는지 확인해서 정의되었으면 아랫줄 실행#ifndef : 매크로가 정의되었는지 확인해서 정의 안되었으면 아랫줄 실행

C++ 네임스페이스

네임스페이스식별자가 정의되는 공간을 말합니다. - 식별자는 변수, 함수, 구조체, 클래스, 공용체, 열거체 등의 이름을 이야기합니다.네임스페이스를 이용하면 같은 이름의 식별자를 여러번 정의하고 구분해서 사용할 수 있습니다.  네임스페이스의 필요성간단한 프로그램이 아닌 상용 프로그램을 개발하기 위해서는 여러 개발자들이 모여서 공동으로 작업을 하게 되는데 같은 모듈 내에서 사용되는 변수, 함수, 구조체 등의 식별자를 정의하다 보면 이름이 겹치는 경우가 종종 발생하게 됩니다.이런 문제점들을 해결하기 위해 프로그램에서 사용되는 식별자를 구조적으로 관리할 수 있는 방법을 제공하는 것이 바로 네임스페이스입니다.  네임스페이스의 정의네임스페이스를 정의하는 것은 간단합니다. namespace 네임스페이스 이름 {  변..

C++ 인라인 함수

인라인 함수 (inline function)인라인 함수는 함수 호출 시 발생하는 오버헤드를 줄이기 위해 함수를 호출하는 대신 함수가 호출되는 곳마다 함수의 코드를 복사해 넣어주는 방법입니다. - 인라인은 새로운 종류의 함수가 아니라 함수에 적용할 수 있는 새로운 특성입니다. 그럼 오버헤드는 뭘까요실제로 함수가 호출되는 과정은 상당히 복잡합니다. - 함수의 인자를 스택에 저장 -> 함수가 리턴될 때 돌아올 주소를 스택이나 레지스터에 저장 -> 함수의 시작 주소로 점프 -> 함수의 코드 실행 -> 함수에서 만들어진 지역변수, 스택에 저장된 인자 해제, 리턴값을 레지스터에 저장 -> 함수를 호출할 때 저장해둔 주소(다음에 수행할 문장의 위치)로 되돌아갑니다. 이렇듯 몇 개의 명령어로 구성된 간단한 함수를 호출..

C 배열과 포인터

배열과 포인터 배열과 포인터는 유사한점이 있습니다. - 차이점이 있다는 이야기겠죠? 그럼 보다 자세하게 알아보겠습니다. char a[4]; 위의 선언문은 a라는 이름으로 4개의 char형(정수형 1byte) 데이터를 저장할 수 있는 기억공간을 만들어라 라는 것입니다. - 각각의 공간에 a[0], a[1], a[2], a[3]의 기억공간이 만들어집니다. (다 아시죠?)더 정확하게 말씀드리자면  1. a라는 이름의 주소번지를 담을 수 있는 공간이 만들어짐2. 메모리 내 빈 공간을 찾아 char 형의 데이터를 저장할 수 있는 연속된 4개의 공간 확보3. 연속된 4개의 기억장소의 첫번째 주소번지를 이전에 만들어 놓았던 a라는 기억장소에 저장 위 내용 중 1번은 완전히 포인터 선언을 이야기하고 있죠?유사합니다, ..

C 포인터

포인터 이해하기도 어렵고 악명높은 포인터에 대해 이야기해보도록 하겠습니다. 사전적 의미로는Point : 가리키다, 지적하다라는 의미를 갖고있습니다. 선언법은 아래와 같습니다. int *p;char *c;float *k; 와 같이 만듭니다. 그럼 일반적인 기억공간의 선언과 비교를 해보자면! 위 그림과 같이 int *p라고 선언할 때에는 p라는 이름의 주소번지를 담을 수 있는 기억장소가 만들어집니다.따라서, 이렇게 선언이 된 경우에는 p = 30; 과 같은 구문은 동작하지 않습니다. - p라는 공간은 주소번지만 담을 수 있는 공간이거든요!! - 30과 같은 정수형 변수는 넣을 수 없습니다. 주소가 아니기 때문이죠 정작 정수형 변수를 넣을 수 있는 공간은 *p라는 기억장소입니다. - *p = 30 은 된다 요..