안녕하세요 열코입니다.

이번 시간에는 C언어 변수 선언 및 키워드에 대해 알아보겠습니다.

변수(variable)란 메모리에 할당된 기억장소를 일컫는말이며 기본적으로 어떤 형태의

데이터를 저장하는데 사용됩니다. 또한 변수의 종류마다 다른 크기의 메모리가 필요합니다.


변수 선언 방법

일반적인 변수 선언의 형식은 다음과 같습니다.


타입 변수이름;

타입 변수이름1, 변수이름2, 변수이름3;


타입은 변수의 자료형을 말하며, 기본자료형 및 사용자 정의 자료형이 올 수 있습니다.

사용자 정의 자료형은 C언어에서 대표적으로 구조체를 떠올릴 수 있겠네요.


C언어의 대표적인 기본 자료형은 다음과 같습니다.


char (1byte) : 문자 (-128 ~ 127)

short (2byte) : 정수 (-32768 ~ 32767)

int (4byte) : 정수 (-2147483648 ~ 2147483647)

long (4byte) : 정수 (-2147483648 ~ 2147483647)

float (4byte) : 실수 (부동소수점, ±3.4x10^-37 ~ ±3.4x10^38)

double (8byte) : 실수 (부동소수점, ±1.7x10^-307 ~ ±1.7x10^308)


맨 앞은 변수의 자료형 이름이며, 괄호안은 자료형의 크기입니다.(32bit 운영체제 기준)

마지막 괄호는 변수의 범위입니다.



변수 명명 규칙(Naming Rule)

변수의 이름을 정하는것은 개발자에게 아주 고민스러운 일입니다.

마치 어릴적 메이플스토리에서 캐릭터 생성화면에서 멈춘것처럼 말이죠.

잘 지은 변수이름하나가 프로그램 전체의 가독성과 이해에 영향을 미칠정도로 변수의 이름은 중요합니다.


C언어에서는 변수 이름으로 다음과 같은 제약사항이 있습니다.


1. 영문자, 숫자, 밑줄( _ )만이 사용가능하다. (최신 컴파일러에서는 한글도 가능합니다.)

2. 숫자를 변수 이름의 처음으로 사용 할 수 없다. (예. int 2d; → 오류)

3. 변수 이름에서 대소문자는 구분된다. (예. int X와 int x는 별개의 변수)

4. 키워드는 변수이름으로 사용할 수 없다. (아래 세부설명 참고)

5. 하나 또는 두개의 밑줄로 시작하는 이름은 미리 식별된 문자로 예약되어있다. (_ 또는 __)

6. 변수 이름의 길이는 제한이 없다.





또한 개발자 마다 변수이름을 붙이는 스타일이 다르기 때문에 변수 명명법에 대한 코딩 표준법이 존재합니다.

대표적으로 파스칼케이싱(PascalCasing)과 카멜케이싱(CamelCasing)에 대해 알아보겠습니다.


- Pascal Casing

클래스(C++,Java), 열거형(enum), 이벤트, 함수 등의 이름을 만들 때 사용하며 대문자로 시작합니다.

복합어인 경우 중간에 새로 시작하는 단어를 대문자로 사용합니다.

예) GetName, PrintString, MyStruct, NumOfPeople 등


- Camel Casing

함수의 매개변수의 이름에 적용되며 첫번째 문자는 소문자로 시작하며

복합어일 경우 새로 시작하는 단어를 대문자로 사용합니다.

예) getName, printString, myStruct, numOfPeople 등



C언어 키워드

키워드(keywords)는 C언어의 특정 예약어로 기능을 사용하는데 도움이 되는 목록입니다.

C언어에서는 총 32개(이상)의 키워드가 있습니다.


auto, break, case, char, const, continue, default, do, double, else, enum, extern, float, for, goto, if, int, long, register, return, short, signed, static, struct, switch, typedef, union, unsigned, void, volatile, while


위 키워드들은 코드 작성시 파란색으로 변경되며 변수이름으로는 사용할 수 없습니다.


특수한 변수들

const : 상수를 선언하는데 사용할 수 있습니다.

C언어 상수는 반드시 선언시 초기화해야하며 포인터와 함께 사용될 수 있습니다.

