Programming Language/C, C++ 38

C++ 가상 함수 (virtual) - 기본

가상 함수 (Virtual)기본 클래스의 포인터로 호출하더라도 파생 클래스에 재정의된 함수를 호출하도록 만들려면 기본 클래스의 멤버 함수를 가상 함수로 선언해야 한다.- 기본 클래스를 상속받은 파생 클래스에 같은 함수가 있다면 파생 클래스의 함수는 무시되고 기본 클래스의 함수로 실행이 됩니다.- 파생 클래스의 함수를 실행시키고 싶다면 virtual 키워드를 사용해야 합니다. 이전에 상속에서 예를 들었었던 Shape를 예로 들어 이어나가겠습니다.   Shape 클래스 선언부- void Draw() const; 함수에 가상함수 키워드가 없는 이전의 예제입니다. 가상함수 키워드를 사용하지 않고 Draw 함수를 호출하게 되면 아래와 같은 결과가 나옵니다.  파생 클래스(Rectangle, Eclipse)의 Dr..

C++ 상속

객체 지향 프로그래밍이 제공하는 상속이라는 특징은 상속 그 자체로도 의미가 있지만 상속에 의해서 다형성이 제공된다는 점에서 그 의미가 큽니다. 클래스형 변환 규칙클래스와 관련된 형 변환 규칙을 클래스형 변환 규칙이라고 합니다. 규칙들은 아래와 같습니다.- 파생 클래스의 객체는 기본 클래스의 객체로 형 변환 가능하다.- 파생 클래스의 포인터는 기본 클래스의 포인터로 형 변환 가능하다.- 파생 클래스의 레퍼런스는 기본 클래스의 레퍼런스로 형 변환 가능하다. 클래스형 변환 규칙 중 객체 간의 형 변환은 자주 사용되지 않습니다. 주로 포인터 간의 형 변환이나 레퍼런스 간의 형 변환이 사용됩니다. 백문이 불여일견, 예를 통해서 알아보겠습니다.   도형과 사각형, 원의 관계를 예로 들겠습니다.Rectangle과 E..

C++ Hash와 Map의 차이점

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

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번은 완전히 포인터 선언을 이야기하고 있죠?유사합니다, ..