C++/C++ 기본 40

복사 생성자

복사 생성자 1. 얕은 복사와 깊은 복사 복사란 원본과 동일한 별개의 사본을 만드는 것이다. 복사를 자세히 살펴보면 얕은 복사(shallow copy)와 깊은 복사(deep copy)로 구분할 수 있다. 어린이가 장난감을 가지고 있다고 하자. 얕은 복사의 경우에는 어린이만 복사를 하고 장난감은 복사를 하지 않는다. 얕은 복사 후, 두 어린이는 장난감을 서로 자기 것이라고 아는 충돌이 생긴다. 이와 달리 깊은 복사는 원본이 소유한 모든 것까지 복사한다. 깊은 복사가 이루어지면 어린이가 소유한 장난감도 복사되므로 얕은 복사에서 생기는 충돌은 발생하지 않는다. - 객체의 얕은 복사와 깊은 복사 얕은 복사와 깊은 복사는 C++의 객체 복사에도 존재한다. 어떤 복사 방식을 사용하느냐에 따라 복사 결과에 심각한 차..

C++/C++ 기본 2018.07.27

참조와 함수

참조와 함수 1. 참조 개념 C++에서는 C 언어에 없는 참조(reference)개념을 도입하였다. 포인터 변수를 선언하기 위해 * 기호를 사용하지만, 참조 변수를 선언하기 위해서는 & 기호를 사용한다. &를 참조자라고 부른다. C++에서 참조는 다음과 같이 활용된다. 1) 참조 변수2) 참조에 의한 호출3) 함수의 참조 리턴 2. 참조 변수 1) 참조 변수 선언 참조 변수는 이미 선언된 변수(원본 변수로 지칭)에 대한 별명으로서, 참조자(&)를 이용하여 선언하며, 선언 시 반드시 원본 변수로 초기화하여야 한다. 다음은 두개의 참조 변수 refn과 refc를 선언하는 코드이다. i.e.int n = 2;int &refn = n; //참조 변수 refn 선언. refn은 n에 대한 별명으로, 둘은 동일한 ..

C++/C++ 기본 2018.07.27

객체 치환 및 객체 리턴

객체 치환 및 객체 리턴 1. 객체 치환 객체 치환 시 객체의 모든 데이터가 비트 단위로 복사된다. 다음 예를 보자. i.e.Circle c1(5); //반지름 값 = 5Circle c2(30); //반지름 값 = 30c1 = c2; //c2 객체를 c1 객체에 비트 단위로 복사한다. c1의 반지름이 30이 된다. 객체 치환 후 c1과 c2의 내용이 완전히 같다. 그러나 c1, c2가 하나의 객체가 되는 것은 아니다. c1과 c2는 별개이며 내용물만 같을 뿐이다. 객체 치환(assignment)은 동일한 클래스 타입에 대해서만 적용된다. 2. 함수의 객체 리턴 C++에서 함수가 객체를 리턴하는 경우를 보자. 다음은 Circle 클래스의 객체를 리턴하는 getCircle() 함수이다. i.e.Circle ..

C++/C++ 기본 2018.07.26

함수 호출 시 객체 전달

함수의 인자 전달 방식 - 값에 의한 호출과 주소에 의한 호출의 특징 값에 의한 호출(call by value)은 실인자의 값을 복사하여 전달하므로, 함수 내에서 실인자를 손상시킬 수 없는 장점이 있다. 그러므로 함수 호출에 따른 부작용(side-effect)은 없다. 반면, 주소에 의한 호출(call by pointer)은 실이자의 주소를 넘겨주어 의도적으로 함수 내에서 실인자의 값을 변경하고자 할 때 이용된다. C++에서는 이들 외에 참조에 의한 호출(call by reference)을 추가하였다. 1. 함수 호출시 객체 전달 C++에서는 함수의 객체를 전달할 수 있으며, 이것은 int, char등 기본 타입의 값을 전달하는 것과 여러 가지 면에서 다르다. 1) 값에 의한 호출로 객체 전달 - 값에 ..

C++/C++ 기본 2018.07.26

cin.getline()과 getline()의 차이점

cin.getline()과 getline()의 차이점 c++를 공부하다보면 "cin.getilne()" 함수와 "std::getline()" 함수를 마주하게 된다. 둘다 "getline()'이라는 이름의 함수이고, 문자열을 입력 받는데에 사용된다. 그래서인지 흔히들 두 함수를 혼동한다. cin.getline() 함수는 문자 배열이며 마지막 글자가 0(terminator)인 c-string을 입력 받는데에 사용한다. 이에 반해, std::getline() 함수는 원하는 구분자(delimiter)를 만날 때 까지 모든 문자들을 입력 받아서 하나의 string 객체에 저장한다.

