초심으로 돌아가기) 객체지향 프로그래밍1: 특징
by Steady On영어로는 Object Oriented Programming 줄여서 OOP... 개발하면서 진짜 많이 듣는 단어다. 약간 뜬구름 잡는 듯한 느낌이 있는데 요즘 하고 있는 스터디와 참여하고 있는 원티드 프리온보딩에서 배운 내용. 그리고 추가로 더 찾아본 내용을 정리해보려고 한다.
객체지향 프로그래밍이란?
일단 객체지향 프로그래밍은 일종의 방법론이다. 코드를 작성하는 방법, 코드를 정리하는 방법의 하나이다. 데이터에 대한 생각, 구조 방식이라고도 볼 수 있다. 객체지향 프로그래밍은 이 세상의 모습 그대로를 코드로 나타내보고자 함에서 시작되었다고 한다. 실세계의 모습을 표방해서 코드로 나타내는 것, 그게 객체지향 프로그래밍의 시작점이다.
객체지향 프로그래밍은 프로그램을 하나의 덩어리가 아니라 여러 개의 독립된 단위(모듈)로 이루어져 있고, 각 모듈은 데이터를 가지고(프로퍼티), 상호작용을 한다(메서드)는 관점으로 파악하는 것이다. 여러 개의 모듈로 프로그램을 구성한다는 특징때문에 모듈을 갈아끼우거나(수정), 추가하는 등의 변경에 용이하고 유연하다는 특징이 있다. 그래서 소프트웨어 개발 시에 이를 적용하면 개발과 유지보수에 용이하고, 각 모듈의 재사용성이 높아져서 비용이 절감되는 효과도 기대할 수 있다.
객체지향 프로그래밍의 특징
객체지향은 일반화, 추상화, 상속, 다형성, 은닉화, 캡슐화의 특징을 가진다.
일반화
일반화는 하위 요소들의 공통점을 상위 요소로 추려내는 과정을 의미한다. 예를 들어, 내가 키우는 강아지의 이름은 하루다. 하루는 푸들이다. 푸들은 개다. 개는 생물이다.
(구체적) 하루 → 푸들 → 개 → 생물 (일반적) |
일반화를 하면 할수록 객체의 디테일함이 사라지고 공통된 특징만 남게된다. 따라서 너무 일반화를 심하게 하는 경우 본래의 형태가 떠오르지 않을 수 있으므로 적당하게 하는것이 중요하다.
추상화
추상화는 현실에서 출발하되 불필요한 부분을 제거해가면서 사물의 본질을 드러나게 하는 과정을 의미한다. 예를 들면,
하루의 특징 |
- 털이 크림색이다. - 다리가 4개다. - 9살이다. - 잘 짖지 않는다. - 코가 검정색이다. - 푸들이다. - 발바닥이 검정색이다. - 앉아, 기다려, 빵!, 손, 코!, 브이!를 할 수 있다. - 어젯밤에 자면서 엄청난 잠꼬대를 했다. |
하루는 이런 특징을 가진다. 하지만, 동물병원에서는 하루의 이런 모든 특징이 중요하지 않을 것이다. 그런 관점에서 불필요한 부분을 제거하면, 다음과 같을 것이다.
하루의 특징 |
- 털이 크림색이다. - 다리가 4개다. - 9살이다. - 푸들이다. |
이 데이터를 정리해서 차트에 기록을 한다면, 이렇게 되겠지
이름: 하루 종: 개 견종: 푸들 나이: 9살 외형 특이사항: 없음(다리 4개) |
이게 추상화다! 불필요한 부분은 제거하되 필수적인 부분은 유지해서 본질을 잃지 않는 것
상속
상속은 새로 만들어지는 객체가 이미 만들어진 객체의 특성을 그대로 물려받는 것을 말한다. 위의 일반화에서 우리는
(구체적) 하루 → 푸들 → 개 → 생물 (일반적) |
이런 결론을 내렸다. 푸들의 특징은 털이 곱슬곱슬하고 크기가 다양하다는 것(스탠다드, 미디엄, 미니어처, 토이)과 털 색깔이 다양하다(브라운, 실버, 크림, 블랙 등)이 있다. 하루는 푸들의 특징을 고스란히 물려받았고, 옆집 푸들인 누리는 하루보다는 큰 미니어처이고 털 색깔은 실버이다. 그리고 하루도 누리도 푸들이지만 개의 특성을 그대로 물려받았다고 할 수 있다. 짖을 수 있고(멍멍!하고), 달릴 수 있고, 밥을 먹을 수 있다. 이렇게 상위 객체의 특징을 하위객체가 고스란히 물려 받는게 상속이다.
(클래스가 어쩌고 하면서 설명할 수 있지만, 지금은 코드를 설명하고자 하는게 아니므로)
다형성
다형성은 어떤 한 요소(보통 메서드)를 다양한 모습으로 변형시켜 사용할 수 있는 것이다. 일반적으로 개는 멍멍하고 짖는다고 한다. 하지만, 하루는 "월!"하고 짓는다. 옆집 누리는 "앙앙" 하고 짖고, 친구가 키우는 살구는 "컹컹" 짖는다. "짖는다"는 관점에서는 하루, 누리, 살구가 모두 짖지만, 각자 짖는 소리에 차이가 있다. 이렇게 같은 이름(짖는다)의 메서드가 여러 객체에서 다른 기능을 하는 것을 오버라이딩(Overriding)이라고 한다.
하지만 살구는 강아지 유치원에서 훈련을 받았기 때문에 작게 짖을 수 있다. 짖는다(작게) 라고 하면 진짜 작게 짖는다. 이렇게 메서드에 다른 파라미터를 설정해서 다른 기능을 만드는 것은 오버로딩(Overloading)이라고 한다.
은닉화
은닉화는 객체가 가진 데이터를 겉으로 드러내지 않고 숨기는 것이다. 예를 들어 하루는 겉보기에는 3살 정도된 강아지로 보인다. 산책을 다닐때 하루가 9살이라는 것을 어디에 써서 붙이고 다니지 않는다. 하루의 어딜봐도 하루의 나이는 알 수 없다. 겉으로 드러내지 않는 것! 이게 은닉화다.
캡슐화
캡슐화는 은닉화한 데이터에 접근하거나 제어할 수 있도록 인터페이스를 제공하는 것을 말한다. 예를 들어, 하루와 내가 산책을 하고 있을 때 누군가 나에게 "얘는 몇살이에요?" 라고 물어보면 "9살이요"라고 말해준다. 내가 하루의 나이에 접근할 수 있는 인터페이스가 되는 것이다.(ㅋㅋㅋㅋㅋㅋㅋ)
프리온보딩에서 "객체의 속성을 가져오지 말고 객체가 일하도록 시켜라"라는 말을 들었다. 프로퍼티에 접근하거나 제어할 수 있도록 수단과 방법을 제공하게 만들어야 데이터를 은닉해서 보안성이 높은 프로그래밍을 할 수 있다고 한다.
마무리
사실 이렇게만 알아서는 객체지향 프로그래밍을 다 알았다고는 할 수 없다. 하지만, 객체 지향 프로그래밍은 프로그램을 여러 모듈로 나누어 생각한다는 것, 그리고 그러한 특징때문에 유지보수와 개발에 용이해서 많이 쓰이고 있다는게 중요하다. 많이 쓰이니까 이걸 알아야 현업에서 일할 수 있겠지?
객체지향 프로그래밍 시리즈 다음글
[Apple Platform Develop/Study Log] - 초심으로 돌아가기) 객체지향 프로그래밍 2: SOLID 원칙과 객체지향 생활체조
'Programming' 카테고리의 다른 글
다트 게임 - Swift; 객체를 이용한 풀이 (1) | 2023.06.15 |
---|---|
초심으로 돌아가기) 객체지향 프로그래밍 2: SOLID 원칙과 객체지향 생활체조 (1) | 2023.05.07 |
초심으로 돌아가기) Swift API Design Guidelines 살펴보기 (0) | 2023.05.07 |
블로그의 정보
Roen의 iOS 개발로그
Steady On