[C++] 객체 지향 프로그래밍 - 기본

Taeil Nam·2022년 10월 19일
0

C++

목록 보기
2/13
post-thumbnail

객체 지향 프로그래밍 (Object-Oriented Programming)

  • 프로그램이 명령어의 모음이 아닌, 객체들의 모음이라고 생각하여 프로그래밍 하는 것.
  • 필요한 객체들을 생성하고, 객체들을 조립해서 프로그램을 만드는 것.
  • C 언어 = 절차 지향 프로그래밍.
  • C++ 언어 = 객체 지향 프로그래밍.

객체 (Object)

  • 속성(Attribute)과 행위(Behavior)를 가지는 독립된 단위.
  • 속성과 행위는 클래스에 의해 정의됨.
  • 클래스 정의 -> 해당 클래스를 사용하는 객체 생성.
  • 객체가 생성 되면, 객체가 사용하는 속성의 크기만큼 메모리가 할당 됨.

클래스 (Class)

  • 객체가 가지는 속성과 행위를 정의한 것.
  • 객체를 만들기 위한 일종의 설계도.
    ex) 아반떼 설계도 = 클래스.
    ex) 아반떼 = 객체.
  • 속성 = 클래스의 멤버 변수.
  • 행위 = 클래스의 멤버 함수.
  • 클래스를 정의하는 것은 메모리에 연관을 주지 않음. (구조체(struct)도 정의만 하는 것은 메모리 안쓰는 것처럼)
  • 특정 클래스를 사용하는 객체가 생성되면, 해당 클래스에 정의한 멤버 변수 크기 만큼 메모리가 할당 됨.

예제 코드

  1. 게임 캐릭터 "Knight"를 설계해보자!
  2. 설계한 "Knight"를 객체로 사용해보자!
class Knight // 클래스 Knight 선언.
{
public: // 행위 선언 하는 곳.
    // class Knight의 행위들 = 멤버 함수.
    void Move(int y, int x);
    void Attack();
    void Die(int hp)
    {
        hp = 0;
        cout << "Die" << endl;
    }

public: // 속성 선언 하는 곳.
    // class Knight의 속성들 = 멤버 변수.
    int hp;
    int damage;
    int positionY;
    int positionX;
};

// class Knight의 멤버 함수 Move 정의.
void Knight::Move(int y, int x)	// 함수 이름에 Knight:: 를 붙여준다.
{
    positionY = y;
    positionX = x;
    cout << "Move" << endl;
}

// class Knight의 멤버 함수 Attack 정의.
void Knight::Attack() // 함수 이름에 Knight:: 를 붙여준다.
{
    cout << "Damage : " << damage << endl;
}

// main 함수.
int main()
{
    // 객체 생성 (Instantiate)
    Knight k1;			// Knight 클래스를 사용하는 객체 k1 생성.
    k1.hp = 100;		// 객체 k1의 멤버 변수 hp 초기화.
    k1.damage = 10;		// 객체 k1의 멤버 변수 damage 초기화.
    k1.positionY = 0;	// 객체 k1의 멤버 변수 positionY 초기화.
    k1.positionX = 0;	// 객체 k1의 멤버 변수 positionX 초기화.

    Knight k2;			// Knight 클래스를 사용하는 객체 k2 생성.
    k2.hp = 80;			// 객체 k2의 멤버 변수 hp 초기화.
    k2.damage = 5;		// 객체 k2의 멤버 변수 damage 초기화.
    k2.positionY = 10;	// 객체 k2의 멤버 변수 positionY 초기화.
    k2.positionX = 10;	// 객체 k2의 멤버 변수 positionX 초기화.

    k1.Move(2, 2);	// 객체 k1의 멤버 함수 Move 실행.
    k1.Attack();	// 객체 k1의 멤버 함수 Attack 실행.
    k1.Die(k1.hp);	// 객체 k1의 멤버 함수 Die 실행.

    return 0;
}

객체 지향 프로그래밍의 장단점

장점

  1. 코드 재사용이 용이

    • 남이 만든 클래스를 가져와서 이용할 수 있고 상속을 통해 확장해서 사용할 수 있음.
  2. 유지보수가 쉬움

    • 절차 지향 프로그래밍에서는 코드를 수정해야할 때 일일이 찾아 수정해야하는 반면, 객체 지향 프로그래밍에서는 수정해야 할 부분이 클래스 내부에 멤버 변수 혹은 메서드로 있기 때문에 해당 부분만 수정하면 됨.
  3. 대형 프로젝트에 적합

    • 클래스 단위로 모듈화시켜서 개발할 수 있으므로 대형 프로젝트처럼 여러 명, 여러 회사에서 개발이 필요할 시 업무 분담이 쉬움.

단점

  1. 처리속도가 상대적으로 느림.
  2. 객체가 많으면 용량이 커질 수 있음.
  3. 설계시 많은 시간과 노력이 필요.

0개의 댓글