반응형
음.. 필자와 같은 비전공자 출신이 처음 프로그래밍을 접했을 때 당황하는 모먼트가 분명 몇가지 있으리라 생각한다.
혹자가 “처음 프로그래밍을 접하면서 가장 이해 하기 힘든 개념이 무엇이었나요?”라고 묻는다면, 나는 주저없이 class에 관해 얘기를 하지 않을까 싶다. 머릿속으로 이해를 해도 쉽게 생각한 부분이 이미지로 형상화가 잘되지않으며, class안에 있는 속성(instance)와 행위 (method)는 코딩을 할때마다 다시금 “이해를 하고 지금 코딩을 하는것인가?”라고 생각하게 만들었다.
간략하게 필자가 이해한 절차적 프로그래밍(aka 구조적 프로그래밍, 함수지향적 프로그래밍)를 언급, 비교하면서 이번 파이썬의 객체지향에 대해 알아보겠습니다.
절차적 프로그래밍
- 대표적인 언어: c하나의 기능을 다시 세부기능으로 나누고 또 나눈다. 그러다보면 더이상 나눌 수 없는 단위기능이 도출이 되는데 이를 함수(function) 형태로 구현한다. 누군가는 top-down 방식이라고 부르며, 또 혹자는 divide and conquer라고 일컫는 것을 봐왔다.
- 해결해야하는 문제를 기능 단위로 세분화
- 대표적인 장점:
- 프로그램의 분과 설계가 쉽다 –> 코드로 작성하고 프로그램을 완성
- 프로그램의 구현시간이 짧다 –> 비용의 절감
- 상대적인 단점:
- 프로그램 수정이 쉽지 않음, 기존 코드의 재활용성이 떨어짐 => 유지보수성이 떨어진다.프로그램 수정 요청이 많아지고 –> 개발비용보다 유지보수 비용이 급격하게 증가
- 이때부터 설계는 어렵지만 유지 보수성이 훨씬 뛰어난 객체지향 방식에 대한 프로그래밍 수요에 붐이 일어난다.
- 1990년 들어오면서 인터넷 보급이 급속도로 빨라졌고, 사람들이 웹 인터페이스를 접하면서 요구사항이 많아지기 시작.
- 이건 대표적으로 c 에 해당되며 장점이자 단점이다. 메모리의 직접적인 주소를 가져오고 제어할 수 있는데, 그래서 하드웨어 조작에 적합한 점을 갖고 있다. 그렇지만 반대로, 메모리 주소를 직접 가져오기때문에 상대적으로 다른 언어에 비해 보안성이 좋지 못하다.
이제 객체 지향 방식을 살펴보겠습니다.
객체지향 프로그래밍
- 대표적인 언어: Java, C++, C#
- 객체 방식으로 프로그램을 분석, 설계, 구현한다.
- 대표적인 장점: 프로그램의 유지보수성은 굉장히 뛰어나다. (객체를 사용하면 함수끼리 얽혀있는게 적기 때문)
- 상대적인 단점: 상대적으로 프로그램을 설계하고 구현하는게 힘들다.
객체지향은 유저 스스로가 해결해야 하는 현실세계의 문제를 그대로 프로그램으로 표현한다고 생각하면 도움이 되는거 같다.
프로그램을 기능으로 세분화 하지 않고, 프로그램을 구성하는 주체를 파악하고 이 주체들간의 DATA의 흐름에 초점을 둔다.
- 우리가 현실세계에서 문제를 구성하고 있는 구성요소 => 개체 (object)
- 프로그램적으로 문제를 구성하고 있는 구성요소 => 객체 (object)
그렇다면 어떻게 프로그램적으로 표현하느냐? class 를 사용.
class는 현실세계의 객체를 프로그래밍으로 모델링하는 수단이다.
객체지향 프로그래밍의 예시
은행 프로그램을 예로 들어보자.
- 은행을 구성하고 있는 구성요소를 먼저 찾아봅시다. -> 의자, 테이블, 볼펜, 안경, 돈, 지폐 계산기, ATM, 등등 이 존재할 것입니다.
- 만약 프로그램을 할 때 의자가 필요 없다? 그러면 날리면 된다.너무나 당연하게도 의문이 하나 들텐데 “사람마다 구성요소를 바라보는 시점, 판단 등과 같은 것들은 다 다르지 않을까?” 100% 동의한다. 그렇기때문에 객체지향 프로그래밍의 설계가 상대적으로 훨씬 어렵다고 평가를 받는다.
- class로 구현한 현실 세계에서 어떤 요소가 바뀌면, 프로그래밍에서 속성(instance)을 바꿔주면 된다. 함수로만 구현한게 아니니깐, 요소만 바꾸면 된다는 유지보수성의 탁월한 특징이 있다.
- 따라서 객체를 제대로 만들고 활용한다면 현실 세계의 은행을 그대로 프로그래밍 적으로 묘사가 가능하다. 또한 파생적인 효과를 누릴수 있는 것중 하나가 모델링이 완벽하면 유지보수가 쉽다는 장점이 있습니다.
반응형
'파이썬 > 클래스' 카테고리의 다른 글
[python] 파이썬 class의 __call__ 함수 (매직메소드) (0) | 2023.03.12 |
---|---|
[python] 클래스 메서드(class method)와 정적 메서드(static method) (0) | 2023.03.08 |
[python] 파이썬 Class 내 self.<variable name>에서 self 키워드는 어떤 역할을 할까? (0) | 2023.03.05 |
파이썬과 객체지향 (python and class) 3 - 생성자(__init__, initializer) (0) | 2023.01.02 |
파이썬과 객체지향 (python and class) 2 (0) | 2023.01.02 |