[C++] 클래스의 설계

 

절차적 프로그래밍

 

C언어가 대표적인 절차적 프로그래밍 언어이다. 절차적 프로그래밍의 언어는 프로그램의 시작을 주도하는 main함수 내에 기술된 내용이 순차적으로 수행된다. 그래서 main 함수는 대부분 다른 함수의 호출로 기술되어 있다. 이처럼 절차적 프로그래밍에서는 함수를 중심으로 프로그램을 설계한 후 거기에 필요한 데이터를 정의한다.

 

 

객체지향 프로그래밍

 

객체를 지향하는 프로그램 방식으로 객체를 생성하기 위한 클래스를 설계한 후에 이를 다룰 메소드(사용자 인터페이스)를 정의하여 메소드로 객체를 다루도록 한다.

 

일정한 순서에 의해 진행되지 않는다.

사건이 일어날 때마다 그에 따른 처리를 하는 식이다.

여기서의 객체는 구조체처럼 멤버변수를 가지고 있으면서 그들만의 함수도 함께 가지고 있는 것을 말한다.

객체 내부에 정의된 함수는 그 객체를 사용하기 위해 필요한 기술적인 측면을 모두 정의하고 있고, 메소드라 한다.

 

 

객체 지향 프로그래밍의 특징

 

1. 캡슐화와 데이터 은닉

 

데이터를 직접 다루면 손상될 수 있으므로 이를 방지하기 위해 제공되는 것이 캡슐화(Encapsulation)와 데이터은닉(Data Hiding)이다. 사용자가 데이터를 직접 사용하지 못하게 하고, 대신 메소드를 통해서 접근 가능하도록 함으로써 데이터의 유효성을 검증한다.

 

 

2. 다형성과 함수의 오버로딩, 연산자 오버로딩


다형성( Polymorphism)은 동일한 함수나 연산자를 자료에 따라 다르게 동작하도록 적용할 수 있음을 의미.

예를 들어, 함수의 이름은 동일한데 매개변수의 자료형이나 개수를 서로 다르게 주어 여러번 정의할 수 있는데 이를 함수의 오버로딩이라고 한다.

특히 C++에서는 연산자를 정의할 수 있다.

이미 사용 중인 연산다를 다른 용도로 다시 정의해 사용할 수 있는데 이를 연산자의 오버로딩(Operator Overloading)이라고 한다.

 

3. 상속성

상속성(Inheritance)은 객체지향의 가장 대표적인 특징으로, 특정 객체의 성격을 다른 객체가 상속받아 사용할 수 있도록 하는 것이다. 클래스를 설계할 때 여러 개의 클래스에 공통적으로 필요한 성격을 가장 기본적인 클래스에 정의해 두는데, 이 기본적인 클래스를 부모 클래스라 한다.

상속은 이미 존재하는 클래스의 상속을 받기 때문에 매번 전체를 다시 만들 필요없어 개발 기간을 단축시키고 기존 코드를 재활용할 수 있다.

 

 

 

class는 자료를 추상화하여 사용자정의 자료형으로 구현할 수 있도록 하는 C++의 도구이다.

class로 클래스를 선언하는 형식은 구조체와 유사하지만 개념은 확연히 다르다.

 

구조체는 단순히 멤버변수들을 정의하여 원하는 형태로 기억공간을 할당받을 수 있도록 정의하는 것.

클래스는 기억공간을 확보하는 것은 물론이고 이 클래스를 다룰 수 있는 방법도 구현해야 한다.

 

클래스는 크게 클래스 선언과 클래스 멤버함수의 정의로 구성되어 있다.

클래스 선언에는 멤버변수와 멤버함수 원형(프로토타입)을 기술한다.

멤버함수의 정의는 클래스 선언 밖에서 따로 이루어진다.

 

<<클래스 선언>>

 

class 클래스명
{

접근 지정자 :

자료형 멤버변수;

접근 지정자:

자료형 멤버함수();

}

 

 

 

<<멤버함수 정의>>

 

자료형 클래스명::멤버함수()

{

}

 

클래스의 선언은 구조체 선언과 그 구조가 비슷하지만 구조체에는 없었던 접근 지정자가 추가된다.

 

private로 선언된 멤버는 해당 멤버가 속한 클래스의 멤버함수에서만 사용할 수 있기 때문에 캡슐화(데이터은닉) 된다.

public 으로 선언된 멤버들은 객체를 사용할 수 있는 범위라면 어디서나 접근이 가능한 공개된 멤버. 주로 private 멤버를 해당 클래스 외부에서 사용하도록 하기 위한 멤버함수를 정의할 때 사용한다.

 

 

클래스는 새로운 자료형으로 설계할 때는 단순히 데이터의 저장 측면뿐만 아니라 데이터를 처리할 메소드(멤버함수) 제공도 고려해야 한다.

그러므로 다음과 같이 클래스는 새로운 자료형이 되고, 데이터는 멤버변수가, 데이터를 처리할 메소드는 멤버함수가 된다.

 

데이터 은닉에 입각해 멤버변수의 접근지정자는 private로 선언하는 것이 일반적이다.

private로 선언된 멤버현수는 직접제어하지 못하므로 이를 다룰 수 있도록 하기 위한 방법으로 제공하는 멤버함수는 클래스 외부에서 접근 가능하도록 하기 위해서 접근 지정자를 public으로 선언하는 것이 일반적.

 

 

 

클래스의 멤버함수 구현


함수의 3요소는 함수의 정의, 선언, 호출이다.

멤버함수도 이 3가지 조건을 만족해야하며, 멤버함수의 호출은 일반함수와 달리 클래스로 객체를 선언하여 인스턴스화되어야 호출할 수 있다.

 

1. 정의할 때 그 함수가 어느 클래스에 소속되는지 나타내기 위해 함수명 앞에 클래스명을 명시한다. 이때 클래스명 다음에 스코프 연산자(::)를 사용한다.

2. 정의하는 목적은 클래스 내에 정의된 private멤버에 접근하여 이를 다루기 위해서이다. 그래서 멤버함수를 메소드라고도 한다.

 

 

만약 함수를 정의할 때 소속된 클래스명이 명시되어 있지 않기 때문에 이 함수는 일반 함수로 인식한다.

클래스명을 명시하는 것은 어느 클래스에 소속되어 있는지를 식별하기 위해서이지만

다른 클래스에서 같은 이름의 멤버함수를 사용할 수 있도록 하기 위해서이기도 하다.

 

private멤버변수는 자신이 속한 클래스의 멤버함수를 제외하고는 다른 어떠한 함수에서도 접근할 수 없다.

그렇다고 멤버변수를 public으로 선언하면 이는 객체지향 개념에서 벗어난 클래스 설계가 된다.

 

 

객체는 클래스를 실체(Instance)화한 것이다. 그래서 객체를 인스턴스(Instance)라고도 한다.

 

 

Ex> int a

 

int : 자료형

a   : 객체

즉 자료형 int는 a변수를 만들어내기 위한 형틀 !

즉, 템플릿(Template)이다.

 

클래스도 객체를 생성하기 위한 하나의 형틀로 이해하면 쉽다.