본문 바로가기

교육 노트/C++ 심화강의

[C++ 때려잡기] C++ 심화강의 1 객체 지향 프로그래밍과 클래스

지금까지 C++의 기본적인 문법들을 배웠다.
그러나 지금까지 배운 C++ 은 C++ 문법을 사용했다 뿐이지 사실상 C방식과 더 가깝다

C++ 의 처음 이름은  C with classes 라는 뜻으로 C 에 class라는 개념을 추가한것이다.

즉 class를 배우지 않으면 C++을 배운것이 아니다.

심화 강의부터는 Class, OOP등을 강의하도록 하겠다.



1. 객체 지향 프로그래밍 (object oriented programming), OOP


지금까지 배운 프로그래밍 방식은 절차지향 프로그래밍으로

각종 변수와 구조체등을 모듈화된 함수등을 사용하여 특정 절차를 거치도록하여 프로그램을 구성하였다.


그러나 프로그램이 커지면서 해당방식으로 프로그래밍 하는것이 힘들어졌고

C++ 의 창시자 비야네 스트롭스트룹 님께서 Simula라는 시뮬레이션 전용언어에서 사용하는 객체지향 이라는 개념을 C에 추가하였다.

그럼 여기서 객체 지향언어란 무엇인가?


세상은 객체와 객체의 상호작용으로 이루어져있다.

예를 들어 내가 TV를 본다고 하면

"내" 가 "TV"를 보는것이다

여기서 나랑 TV는 실제 사물이다.

보는것은 나와 TV의 상호작용이다


여기서 "내" 랑 "TV"를 객체(오브젝트) 라고 부른다


이러한 세상의 개념을 C에 프로그래밍 방식으로써 추가한것이 C++이다



슈퍼 마리오 게임을 만든다고 가정하자.


슈퍼 마리오 게임은
마리오(캐릭터) 와 아이템, 블록, 적, 미사일등의
복합적으로 상호작용하는 게임이다.


여기서

여기서 상호작용하는 각각의 요소들이 전부 객체 이다.


그럼 클래스는 무엇인가?

클래스는 객체를 만들기 위한 틀이다. (흔히 붕어빵틀에 비교한다.)


예를 들어서 마리오라는 객체를 만들어야한다.

그러면 게임캐릭터 라는 틀(class)를 우선 만들어주어야한다.


그다음 게임캐릭터라는 틀로 마리오를 찍어내어 마리오라는 객체를 만든다.


만약 루이지라는 캐릭터를 추가하고 싶으면

이미 만들 게임캐릭터라는 틀로 루이지를 찍어내면 된다.



지금까지의 설명은 class와 객체를 개념적으로 설명한것이고

class를 프로그래밍 관점으로 보자면


데이터와 함수가 결합되어있는 내가만든 자료형(사용자 정의 자료형)이다.


구조체를 배웠을때 기억하는가?

2018/08/26 - [교육 노트/C++ 기초강의] - [C++ 때려잡기] C++ 기초강의 4-1 간단한 구조체


1. 구조체

구조체란 하나 이상의 변수를 그룹 지어서 만든 사용자 정의 자료형이다



출처: http://see-ro-e.tistory.com/entry/C-때려-잡기-C-기초강의-41-간단한-구조체 [SeeRoE 프로그래밍 기록]

구조체란 하나 이상의 변수를 그룹 지어서 만든 사용자 정의 자료형이다

출처: http://see-ro-e.tistory.com/entry/C-때려-잡기-C-기초강의-41-간단한-구조체 [SeeRoE 프로그래밍 기록]

구조체란 하나이상의 변수(데이터)를 그룹지운 사용자 정의 자료형이었다.

여기서 함수까지 그룹지은것이 클래스이다.


클래스의 기본문법을 살펴보자



구조체란 하나 이상의 변수를 그룹 지어서 만든 사용자 정의 자료형이다

출처: http://see-ro-e.tistory.com/entry/C-때려-잡기-C-기초강의-41-간단한-구조체 [SeeRoE 프로그래밍 기록]
구조체란 하나 이상의 변수를 그룹 지어서 만든 사용자 정의 자료형이다

