객체 지향 프로그래밍(Object-Oriented Programming)
개요
객체 지향이란?
필요한 데이터를 추상화 시켜 상태와 행위를 가진 객체로 만들고, 만들어진 객체의 상호작용을 통해 로직을 구성하는
프로그래밍 방법론인데 쉽게 다시 말하면 데이터를 객체로 만들어 서로 상호작용해서 로직을 구성하는 방식이다.
4대 원칙
추상화(Abstraction)
복잡한 자료, 모듈, 시스템의 세부사항은 숨겨두고, 그것들의 중요한 기능이나 데이터만 노출시키는 것을 말한다.
예시
interface IAttackable
{
void TakeDamage(int amount);
}
인터페이스의 TakeDamage() 함수로 '공격받을 수 있다'고만 알 수 있게 되고, 내부적으로 체력이 어떻게 깎이는지 모르게 한다.
캡슐화(Encapsulation)
객체의 내부의 데이터는 숨겨 보호하고, 필요한 기능을 통해서만 조작하여 직접 접근을 제한한다.
자주 사용하는 접근 제어자인 private, protected, public을 사용하여 관리한다.
예시
public class Player
{
private float health;
public void TakeDamage(float amount)
{
health -= amount;
}
}
private으로 health를 숨기고, public으로 TakeDamage() 함수를 외부에서 사용할 수 있게 한다.
상속(Inheritance)
공통된 특징을 부모 클래스로 빼고, 자식 클래스가 물려받는다.
예시
public class Character
{
public float health;
public float atk;
public float def;
}
public class Player : Character
{
public void Move() {}
}
public class Monster : Character
{
public void Attack() {}
}
Player와 Monster은 모두 Character로 분류되어 그것들의 공통적인 체력, 공격력, 방어력을 Character라는 부모 클래스로 빼어 내고, 각자의 특징인 Player의 이동과 Monster의 공격이라는 행동을 각자의 클래스에 놔둔다.
다형성(Polymorphism)
같은 이름의 메서드를 다향한 형태의 동작으로 실행될 수 있다.
부모 클래스나 인터페이스를 기반으로, 자식마다 다른 동작이 가능한다.
예시
interface IAttackable
{
void TakeDamage();
}
public class Character
{
public virtual void Heal()
{
Console.WriteLine("힐!");
}
}
public class Player : Character, IAttackable
{
public void TakeDamage()
{
Console.WriteLine("플레이어가 공격을 당했습니다!");
}
public override void Heal()
{
Console.WriteLine("플레이어: 힐!");
}
}
public class Monster : Character, IAttackable
{
public void TakeDamage()
{
Console.WriteLine("몬스터가 공격을 당했습니다!");
}
public override void Heal()
{
Console.WriteLine("몬스터: 힐!");
}
}
인터페이스인 IAttackable과 부모 클래스인 Character의 자식 클래스인 Player와 Monster가 같은 함수를 사용하더라도 결과는 다르게 나온다.