반응형

언어 자료구조 알고리즘 1251

[C++] 상수화 멤버

2.2.4 상수화 멤버 캡슐화된 멤버들을 구분하는 또 다른 기준 중의 하나는 상수 멤버와 비 상수 멤버로 나누는 것입니다. 상수 멤버는 형식 정의 내에 멤버 앞에 const 키워드가 붙여 명시하게 됩니다. 상수 멤버 필드는 const 키워드가 앞에 붙고 상수 멤버 메서드는 뒤에 붙게 됩니다. 상수 멤버 필드는 값이 변경되지 않는 멤버 필드이고 상수 멤버 메서드는 멤버 필드값을 변경하는 구문을 포함하지 못하는 메서드입니다. 예를 들어, 학생 생성 시에 학번을 부여하고 이후에는 학번을 변경하지 못하게 하고자 한다면 상수 멤버 필드로 사용할 수 있습니다. 또 다른 예로 학생의 iq가 최대 200까지만 올라갈 수 있게 하려고 한다면 static 상수 멤버 필드로 정할 수 있습니다. 그리고 학생의 정보를 확인만 ..

[C++] 개체의 멤버와 형식의 멤버

2.2.3 개체의 멤버와 형식의 멤버 캡슐화된 멤버의 종류를 나누는 기준은 여러 기준이 있을 수 있습니다. 그중에 하나가 해당 멤버가 개체의 멤버인지 혹은 형식의 멤버인지로 구분을 할 수가 있습니다. 이러한 기준으로 구분할 때 형식의 멤버를 정적(static) 멤버라 부르고 개체의 멤버를 비 정적 멤버라 부릅니다. C++에서 정적 멤버는 형식 정의 내에서 해당 멤버를 static 키워드를 붙여 명시해야 합니다. static 키워드가 붙여 명시된 정적 멤버들은 개체에 종속적인 멤버가 아닌 형식에 종속적인 멤버가 됩니다. 예를 들어, 학생을 생성할 때 학생의 일련번호를 차례대로 부여한다고 할 때 학생의 일련번호는 각각의 학생마다 별도로 유지가 되어야 할 것입니다. 하지만 이번에 생성할 학생에게 어떠한 일련번..

[C++] 소멸자

- 소멸자 C++은 Java나 C#과 달리 플랫폼에서 개체들을 관리(Managed)하지 않습니다. 물론, 여기서 얘기하는 C++은 Native 기반의 C++을 얘기를 하는 것이며 .NET에서 개발하는 Managed C++을 얘기하는 것이 아닙니다. 플랫폼에서 관리하는 개체를 관리화(Managed) 개체라고 하는데 이들은 소멸에 관한 책임이 개발자에게 부여하지 않고 플랫폼이 해당 개체를 참조하는 변수가 있는지를 플랫폼이 조사합니다. 이러한 조사(세대 조사)를 통해 참조되지 않는 개체들은 플랫폼의 가비지 수집할 때 수집 대상이 되는 형태로 관리가 되기 때문에 개발자가 소멸에 관한 책임이 적습니다. 이들과 달리 C++에서는 생성되는 개체는 관리화 개체가 아니므로 개발자가 소멸에 관한 책임을 져야 합니다. 소멸..

[C++] 생성자

- 생성자 C++에서 특정 클래스 형식의 개체 인스턴스를 생성할 때 new 연산자를 사용합니다. new 연산자에서는 요청하는 형식의 개체를 위해 메모리를 할당하고 가상 함수 테이블을 형성하는 등의 초기 작업을 수행한 후에 생성자 메서드를 수행하고 생성된 개체의 메모리 주소를 반환합니다. 만약, 사용자가 생성자 메서드를 정의하지 않는다면 개체의 메모리를 할당하고 가상 함수 테이블을 형성하는 등의 초기 작업을 수행한 후 해당 개체의 메모리 주소를 반환하는데 이러한 작업을 수행하는 것을 디폴트 기본 생성자라고 합니다. 하지만 사용자가 생성자 메서드를 정의하면 디폴트 기본 생성자는 형성되지 않게 됩니다. 이러한 이유로 사용자가 입력 매개 변수가 있는 생성자를 정의했을 때 입력 인자를 전달하지 않고 개체를 생성하..

[C++] 2.2.1 멤버 메서드