상수는 프로그램 실행 도중 더이상 값을 수정할 수 없습니다.


const type(자료형) name(변수이름) = value(값);


extern : 변수가 사용된 블록이 아닌 다른곳에서 정의됬다고 명시합니다.

기본적으로 C언어에서 헤더파일이나 다른 .c 파일에서 선언된 변수를 사용하기 위해 사용됩니다.


extern type(자료형) name(변수이름) = value(값);


static : 프로그램에 정적 변수를 선언하는데 사용됩니다.

기본적으로 C언어 변수는 동적(dynamic) 변수로써 사용시 메모리가 할당되며 사용되고 해제됩니다.

정적 변수로 선언되면 프로그램 종료시까지 메모리가 유지됩니다.

static 변수 역시 const와 같이 사용될 수 있으며 오직 한번만 초기화됩니다.


static type(자료형) name(변수이름) = value(값);


void : 빈 데이터 유형입니다.

함수의 반환값이 없을때 사용하거나 포인터가 자료형과 관계없이 가리킬 때 사용됩니다.


typedef : 이미 존재하거나 사용자 정의 자료형(구조체 등)에 새 이름을 제공할 때 사용합니다.

구조체 이름이 너무 길거나 기존 자료형 이름을 간단하게 표기할 때 사용합니다.


typedef type(자료형) name(새로 정의한 자료형 이름);

예) typedef long long int LL; (long long int를 LL로 사용하겠다.)





이상 'C언어 변수선언 및 키워드'에 대해 알아보았습니다.

질문 또는 오타나 잘못된 정보가 있는 경우 댓글로 달아주세요!

메인 페이지로 이동하시면 더 많은 자료를 볼 수 있습니다.



'C, C++' 카테고리의 다른 글

C언어 변수 이름이 숫자로 시작할 수 없는 이유  (0) 2018.11.13
C 정적(static) 변수  (0) 2018.10.29
C 표준 입력 함수 scanf  (0) 2018.10.23
C 표준 출력 함수 printf()  (0) 2018.10.22
C++ 가상 함수(Virtual Function)  (8) 2018.10.19
C++ 연산자 오버로딩  (2) 2018.10.12
C++ 함수 오버로딩  (0) 2018.10.11
C/C++ 메모리 동적할당  (0) 2018.10.11

C 표준 입력 함수 scanf




안녕하세요 열코입니다.

저번 시간에 C언어 표준 출력 함수인 printf() 함수에 대해 알아봤는데요.

이번 시간에는 C언어 표준 입력 함수인 scanf() 함수에 대해 알아보겠습니다.

scanf() 함수 역시 printf()와 같이 표준 입출력 헤더파일인 stdio.h에 포함되어 있으므로

사용시,


1
#include <stdio.h>

cs


를 추가해줍니다.


scanf() 함수의 프로토타입입니다.


1
2
3
4
int scanf(  
   const char *format [,  
   argument]...   
);  
cs


printf() 함수와 동일하게 형식 필드 문자 format과 선택 인수들이 있습니다.

형식 필드 문자는 printf() 함수의 형식 필드 문자를 참고해주세요. (단 a 문자는 사용할 수 없습니다.)

반환 값 역시 printf() 함수와 동일한 int 형이며, 지정된 필드 수를 반환합니다.


다음은 scanf() 함수의 기본 예제 소스 코드입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
int main() {
    int i;
    
    printf("숫자를 입력해 주세요 : ");
 
    scanf("%d"&i);
 
    printf("입력받은 숫자는 %d입니다.\n", i);    
 
    return 0;
}
cs


scanf() 함수의 두번째 인자들은 저장 할 변수의 주소이며, 변수 이름 앞에 & 기호를 꼭 붙여주어야 합니다.

이는 주소값을 의미하며, 해당 자료는 포인터강좌를 참고하세요.




또한 여러 데이터를 한번에 입력받을 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
 
