'C++'에 해당되는 글 17건

  1. 2018.10.11 C++ 함수 오버로딩
  2. 2018.10.11 C/C++ 메모리 동적할당
  3. 2018.10.10 C++ friend 클래스와 함수 1
  4. 2018.10.10 C++ 클래스 접근제한자
  5. 2018.10.09 C++ 클래스와 객체

C++ 함수 오버로딩




안녕하세요 열코입니다.

이번시간에는 C++ 에서 함수 오버로딩에 대해 알아보겠습니다.


☞ 함수 오버로딩이란?

같은 함수의 이름을 가지고 있지만 파라미터(매개변수) 및 리턴 타입 등의 특징이 다른 여러개의 함수를 만드는 것입니다.

예를들어 우리가 C++ 프로그래밍을 할 때에 cout 출력 함수를 통해 int, char, string, double 등의 여러가지 타입의 자료형을

다른 함수가 아닌 cout 하나의 함수를 통해 출력할 수 있는 기능을 구현하는데 사용됩니다.


* 너무 많이 함수를 오버로딩 할 경우 코드가 복잡해지며 어떤 오버로드 함수가 호출되었는지 알기 힘들어지므로

적절한 상황에 적당히 사용하는것을 권합니다.


 함수 오버로딩 예제


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;
 
int yc(int i) {
    return i + 1;
}
char yc(char c) {
    return c + 1;
}
double yc(double d) {
    return d + 1.1;
}
 
 
int main(void) {
    int x = 5;
    char y = 'a';
    double z = 3.3;
 
    cout << yc(x) << "\n";
    cout << yc(y) << "\n";
    cout << yc(z) << "\n";
 
    return 0;
}
cs


위의 코드처럼 같은 이름을 가진 함수가 여러개 존재합니다.

main 함수에서는 yc() 라는 함수를 호출할 뿐이고 매개변수로 int, char, double 형식이 순서대로 들어갑니다.

컴파일러는 매개변수를 구분하여 어떤 함수를 호출할 지 결정합니다.


ㅇ 출력 결과


6

b

4.4



 함수 오버로딩이 가능하지 않은 경우?

Microsoft MSDN에서는 함수 오버로드 고려사항으로 다음과 같이 정의합니다.


출처 : https://msdn.microsoft.com/ko-kr/library/5dhe1hce.aspx



C++에서 함수 오버로딩을 할 수 없는 함수들을 하나씩 살펴보도록 하겠습니다.


1. 반환 값의 형식만 다른 함수 선언.


1
2
3
4
5
6
7
8
int yc() {
    return 1;
}
 
char yc() {
    return 'c';
}
 
cs


위와 같이 반환 값의 형식만 다른 함수를 오버로드 할 경우 다음과 같은 컴파일 오류가 발생합니다.


- 반환 형식으로만 구분되는 함수를 오버로드할 수 없습니다.

- 'char yc(void)': 오버로드된 함수가 'int yc(void)'과(와) 반환 형식만 다릅니다.

- 'yc': 재정의. 기본 형식이 다릅니다.



2. 형식이 같은 static(정적) 멤버 함수를 오버로드하는 경우.


1
2
3
4
5
6
class YC {
    static void yc(int i) {}
 
    void yc(int i) {}
};
 
cs


위와 같이 반환 값 형식과 매개변수 형식이 같은 정적 메소드와 비 정적 메소드를 오버로드할 수 없습니다.

다음과 같은 컴파일 오류가 발생합니다.


- 매개 변수 형식이 같은 정적 및 비정적 멤버 함수를 오버로드할 수 없습니다.



3. 매개변수 형식이 배열과 포인터


1
2
int yc(int *p);
int yc(int p[]);
cs


위와 같이 함수 몸체가 없이 정의만 하는 경우 컴파일 오류는 발생하지 않지만, 컴파일러가 동일한 함수로 인지합니다.

매개변수 배열 선언은 포인터 선언으로 조정되기 때문에 단순히 위의 함수를 재정의 하는 구문입니다.


아래 코드의 경우도 마찬가지로 동일한 함수를 재정의하는 구문입니다.


1
2
3
int yc(int );
int yc(int *);
 
cs


매개변수에 const로 구분을 짓는것 또한 마찬가지입니다.