2.2.1 멤버 메서드 이번에는 멤버 메서드에 대해서 알아보기로 합시다. C++언어에서 사용자가 형식을 정의할 경우 멤버 필드와 멤버 메서드를 캡슐화할 수 있다고 하였습니다. 멤버 메서드를 캡슐화를 할 경우 메서드에서 수행할 코드를 정의하는 것은 클래스 정의문 내에서 할 수도 있고 클래스 정의문 외부에서도 할 수 있습니다. 클래스 외부에 메서드에서 수행할 코드를 정의한 예 class Stu { public: void Study(); }; void Stu::Study() { cout

[C++] 2.2.1 접근 지정자

2.2.1 접근 지정자 C언어의 구조체는 모든 곳에서 모든 멤버를 접근할 수 있습니다. 이러한 특징으로 인해 잘 정의된 함수를 이용하여 구현하기로 약속하였음에도 불구하고 직접 멤버를 사용하는 경우가 발생합니다. 예를들어 학생 구조체에 멤버 변수 iq가 있고 공부를 하면 특정 범위까지 iq가 올라가게 프로그래밍을 한다고 가정합시다. 이를 위해 다음과 같이 Stu.h와 Stu.c에 학생 구조체를 정의하고 학생이 공부하는 함수를 정의를 하였습니다. Stu.c - Study 함수에서 tcnt만큼 iq를 증가시킴. 단, 최대 IQ를 벗어날 수 없게 작성하였음 #include "Stu.h" void Study(Stu *stu,int tcnt) { stu->iq += tcnt; if(stu->iq > MAX_IQ) ..

[C++] 2. 1 캡슐화란?

2. 1 캡슐화란? 이번 장부터 C++의 클래스에 관한 얘기가 시작됩니다. 클래스에 대해 문법을 효과적으로 이해하고 사용하기 위해서는 OOP(Object Oriented Programming, 개체 지향 프로그래밍)의 특징을 잘 인지하여야 합니다. 개체 지향 프로그래밍(많은 곳에서 개체를 객체라 부르고 있습니다. 여러분이 MSDN을 통해 학습을 하다 보면 객체로 번역하지 않고 개체로 번역된 것을 보게 됩니다. 이 책에서는 MSDN에 번역된 것처럼 개체라고 부르겠습니다.) OOP의 특징을 얘기할 때 많은 이들이 OOP의 세 가지 기둥을 얘기합니다. OOP의 세 가지 기둥에는 캡슐화와 상속, 다형성이 있습니다. 이 중에 캡슐화는 여러 개의 멤버를 하나의 형식으로 묶어서 정의하는 것을 말합니다. 예를 들어, ..

[C++] namespace

- namespace C++언어는 1988년에 만들어진 이후에 계속해서 새로운 문법이 추가되고 있습니다. 이렇게 추가된 문법 중의 하나가 namespace인데 이를 이용하면 같은 이름의 형식이나 개체 등이 정의된 여러 라이브러리 중에 원하는 부분을 선별적으로 사용할 수 있습니다. 가령, ALib와 BLib에 Stack과 Queue라는 사용자 형식을 제공하고 있는데 ALib에 있는 Stack과 Queue를 사용한다고 가정해 봅시다. 만약 namespace로 구분되어 있지 않다면 ALib를 추가하고 BLib를 추가를 하면 같은 이름이 사용자 형식이 정의되어 있어 컴파일 오류가 발생합니다. 이러한 문제점을 위해 C++에서는 namespace문법이 추가되었습니다. 이에 대해 살펴보기 위해 다음의 예를 들어보기로..

[C++] 매개 변수명이 없는 입력 매개 변수

- 매개 변수명이 없는 입력 매개 변수 C++에서 함수 중복이 가능하다는 것은 위에서 이미 언급한 바가 있습니다. 그런데 경우에 따라서 메서드 명을 같게 부여하고 싶은데 입력 인자가 같다면 어떻게 해야 할까요? C++언어에서는 이 같은 경우에 두 개의 함수를 구분하기 위해 매개 변수명이 없는 입력 매개 변수를 사용할 수 있습니다. 물론, 호출하는 곳에서는 피 호출함수에 값이 전달되어 사용되지는 않지만, 호출 시 이에 대한 값도 반드시 넣어야 합니다.

반응형