int main() {
    int i;
    float f;
    char c;
    char s[100];
 
    printf("정수, 실수, 문자, 문자열 순으로 입력해주세요 : ");
    if(scanf("%d %f %c %s"&i, &f, &c, s) != 4) {
        printf("잘못된 입력입니다.");
    }
    else {
        printf("정수 : %d\n", i);
        printf("실수 : %f\n", f);
        printf("문자 : %c\n", c);
        printf("문자열 : %s\n", s);
    }    
 
    return 0;
}
cs


4개를 입력 받기 때문에 scanf() 함수의 반환값으로 4가 반환되며,

이가 아니 경우(적거나 많은 경우) 잘못된 입력을 출력합니다.

위 설명에서 scanf() 함수의 두번째 인수들의 이름 앞에 & 기호를 붙이라고 했는데요.


하지만 %s에 해당하는 인수는 &s가 아닌 그냥 s네요.

이는 char 배열(문자열)의 이름과 관계가 있는데요.

배열의 이름은 배열의 첫번째 원소의 주소와 같습니다.

이에 대한 설명은 배열강좌에 설명되어 있으며, C언어 초급자 분이시면

그냥 문자열 입력받을때는 &기호를 생략한다. 라고 알고 계시면 되겠습니다.


필요에 따라 * 기호를 추가하여 일부 입력을 무시할 수도 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
int main() {
    int i;
    
    printf("숫자를 입력해 주세요 : ");
 
    scanf("%*s %d"&i);
 
    printf("입력받은 숫자는 %d입니다.\n", i);    
 
    return 0;
}
cs


첫번째 인수인 %s의 입력을 무시합니다.

이 경우 공백이나 새로운 줄 입력까지의 입력을 무시합니다.




이상 'C 표준 입력함수'에 대해 알아보았습니다.

질문 또는 오타나 잘못된 정보가 있는 경우 댓글로 달아주세요!

메인 페이지로 이동하시면 더 많은 자료를 볼 수 있습니다.



'C, C++' 카테고리의 다른 글

C언어 변수 이름이 숫자로 시작할 수 없는 이유  (0) 2018.11.13
C 정적(static) 변수  (0) 2018.10.29
C 변수 선언 및 키워드  (0) 2018.10.25
C 표준 출력 함수 printf()  (0) 2018.10.22
C++ 가상 함수(Virtual Function)  (8) 2018.10.19
C++ 연산자 오버로딩  (2) 2018.10.12
C++ 함수 오버로딩  (0) 2018.10.11
C/C++ 메모리 동적할당  (0) 2018.10.11


지속해서 업데이트 됩니다. (11/13)
ctrl + d를 눌러 북마크를 추가할 수 있습니다. 
모든 질문은 커뮤니티 Q&A 게시판에서 받습니다.


C/C++

  

C#



Python



Java



Android



HTML/CSS



JavaScript



PHP



DataStructure



Algorithm



Database



Network






안녕하세요 열코입니다.

이번 시간에는 C++ 클래스의 가상 함수(Virtual Function)에 대해 알아보도록 하겠습니다.

가상 함수는 기본 클래스(상속되지 않은 클래스) 내에서 선언되어 파생 클래스에 의해 재정의되는 맴버 함수입니다.

포인터(Pointer) 또는 기본 클래스에 대한 참조(Reference)를 사용하여 파생 클래스의 객체를 참조하면 해당 객체에 대해

가상 함수를 호출하고 파생 클래스의 함수를 실행할 수 있습니다.

이는 주로 실행시간(Runtime)에 함수의 다형성(Polymorphism)을 구현하는데 사용됩니다.

가상 함수는 기본 클래스내에 virtual 키워드로 함수를 선언합니다.


가상 함수 선언에는 몇가지 규칙이 존재합니다.

1. 클래스의 공개(public) 섹션에 선언합니다.

2. 가상 함수는 정적(static)일 수 없으며 다른 클래스의 친구(friend) 함수가 될 수도 없습니다.

3. 가상 함수는 실행시간 다형성을 얻기위해 기본 클래스의 포인터 또는 참조를 통해 접근(access)해야 합니다.

4. 가상 함수의 프로토타입(반환형과 매개변수)은 기본 클래스와 파생 클래스에서 동일합니다.

5. 클래스는 가상 소멸자를 가질 수 있지만 가상 생성자를 가질 수 없습니다.