C++/C++ 기본 2018.07.24

this 포인터

this 포인터 1. this의 기본 개념 this는 객체 자신에 대한 포인터로서 클래스의 멤버 함수 내에서만 사용된다. this는 전역 변수도 아니고 함수 내에 선언된 지역 변수도 아니다. 정확히 말하자면, this는 객체의 멤버 함수가 호출될 때, 컴파일러에 의해 보이지 않게 전달되는 객체에 대한 주소이다. this 포인터를 이용하여 Circle 클래스를 작성하면 다음과 같은 형태가 된다. i.e.class Circle {int radius;public:Circle() { this->radius = 1; }Circle(int radius) { this->radius = radius; }void setRadius(int radius) { this.radius = radius; }...}; 2. this..

C++/C++ 기본 2018.07.17

객체와 객체 배열의 동적 생성 및 반환

객체와 객체 배열의 동적 생성 및 반환 1. 객체의 동적 생성 및 반환 기본 타입 변수와 마찬가지로, new와 delete를 이용하여 객체를 동적으로 생성하고 반환할 수 있다. - new를 이용한 객체의 동적 생성과 생성자 다음은 new 연산자를 이용하여 객체를 동적 생성하는 구문이다. 클래스_이름 *포인터_변수 = new 클래스_이름; //기본 생성자 호출클래스_이름 *포인터_변수 = new 클래스_이름(생성자_매개_변수_리스트); //매개 변수 있는 생성자 호출 new는 클래스 크기의 메모리를 할당받아 객체를 생성하며, 이때 생성자를 호출한다. 앞의 첫 번째 형식의 경우기본 생성자가 호출되며, 두 번째의 경우 매개 변수를 가진 생성자가 호출된다. - delete를 이용한 객체 반환과 소멸자 동적으로 ..

C++/C++ 기본 2018.07.17

동적 메모리 할당 및 반환

동적 메모리 할당 및 반환 1. 동적 메모리 할당 일반적으로 개발자는 프로그램 작성 단계에서 필요한 메모리를 확보하기 위해 변수, 객체, 배열을 정적으로 선언한다. 하지만, 문서 편집기나 그래픽 편집기를 개발하는 경우, 몇 줄의 텍스트를 입력할 것인지, 몇 개의 도형을 그릴 것인지 사용자의 마음에 달려 있기 때문에, 필요한 메모리를 프로그램을 작성하는 단계에서 모두 선언을 하는 것은 불가능하다고 할 수 있다. 물론, 크기가 작은 프로그램의 경우 가능할 수는 있겠지만, 프로그래머가 언제나 크기가 작은 프로그램만 만들지는 않을 뿐더러, C 프로그래밍을 해본 사람들은 알겠지만 포인터를 사용하다보면 동적 할당이 반드시 필요한 상황들이 생기고는 한다. 그렇기에, C++에서는 동적으로 메모리를 할당하고, 다 쓰고나..

C++/C++ 기본 2018.07.16

다차원 객체 배열

다차원 객체 배열 C++에서는 2차원, 3차원 등 다차원 객체 배열을 만들 수 있다. 예를 들어 2행 3열의 2차원 객체 배열은 다음과 같이 선언한다. i.e.Circle circles[2][3]; //2행 3열의 2차원 객체 배열 생성 2차원 배열도 일차원 배열과 동일하게, 각 원소 객체가 생성될 때 기본 생성자 Circle()이 실행된다. 또한, 2차원 배열도 1차원 배열처럼 []를 사용해서 원하는 원소에 접근한다. 다만, 2차원 배열의 경우에는 []를 2개 사용한다. i.e.circles[0][0].setRadius(1);circles[0][1].setRadius(2);circles[0][2].setRadius(3);circles[1][0].setRadius(4);circles[1][1].setRa..

C++/C++ 기본 2018.07.07

객체 배열

객체 배열 1. 객체 배열 선언 및 활용 C++에서 객체의 배열을 선언하는 방법을 알아보자. 객체 배열은 원소가 객체라는 점을 빼고, int, char 등 기본 타입의 배열을 선언하고 활용하는 방법과 동일하다. 다음 예제 코드를 보도록 하자. i.e.#include using namespace std; class Circle {int radius;public:Circle() { radius = 1; } //클래스 선언부에서 구현 -> 컴파일 시에 인라인 함수로 변환Circle(int r) { radius = r; }void setRadius(int r) { radius = r; }double getArea();}; double Circle::getArea() {return 3.14 * radius * r..

C++/C++ 기본 2018.07.07