OOP란?
해당 브런치에 남김 글은 초고입니다. 완성된 작품은 해당 "오늘부터 IT를 시작합니다."로 출간하였습니다!!
구매하여서 완성된 글을 종이책의 정감과 편안함으로 읽어보시길 바랍니다^^
감사합니다.!!
http://www.yes24.com/Product/Goods/111417594
추운 겨울 천 원짜리 한 장으로 행복할 수 있는 방법이 있을까요? 따뜻하고, 배까지 부를 수 있다면 얼마나 좋을까요? 그런데 국민간식 붕어빵이면 그것은 현실이 됩니다. 가격은 지역마다 조금씩 다르지만 보통은 1,000원에 3~4개, 바삭한 밀가루 빵 사이에 들어있는 달콤한 팥은 없어서는 안 될 겨울철 군것질 거리입니다. 바삭하게 구워진 이 붕어 모양의 빵 한 봉지를 주문하고, 기다리면 차례대로 붕어빵 틀에서 갓 구원진 빵들이 차례대로 만들어집니다. 흡사 프로그래밍 코딩을 하는 것처럼 일정 시간과 방법들을 투입하면 그대로 정해진 결과로 붕어빵이 탄생하는 걸 지켜볼 수 있습니다. 이 과정을 지켜보면서 객체지향 프로그래밍이 어떻게 움직이고 협력하는지 알 수 있을 거 같단 생각이 들었습니다. 이번 단원에는 '붕어빵 이야기'를 통해 쉬운 비유로 복잡한 OOP(Object-Oriented Programming)을 알아보겠습니다.
"객체지향 프로그래밍에 대해 설명해보세요?" 개발자가 취직하기 위해서 마주한 기술면접에서 나오는 단골 문제 하면 바로 객체지향에 관한 것입니다. 문제는 가벼운 질문으로 끝나는 것이 아니라 꼬리에 꼬리를 물면서 이제 질문을 이어 나갑니다. "장점은 무엇일까요?", "단점이 있을까요?", "어떤 사물과 비유가 가능할까요?" 그만큼 이 개념은 프로그래밍 중요하고 널리 쓰이는 방식입니다. 그렇다면 OOP라는 녀석을 한번 자세히 알아보겠습니다.
객체 지향 프로그래밍(영어: Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나입니다. 독립된 단위인 객체들의 모임을 들로써 객체(object)라는 기본 단위로 나누어 메시지를 주고받고 데이터를 처리하며 상호작용하는 방식입니다. 객체란 하나의 역할을 수행하는 '메서드와 변수(데이터)'으로 볼 수 있습니다. 이런 방식의 특징은 매우 유연하고 변경이 쉽기 때문에 대규모 소프트웨어 개발에 주로 사용되는 방식입니다. 이렇게 만들어진 프로그램은 유지보수와 개발이 매우 편리하며, 직관적으로 코드를 분석할 수 있습니다. 객체 지향이 가진 특징은 크게 4가지가 있습니다. 바로 객체, 캡슐화, 상속, 추상화, 다형성, 인터페이스입니다.
- 객체(object)
물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있고 다른 것과 식별 가능한 것을 말합니다. 객체 지향 프로그래밍에서 클래스는 객체를 만들기 위한 확장 가능한 코드 템플릿입니다. 구현 가능한 초기 값을 제공하는 역할을 합니다.
- 캡슐화(encapsulation)
객체지향에 큰 특징 중에 하나가 바로 캡슐화입니다. 영어로는 Encapsulation입니다. 봉인하다.라는 뜻입니다. 중요한 데이터를 보존하고 보호하는 것입니다. 이름에서 느껴지듯 내부의 정보를 최소한으로 외부에 노출하는 걸 의미합니다. 즉 내부에서 정의한 필드와 자료구조 등에 대한 접근을 차단한다는 뜻입니다. 그리고 이를 메쏘드로 접근해서 사용하는 방식입니다.
- 다형성(polymorphism)
다형성은 객체지향 프로그램에 특징 중 하나입니다. 상속이 대표적인 개념이기도 합니다. 서로 다른 클래스의 객체가 같은 값을 받은 후 각자의 방식으로 동작하는 능력을 말합니다. 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미합니다.
- 상속(Inheritance)
상속은 적응 양의 코드로 새로운 클래스를 작성할 수 있도록 클래스를 상속해주는 방식을 말합니다. 이는 코드의 추가와 변경이 용이하게 하고, 기존의 클래스를 재사용하여 새로운 클래스를 만들기 때문에 재사용성을 높이고 코드의 중복을 제거하는 방식을 말합니다.
- 추상화(Abstraction)
추상화란 특정한 개별 사물과 관련되지 않은 공통된 속성이나 관계 등을 뽑아내는 것입니다. 중요한 특징을 추려낸 후에 이를 간단하게 표현하는 것을 말합니다. 추상화는 여러 가지 요소를 하나로 통합하는 방향성을 가지고 있습니다. 컴퓨터 관점에서 추상화란 데이터나 프로세스 등을 의미가 비슷한 개념이나 표현으로 정의해 나가는 과정이면서 동시에 각 개별 개체의 구현에 대한 상세함은 감추는 것, 이것이 추상화라고 할 수 있습니다.
복잡하고 쉽게 이해할 수 없는 개념들입니다. 한 번이 이해 못 하셨다면 그게 정상입니다. 그래서 이번에는 다시 객체지향 프로그래밍을 붕어빵으로 비유해 설명해 보겠습니다.
붕어빵을 만드는 방법은 생각보다 단순합니다. 우선 붕어빵 반죽과, 팥 앙금을 준비합니다. 이 재들은 직접 만들지 않고 마트에서 파는 기성 제품을 구매합니다. 이제는 붕어빵을 굽는 기계를 가동합니다. 가스를 넣고 불을 지핍니다. 충분히 기계가 데워지면 붕어 모양의 틀에 밀가루 반죽을 넣습니다. 절반 정도 넣고, 팥을 넣습니다. 그리고 다시 밀가루를 부어서 나머지 반을 붓고, 뚜껑을 닫습니다. 그렇게 한 개의 붕어빵이 익어가기 시작합니다. 그리고 동일한 작업을 합니다. 그럼 제일 처음 만들었던 붕어빵이 가장 먼저 익고 이를 꺼내어 맛있게 먹으면 됩니다.
붕어빵을 만드는 기계 붕어빵 틀은 객체를 생성하는 기능을 제공합니다. 그래서 붕어빵을 찍어내는 기계는 바로 클래스(class)라고 표현할 수 있습니다. 클래스란 객체를 정의하는 틀 또는 설계도와 같은 의미로 사용됩니다. 그렇기 때문에 클래스는 동일한 결과를 얻어 낼 수 있습니다. 이 덕분에 붕어빵을 만드는 사람도 동일한 결과를 얻고, 소비자도 동일한 맛의 빵을 얻을 수 있습니다.
보통의 붕어빵은 밀가루 반죽과 팥은 구매하여 사용합니다. 이 비법이 재료들은 동일한 베이스로 만들어집니다. 하지만 납품하는 제품마다 다른 맛과 특징이 숨겨져 있습니다. 하지만 그 맛을 내는 비법은 모두 비밀입니다. 캡슐화는 캡슐에 담긴 알약입니다. 효능이 다른 가루가 들어있지만 우리는 그것을 물과 함께 삼키면 그만입니다. 다시 말해 정의된 방법을 외부에 노출시키지 않고 그것을 사용할 수 있게 만들어 놓은것이 바로 캡슐화, 은닉성이라고 합니다. 다시 말해 붕어빵을 만들 때 우리는 캡슐화된 반죽과 팥의 사용법만 알고 있으면 됩니다.
붕어빵이 큰 인기를 얻자 유행하고 나서 이보다 좀 더 큰 모양으로 반죽은 얇고 팥이 더 많이 들어간 잉어빵을 출시하게 되었습니다. 또 그 후에는 좀 더 크고 비싼 가격의 황금잉어빵까지 탄생하게 되었습니다. 하지만 약간의 방식의 차이가 있을 뿐 만드는 과정은 모두 동일합니다. 기존 붕어빵의 틀에 자신만의 특성을 입혀서 새로운 제품을 만들었기 때문입니다. 이게 바로 상속입니다. 붕어빵 틀을 상속받아서 좀 더 반죽이 많이 들어가게 해서 새로운 이름을 붙였습니다. 이는 클래스가 상속을 이용하여 새로운 클래스를 만드는 과정과 동일합니다. 상속이란 토대에 창작을 더하면 언제든지 금방 새로운 것을 만들어 낼 수 있습니다. 만약 제가 붕어빵을 상속받아서 새롭게 만들어본다면 반대로 크기를 작게 하여 미꾸라지 빵을 만들어보고 싶습니다.
붕어빵은 빵입니다. 빵의 기본적인 특징은 무엇일까요. 바로 밀가루입니다. 이 곡식의 가루를 통해 식빵도 만들 수 있고, 바게트도 만들 수 있습니다. 굳이 붕어빵만을 만드는 데 사용하지 않습니다. 그것이 바로 빵입니다. 피카소는 추상화의 대가입니다. 그는 대상의 핵심적인 특징을 뽑아내어 아주 간단한 선만 남겨두고는 했습니다. 추상화란 이처럼 중요한 정보만을 표현하는 것을 말합니다. 그러므로 붕어빵은 빵입니다. 빵에서 생각하는 것이 바로 추상화입니다. 이런 추상적인 생각으로 밀가루로 붕어 모양의 빵만을 만드는 것이 아니라 더 다양한 빵을 만들 수 있게 됩니다.
복잡하고 어렵게 느껴졌던 객체지향 프로그래밍 방식은 생각보다 가까운 곳에 있었습니다. 사실은 코딩보다 우리가 먼저 이 방식을 사용하여서 좀 더 효율적으로 세상을 만들어가고 있었습니다.
코딩은 원래 우리의 일상과 맞닿아 있습니다.