다음 예제 소스코드가 어떻게 실행될 지 예상해보세요.


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
32
33
34
#include <iostream>
 
using namespace std;
 
class parent {
public :
    virtual void v_print() {
        cout << "parent" << "\n";
    }
    void print() {
        cout << "parent" << "\n";
    }
};
 
class child : public parent {
public :
    void v_print() {
        cout << "child" << "\n";
    }
    void print() {
        cout << "child" << "\n";
    }
};
 
int main() {
    parent* p;
    child c;
    p = &c;
 
    p->v_print();
    p->print();
 
    return 0;
}
cs


parent 클래스를 가리키는 포인터 p를 선언하고, child 클래스의 객체 c를 선언했습니다.

이 포인터 p는 c객체를 가리킵니다.

몸체는 parent 클래스지만 실제 객체는 child 클래스입니다.

이 포인터 p를 이용하여 가상 함수인 v_print()와 오버라이딩 된 함수 print()를 출력하면 각각의 함수는

어느 클래스에서 호출될까요? 답은 아래와 같습니다.



실행 결과


child

parent


v_print() 함수는 가상 키워드로 선언되어 가상 함수가 되었으며

가상 함수는 실행시간(런타임)에 그 값이 결정됩니다. (후기 바인딩이라고도 합니다.)

포인터 p에는 child 클래스의 객체가 들어가 있고 포인터가 가리키는 위치에 따라 child 클래스의 v_print() 함수가 호출되었으며

일반 함수인 print()는 컴파일 시간에 이미 결정되기 때문에 31번째 줄에 p에서 print() 함수를 호출할 때

parent 클래스의 print() 함수가 호출되는것으로 결정이 끝나버린 상태입니다.

따라서 parent 클래스의 print() 함수가 호출되게 됩니다.


또한 아래의 예제 소스코드를 보며 주의사항에 대해 설명하겠습니다.


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
32
33
34
35
36
37
38
#include <iostream>
 
using namespace std;
 
class parent {
public :
    void print1() {
        cout << "parent print1" << "\n";
    }
    virtual void print2() {
        cout << "parent print2" << "\n";
    }
    virtual void print3() {
        cout << "parent print3" << "\n";
    }
};
 
class child : public parent {
public :
    void print2() {
        cout << "child print2" << "\n";
    }
    void print3(int x) {
        cout << "child print3" << "\n";
    }
};
 
int main() {
    parent* p;
    child c;
    p = &c;
 
    p->print1();
    p->print2();
    p->print3();    
 
    return 0;
}
cs


위 예제 코드를 보시면 parent 클래스에서 print1() 함수는 일반 함수로 선언되었으며,

print2(), print3() 함수는 virtual 키워드를 통해 가상 함수로 선언되었습니다.

또한 상속받은 child 클래스에서 print3() 함수는 오버라이딩하여 매개변수를 추가했습니다.

똑같이 parent 클래스의 포인터를 선언하여 파생 클래스인 child 클래스의 객체를 참조하고 포인터를 통해

print1(), print2(), print3() 함수를 호출하면 어떤 결과가 도출될까요?


실행 결과


parent print1

child print2

parent print3


print1() 함수는 일반 함수이기 때문에 컴파일 시간에 결정이 나고 parent 클래스의 print1() 함수가 호출됩니다.

print2() 함수는 가상 함수이기 때문에 실행 시간에 결정이 됩니다. parent 클래스지만 가리키고있는 객체가 child 클래스이기 때문에

child 클래스의 print2() 함수가 호출되게 됩니다.

print3() 함수는 가상 함수이지만 child 클래스에서는 매개변수가 없는 함수를 호출했기 때문에 부모 클래스인 parent 클래스의

print3() 함수가 호출되게 된 것입니다.



이상 'C++ 가상 함수'에 대해 알아보았습니다.

질문 또는 오타나 잘못된 정보가 있는 경우 댓글로 달아주세요!

공감♡ 버튼을 눌러주시면 더욱 유용하고 좋은 포스팅으로 찾아 뵙겠습니다.




'C, C++' 카테고리의 다른 글

