객체 지향 프로그래밍(OOP)의 4가지 특성

GamzaTori·2024년 1월 31일
0

OOP란?

  • Objecet Oriented Progamming의 약자로 객체 지향 프로그래밍 이라는 뜻이다.
  • 객체 지향 프로그래밍이란 실세계의 투영이며, 객체란 현실 세계에 존재하는 사물에 대한 추상화라고 한다.
  • 하지만, 어디까지나 비유일뿐 소프트웨어 객체와 실세계 사물 사이에 존재하는 연관성은 희미하다

객체지향의 목표는 실세계의 모방이 아닌 새로운 세계를 창조하는 것

객체 지향에 대해 더 궁금하다면

절차 지향 프로그래밍이란?

대표적으로 C언어가 있으며 말 그대로 순차적으로 처리하는 프로그래밍
컴퓨터의 처리 방식과 유사하여 속도 면에서는 유리하지만 하나의 수정 사항이 프로그램 전체에 영향을 미치고 유지보수 면에서 안좋다는 단점이 있다.

1. 추상화

  • 어떤 양상, 세부사항, 구조를 좀 더 명확하게 이해하기 위해 특정 절차나 물체를 의도적으로 생략하거나 감춤으로써 복잡도를 극복하는 방법이다. 추상화는 두 가지 단계로 이루어진다.
    1. 공통점을 취하는 일반화
    2. 불필요한 세부사항을 제거하는 단순화

추상화는 단순하고 직관적이기 위해 필요하다

class Creautre
{
	int _hp;
    int _mp;
}

class Knight : Creature
{
	
}

class Monster : Creature
{
	
}
  • 기사와 몬스터 클래스는 체력이라는 공통점을 가지고 있으므로 이를 추상화하여 상위 클래스에 정의할 수 있다

추상화에 대해 더 궁금하다면

2. 캡슐화

  • 우리가 흔히 먹는 캡슐 알약의 안에는 어떤 성분의 약이 있는지 알 수 없고 복용법을 통해서만 복용이 가능하다.
  • 이처럼 캡슐은 외부에 노출하지 않고, 복용법을 통해 외부에 사용할 수 있는 방법을 제시함으로써 캡슐 안의 내용물을 안전하게 보호한다
Class Monster
{
	private int _hp;
    
    public int GetHp{return _hp;}
    public void SetHp(int hp){_hp = hp;}
}
  • 캡슐화란 클래스 안의 데이터들을 외부로부터 보호하기 위해 하나의 캡슐로 만드는 것이다
  • 이렇게 몬스터의 체력은 private 접근 지정자를 통해 외부로부터 보호하며 외부에서는 GetHp와 SetHp를 통해서만 체력에 접근할 수 있다.
  • 이를 통해 데이터를 외부로부터의 직접적인 접근을 보호하고 클래스 내부의 데이터를 은닉하는 효과를 얻을 수 있다

3. 상속

  • 상속이란 객체들 간의 관계를 구축하는 방법
  • 상속을 통해 기존의 클래스를 재활용하여 새로운 클래스를 작성할 수 있다
  • 추상화를 통해 상위 클래스를 만들고 공통되는 속성과 기능의 재사용이 가능하다
class Creautre
{
	int _hp;
    int _mp;
}

class Knight
{
	int _hp;
    int _mp;
    void Swing();
}

class Archer : Creature
{
	void Shoot();
}
  • 위의 코드에서 궁수의 경우 기사와는 다르게 추상화한 상위 클래스를 상속받음으로써 반복적인 코드를 최소화하고 재사용할 수 있다

4. 다형성

  • 다형성은 어떤 객체의 속성이나 기능이 여러가지 형태를 취할 수 있음을 뜻한다
  • 다형성의 대표적인 예시로는 오버로딩(Overloding)과 오버라이딩(Overriding)이 있다

오버로딩(Overloding)이란 같은 클래스 내에서 동일한 이름의 함수를 매개변수의 개수나 자료형이 다른 여러개의 함수로 정의하는 것이다

int main(void)
{
	cout << "Hello" << endl;	// 문자열 출력
    cout << 123 << endl;		// 정수 출력
    cout << 1.324 << endl;		// 소수 출력

	return 0;
}
  • C++에서는 대표적으로 cout의 연산자 오버로딩이 있다

오버라이딩(Overriding)이란 하위 클래스에서 상위 클래스의 함수를 재정의하는 것이다.

class Adventure
{
	int _hp = 100;
    int _mp = 100;
    void Attack()
    {
    	// 주먹 공격
    }
}

Class Archer : Creature
{
	_hp = 90;
    _mp = 90;
    
    // 오버 라이딩
    void Attack() override
    {
    	// 화살 발사
    }
}
  • 상위 클래스의 모험가의 Attack 함수를 화살을 발사하는 함수로 재정의했다.

ref: [Book]객체지향의 사실과 오해 - 저자 조영호

profile
게임 개발 공부중입니다.

0개의 댓글