1
2
3
4
5
6
int yc(int x) {
    return x;
}
int yc(const int x) {
    return x;
}
cs


위와 같이 함수를 선언한 경우에는 컴파일 에러를 발생시킵니다.


- 'int yc(int)' 함수에 이미 본문이 있습니다.


위의 케이스들은 함수 오버로딩이 아닌 단순 함수 재정의라고 볼 수 있습니다.



이상 'C++ 함수 오버로딩'에 대해 알아보았습니다.

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

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



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

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/C++ 메모리 동적할당  (0) 2018.10.11
C++ friend 클래스와 함수  (1) 2018.10.10
C++ 클래스 접근제한자  (0) 2018.10.10
C++ 클래스와 객체  (0) 2018.10.09

C/C++ 메모리 동적할당




안녕하세요 열코입니다.

이번시간에는 C/C++에서의 메모리 동적할당에 대해 알아보도록 하겠습니다.



☞ 메모리 동적 할당이란?

C/C++에서 실행 시간동안 사용할 메모리 공간을 할당하는 것을 말합니다.

메모리 공간 필요 시 할당하고, 사용이 끝난 후 반납을 사용자가 원하는 시점에 원하는 크기만큼 가능합니다.

사용자에 의해 메모리가 동적으로 할당이 되면 프로그램이 끝날 때 까지 유지되므로,

메모리 공간 사용이 끝나면 메모리 낭비(누수)를 줄이기 위해 명시적으로 메모리 할당을 해제 해주어야합니다.


* 참고로 자바에는 가비지 컬렉션이 존재하여 사용되지않는 메모리를 자동으로 해제해줍니다.

C/C++에는 가비지 컬렉션이 존재하지 않으므로 사용자가 명시적으로 메모리를 해제 해 주어야 합니다. 



 컴퓨터 메모리 구조?

컴퓨터 메모리 구조에 대해 잠깐 짚고 넘어가겠습니다. 컴퓨터 메모리의 공간은 

크게 4부분 - 스택, 힙, 데이터, 코드(텍스트) 부분으로 나눌 수 있습니다.


여기서 스택, 힙 공간은 프로그램 실행(런타임) 크기가 결정됩니다.

데이터와 코드 부분은 컴파일러에 의해 컴파일시 크기가 결정됩니다.


- 스택(Stack) 공간은 지역변수와 매개변수 등이 할당되는 임시적인 영역입니다.

- 힙(Heap) 공간은 동적으로 메모리를 할당하는 곳이며 생성 중 크기를 결정합니다.

- 데이터(Data) 공간은 전역 변수와, 정적(static) 변수, 초기화 된 배열 등이 존재합니다.

- 코드(Code) 공간은 프로그램의 명령어나 기계어 명령이 존재합니다. 



 동적 메모리 할당/해제 방법?

C 프로그래밍에서는 malloc()과 calloc() 함수 등을 사용하여 런타임에 메모리를 동적으로 생성하며,

free() 함수를 사용하여 동적으로 할당된 메모리를 명시적으로 해제합니다.

C++ 프로그래밍에서는 이러한 함수들을 더 편하게 사용할 수 있도록 new와 delete 연산자를 사용하여 할당 및 해제합니다.


동적할당 코드에는 포인터 개념 및 사용이 포함되어 있습니다. 

아직 포인터에 대한 개념이 잡혀있지 않다면 여기를 눌러 개념을 잡고 넘어 갑시다.


- C 예제코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <stdlib.h>
 