C 정적(static) 변수  (0) 2018.10.29
C 변수 선언 및 키워드  (0) 2018.10.25
C 표준 입력 함수 scanf  (0) 2018.10.23
C 표준 출력 함수 printf()  (0) 2018.10.22
C++ 연산자 오버로딩  (2) 2018.10.12
C++ 함수 오버로딩  (0) 2018.10.11
C/C++ 메모리 동적할당  (0) 2018.10.11
C++ friend 클래스와 함수  (1) 2018.10.10

C++ 연산자 오버로딩




안녕하세요 열코입니다.

저번시간에 함수 오버로딩에 대해 알아보았는데요.

이번시간에는 연산자 오버로딩에 대해 알아보도록 하겠습니다.


☞ 연산자 오버로딩이란

기존의 제공하고 있는 연산자를 재정의하여 사용자 정의 클래스로 사용하는 것을 말합니다.

대부분의 기본 제공 연산자 함수는 전역 함수 또는 클래스로 재정의 가능합니다.

오버로드 된 연산자는 함수로 구현됩니다.



☞ 연산자 오버로드에 대한 일반 규칙

  • **과 같은 새로운 연산자를 정의할 수는 없습니다.

  • 기본 제공 데이터 형식에 적용할 때 연산자의 의미를 다시 정의 할 수 없습니다.

  • 오버로드 된 연산자는 비정적(non-static) 클래스 멤버 함수거나 전역 함수이어야 합니다.

   (private 또는 protected 접근자의 전역 함수는 해당 클래스의 friend로 선언해야 합니다.)
  • 단항 연산자 또는 이항 연산자(&, *, +, -)로 오버로드 가능하며 각 사용을 별도로 오버로드 할 수 있습니다.

  • 멤버 함수로 오버로드된 연산자의 첫번째 파라미터는 항상 연산자가 호출되는 객체의 클래스 형식입니다.

   (첫번째 파라미터에 대한 변환은 제공되지 않습니다.)




 오버로딩 불가능한 연산자

아래 표의 연산자들은 오버로드 할 수 없습니다.


 연산자

이름 

멤버선택 

.* 

멤버 포인터 선택 

:: 

범위 

?: 

조건 

문자열 전처리기 변환 

## 

전처리기 연결 



 간단한 예


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
#include <iostream>
using namespace std;
 
class Point {
private :
    int x, y;
 
public :
    Point(int x_, int y_) {
        x = x_;
        y = y_;
    }
 
    void print() {
        cout << "x : " << x << ", y : " << y << "\n";
    }
};
 
 
int main(void) {
    Point p1 = { 11 };
    Point p2(22);
    
    Point p3 = p1 + p2;
 
    p3.print();
 
    return 0;
}
cs

다음과 같이 Point라는 클래스가 있고 Point 클래스 내부에는 int x와 int y가 있습니다.
main함수에서 Point 객체인 p1과 p2를 생성해주고, p3에는 p1과 p2를 더한값을 저장하고 싶습니다.
근데 + 연산자에 대해 Point 객체의 덧셈은 지원 해주지 않습니다.
Point 클래스는 방금 제가 임의로 만든 클래스이며, + 연산자가 무엇을 의미하는지 모르기 때문이죠.
마치 String 변수의 + 연산이 a+a = aa인지 a+a=b인지 모르는것 처럼요.


이를 해결하기 위해 C++에서는 연산자 오버로딩을 제공합니다.
설명은 위에서 해드렸으니 코드에 대해 설명하겠습니다.
먼저 Point 클래스의 + 연산자에 대한 오버로딩 예제 코드입니다.

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
32
33
34
35
#include <iostream>
using namespace std;
 
class Point {
private :
    int x, y;
 
public :
    Point(int x_, int y_) {
        x = x_;
        y = y_;
    }
 
    void print() {
        cout << "x : " << x << ", y : " << y << "\n";
    }
 
    Point operator + (Point& p) {
        x = x + p.x;
        y = y + p.y;
        return Point(x, y);
    }
};
 
 
int main(void) {
    Point p1 = { 11 };
    Point p2(22);
    
    Point p3 = p1 + p2;
 
    p3.print();
 
    return 0;
}
cs

