본문 바로가기

Programming

[C++의 특징 - 4] 구조체와 클래스 (Structure & Class) 1. C언어에서의 구조체 : 구조체란 다른 타입을 가지는 변수들을 하나의 이름으로 묶어둔 것이라고 할 수 있다. 그럼 구조체를 왜 사용할까? 구조체는 관련있는 데이터를 하나의 자료형으로 묶어서, 프로그램의 구현 및 관리가 용이 해진다는 장점을 가지고 있기 때문이다. C언어에서 구조체에 대한 불만이라고 한다면, 구조체를 기본 자료형으로 인식해 주지 않는다는 점이다. 아래 예제를 보자. //Person이라는 사용자 정의 자료형 (Structure) struct Person{ int age; char name[10]; }; int main() { int a =10; Person P //C에서는 에러가 난다. return 0; } 2. C++에 와서 달라진점? C++로 넘어오면서 구조체 사용에 대해 달라진점이 .. 더보기
[C++] 상속 첫번째, 멤버 이니셜라이저 (Member Initializer) 와 Protected 우선 다음의 상속이 구현된 소스 코드를 보고 문제점이 무엇인지 알아 보자. #include using namespace std; class Person { int age; char name[20]; public: int GetAge() const { return age; } const char* GetName() const { return name; } Person(int _age=1, char* _name="noname"){ age=_age; strcpy(name, _name); } }; class Student: public Person { char major[20]; //전공 public: Student(char* _major){ strcpy(major, _major); } const char* G.. 더보기
[C++] 상속과 다형성 (Inheritance & Polymorphism) 우선 여기서는 상속과 다형성에 대한 간단한 의미만 정리 하고 넘어갈 것입니다. 다음에 상속과 다형성에 대해서 더 자세한 포스팅을 할 것입니다. 상속 (Inheritance) : 상속은 기존의 클래스를 토대로 해서 새로운 클래스를 만드는 방법이라고 할 수 있다. 객체지향 프로그래밍을 사용해서 워드 프로세서를 만드는 경우를 생각해보자. 고객으로부터 웹페이지 형식으로 문서를 저장할 수 있게 요구 받았다고 하면, 이때는 문서 저장과 관련된 기존의 클래스를 조금 개조해서 웹 페이지 형식으로 저장하게 만들 수 있다. 이렇게 기존의 클래스를 조금 고쳐서 새로운 클래스를 만들고 싶을 때 상속을 사용할 수 있다. 일상생활에서의 상속은 부모의 재산이나 부채를 그대로 이전하는 것을 의미하는데, 객체지향 프로그래밍에서의 상속.. 더보기
[C++] Explicit과 Mutable explicit : explicit이라는 키워드는 명시적 호출만을 허용하겠다는 것이다. 예제를 통해 알아 보자. #include using namespace std; class AAA { public: explicit AAA(int n){ cout 더보기
[C++] 클래스와 static C 에서의 static : C언어에서 static을 사용했던 이유는 전역변수는 프로그램어느 곳에서 접근 가능하지만, 지역변수에다가 static을 붙여주면, 지역변수가 전역변수의 특성을 지니게 하면서 접근할 수 있는 범위에 제한을 둔다는 특징이 있기 때문이었다. Class, Static 멤버의 등장 : C++에서는 전역이라는 개념이 존재하지 않는다. 그럼 왜 C++은 왜 전역을 쓰지 않나? 기본적으로 전역변수는 접근 범위가 제한되어 있지 않기 때문에 프로그램 관리가 어려운 점도 있지만, 근본적으로 OOP에서는 전역이라는 개념이 존재하지 않기 때문이다. 그래서 전역 변수와 전역 함수를 일부 대체하기 위해서 static 멤버 라는 개념이 등장한 것이다. #include using namespace std; i.. 더보기
[C++] 클래스에서의 멤버 변수, 멤버 함수의 상수화 (const의 사용법) 일단 const에 대해서는 이미 언급을 해 놓았죠. [C/C++] 콘스트(const)란? (←링크 참조) 그럼 C++에서 클래스라는 곳에서는 어떻게 쓰이는지 한번 알아 보도록 하겠습니다. const 멤버 변수 : 우선 예제를 먼저 보도록 하겠습니다. #include using namespace std; class Student { const int id; int age; char name[20]; char major[30]; public: Student(int _id, int _age, char* _name, char* _major) { id=_id; //에러 age=_age; strcpy(name, _name); strcpy(major, _major); } void ShowData() { cout 더보기
[C++의 특징 -5] This 포인터와 Friend This 포인터란? : This Pointer란 객체가 멤버함수를 호출할 때 자동으로 멤버함수에게 전달되는 포인터이며, 호출한 객체를 가리키는 포인터를 말한다. 흔히 자기 참조 포인터(자기 자신을 가리킬 수 있는 포인터)라고 불리우며, 멤버 함수에게만 this pointer가 전달된다.(Friend 함수는 멤버 함수가 아니므로 this pointer가 전달되지 않는다. Static 함수도 마찬가지이다.) 아래의 예제를 보면 금방 감이 올것이다. #include using namespace std; class Person { public: Person* GetThis(){ return this; //this 포인터를 리턴. } }; int main() { Person *p1 = new Person(); c.. 더보기
[C++] 생성자와 소멸자 (Constructor & Destructor) - 두번째 저번 포스팅에 이어 두번째로 이번에는 소멸자에 대해서 얘기해 보겠습니다. 우선 소멸자를 이야기 하기 전에 객체가 소멸되는 시점에 관해서 언급 해보도록 하죠. * 객체가 소멸되는 시점 : 함수 내에 지역적으로 변수가 선언되면 함수 호출이 끝남과 동시에 소멸이 된다. 이와 마찬가지로 객체도 함수내에서 선언된다고 하면, 함수 호출이 끝나면 소멸되게 된다. * 전역적으로 선언된 객체 : 전역변수는 프로그램 시작과 동시에 메모리에 올라갔다가, 프로그램이 종료될때 소멸된다. 객체도 마찬가지로 똑같은 동작을 하지만, 객체는 이렇게 생성할 일은 거의 없다고 보면 된다. * 전역 : 일반적인 객체지향에 전역이란 개념은 존재 하지 않는다. 이를 대신하기 위한 static 멤버 변수, 멤버 함수가 존재 한다. (이거 대해서.. 더보기
[C++] 생성자와 소멸자 (Constructor & Destructor) - 첫번째 1. 생성자 (Constructor) : 생성자는 객체를 생성할 때 자동적으로 호출되는 함수로 클래스와 같은 이름의 형태를 띤 함수이며, 리턴형이 없으며, 리턴 하지도 않는 특징을 가지고 있다. 그럼 왜 생성자가 필요할까? 바로 객체를 생성과 동시에 초기화를 해주기 위해 필요하다. 객체를 생성과 동시에 초기화 주는 것이 클래스의 좋은 구조이기 때문에, C++는 정보은닉과 더불어 생성과 동시에 초기화라는 안전성을 제공하는 생성자라는 문법을 제공해 주는 것이다. 1-1. 생성자의 사용? : 생성자의 형태를 보면, 일단 세가지 형태를 가지고 있다. 첫번째로 디폴트 생성자 (Default Constructor), 인자가 있는 생성자, 마지막으로는 복사 생성자 (Copy Constructor) 이 세가지 형태가 .. 더보기
[C++] 정보은닉과 캡슐화 (Information Hiding & Encapsulation) 1. 정보은닉 (Information Hiding) : 프로그램을을 사용하는 사용자가 알아야 하는 것은 프로그램 사용법이지 프로그램의 내부 동작이나 상세 구조가 아니다. 사용자가 굳이 알 필요가 없는 불필요한 정보는 숨김으로써 사용자는 최소한의 정보만으로 프로그램을 쉽게 사용할 수 있어야 한다. C++에서는 클래스의 정보 은폐 기능을 지원하기 위해 private, public, protected 등의 접근제어 키워드를 통해 선언된 클래스 외부에서 직접적인 접근을 허용하지 않는것을 정보은닉이라 할 수 있다. 하지만 간접적 접근 경로를 제공해줘야 한다. 숨길 멤버와 공개할 멤버의 블록을 구성하도록 해서, 공개된 멤버는 외부에서 자유롭게 읽을 수 있지만 숨겨진 멤버를 참조하려고 시도하면 컴파일 과정에서 접근할.. 더보기