int main(void) {
    int *p;
    int size = 5;
    p = (int *)malloc(sizeof(int* 5);
 
    for (int i = 0; i < 5; i++) {
        p[i] = i + 1;
    }
 
    for (int i = 0; i < 5; i++) {
        printf("%d\n", p[i]);
    }
 
    free(p);
 
    return 0;
}
cs


먼저 malloc() 함수를 사용하기 위해 stdlib.h 헤더파일을 include 해줍니다.

그리고 malloc() 함수를 사용하기 위해 포인터 변수를 하나 생성합니다. 여기서 포인터의 자료형을 동적할당 하려는 자료형과

일치해야 합니다. 저는 int형 변수 5개를 동적할당 받기위해 int형 포인터 변수를 선언했습니다.


그리고 malloc() 함수의 반환값은 void*이므로 (int*)를 malloc() 함수 앞에 명시적으로 형변환을 시켜줍니다.

만약 char*라면 (char*)를 사용하여 명시적으로 형변환을 해줍니다. (자료형에 맞추시면 됩니다.)


그리고 malloc() 함수의 매개변수로 동적할당 받을 메모리 크기를 넘겨줍니다.

int형 변수 5개이므로 4*5 = 20을 넘겨주면 되겠다 싶더니 무슨 이상한 문자들이 있군요...

sizeof() 함수는 해당 자료형의 크기를 반환합니다. sizeof(int)니까 int형 자료형의 크기가 되겠군요.

5개가 필요하니 5로 초기화 해준 size를 곱해줍니다.

여기서 sizeof()의 사용을 한 이유는 프로그램 사용자마다 운영체제가 다르기 때문에 자료형의 크기가 달라질 수 있기 때문입니다.

sizeof()함수를 사용하면 64bit 컴퓨터에서는 8바이트로 반환되기 때문이죠.


그리고 동적할당 받은 메모리는 배열처럼 사용 가능합니다. (보통 배열의 동적 크기를 지정해주기 위해 사용됩니다.)


사용후에는 free() 함수를 이용하여 메모리 할당을 해제 해 주었습니다. 


ㅇ 출력 결과


1

2

3

4

5



- C++ 예제코드

C++ 프로그래밍에서는 new와 delete 키워드를 사용합니다.

사용법은 C 프로그래밍 보다 훨씬 쉬우니 설명은 생략하고 아래의 예제 코드를 확인 해 봅시다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
int main(void) {
    int *= new int[5];
 
    for (int i = 0; i < 5; i++) {
        p[i] = i + 1;
    }
 
    for (int i = 0; i < 5; i++) {
        cout << p[i] << "\n";
    }
 
    delete[] p;
 
    return 0;
}
cs


어때요? 진짜 말한대로 코드가 간단하죠?

new 키워드를 통해 int형 변수 5개 ([5])를 동적할당합니다.

그리고 delete키워드를 통해 동적할당 해제.


ㅇ 출력 결과


1

2

3

4

5


개인적으로 C++ 프로그래밍의 메모리 동적 할당 방법이 더 쉽고 간결해서 자주 사용하는 편입니다. ^^



이상 'C/C++ 메모리 동적할당'에 대해 알아보았습니다.

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

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



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

C 표준 출력 함수 printf()  (0) 2018.10.22
C++ 가상 함수(Virtual Function)  (8) 2018.10.19
C++ 연산자 오버로딩  (2) 2018.10.12
C++ 함수 오버로딩  (0) 2018.10.11
C++ friend 클래스와 함수  (1) 2018.10.10
C++ 클래스 접근제한자  (0) 2018.10.10
C++ 클래스와 객체  (0) 2018.10.09
C/C++ 구조체 사용법 및 예제  (1) 2018.10.08



안녕하세요 열코입니다.

저번시간에 C++ 클래스와 접근제한자에 대해 알아보았는데요.

이번에는 저번시간 protected 제한자 부분에서 언급했던 friend(친구) 클래스와 함수에 대해 알아보겠습니다.


☞ freind 클래스란?

firend 클래스는 friend로 선언된 다른 클래스의 private 및 protected 멤버에 접근할 수 있습니다.

특정 상황에서 클래스 내에 접근하지 못하도록 private 제한을 두었는데, 필요의 경우 해당 클래스나 함수에서

접근 가능하도록 사용하는것이 friend 클래스 및 함수입니다.

사용법은 friend 키워드를 사용하여 클래스나 함수를 명시 해 주는 것 인데요.

아래 예제는 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
30
#include <iostream>
#include <string>
using namespace std;
 
class Friend1 {
private :
    string name;
 
    friend class Friend2;
};
 
class Friend2{
public : 
    void set_name(Friend1& f, string s) {
        f.name = s;
    }
    void show_name(Friend1& f) {
        cout << f.name << "\n";
    }
};
 
int main(void) {
    Friend1 f1;
    Friend2 f2;
    
    f2.set_name(f1, "열코");
    f2.show_name(f1);
 
    return 0;
}
cs


위 클래스를 보시면 Friend1 클래스와 Friend2 클래스가 있습니다.

Friend1 클래스에는 private 멤버 변수로 name이라는 string 변수가 존재합니다.

그 아래 보시면 friend class Friend2; 라는 코드가 보입니다.

이 코드가 바로 "나(Friend1)는 Friend2의 친구니까 내 개인적인 정보를 공유 해도 돼!" 라는 뜻입니다.

그리고 Friend2 클래스의 코드를 보시면 public 제한자의 함수 두개가 보입니다.



setter 함수와 출력 함수인데요, Friend1의 private 멤버인 name에 직접 접근하는것을 볼 수 있습니다.

친구니까 개인적인거 정도는 허용가능하겠죠? 

이런식으로 private 멤버나 protected 멤버를 외부 클래스에서 접근할 수 있도록 하는것이 friend 키워드입니다.


ㅇ 출력 결과


열코


☞ friend 함수란?

friend 클래스와 마찬가지로 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
#include <iostream>
#include <string>
using namespace std;
 
class Friend1 {
private :
    string name;
 
    friend void set_name(Friend1&string);
};
 
 
void set_name(Friend1& f, string s) {
    f.name = s;
    cout << f.name << "\n";
}
 
int main(void) {
    Friend1 f1;
 
    set_name(f1, "열코");
 
    return 0;
}
cs


friend 키워드를 사용하여 set_name이라는 함수가 내 친구라는것을 컴파일러에게 알려주는 것입니다.

그래서 set_name 함수에서는 Friend1 클래스의 private 멤버인 name 변수에 접근이 가능한 것이죠.

생각보다 간단하고 쉬운 개념이죠?


* 주의사항

- 친구의 친구는 friend 키워드로 명시하지 않은 경우 친구 관계가 형성되지 않습니다.

- 친구의 자식도 마찬가지로 friend 키워드로 명시하지 않은 경우 친구 관계가 형성되지 않습니다.



이상 'friend 클래스와 함수'에 대해 알아보았습니다.

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

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



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

C++ 가상 함수(Virtual Function)  (8) 2018.10.19
C++ 연산자 오버로딩  (2) 2018.10.12
C++ 함수 오버로딩  (0) 2018.10.11
C/C++ 메모리 동적할당  (0) 2018.10.11
C++ 클래스 접근제한자  (0) 2018.10.10
C++ 클래스와 객체  (0) 2018.10.09
C/C++ 구조체 사용법 및 예제  (1) 2018.10.08
C/C++ 배열 사용법  (0) 2018.10.05



안녕하세요 열코입니다.

지난시간에 C++ 클래스에 대해 배워보았습니다. (공부하러가기)

클래스 멤버 선언 시 지정해 줄 수 있는 접근 제한자에 대해 기본적인 것만 짚고 넘어갔는데요.

3가지 접근 제한자가 존재한다고 말씀드렸습니다.

public, private, protected 바로 이 3가지 유형인데요.

이번시간에는 이 클래스 멤버 접근 제한자에 대해 알아보도록 하겠습니다.


☞ 왜 접근 제한자를 사용해야하는지?

객체지향 프로그래밍의 중요한 개념 중 하나는 데이터 숨김(은닉)입니다.

실제로 사용자가 자판기에서 음료를 뽑으려고 할 때 버튼을 누르면 음료가 나옵니다.

이때 사용자는 음료를 뽑기 위해 버튼을 누르면 된다는 것을 알고있지만 실제로 어떤 원리로 인해 음료가 나오는지 모릅니다.

알 필요도 없구요.

이 음료를 뽑기위한 내부 구현 방법이 데이터 숨김입니다.

클래스 멤버가 외부 함수에서 직접 액세스(접근) 하지 못하도록 일부 제한을 설정합니다.


* 참고1 : C++ 클래스 내에 멤버에 대한 접근 제한자를 두지 않으면 기본적으로 private입니다.

* 참고2 : C/C++ 구조체 멤버에 대한 기본적인 접근 제한자는 public입니다.



☞ public

public의 뜻은 '공개적인'이라는 뜻입니다.

public으로 선언된 데이터 멤버 및 멤버함수는 다른 클래스에서도 접근이 가능합니다.

public 멤버는 . 연산자를 사용하여 프로그램의 아무곳에서나 액세스 할 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
#include <iostream>
 
using namespace std;
 
class Circle {
public :
    double radius;
    double print_area() {
        return 3.14 * radius * radius;
    }
};
 
int main(void)
{
    Circle circle;
    circle.radius = 5;
 
    cout << "반지름 : " << circle.radius << "\n";
    cout << "원의 넓이 : " << circle.print_area() << "\n";
 
    return 0;
}
cs


ㅇ 실행 결과


반지름 : 5

원의 넓이 : 78.5


위 프로그램에서 데이터 멤버 radius는 공개(public)되어 있으므로 클래스 외부(main함수)에서 접근(access) 할 수 있습니다.



☞ private

클래스 멤버를 private으로 선언하면 해당 멤버는 오직 클래스 내부에서 접근할 수 있습니다.

클래스 외부의 모든 객체나 함수에서 직접 접근할 수 없습니다.

클래스 내부의 멤버 함수 또는 friend 함수만 클래스의 private 멤버에 접근할 수 있습니다.

(friend 함수에 대해서는 다음시간에 알아보도록 하겠습니다 ^^)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
using namespace std;
 
class Circle {
private :
    double radius;
public :
    double print_area() {
        return 3.14 * radius * radius;
    }
};
 
int main(void)
{
    Circle circle;
    circle.radius = 5// 접근 오류!!
 
    cout << "반지름 : " << circle.radius << "\n"// 접근 오류!!
    cout << "원의 넓이 : " << circle.print_area() << "\n";
 
    return 0;
}
cs


클래스 외부에서 private 멤버에 직접 접근하려고하면 다음과 같이 오류가 발생합니다.


- 멤버 "Circle::radius""에 액세스할 수 없습니다.

- 'Circle::radius': private 멤버('Circle' 클래스에서 선언)에 액세스할 수 없습니다.


위 프로그램을 아래와 같이 수정할 수 있습니다.


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 Circle {
private :
    double radius;
public :
    void set_radius(double r) {
        radius = r; // 클래스 내부에서 접근 가능
    }
    double get_radius() {
        return radius; // 클래스 내부에서 접근 가능
    }
    double print_area() {
        return 3.14 * radius * radius;
    }
};
 
int main(void)
{
    Circle circle;
    circle.set_radius(5);
 
    cout << "반지름 : " << circle.get_radius() << "\n";
    cout << "원의 넓이 : " << circle.print_area() << "\n";
 
    return 0;
}
cs


위 코드를 보시면 set_radius() 와 get_radius() 함수를 만들어서 private 멤버인 radius에 접근하는것을 볼 수 있습니다.

이것을 보통 getter와 setter라고 명명합니다.

setter는 클래스 외부에서 직접 접근할 수 없는 private 멤버의 값을 초기화 해 줄 때 사용하며,

getter는 이 private 멤버의 값을 반환할 때 사용합니다.

클래스 외부(main)함수에서 getter와 setter를 어떻게 사용했는지 확인 해 보세요.


ㅇ 실행 결과


반지름 : 5

원의 넓이 : 78.5



☞ protected

protected 제한자는 private 제한자와 비슷합니다.

클래스 외부에서는 protected 멤버에 접근할 수 없지만 해당 클래스의 하위 클래스(파생된 클래스, 자식 클래스)에서는 접근할 수 있습니다.


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 Parent {
protected :
    int id;
};
 
class Child : public Parent {
public :
    void set_id(int i) {
        // 클래스 외부에서 protected 멤버에 접근
        id = i;
    }
    void print_id() {
        cout << "ID : " << id << "\n";
    }
};
 
int main(void)
{
    Child child;
 
    child.set_id(10);
    child.print_id();
 
    return 0;
}
cs


ㅇ 실행 결과


ID : 10



이상 'C++ 클래스 접근 제한자'에 대해 알아보았습니다.

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

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



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

C++ 연산자 오버로딩  (2) 2018.10.12
C++ 함수 오버로딩  (0) 2018.10.11
C/C++ 메모리 동적할당  (0) 2018.10.11
C++ friend 클래스와 함수  (1) 2018.10.10
C++ 클래스와 객체  (0) 2018.10.09
C/C++ 구조체 사용법 및 예제  (1) 2018.10.08
C/C++ 배열 사용법  (0) 2018.10.05
C 파일처리  (0) 2018.10.02

C++ 클래스와 객체




안녕하세요 열코입니다.

저번 시간에 C/C++ 구조체에 대해 알아보았습니다. (구조체 공부하러가기)

이번시간에는 구조체와 비슷한 형태의 구조를 가진 클래스에 대해 알아보겠습니다.

(여담으로 C++이 세상에 나오기 전 C의 구조체를 모티브로 만든것이 C++의 클래스라고합니다.)


C++은 객체지향 프로그래밍의 대표적인 언어로써 객체지향 프로그래밍 언어의 구성요소인 클래스를 사용할 수 있습니다.


☞ 클래스(class)란?

사용자 정의 데이터 유형으로 데이터 멤버 및 멤버 함수가 포함되어 있으며, 

해당 클래스의 객체(Object 또는 Instance)를 생성하여 접근(Access)하고, 사용할 수 있습니다.


예를들어, 자동차라는 데이터 타입(변수)를 만들고자 할 때, 우리는 여러가지 변수와 함수 중 

바퀴의 수, 속도 제한, 주행 거리 등의 공통 속성을 찾아 만들어야 합니다.


또한 클래스가 정의 될 때 메모리에 할당되지 않으며 객체가 생성될 때 메모리가 할당됩니다.



 클래스 정의 및 객체 선언 방법?

클래스의 정의 방법은 구조체의 정의 방법과 유사합니다.

아래의 예제를 확인하세요.


1
2
3
4
5
6
7
8
9
10
11
12
using namespace std;
 
// 클래스 정의
class member {
 
};
 
int main(void) {
    member m1; // 객체 생성
    
    return 0;
}
cs


class라는 키워드를 사용하여 클래스를 정의하고, 일반 변수 선언하듯이 (int a;) 객체를 생성해서 사용할 수 있습니다.

하지만 구조체와 다른 점으로는 데이터 멤버에 접근 지정자를 지정해 줄 수 있습니다.

접근 지정자는 3가지로 나뉘는데


public, private, protected 이렇게 3가지로 나뉩니다.


public 멤버는 공개 데이터 맴버로 클래스 내부 및 외부에서도 객체를 통해 접근이 가능합니다.

private 멤버는 비공개 데이터 멤버로 클래스 내부에서만 접근이 가능합니다.

protected 멤버는 보호된 데이터 멤버로 상속된 클래스 한정 접근 가능합니다.

(protected에 대해서는 상속 시간에 더 자세히 알아보겠습니다. ^^)



public 및 private 접근 지정자는 아래와 같이 지정해 줄 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <string>
using namespace std;
 
class member {
private :
    int id;
    string name;
    
public :
    void print_name() {
        cout << name;
    }
 
};
 
int main(void) {
    member m1;
    
    return 0;
}
cs


☞ 클래스의 멤버 함수 정의 방법?

멤버 함수를 정의하는 방법은 두 가지가 있습니다.

첫번째는 내부 클래스 정의이며, 두번째는 외부 클래스 정의입니다.

내부 클래스 정의는 말 그대로 클래스 내부에 멤버 함수를 정의하는 것이고,

외부 클래스 정의는 :: 연산자(scope resolution)를 사용해야 합니다.

아래는 외부 클래스 정의의 예제 코드입니다.


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>
#include <string>
using namespace std;
 
class member {
private :
    int id;
    string name;
    
public :
    // 내부 클래스 정의
    void print_name() {
        cout << name;
    }
 
    // 외부 클래스 정의
    void print_id();
};
 
// 외부 클래스 정의
void member :: print_id() {
    cout << id;
}
 
int main(void) {
    member m1;
    
    return 0;
}
cs


☞ 생성자, 소멸자?

클래스는 객체가 인스턴스화(객체 생성) 될 때마다 컴파일러에 의해 호출되는 특수 메소드가 있는데,

바로 생성자 라는 함수입니다.

생성자, 소멸자에는 다음과 같은 유형이 있습니다.


1. 디폴트 생성자

2. 매개변수 생성자

3. 복사 생성자

4. 소멸자


처음 들으신 분들은 많이 생소하실수도 있지만 하나씩 설명해 나가겠습니다.



1. 디폴트 생성자

첫번째 디폴트 생성자는 사용자가 직접 생성자를 정의해 주지 않아도 알아서 만들어지는 생성자입니다.(눈에 보이진 않습니다.)

내부적으로 알아서 처리되는 녀석인데

이를 사용자가 직접 정의해 줄 수 있습니다.

아래 예제 코드는 디폴드 생성자 예제입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
 
class Point {
private :
    int x;
    int y;
    
public :
    // 디폴트 생성자
    Point() {
        x = 10;
        y = 15;
    }
    void print() {
        cout << "X : " << x << ", Y : " << y << "\n";
    }
};
 
int main(void) {
    Point p;
    p.print();    
}
cs


디폴트 생성자는 위와 같이 사용자가 직접 정의해 줄 수 있습니다.

함수 반환형은 없으며, 함수 이름은 클래스의 이름과 동일합니다.


2. 매개변수 생성자

두번째로 매개변수 생성자입니다.

매개변수 생성자를 통해 객체 생성 시 클래스 멤버 변수의 값을 초기화 할 수 있습니다.

아래 예제 코드는 매개변수 생성자 예제입니다.


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
#include <iostream>
using namespace std;
 
class Point {
private :
    int x;
    int y;
    
public :
    // 디폴트 생성자
    Point() {
        x = 10;
        y = 15;
    }
    // 매개변수 생성자
    Point(int x, int y) {
        this->= x;
        this->= y;
    }
    void print() {
        cout << "X : " << x << ", Y : " << y << "\n";
    }
};
 
int main(void) {
    Point p;
    p.print();    
 
    Point p2 = { 34 };
    p2.print();
}
cs


매개변수 생성자는 생성자 함수 매개변수로 값을 넘겨받아 클래스 멤버 변수를 초기화 할 때 사용합니다.

매개변수 생성자 안의 this 키워드는 클래스 자신의 객체를 가리키는 특수 키워드로써 자기자신을 의미한다고 생각하시면 됩니다.



3. 복사 생성자

복사 생성자는 기존의 객체를 복사하여 새로운 객체를 생성합니다. 컴파일러는 모든 클래스의 기본 복사 생성자를 제공합니다.


1
2
3
4
5
6
7
int main(void) {
    Point p;
    p.print();    
 
    Point p2 = p;
    p2.print();
}
cs


Point p2 = p; 에서처럼 컴파일러에서 제공하는 디폴트 복사 생성자를 호출하는 모습입니다.

나중에 시간이 되면 이 복사 생성자에 대해서도 자세히 알아보도록 하겠습니다!


4. 소멸자

소멸자는 객체의 사용이 모두 끝날 때 컴파일러에서 호출하는 특수 멤버 함수입니다.

생성자와 같이 디폴트 소멸자가 기본적으로 생성됩니다.

보통 클래스 내에서 동적 할당한 메모리를 해제할 때 유용하게 사용됩니다.


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
#include <iostream>
using namespace std;
 
class Point {
private :
    int x;
    int y;
    
public :
    // 디폴트 생성자
    Point() {
        x = 10;
        y = 15;
    }
    // 매개변수 생성자
    Point(int x, int y) {
        this->= x;
        this->= y;
    }
 
    // 디폴트 소멸자
    ~Point() {
        cout << "소멸자 호출\n";
    }
    void print() {
        cout << "X : " << x << ", Y : " << y << "\n";
    }
};
 
int main(void) {
    Point p;
    p.print();    
 
    Point p2 = p;
    p2.print();
}
cs



이상 '클래스와 객체'에 대해 알아보았습니다.

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

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



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

C++ 함수 오버로딩  (0) 2018.10.11
C/C++ 메모리 동적할당  (0) 2018.10.11
C++ friend 클래스와 함수  (1) 2018.10.10
C++ 클래스 접근제한자  (0) 2018.10.10
C/C++ 구조체 사용법 및 예제  (1) 2018.10.08
C/C++ 배열 사용법  (0) 2018.10.05
C 파일처리  (0) 2018.10.02
C++ 벡터 사용법  (2) 2018.09.26

to Top