객체 지향 프로그래밍은 컴퓨터 프로그래밍 패러다임중 하나로, 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다. 말그대로 객체를 중심으로 프로그래밍을 하는것!
<장점>
<단점>
은닉된 클래스 내의 자료형이나 오브젝트의 설정/ 접근이 필요할경우 프로퍼티의 사용이 가능하다.
Class Test(){
private int forTest = 10;
public int ForTest{
get {return forTest;}
set {forTest = value;}
}
}
public class Animal
{
int hp = 30;
float speed = 3.0f;
protected void Attack(){
Console.Writline("공격하기");
}
}
public class Monkey : Animal
{
public void Runaway(){
Console.Writline("도망가기");
}
}
static void Main(string[] args)
{
Monkey monkey = new Monkey();
Monkey.Attack();
}
이런 코드가 구현될경우 Monkey내에선 attack을 정의하지 않지만 부모클래스에서 정의하였으므로 Attack 함수의 사용이 가능하다.
Animal monkey_a = new Monkey();
Monkey monkey_m = new Monkey();
List<Animal> animalList = new List();
animalList.Add(monkey_a);
animalList.Add(monkey_m);
foreach(Animal anim in animalList)
{
anim.Attack();
}
일 경우 자료형이 다른 각각의 monkey_a, monkey_m이지만 동일한 부모의 메서드인 attack 함수가 실행이 된다.
abstract class Site
{
public abstract void host(); // 추상 메서드 구현불가
public void greeting()
{
Console.WriteLine("놀러오세요");
]
}
Site my = new Site(); //에러 추상클래스로는 객체의 생성이 불가능함
// 사용하는 방법 서브 클래스 이용
class My : Site
{
public override void host()
{
Console.WriteLine("Homzzang.com");
}
}
static void Main()
{
My my = new My(); //추상클래스의 파생클래스는 재정의가 가능
my.host(); // 오버라이딩 한 추상메서드
my.greeting(); //추상클래스 내의 일반 메서드
}
다형성에서의 연장선상에서
부모함수에 virtual함수를 구현해주고
class Animal
{
public virtual void Sound()
{
Console.WriteLine("동물소리");
}
}
class Monkey : Animal
{
public override void Sound()
{
Console.WriteLine("끽끽");
}
}
class Tiger : Animal
{
public overrdie void Sound()
{
Console.WriteLine("어흥");
}
}
static void Main()
{
Monkey monkey = new Monkey();
Tiger tiger = new Tiger();
List<Animal> animalList = new List<Animal>();
animalList.Add(monkey);
animalList.Add(tiger);
foreach(var a in animal)
{
a.Sound(); //output : 끽끽 \n어흥
}
}
오버라이딩을 통해 구현을 할 경우 다형성의 원칙에 따라 monkey와 tiger를 animal 형식의 리스트에 넣을 수도 있고 해당 리스트내의 Sound를 실행 할 경우 파생클래스에서의 overrding된 함수가 실행된다.