18번째 줄을 보시면 새로운 함수가 하나 생성되었습니다.
+ 연산자에 대한 오버로딩 함수인데요. 하나씩 살펴보겠습니다. ^^
반환형으로는 Point 객체네요. 
함수의 이름은 operator입니다. 함수의 이름을 operator로 사용함으로써 컴파일러에게 연산자 오버로드 함수인것을 명시합니다.
뒤에 연산자 +를 입력했습니다. 매개변수로는 Point 객체의 참조변수입니다.

30번째 줄을 보시면 Point p3 = p1 + p2; 라는 코드가 있습니다.
여기서 p1이 오버로드 된 + 연산자 함수를 호출했으며, + 뒤에있는 p2는 Point& p로 넘겨 받아지는 것 입니다.
반환값은 Point 객체로 x와 y가 각각 더해진 새로운 임시 Point 객체를 반환합니다.
이 반환된 임시 객체 값이 p3 값으로 넘어가서 결과적으로 3, 3이 출력되는 것입니다.

ㅇ 출력 결과

x : 3, y : 3


☞ 연산자 오버로딩 활용 1
데이터 타입 변환에 대한 연산자 또한 오버로딩 할 수 있습니다.
다음 예제를 확인해보세요.

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
#include <iostream>
using namespace std;
 
class DIV {
private :
    int num, div;
public :
    DIV(int n, int d) {
        num = n;
        div = d;
    }
 
    operator double() const {
        return double(num) / double(div);
    }
};
 
 
int main(void) {
    DIV d(13);
    double db = d;
    cout << d;
 
    return 0;
}
cs

21번째 줄을 보시면 double 변수로 db를 선언하고 값을 DIV 객체인 d를 넘겨주었습니다.
어떻게 이게 가능할까요?
13번째 줄을 보시면 double 이라는 키워드를 연산자 오버로딩하여 double 값을 반환하는 함수로 오버로딩 했습니다.
그러므로 double 변수에 대입할 수 있게 된 것이죠.

☞ 연산자 오버로딩 활용 2
cin, cout의 << 연산자, >> 연산자 오버로딩 역시 가능합니다.
다음 예제 코드는 cin 의 << 연산자에 대한 오버로딩 입니다.

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
#include <iostream>
using namespace std;
 
class Point {
private :
    int x, y;
 
public :
    Point(int x_, int y_) {
        x = x_;
        y = y_;
    }
 
    friend ostream& operator<<(ostream&const Point&);
};
 
ostream& operator<<(ostream& os, const Point& p) {
    os << p.x << ", " << p.y;
    return os;
}
 
int main(void) {
    Point p(23);
    
    cout << p;
 
    return 0;
}
cs

Point라는 클래스가 있습니다. p 라는 객체를 생성하고 cout << p; 라는 코드는 분명 오류가 발생합니다.
왜나면 cout의 << 연산자는 기본적으로 사용자 정의 클래스에 대한 출력을 지원해 주지 않기 때문이죠.
이를 연산자 오버로딩을 통해 해결 가능합니다.
17번째 줄을 보시면 << 연산자에 대한 오버로드 함수입니다.
또한 Point 객체의 private 멤버인 x와 y에 접근 할 수 있도록 Point 클래스 내부에 friend 함수를 지정해 주었습니다.

ㅇ 출력 결과

2, 3



이상 '연산자 오버로딩'에 대해 알아보았습니다.

질문 또는 오타나 잘못된 정보가 있는 경우 댓글로 달아주세요!

공감♡ 버튼을 눌러주시면 더욱 유용하고 좋은 포스팅으로 찾아 뵙겠습니다.



'C, C++' 카테고리의 다른 글

C 변수 선언 및 키워드  (0) 2018.10.25
C 표준 입력 함수 scanf  (0) 2018.10.23
C 표준 출력 함수 printf()  (0) 2018.10.22
C++ 가상 함수(Virtual Function)  (8) 2018.10.19
C++ 함수 오버로딩  (0) 2018.10.11
C/C++ 메모리 동적할당  (0) 2018.10.11
C++ friend 클래스와 함수  (1) 2018.10.10
C++ 클래스 접근제한자  (0) 2018.10.10

to Top