cpp

[C++] 클래스 상속(inheritance) 및 다중 상속
·
Language/C & C++
상속 상속이란 기반 클래스(base class)의 속성과 기능을 파생 클래스(derived class)에 물려주는 것이다. 즉 파생 클래스에서는 기반 클래스의 멤버 변수와 멤버 함수를 사용할 수 있다. 단 기반 클래스의 멤버 변수와 멤버 함수의 접근지정자가 private이면 파생 클래스에서 접근이 안된다. 상속을 통해서 기반 클래스에 있는 멤버 변수와 멤버 함수를 그대로 사용할 수 있으니 파생 클래스에서는 멤버 변수와 함수를 간결하게 작성할 수 있고, 클래스들 간 구조적 관계를 파악하기도 용이하다는 장점이 있다. 또한 클래스 재사용도 쉬워진다.클래스 상속 기본 문법은 다음과 같다.class DerivedName : accessmodifier BaseName { ....};accessmodifier ..
[C++] 연산자 오버로딩(operator overloading)
·
Language/C & C++
연산자 C++ 에서 연산자는 다양한 자료형에 대응하여 연산을 진행한다. 예를들어 int 형과 int 형을 더하면 각 숫자를 더하여 반환하고, 문자열과 문자열을 더하면 각 문자열을 이어서 반환한다. 기본 자료형이 아니라 클래스에 대해서도 다른 연산을 진행하는 경우가 있다. 예를 들어 std::cout 은 연산자 오버로딩은 클래스 내부에서 정의되어 위 예시처럼 사용될 수도 있고, 전역에서 정의되어 사용할 수도 있다. 그러나 전역에서 사용되려면 friend 를 알아야 제대로 사용할 수 있다. 클래스 내 연산자 오버로딩 연산자 오버로딩은 클래스 내에서 진행된다. 선언하는 문법은 다음과 같다.return_datatype operator operator_name(parameter);operator_name 에 연산..
[C++] 프렌드(friend)를 통한 클래스 멤버 접근
·
Language/C & C++
멤버 접근 접근 지정자(참고 링크)를 통해 클래스 내의 멤버에 대해서 접근을 금지하거나 허용할 수 있었는데, private 나 protect 로 설정되어 접근이 막힌 클래스 멤버에 대해 클래스의 멤버 함수가 아니라 다른 함수에서 접근이 필요할 수 있다. 특히 서로 다른 클래스에 대한 연산을 함수로 구현한다면, 이때 사용되는 클래스들의 멤버 변수 접근이 막혀있는데, 접근이 필요할 수 있다. 멤버 변수 접근을 public 으로 풀어버릴 수도 있지만, 이 경우 클래스의 은닉성을 깨는 것이기 때문에 권장되지 않는다. 이때 사용하는 것이 friend 이다.클래스 내에서 friend 를 이용하여 접근을 허용해주어 클래스에서 접근이 금지되었던 멤버에 접근할 수 있게 한다. 이때 전역변수, 다른 클래스의 멤버 함수, ..
[C/C++] 헤더파일 분할 작성과 헤더파일 중복 선언 방지
·
Language/C & C++
헤더파일 분할 작성 C 나 C++ 에서나 동일하게 작동하나 클래스를 활용하는 C++ 중심으로 설명하겠다.클래스나 함수 등을 선언부, 구현부로 나누고, 이 파일을 분리해서 작성하면 재사용이 가능하다는 장점이 있다. 선언부는 헤더파일(.h)로 작성하고, 구현부는 cpp 파일로 작성하며, main 함수와 전역 함수, 변수 등은 또 다른 cpp 파일에 작성해 컴파일하면서 병합하는 것이다.예를 들어 계산기 클래스를 만들고, 이를 실행하는 프로그램을 구현한다면, 다음과 같이 파일을 나누어서 작성할 수 있다.// Calculator.hclass Calculator{public: int add(int a, int b); int sub(int a, int b); int mul(int a, int b); ..
[C++] 얕은 복사(shallow copy)와 깊은 복사(deep copy) 그리고 복사 생성자
·
Language/C & C++
얕은 복사와 깊은 복사 얕은 복사 (Shallow Copy)객체를 복사할 때 객체의 멤버 변수를 단순히 복사하는 방식이다. 단순한 기본 자료형이 멤버 변수일 때는 문제가 없지만, 멤버 변수가 포인터 변수라면 포인터 변수의 값을 복사하기 때문에, 즉 주소값을 복사하기 때문에 문제가 생길 수 있다. 주소값을 복사했기 때문에 원본 객체와 복사된 객체의 해당 포인터 멤버 변수는 같은 주소를 가리키고 있고, 하나의 객체에서 해당 변수가 가리키고 있는 값에 대한 수정이 이루어지면 다른 객체에까지 영향을 미치게 된다.예를 들어 다음 코드를 확인하자.#include using namespace std;class ShallowCopy {public: int* data; ShallowCopy(int val) {..
[C++] 값에 의한 호출(call by value)과 주소에 의한 호출(call by address) 그리고 참조에 의한 호출(call by reference)
·
Language/C & C++
값에 의한 호출 (Call by Value) 함수가 호출되면 매개변수가 스택에 생성된다. 호출하는 코드에서 값을 넘겨주고, 넘어온 값이 매개변수에 복사된다.값에 의한 호출로 객체를 전달하면 객체 이름만 사용한다. 함수의 매개변수 객체를 생성하는데, 이때 매개변수 객체의 생성자는 호출되지 않는다. 단 함수가 종료될 때 매개변수 객체의 소멸자는 호출된다.값에 의한 호출은 해당 값이 복사되어 사용되기 때문에 매개변수로 들어가는 원본 데이터는 함수 내에서의 일에 변화를 받지 않는다.예를 들어 다음 코드를 보자.#include using namespace std;void swap(int a, int b) { int temp = a; a = b; b = temp;}int main() { int..
[C++] 동적 메모리 할당 및 반환
·
Language/C & C++
동적 메모리 할당 정적으로 메모리를 할당하면 간편하고, 메모리 누수와 같은 부분을 신경쓰지 않아도 된다는 장점이 있지만, 할당된 메모리 크기가 말 그대로 정적이라 조절이 불가능해서 메모리가 추가로 필요할 때 대응이 어렵다. 따라서 동적으로 메모리를 할당하여 프로그램이 동작하는 중에 할당 메모리의 크기를 조절하는 방식이 필요하다.C 에서는 malloc, calloc, realloc 을 이용하여 동적 메모리 할당을 하였고, C++ 에서도 cstdlib 를 include 하여 사용할 수 있지만, 다른 방법으로도 동적 메모리 할당이 가능하다.참고로 정적 할당된 메모리는 스택 메모리를 사용하고, 동적 할당된 메모리는 힙 메모리를 사용한다. 또 추가로 C99 에서 표준으로 도입되었던 VLA(variable leng..
[C++] 클래스(class)와 객체(object) 선언
·
Language/C & C++
클래스와 객체 선언 및 접근 클래스는 객체를 생성하기 위해 정의된 틀이다. 구조체와 유사하나 멤버 함수, 상속 등의 개념이 더해져있다. 클래스 내부에서는 멤버 변수와 멤버 함수 선언이 이루어진다. 멤버 변수 초기화값을 설정하여 멤버 변수의 초기값을 정해줄 수 있다.객체는 클래스를 통해 생성된 것이다. 멤버 변수와 멤버 함수로 구성되며 메모리에 생성된다. 실체(instance)라고도 부른다. 하나의 클래스를 통해 여러 개의 객체 생성이 가능하며, 이렇게 생성된 객체들은 각각 별도의 메모리 공간에 할당된다.클래스 선언부(declaration)는 class 키워드와 함께 앞서 언급한 바와 같이 멤버 변수와 멤버 함수의 선언으로 이루어진다. 클래스 구현부(implementation)에서는 클래스에 선언된 멤버 ..
애스터로이드
'cpp' 태그의 글 목록 (2 Page)