Programming Study/C++

클래스의 기본

LeeWonTae 2014. 9. 23. 13:49

1. C++에서의 구조체

구조체가 주는 이점

  - 연관 있는 데이터를 하나로 묶으면, 프로그램의 구현 및 관리가 용이하다.

 

소프트웨어를 단순히 표현하면

소프트웨어 = 데이터의 표현 + 데이터의 처리 

 

표현해야 하는 데이터는 항상 부류를 형성하기 마련이다.

그리고 이렇게 부류를 형성하는 데이터들은 함께 생성, 이동 및 소멸된다는 특성이 있다.

그래서 구조체는 연관 있는 데이터를 묶을 수 있는 문법적 장치로 데이터의 표현에 큰 도움을 준다.

 

C언어에서 구조체 변수를 선언하는 방법은 다음과 같다.

struct Car basicCar;

struct Car SimpleCar; 

앞에 삽입된 키워드 struct는 이어서 선언되는 자료형이 구조체를 기반으로 정의된 자료형임을 나타낸다.

그리고 키워드 struct를 생략하려면 별도의 typedef 선언을 추가해야 한다.

하지만 C++에서는 기본 자료형 변수의 선언방식이나 구조체를 기반으로 정의된 자료형의 변수 선언방식에 차이가 없다.

즉, C++에서는 별도의 typedef선언 없이도 다음과 같이 변수를 선언할 수 있다.

Car basicCar;

Car SimpleCar; 

 

C++에서는 구조체 안에 함수를 삽입하는 것을 허용한다.

구조체 안에 enum 상수의 선언도 가능하다.

구조체 내의 함수가 많거나 그 길이가 길다면 함수의 원형선언을 구조체 안에 두고,

함수의 정의를 구조체 밖으로 함수를 꺼내는 것도 가능하다.

struct Car

{

    ...............

    void ShowCarState();

    void Acce();

    ...............

 

void Car::ShowCarState()

{

    ...............

}

 

void Car::Accel()

{

    ................

}

 

 

2. 클래스(Class)와 객체(Object)

앞서 설명한 C++의 구조체는 클래스의 일종이다.

그렇다면 클래스와 구조체는 어떠한 차이점이 있을까?

 

클래스와 구조체의 유일한 차이점

키워드 struct를 대신해서 class를 사용하면, 구조체가 아닌 클래스가 된다.

클래스 내에 선언된 함수가 아닌, 다른 영역에서 변수를 초기화하려 하면 안된다.

클래스는 기본적으로(별도의 선언을 하지 않으면) 클래스 내에 선언된 변수는 클래스 내에 선언된 함수에서만 접근 가능하다.

클래스 멤버의 접근과 관련해서는 이렇게 이야기 한다.

"접근과 관련해서 별도의 선언을 하지 않으면, 클래스 내에 선언된 변수 및 함수에 대한 접근은 허용하지 않을테니,

접근과 관련된 지시를 별도를 내려줘"

이렇듯 클래스는 정의를 하는 과정에서 각각의 변수 및 함수의 접근 허용범위를 별도로 선언해야 한다.

이것이 바로 키워드 struct를 이용해서 정의하는 구조체와 키워드 class를 이용해서 정의하는 클래스의 유일한 차이점이다.

 

접근제어 지시자(접근제어 레이블)

C++의 접근제어 지시자는 다음과 같이 총 세가지가 존재한다. 

public

  - 어디서든 접근허용

protect

  - 상속관계에 놓여있을 때, 유도 클래스에서의 접근허용

private 

  - 클래스 내(클래스 내에 정의된 함수)에서만 접근 허용

이 중에서 protected는 '상속'과 관련이 있으므로 나중에 살펴보기로 하고, 우선은 public과 private에 대해서만 보자.

 

- 접근제어 지시자 A가 선언되면,

  그 이후에 등장하는 변수나 함수는 A에 해당하는 범위 내에서 접근이 가능하다.

- 그러나 새로운 접근제어 지시자 B가 선언되면,

  그 이후로 등장하는 변수나 함수는 B가 해당하는 범위 내에서 접근이 가능하다.

- 함수의 정의를 클래스 밖으로 빼도, 이는 클래스의 일부이기 때문에,

  함수의 내에서는 private으로 선언된 변수에 접근이 가능하다.

- 키워드 struct를 이용해서 정의한 구조체(클래스)에 선언된 변수와 함수에

  별도의 접근제어 지시자를 선언하지 않으면, 모든 변수와 함수는 public으로 선언된다.

- 키워드 class를 이용해서 정의한 클래스에 선언된 변수와 함수에

  별도의 접근제어 지시자를 선언하지 않으면, 모든 변수와 함수는 private으로 선언된다.

 

용어정리 : 객체(Object), 멤버변수, 멤버함수

구조체 변수, 클래스 변수라는 표현은 이제 어울리지 않는다.

왜냐하면 구조체와 클래스는 변수의 성격만 지니는 것이 아니기 때문이다.

그래서 변수라는 표현을 대신해서 '객체'라는 표현을 사용한다.

 

클래스를 구성하는(클래스 내에 선언된) 변수를 가리켜 '멤버변수'라 하고,

클래스를 구성하는(클래스 내에 정의된) 함수를 가리켜 '멤버함수'라 한다.

 

C++에서의 파일 분할

어떠한 프로그램이건 하나의 파일에 모든 것을 담진 않는다.

특히 C++은 클래스 별로 헤더파일과 소스파일을 생성해서 클래스의 선언과 정의를 분리하는 경우가 많기 때문에

많은 수의 파일이 만들어진다.

C++에서 파일 분할에 대해 살펴보자

헤더파일 - 클래스의 선언을 담는다. 

cpp파일 - 클래스의 정의(멤버함수의 정의)를 담는다.

 

인라인 함수는 헤더파일에 함께 넣어라!

클래스에 선언된 함수를 인라인화 하고 cpp파일에 넣어두면 컴파일 에러가 발생한다.

컴파일 과정에서 함수의 호출 문이 있는 곳에 함수의 몸체 부분이 삽입되어야 하므로 인라인 함수는 컴파일 에러를 발생시킨다.

때문에 인라인 함수는 클래스의 선언과 동일한 파일에 저장되어서 컴파일러가 동시에 참조할 수 있게 해야 한다.

 

 

3. 객체지향 프로그래밍의 이해

객체는 영어로 Object이다.

C++에서 말하는 Object는 "사물, 또는 대상"이다.

객체지향 프로그래밍은 현실에 존재하는 사물과 대상, 그리고 그에 따른 행동을 있는 그대로 실체화 시키는 형태의 프로그래밍이다.

객체는 하나 이상의 상태 정보(데이터)와 하나 이상의 행동(기능)으로 구성되며,

변수를 통해서 표현이 되고(변수에 상태 정보를 저장할 수 있으므로), 행동은 함수를 통해서 표현이 된다.

 

객체간의 대화방법(Message Passing 방법)

하나의 객체가 다른 하나의 객체에게 메시지를 전달하는 방법은(어떠한 행위의 요구를 위한 메시지 전달)

함수 호출을 기반으로 한다.

그래서 객체지향에서는 이러한 형태의 함수호출을 가리켜 '메시지 전달(Message Passing)'이라 한다.

 

 

 

- 윤성우 저, 열혈강의 C++ 프로그래밍 中 -