-
c++ class, parameter types대학/자료구조 2022. 10. 16. 14:48
이번 포스트는 앞으로 자료구조 포스팅에서 사용할 c++ 기초 문법을 정리하고자 한다.
(100% 커버는 못하고, 간단한 문법만 정리하고 나머지는 그 때 가서 정리하자)
// rgb.h class RGB { public: // 생성자 RGB(char _red[] = (char *)"red", char _green[] = (char *)"green", char _blue[] = (char *)"blue"); // 파괴자 ~RGB(); void set_rgb(char _red[], char _green[], char _blue[]); char *&get_red(); char *&get_green(); char *&get_blue(); private: char *red; char *green; char *blue; };
// rgb.cpp #include <iostream> #include <stdlib.h> #include <cassert> #include "rgb.h" using namespace std; RGB::RGB(char _red[], char _green[], char _blue[]){ assert(strlen(_red) < 100); assert(strlen(_green) < 100); assert(strlen(_blue) < 100); red = new char[100]; green = new char[100]; blue = new char[100]; strcpy(red, _red); strcpy(green, _green); strcpy(blue, _blue); } RGB::~RGB() { delete[] red; delete[] green; delete[] blue; } void RGB::set_rgb(char _red[], char _green[], char _blue[]) { assert(strlen(_red) < 100); assert(strlen(_green) < 100); assert(strlen(_blue) < 100); strcpy(red, _red); strcpy(green, _green); strcpy(blue, _blue); } char *&RGB::get_red() { return red; } char *&RGB::get_green() { return green; } char *&RGB::get_blue() { return blue; }
#include <iostream> #include <stdlib.h> #include "rgb.h" using namespace std; int main(int argc, char const *argv[]) { RGB myrgb((char *)"red string"); cout << myrgb.get_red() << endl; cout << myrgb.get_green() << endl; cout << myrgb.get_blue() << endl; myrgb.set_rgb((char *)"Hello", (char *)"world", (char *)"!!!!!"); cout << myrgb.get_red() << endl; cout << myrgb.get_green() << endl; cout << myrgb.get_blue() << endl; return 0; }
위의 코드를 하나씩 뜯어보면서 알아보자.
- class
상속에 대해서는 일단 넘어가겠습니다.
클래스는 public 멤버와 private 멤버로 나뉘는데,
public 멤버들은 class의 private 멤버에 접근할 수 있도록 하는 인터페이스 함수(getter, setter function)나,
데이터를 요리조리 바꿀 수 있게 해주는 함수, 연산자 오버로딩 등을 구현할 수 있다.
private 멤버들은 class에서 사용할 데이터를 저장하거나, 상태를 저장하는 등의 기능을 수행하는 변수나,
class 내부에서만 사용할 유틸 함수 등을 정의하는데 사용한다.
일반적으로 헤더 파일(.h) 에 클래스와 멤버 변수, 함수 등을 '선언' 하고,
함수에 대한 설명과 pre, postcondition을 주석으로 달아놓는다.
그리고 헤더 파일과 동일한 이름의 .cxx(.cpp or .cc)파일에 클래스의 멤버 함수를 '구현'한다.
구현 방법은 위 코드를 보시면 감이 오실겁니다.
- parameter
매개 변수 전달법은 크게 세가지가 있다.
1. Value parameter
void swap(int a, int b) { int temp = a; a = b ; b = temp ; } … x=1; y=0; swap(x,y) ; cout << x << endl; // 1 cout << y << endl; // 0
이 경우에는 x, y의 값이 a, b에 복사가 되서 넘어간다.
즉, 함수 내부에서 이뤄지는 일은 외부에서 호출한 인자(argument)에 반영되지 않는다.
2. Reference parameter
void swap(int &a, int &b) { int temp = a; a = b ; b = temp ; } … x=1; y=0; swap(x,y) ; cout << x << endl; // 0 cout << y << endl; // 1
이 경우에는 x, y 자체가 a, b 자리에 들어간다고 이해하면 된다.
즉, 함수 내부에서 이뤄지는 일은 외부에서 호출한 인자에도 반영된다.
구현은 포인터를 통해 이루어져 있다고 한다.
3. Const reference parameter
void swap(const int &a, const int &b) { int temp = a; a = b ; // error b = temp ; // error } … x=1; y=0; swap(x,y) ; cout << x << endl; // 1 cout << y << endl; // 0
이 경우에는 reference parameter 방식으로 인자를 넘겨주는데, 함수에서는 그 인자를 const 취급한다.
즉, 함수 내부에서 인자로 받은 매개변수를 변경할 수 없다.
따라서 함수 외부에서 호출한 인자에 반영되지 않는다.
이 경우는 Value parameter와 거의 동일한데, 이 방법을 쓰는 이유는 값 전달의 효율성 때문이다.
value 방식으로 전달하는 경우에는 값이 복사가 되기 때문에, 전달하려는 인자가 class 이거나 크기가 매우 큰 배열의 경우
복사하는데 시간이 오래 걸려 성능이 저하된다.
하지만 const reference로 전달하는 경우에는 위에서 언급했 듯 reference 타입은 포인터로 구현되었기 때문에,
전달하려는 인자의 크기가 얼마나 크든 상관없이 8bytes만 복사되기에 성능 저하의 염려가 없다.
인자 전달 방법에 세 종류가 있다고 했지만, 함수의 리턴 값 전달 방식도 위와 마찬가지로 세 종류로 나눌 수 있다.
private: char *red; ... char *&RGB::get_red() { return red; }
위 코드에서 가져온건데, 이 경우에는 reference로 리턴해준 것이다.
(char *) 형식을 리턴할 건데 &(reference)로 리턴해 주겠다... 라고 이해하면 될 것이다.
'대학 > 자료구조' 카테고리의 다른 글
Linked list (0) 2022.10.17 Dynamic array (0) 2022.10.17 Static array (0) 2022.10.16 c++ operator overloading (0) 2022.10.16 Pre, Postcondition (0) 2022.10.15