CPP language

구차니의 잡동사니 위키
Minimonk (토론 | 기여) 사용자의 2016년 8월 16일 (화) 19:48 버전

(비교) ← 이전 판 | 현재 판 (비교) | 다음 판 → (비교)
이동: 둘러보기, 찾기

C++은 class와 template를 통한 재사용성의 증가와 일반화(제너릭/Generic)에 중점을 둔 C언어의 확장이다.

목차

macro

__PRETTY_FUNCTION__

__FUNC__와 유사하나 클래스와 함께 출력해주는 gcc/clang의 확장 매크로


reference

포인터와 비슷하나 다른 변수

const 형 reference는 값을 변경시 컴파일러에서 에러를 발생시켜 더욱 안전한 프로그램을 작성할 수 있게 한다.

레퍼런스 변수 초기화 시 연결할 변수를 지정하며, 레퍼런스 변수에 다른 변수를 연결 할수는 없다.

함수에서 인자를 레퍼런스로 받으면 일반변수 쓰 듯 사용하면 되나 포인터와 같이 원본 값이 변경된다.

namespace

라이브러리를 생성하여 끌어쓸 경우 같은 이름의 함수나 메소드가 존재할 수 있으므로

클래스 별로 이름을 지정하여 이름의 충돌을 방지함

namespace std
{

}
using namespace std;

std는 표준 라이브러리(standard library) 를 지칭하며, c++의 어지간한 기능은 std namespace로 되어 있다. 안쓸 경우 std::cout 식으로 scope를 지정하여 사용하여야 함.

overloading

같은 함수의 이름에 다른 변수형의 인자를 받는 기능

생성자의 경우 오버로딩을 통해 다양한 인자를 받아 객체를 생성/초기화 한다.

연산자 오버로딩을 통해 다른 타입에 대한 연산(클래스 끼리의 덧셈 등)을 구현한다.

다만, 오버로딩시 return type에 대해서는 체크가 불가능 하다.

아래는 모두 오버로딩된 함수들.

int add(int a, int b);
short add(short a, short b);
float add(float a, float b);
double add(double a, double b);
double add(float a, double b);
double add(double a, float b);

overriding

메소드 오버라이딩은 상속관계에서 상위 메소드의 이름/형태를 유지한채로 기능을 재구현/재정의 한다.

오버라이딩 된 경우 상위 클래스의 것을 끌어쓰기 위해서는 super.method() 식으로 호출이 가능하다.

static

  • static method

class 내의 static 함수/메소드 들은 class를 instance로 만들지 않더라도 실행이 가능하게 생성된다.

함수

함수 인자 기본값이 설정 가능해짐.

기본값이 설정된 변수들은 함수 호출시 생략이 가능하며 호출시에는 가변인자인 것 처럼 보이기도 한다.

또한, 호출시 인자 타입에 따라 다른 함수가 불려진다(오버로딩 - overloading)

다만 오버로딩은 return type에는 적용되지 않는다.


아래는 함수인자 기본값 예제. 마치 가변함수 처럼 쓰일수도 있다.

void add(int a, int b, int c = 1, int d = 2);
add(a,b);
add(a,b,2);
add(a,b,3,4);

클래스(class)

C언어의 structure가 변수만 포함한다면,

C++의 class는 변수와 함수를 포함한 다음 scope 를 적용하는 것이 차이점이다.

물론 structure도 존재하고 있으며 structure와 class를 혼용하여 사용이 가능하나

class는 기본적으로 private 으로 structure는 public으로 선언이 되는것이 차이이다.

클래스는 :: 는 scope : 는 상속을 표현한다.

또한 : 는 초기화 연산자로 constructor 이전에 변수들을 초기화 하는데 쓰인다.

class temp
{
private:
    int ival; 

public:

    temp() : ival(1)
    {

    }
    
    ~temp()
    {

    }
}

초기화 연산자 (initializer)

생성자에 앞서 수행이 되는 루틴으로 : 를 사용함. const 변수를 초기화 하는 역활을 수행하도록 운용함. 또한, 생성자 보다 가벼우므로 생성자에서 일일이 초기화 하는 것 보다, 초기화 연산자를 통해 초기화 하는 것을 권장함.

상속 (inheritance)

상속은 공통부분을 넘겨받아 사용하는 것으로 : 를 사용함. c++ 에서는 다중상속을 지원함.

class child_class : class parent_class
{
};

생성자 (constructor)

생성하지 않아도 클래스 이름과 동일한 이름의 default constructor가 생성됨. 클래스가 생성시 호출하여 클래스 내의 변수 초기화 나 메모리 할당 등의 역활을 수행하도록 운용함.

소멸자 (destructor)

delete로 클래스 소멸시 호출되며, 생성자 앞에 ~가 붙은 형태로 생성됨. 잡고있던 핸들이나 메모리 등을 해지해주는 역활을 수행하도록 운용함.

접근 제한자 (member accessor)

public: // 모든 접근 허용
private: // 동일 인스턴스 내에서만 접근 가능. 기본 접근 제한자
protect: // 자식 클래스에서의 접근 허용

템플릿(template)

템플릿은 macro의 확대 범용화 라는 느낌과 비슷하며,

컴파일러, 링커의 도움으로 실행중 type에 따라서 필요한 함수를 생성해 내는 개념이다.

template <class myType>
myType func(myType a, myType b)
{
    return 0;
}

func<int>(a,b);

정리중

  • friend 클래스,메소드

private 접근제한으로 접근 불가능한 클래스에서의 접속을 허용해주는 키워드

  • virtual 메소드

실제로 구현하지 않아도 되는 메소드, 상속에서 추상화 하기 위해 사용함

skeleton code

#include <iostream>

using namespace std;

int main(int argc, char** argv)
{
	cout << "Hello world" << endl;
	return 0;
}
개인 도구
이름공간

변수
행위
둘러보기
도구모음