객체지향 프로그래밍이란?
객체지향 프로그래밍(Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나로, 프로그램을 명령어의 단순한 나열이 아니라 여러 개의 독립적인 객체(Object)들의 상호작용으로 구성된 시스템으로 바라보는 방식이다.
각 객체는 데이터와 동작을 함께 가지며, 메시지(메서드 호출)를 통해 서로 상호작용하며, 이러한 방식은 현실 세계의 개념이나 사물을 프로그램으로 모델링하는 데에도 자주 활용된다.
객체지향 이전의 프로그래밍 패러다임
비구조적 프로그래밍 (Unstructured Programming)
초기의 프로그램은 오늘날과 같은 명확한 구조를 가지지 않았다.
프로그램은 단순히 위에서 아래로 순차적으로 실행되는 명령어의 나열 형태였으며,
필요한 경우 goto 문을 사용해 코드의 실행 흐름을 직접 이동시키는 방식이 일반적이었다.
이 방식은 프로그램의 흐름이 단순할 때는 직관적으로 이해할 수 있다는 장점이 있었다.
하지만 프로그램의 규모가 커지고 복잡해질수록 goto 문이 많이 사용되면서 코드의 흐름이 얽히게 되었고,
결과적으로 이른바 '스파게티 코드(Spaghetti Code)' 문제가 발생하게 된다.
이러한 문제 때문에 프로그램의 흐름을 보다 체계적으로 관리할 수 있는 방법이 필요해졌고,
그 결과 구조적 프로그래밍(Structured Programming) 이 등장하게 된다.
구조적 / 절차적 프로그래밍 (Procedural Programming)
구조적 프로그래밍은 프로그램의 흐름을 다음과 같은 제어 구조로 구성하는 방법이다.
- 순차 구조 (Sequence)
- 조건 구조 (Selection)
- 반복 구조 (Iteration)
이를 통해 프로그램을 함수나 절차(Procedure) 단위로 나누어 관리할 수 있게 되었고
코드의 재사용성과 가독성이 크게 향상되었다.
이러한 방식의 프로그래밍을 절차적 프로그래밍(Procedural Programming) 이라고 한다.
대표적인 언어로는 다음과 같은 것들이 있다.
- C
- Pascal
절차지향 프로그래밍은 간단하고 직관적인 문제 해결에 적합하다.
하지만 절차적 프로그래밍에서도 프로그램 규모가 매우 커지면
데이터와 함수가 분리되어 관리되기 때문에 데이터 관리가 어려워지는 문제가 발생한다.
이러한 문제를 해결하기 위해 등장한 패러다임이 바로 객체지향 프로그래밍(Object-Oriented Programming) 이다.
객체지향의 핵심 개념 객체(Object)와 클래스(Class)
객체(Object)
객체(Object)는 데이터와 이 데이터를 처리하는 동작(메서드)을 하나로 묶은 단위이다.
객체는 클래스에서 정의된 구조를 바탕으로 생성되며, 클래스로부터 만들어진 인스턴스(instance) 라고도 한다.
각 객체는 다음과 같은 요소를 가진다.
- 속성(Attribute) : 객체가 가지는 데이터
- 메서드(Method) : 객체가 수행할 수 있는 동작(함수)
객체지향 프로그래밍에서는 프로그램을 하나의 거대한 흐름이 아니라 여러 객체들이 서로 상호작용하는 구조로 바라본다.
클래스(Class)
클래스(Class)는 객체를 생성하기 위한 설계도(Template) 이다.
클래스는 객체가 가져야 할 다음 요소들을 정의한다.
- 속성(데이터)
- 메서드(동작)
클래스를 기반으로 여러 개의 객체를 생성할 수 있으며, 이렇게 생성된 각각의 객체를 인스턴스(instance) 라고 한다.
- 클래스(Class) → 객체를 만들기 위한 설계도
- 객체(Object) → 클래스를 기반으로 생성된 실제 데이터 단위
Class = 설계도
Object = 설계도로 만든 실제 물건
Instance = 클래스로부터 생성된 객체
즉, 객체는 프로그램을 구성하는 기본 단위이며, 클래스는 이러한 객체를 생성하고 관리하기 위한 구조이다.
예시 코드
위에서 설명한 객체지향 개념을 이해하기 위해 간단한 텍스트 기반 게임 구조를 예시로 구현해 보았다.
아래 예제 코드에서는 Character와 Weapon 클래스를 정의하고, 이를 기반으로 캐릭터와 무기 객체를 생성하였다.
각 객체는 메서드를 통해 서로 상호작용하며 전투가 진행된다.
//Weapon 클래스 정의
class Weapon
{
public string weaponName { get; private set; }
public int weaponDamage { get; private set; }
public Weapon(string name, int damage)
{
weaponName = name;
weaponDamage = damage;
}
}
//Character 클래스 정의
class Character
{
public string charName { get; private set; }
public int hp { get; private set; }
public int mp { get; private set; }
public int lv { get; private set; }
public int damage { get; private set; }
public bool isWeaponEquip { get; private set; }
public bool isDead { get; private set; }
private Weapon equippedWeapon; // 장착된 무기
//초기화
public Character(string name, int health, int mana, int level, int dmg)
{
charName = name;
hp = health;
mp = mana;
lv = level;
damage = dmg;
isWeaponEquip = false;
isDead = false;
}
public void EquipWeapon(Weapon weapon)
{
if (isWeaponEquip)
{
Console.WriteLine("이미 무기를 장착하고 있습니다.");
return;
}
equippedWeapon = weapon;
isWeaponEquip = true;
damage += equippedWeapon.weaponDamage;
Console.WriteLine($"{charName}이(가) {weapon.weaponName}을 장착했습니다.");
}
public void Attack(Character otherChar)
{
if (isDead)
{
Console.WriteLine($"{charName}은 사망하여 공격할 수 없습니다.");
return;
}
Console.WriteLine($"{charName}이(가) 공격합니다!");
otherChar.TakeDamage(damage);
}
public void TakeDamage(int damage)
{
hp -= damage;
Console.WriteLine($"{charName}은 {damage}의 피해를 입었습니다.");
if (hp <= 0)
{
hp = 0;
isDead = true;
Console.WriteLine($"{charName}은 사망했습니다.");
}
else
{
Console.WriteLine($"{charName}의 남은 체력 : {hp}");
}
}
}
클래스와 객체
Character와 Weapon 클래스는 각각 캐릭터와 무기를 표현하기 위한 설계도(Class)이다.
클래스는 객체를 생성하기 위한 구조를 정의하며, 속성과 메서드를 포함할 수 있다.
이러한 클래스를 기반으로 실제 객체를 생성할 수 있다.
예를 들어 다음과 같이 객체를 생성할 수 있다.
Character Adel = new Character("Adel", 100, 100, 1, 50);
Character Monster = new Character("Golem", 150, 0, 1, 30);
Weapon HolySword = new Weapon("Holy Sword", 10);
- Adel과 Monster는 Character 클래스의 인스턴스
- HolySword는 Weapon 클래스의 인스턴스
객체 간 상호작용
객체지향 프로그래밍에서는 객체들이 메서드를 통해 서로 상호작용한다.
Adel.EquipWeapon(HolySword);
Adel.Attack(Monster);
- EquipWeapon() 메서드는 캐릭터 객체가 무기 객체를 장착하도록 한다.
- Attack() 메서드는 캐릭터 객체가 다른 캐릭터 객체에게 공격을 수행하도록 한다.
객체는 메서드를 통해 서로 메시지를 주고받으며 동작한다.
캡슐화 (Encapsulation)
코드를 보면 hp와 같은 속성은 다음과 같이 정의되어 있다.
public int hp { get; private set; }
여기서 private set을 사용하여 외부에서 직접 값을 변경할 수 없도록 제한하였다.
따라서 체력 값은 외부에서 임의로 수정할 수 없으며, 반드시 TakeDamage()와 같은 클래스 내부 메서드를 통해서만 변경된다.
이와 같이 객체의 상태를 보호하고 내부 구현을 숨기는 것을 캡슐화(Encapsulation)라고 한다.
namespace OOPStudy
{
internal class Program
{
static void Main(string[] args)
{
// 캐릭터 생성
Character Adel = new Character("Adel", 100, 100, 1, 50);
Character Monster = new Character("Golem", 150, 0, 1, 30);
// 무기 생성
Weapon HolySword = new Weapon("Holy Sword", 10);
Console.WriteLine("1. 공격");
Console.WriteLine("2. 무기 장착");
Console.WriteLine("3. 종료");
while (true)
{
string input = Console.ReadLine();
if (input == "1")
{
Console.Clear();
Adel.Attack(Monster);
if (Monster.isDead)
{
Console.WriteLine("몬스터를 처치했습니다!");
break;
}
Console.WriteLine("\n몬스터의 차례!");
Monster.Attack(Adel);
if (Adel.isDead)
{
Console.WriteLine("플레이어가 사망했습니다.");
break;
}
Console.WriteLine("\n다시 행동을 선택하세요.");
Console.WriteLine("1. 공격");
Console.WriteLine("2. 무기 장착");
Console.WriteLine("3. 종료");
}
else if (input == "2")
{
Console.Clear();
Adel.EquipWeapon(HolySword);
Console.WriteLine("\n다시 행동을 선택하세요.");
Console.WriteLine("1. 공격");
Console.WriteLine("2. 무기 장착");
Console.WriteLine("3. 종료");
}
else if (input == "3")
{
Console.WriteLine("게임을 종료합니다.");
break;
}
}
}
}
}
이 예제에서는 Character와 Weapon이라는 객체가 각각 자신의 역할을 가지며, 메서드를 통해 서로 상호작용하도록 설계하였다. 이러한 구조는 객체지향 프로그래밍에서 중요한 개념인 객체 간 협력과 책임 분리를 보여준다.
출력 결과 이미지





'CS > 객체지향 프로그래밍' 카테고리의 다른 글
| 객체지향 프로그래밍(OOP)의 장단점 (0) | 2026.04.08 |
|---|---|
| 객체지향 프로그래밍(OOP)의 특징 (0) | 2026.04.08 |