객체지향 프로그래밍은 도대체 무엇일까?
C#을 사용하든 파이썬을 사용하든 간에 컴퓨터 언어중에선 객체지향이라는 키워드가 보이는 것이 꼭 있습니다.
처음 들었을 때 저도 대략적으로 이해하는 것에 이틀이 넘는 시간이 들었던 것 같습니다.
객체지향 프로그래밍에 대해서
객체지향 프로그래밍 영어로 Object Oriented Programming 즉 OOP 라고 줄여부릅니다.
객체(Object) 란 개념적으로 설명할 수 있는 모든 것을 말합니다.
설명이 두루뭉실하다고 느껴질 수도 있지만 프로그래밍 상 존재하는 모든 것이 정말 다 객체라고 불리웁니다.
사물(컴퓨터,노트북,스마트폰,차), 개념적인 것(캐릭터,아이템 등 게임적인 요소나 국가,군대 등)
우리가 설명할 수 있는 모든 것이 객체라고 보면 될 것입니다.
그리고 객체지향 프로그래밍은 이러한 객체들을 유기적으로 연결해서 개발을 지향한다는 뜻입니다.
지금부턴 객체엔 작은 따옴표('') 를 넣어주면서 예시를 들어보겠습니다.
'시민1'이 '시장'에서 '상인'에게 '사과'를 구입하였다.
위의 예시처럼 객체들은 서로 유기적으로 상호작용하며 상황을 이어갑니다.
한 문장으로 보일 수 있지만 시민1,시장,상인,사과 전부 다른 객체들을 우린 구현하고 상호작용할 수 있도록 설계합니다.
그리고 그러한 것들을 객체지향 프로그래밍이라 부릅니다.
객체 지향의 특징
우선 객체지향 프로그래밍의 특징은 대부분 절차지향 프로그래밍과 대비되어 설명되는 경우가 많습니다.
하지만 저는 아직 절차지향 프로그래밍 언어를 접해본적은 없어 간단한 특성만을 서술하겠습니다.
캡슐화
데이터와 코드를 외부에서 알 수 없게 감추는 것을 의미합니다.
객체 안에는 객체에 꼭 필요한 정보만을 담아야하며 다른 객체의 필수 요소나 꼭 필요하지 않은 정보를 담아선 안된다는 것입니다.
사과와 사람을 예시로 들어서 설명을 해보겠습니다.
사람이 사과를 포크를 사용해서 먹는다.
위의 예시에서 사람과 사과 두 객체가 상호작용하는 입장에서 사람은 포크라는 도구를 사용해서
사과에 접근하고 있습니다.
이 도구를 사용하는 것 사람 객체에서 구성이 되어있다면 이상할 것이 없겠지만
사과에서 구현이 되어있으면 안된다는 것입니다.
도구를 사용하는 주체는 사람인데 사과에 구현이 되어있다면 도구를 사용해야하는 다른 상황에도
사과에 접근해서 사용하게 됩니다.
추상화
객체들의 공통적인 특징을 추려내는 것을 추상화라고 합니다.
해당 내용은 뒤에서 서술할 상속과 연관되어 있는데 우선 비슷한 구조들의 객체들의 공통점을 묶어서
위에서 아래로 상속을 시키는 것만 이해하고 이 공통점을 잘 추려내야한다는 것만 기억해주세요.
빵에도 종류가 있습니다.
피자빵, 단팥빵,바게트 등등
이들의 공통점은 역시 빵이라는 것과 먹을 수 있다는 것이겠죠.
이처럼 상속시킬 대상의 공통점을 미리 큰 범주에서 잘 추려내는 것을 추상화라고 합니다.
상속
추상화에서 봤던 내용의 연장선으로 보겠습니다.
객체지향 프로그래밍 특성을 가진 언어는 기본적으로 상속을 가지고 있습니다.
상속은 큰 범주를 잡고 그 범주를 다른 대상에게 적용시켜 상속시키는 것입니다.
//큰 범주인 빵
public class Bread
{
protected void Bake() //빵을 굽는다는 것의 의미하는 구성요소
{
}
}
//빵을 상속받은 피자빵
public class PizzaBread : Bread
{
//보이지는 않지만 위의 Bake 또한 포함한다.
}
위의 c#코드는 아까 보았던 빵들의 상속관계를 나타낸 것입니다.
피자빵은 상속을 받음으로서 빵들의 공통점을 전부 내려받았습니다.
눈에 보이지는 않지만 공통요소를 전부 내려받음으로 반복적인 코드를 줄일 수 있습니다.
다형성
다형성은 언어의 각 요소들이 여러 타입을 가질 수 있는 것을 뜻합니다.
즉 같은 이름이나 갈래라도 다양한 분류가 가능하다는 뜻입니다.
다형성을 나타낼 수 있는 요소는 다양한데 예시로 오버라이딩이라는 개념이 있습니다.
public void Eat()
{
Console.WriteLine("먹는다");
}
public void Eat(int amount)
{
Console.WriteLine($"{amount}만큼 먹는다");
}
위의 예시는 같은 이름이지만 괄호안의 요소가 다른 경우입니다. (매개변수라는 개념)
오버라이딩은 매개변수라는 요소가 다르다면 같은 이름의 메서드라도 다르게 사용될 수 있다는 것을 보여줍니다.