코린이의 개발 일지

[c++ 문법] 클래스 (class) 사용하기 - 생성자, public, private 본문

프로그래밍 언어 문법/c++ 문법 정리

[c++ 문법] 클래스 (class) 사용하기 - 생성자, public, private

폴라민 2021. 9. 29. 01:32
반응형

(주의) 정말 기본 문법만을 다룹니다. 저도 처음 접하는 거라 체계가 그다지 잡혀있지 않습니다. 참고만 하세요.

 

쌩초보의 씨쁠쁠 클래스 공부 도전기 입니다.

 

 

우선 구조를 간단히 살펴 볼까요?

 

더럽게 복잡하죠? 저도 그렇게 생각합니다.

 

우선 간단히 생각해 보자면 클래스는 이름이 있고 그 안에 

- 멤버변수

- 멤버함수

로 구성되어 있다고 알고 넘어 갑시다.

 

아 클래스 다룰때 주의할 점.

 

함수와는 달리 클래스 닫는 괄호 } 뒤에 ; 세미콜론 꼭 붙여줘야한다. (이것 때문에 에러가.... )

 

우선 전혀 간단하지 않아보이는 기본 코드 부터 살펴 봅시다.

 

#include <iostream>
#include <string>
using namespace std;

class calculator{
private: // 생략 가능함.
    int num1; // calculator라는 클래스 내에서 사용할 변수 선언
    int num2; // 멤버 변수라고 부른다.

public: // 생략 불가
    calculator(int a, int b) { // 생성자 (constructor)
        // 생성자 란?
        // 객체 생성과 동시에 멤버 변수를 초기화해주는 멤버 함수
        num1 = a;
        num2 = b;
    }
    int add() { return (num1 + num2); } // 멤버 함수
    int minus() { return(num1 - num2); } // 멤버 함수
    int mul() { return(num1 * num2); } // 멤버 함수
};

int main()
{
    calculator cal(3, 4); // cal이라는 이름의 객체 생성. 
    // 3과 4라는 인자를 넘겨주면 생성자에서 num1=3, num2=4로 초기화 해줌.

    cout << "3과 4를 더하면: " << cal.add() << "이다." << endl;
    // class 내에 있는 add라는 멤버 함수 호출 

    cout << "3에서 4를 빼면: " << cal.minus() << "이다." << endl;
    cout << "3과 4를 곱하면: " << cal.mul() << "이다." << endl;

    return 0;
}

 

우선 c++의 기본

iostream 헤더 파일과 namespace std 를 가져 옵시다. 

그다음 클래스가 나오죠?

 

저는 계산기 클래스를 만들어보았습니다. 이름을 calculator라고 짓고 private, puplic을 구분해 줍니다. 

 

private, public은 지시 제어자 라는 이름을 가진 녀석들인데

간단히 말해서 private은 클래스 내에서만 접근 가능하도록 하는 것이고 public은 클래스 외부에서 호출 가능한 것들입니다.

 

주로 클래스 내부에서 사용할 변수들을 private에 넣어 둔다고 생각하시면 될 것 같아요.

 

그럼 public을 한번 봅시다. 뭐가 많죠?

우선 constructor, 생성자 라는 게 있네요.

 

 생성자 란?
        객체 생성과 동시에 멤버 변수를 초기화해주는 멤버 함수

 

라고 써져있는데, 대체 뭔소리냐면

 

이거는 main 함수를 보면 정체를 대충 알 수 있습니다.

calculator cal(3, 4); // cal이라는 이름의 객체 생성. 
    // 3과 4라는 인자를 넘겨주면 생성자에서 num1=3, num2=4로 초기화 해줌.

이거 보이시나요? num1과 num2는 클래스 내에 private공간에 있기 때문에 생성자, 혹은 클래스 내에 public내에 있는 다른 함수를 통해서만 접근할 수 있습니다.

 

생성자 내에 코드를 보면 num1과 num2를 매개변수로 초기화 해주는 것을 볼 수 있습니다.

 

자 그러면 아니 그냥 함수라고 하면 되지 왜 생성자라고 하느냐? 

클래스 내에 그냥 함수와 생성자의 차이점이 뭘까요?

 