출처: http://see-ro-e.tistory.com/entry/C-때려-잡기-C-기초강의-41-간단한-구조체 [SeeRoE 프로그래밍 기록]
구조체란 하나 이상의 변수를 그룹 지어서 만든 사용자 정의 자료형이다

출처: http://see-ro-e.tistory.com/entry/C-때려-잡기-C-기초강의-41-간단한-구조체 [SeeRoE 프로그래밍 기록]클


방금 본 마리오를 예를 들어 캐릭터 클래스를 만들어보자



여기서 public을 접근 제한자라고 한다. (추후에 설명하도록 하겠다)


그럼 해당 클래스로 마리오를 만들어 보자


구조체를 사용할때와 똑같이 . 으로 사용한다.

구조체를 사용할때는 . 을 사용하고 뒤에 변수를 가져왔는데 class에서는 안에 있는 함수를 부를수가있게 되었다.


ps. 파일입출력할때 . 찍고 함수를 부를수있는 이유이다.

ps. 저기서 class 대신에 struct 해도똑같이 작동한다. C에서는 불가능하지만 C++ 에서는 struct에서도 함수를 넣을수있고 기본 접근한정자를 제외하고 class와 struct가 완전 동일 하다 그러나 구분을 위하여 Class라는 용어를 사용하였다.



#include <iostream>
using namespace std;

class Character
{
public:
    int hp;
    int speed;
    string name;
    void move(int dir);
    void jump();
    void hit();
};


void Character::move(int dir)
{
    //함수
}

void Character::jump()
{
    //함수
}

void Character::hit()
{
    //함수
}


int main()
{
    Character mario;
    mario.name = "슈퍼마리오";
    mario.jump();


    return 0;
}


다음과 같이 사용할 수 있다.

만약 class를 사용하지 않았다고 가정하면


#include <iostream>
using namespace std;

struct Character
{
    int hp;
    int speed;
    string name;
};

void move(Character& _c, int dir)
{
    //함수
}
void jump(Character& _c )
{
    //함수
}
void hit(Character& _c )
{
    //함수
}


int main()
{
    Character mario;
    mario.name = "슈퍼마리오";
    jump(mario);


    return 0;
}


다음과 같이 짯을것이다.


이렇게 프로그래밍을 해도 프로그램을 똑같이 동작할것이다.

그럼에도 불구하고 왜 객체 지향 프로그래밍 사용하는 이유는 무엇일까?


그이유는 다양하게 있다.

우선 행동을 하는 주체(객체)와 행동(함수) 가 묶여 누가 무엇을 하는지 명확하다


기존의 방식 jump(mario) 보다 mario.jump() 가 마리오가 점프한다! 가 명확하다.

또한 상대 적도 점프 기능이 있다면

함수명을 이제 myJump() 와 enemyJump() 등으로 나누어지겠지만


객체 지향은 적 클래스를 만들고 해당 객체를 만들어


mario.jump();

enemy.jump();

와 같이 사용할것이다.


또한 어디서 잘못 되었는지 명확하다.


절차지향이라면


해당 순서에따라 어떤 기능이 잘못되면 그 함수가 잘못되었는지, 그 함수 위에서 어떤 데이터를 잘못써서 그 함수가 잘못되었는지

부르는 순서가 잘못되어 그 기능이 잘못 되었는지 알기가 힘들어지고 모든것을 다시 되짚어봐야한다.


그러나 객체지향을 사용하면 캐릭터에서 잘못되면 캐릭터 클래스와 관련한것만 고치면되어 디버깅이 쉽고

캐릭터의 요구사항이 변경되면 캐릭터클래스만 수정하면된다.

또 슈퍼마리오 게임을 만들다가 다른게임을 만들때도 캐릭터클래스를 가져와 재사용할수도 있다.


ps. 프로그래밍 하다보면 사실... 음..



아무튼 객체지향으로 프로그래밍을 함으로써 많은 이득을 얻을 수 있다.


이번 강의는 우선 개념적으로 객체지향 프로그래밍과 클래스를 알아보았다.

다음시간부터 본격적으로 클래스의 사용법에 대하여 알아보도록 하겠다.






728x90