이 글을 보는 사람들은 C 언어는 객체지향 언어가 아니라는 사실을 당연히 알고 있을 것이다. 그렇다고 C 언어로 객체지향적 프로그래밍을 할 수 없을까?
이 시리즈는 C 언어로 객체지향의 특징을 구현할 것이다. 이를 위해서 객체지향이 무엇인지, 그리고 절차지향과는 어떤 차이가 있는 지 우선 알아보자.
절차지향 프로그래밍은 하나의 문제에 대해서 문제를 해결하는 순서를 중요시 하는 패러다임이다.
이는 컴퓨터가 처리하는 방식과 유사하기 때문에 실행속도가 빠르다는 장점이 있다. 하지만 하나의 문제에 대해 순차적으로 처리하기 때문에 중간에 오류가 나면 그 이후를 모두 고쳐야한다는 단점 때문에 유지보수하기가 어렵다는 단점이 있다.
객체지향 프로그래밍은 객체지향적 사고를 설계 및 개발에 도입하여 문제를 생각하고 분석하는 패러다임이다.
객체지향적 사고란 우리가 우리 주변의 환경을 처리하는 기본 방식이다. 우리는 우리 주변의 환경을 볼 때 자연스레 환경을 작게 나누어 분석한다. 예를 들어, 테이블 위에 노트북과 태블릿, 물컵이 있다고 생각해보자. 우리는 별도의 과정을 거치지 않아도 테이블, 노트북, 태블릿, 물컵으로 나누고, 이들을 연관지어 생각하기 시작한다.
이를 통해 절차지향 프로그래밍에 비해 코드의 재사용성이 확실하게 높아 유지보수가 쉽다는 장점이 있다. 하지만 하나의 문제에 대해 객체부터 설계를 해야하기 때문에 설계에 많은 시간이 들어간다는 단점 또한 존재한다.
객체지향 프로그래밍은 인간이 문제를 이해하는 방식을 기반으로 프로그래밍을 한 것이고, CPU는 절차지향적 실행을 따른다. 따라서 이 둘 사이에 놓일 무언가가 필요한데, C 언어가 바로 그 곳에 위치하고 있다.
따라서 C 언어는 객체지향 언어가 될 수 없다.
객체지향을 배운 적이 있는 사람이라면 객체지향의 특징 4가지를 들어본 적이 있을 것이다. 이 시리즈에서 C 언어로 4가지 특징을 구현해볼 것이다.
하나의 객체는 여러 속성(field)과 기능(method)을 가진다. 예를 들어, 사람이라는 객체에는 키, 몸무게 등의 속성과 걷기, 달리기, 공부하기라는 기능이 있다.
캡슐화는 객체에 이러한 속성들을 넣어주는 작업을 말한다. 객체지향 언어에서는 Class 키워드를 통해 선언하며, C 언어에서는 구조체를 통해 이를 구현할 수 있다.
상속은 객체들 간의 관계를 구축하는 작업이다. 상속을 받은 객체를 자식, 상속해 준 객체를 부모로 정의하며 자식 객체는 부모 객체에서 상속받은 속성 및 기능을 사용할 수 있다.
예를 들어, 대학생이라는 객체는 대학생이기 이전에 사람이기 때문에 사람 객체를 상속받는다. 그래서 대학생은 사람과 같이 키, 몸무게 등의 속성을 가지고, 공부하기 기능을 가질 수 있다. 이 외에도 사람 객체에는 없는 성적, 학교 다니기 등의 속성과 기능을 추가할 수 있다.
다형성은 에시를 통해 먼저 설명해보자.
mobius와 anna는 대학생 객체로부터 만들어졌다. 하지만 anna의 공부하기는 열심히 공부하기로 기능하고, mobius의 공부하기는 안하기로 작동한다.
이처럼 같은 객체로부터 만들어진 개체들이 같은 기능을 가졌음에도 불구하고, 그 기능이 개체마다 다르게 행동할 수 있도록 하는 것이 다형성이다.
추상화는 객체 간의 관계를 약하게 이어주는 역할을 한다.
예를 들어, anna라는 대학생은 계산이론과 컴퓨터 구조라는 과목을 공부한다. 따라서 현재 anna라는 개체에는 계산이론과 컴퓨터 구조라는 과목들과 연결되어있다. 하지만 현재 학기가 끝난 후, 다음 학기로 들어가게 되면 공부하는 과목이 바뀐다. 그러면 anna는 연결되어 있는 과목들을 바꿔야한다. 그러기 위해 우리는 새로운 과목을 추가해야할 필요가 있다.
이 때, 단순하게 새로운 과목을 추가한다면 우리는 anna와 새로운 과목 사이의 관계를 또다시 추가시켜줘야 한다. 그리고 이는 anna가 졸업할 때까지 계속되어야 한다.
이를 위해 필요한 작업이 추상화이다. 미리 anna는 과목을 공부한다라고 추상적으로 만들어둔다면 우리는 새로운 과목을 추가하여도 새롭게 연결지어줄 필요가 없이 단순히 과목을 추가하는 것만으로도 연결을 쉽게 할 수 있다.
이러한 객체지향의 특성을 우리는 C 언어를 통해 구현해보고자 할 것이다.
공부하다보면 C 언어에는 이런 특성이 있어? 라고 생각할 수도 있다. 그런 점이 재미있는 부분이기 때문에 열심히 공부해보자.