자 우선 생성자는 내가 만든 클래스와 이름이 완벽히 동일해야 하는 규칙이 있습니다.

이름이 같지 않은 함수를 만들면 그건 생성자가 아니라는 뜻이죠

 

그리고 생성자를 우리가 굳이! 만들지 않아도 클래스가 자동으로 생성자를 만듭니다. 아무것도 없는 그런 생성자를 말이죠.

 

그리고 메인 함수에서 호출할 때 달라집니다.

 

#include <iostream>
#include <string>
using namespace std;

class calculator {
private: // 생략 가능함.
    int num1; // calculator라는 클래스 내에서 사용할 변수 선언
    int num2; // 멤버 변수라고 부른다.

public: // 생략 불가
    int calcu(int a, int b) { 
        num1 = a;
        num2 = b;
        return 0; // 생성자는 return값이 없어도 되지만 그외 함수는 반드시 return 값이 존재해야한다.
    }
    int add() { return (num1 + num2); } // 멤버 함수
    int minus() { return(num1 - num2); } // 멤버 함수
    int mul() { return(num1 * num2); } // 멤버 함수
};

int main()
{
    calculator cal; // cal이라는 이름의 객체 생성. 
    cal.calcu(3, 4);
    // 3과 4라는 인자를 넘겨주면 calcu 함수에서 num1=3, num2=4로 초기화 해줌.

    cout << "3과 4를 더하면: " << cal.add() << "이다." << endl;
    // class 내에 있는 add라는 멤버 함수 호출 

    cout << "3에서 4를 빼면: " << cal.minus() << "이다." << endl;
    cout << "3과 4를 곱하면: " << cal.mul() << "이다." << endl;

    return 0;
}

 

calcu라는 이름으로 즉 클래스와 이름이 다르게 함수명을 바꾸었죠? 앞에 int도 붙여 주었습니다. 

이제 생성자가 아닌 int형을 반환하는 calcu라는 이름의 함수가 되었습니다.

 

똑같이 초기화 해주는 역할을 하지만 함수의 형태도 다르고 메인함수에서 클래스 호출하는 명령어도 좀 달라졌죠?

 

cal이라는 객체를 생성할 때 바로 인자값을 넘겨주면 에러가 납니다.

class 내에 생성자가 없으면 컴파일러가 자동으로 생성자를 형성하기는 하지만

calculator(){

}

형태가 이래요. 아무것도 없습니다. 따라서 객체 생성하면서 자동으로 생성자 호출이 되고 우리가 만든 calcu라는 함수가 자동 호출 되지는 않습니다.

 

class객체를 만든 후, 우리가 만든 함수를 호출해주고 인자도 넘겨 주어야 합니다.

 

 

똑같은 코드를 아래와 같이 작성할 수도 있습니다.

 

#include <iostream>
#include <string>
using namespace std;

class calculator{
private: 
    int num1; 
    int num2; 

public: // 생략 불가
    calculator(int, int);
    int add(); // 멤버 함수
    int minus(); // 멤버 함수
    int mul(); // 멤버 함수
};

calculator::calculator(int a, int b) { // 생성자 (constructo)
    cout << "생성자 호출" << endl;
    num1 = a;
    num2 = b;
}

int calculator::add() {
    cout << endl << "덧셈 계산기 작동" << endl;
    return(num1 + num2);
}

int calculator::minus() {
    cout << endl << "뺄셈 계산기 작동" << endl;
    return(num1 - num2);
}

int calculator::mul() {
    cout << endl << "곱셈 계산기 작동" << endl;
    return(num1 * num2);
}

int main()
{
    calculator cal(3, 4); 

    cout << "3과 4를 더하면: " << cal.add() << "이다." << endl;
    cout << "3에서 4를 빼면: " << cal.minus() << "이다." << endl;
    cout << "3과 4를 곱하면: " << cal.mul() << "이다." << endl;

    return 0;
}

 

 

별다를건 없고 class 내에서는 함수들 선언만 해주고 class 외부에서 class 지정하고 따로 함수 써준거죠.

 

쓰기 편한 방향으로 작성하시면 될 것 같습니다.

 

 

그럼 class 기본은 여기까지 하도록 하겠습니다.

반응형
Comments