본문 바로가기
Computer Science/OS

Python Programming 요약

by 수제햄버거 2022. 6. 9.
728x90
반응형

Contents
Part 1. Why should we learn coding?

Part 2. History of Computer

Part 3. Welcome to Python!

Part 4. Object Oriented Programming

 

Part 1. Why should we learn coding?


Problem Solving

 최초로 컴퓨터가 탄생하고 프로그래머들은 어떻게 컴퓨터로 사람의 언어(이하 자연어) 를 표현해야 할 지 고민 했습니다. 해결방법으로 본인들만의 문자세트를 지정하고 문자인코딩을 통해 문자들을 코딩에 할당했습니다. 그런데 미국인 프로그래머 A씨가 유럽으로 출장을 떠나면서 또 다른 문제점이 생깁니다. 미국에서 잘만 돌아가던 프로그램이 안 돌아가기 시작한겁니다. 이러한 문제를 해결하기 위해 1967년 미국에서 표준 문자세트를 제정하게 됩니다. 바로 ASCII 코드입니다. ASCII코드의 등장덕분에 이제 전세계 어디에서든 문자를 표현 할 수 있게 됩니다!  이처럼 컴퓨터 분야는 수 많은 문제를 만나고 그것을 해결해 가면서 발전해왔습니다. 이런 방법을 우리는 Problem Solving 이라고 부릅니다.

[Key Note]
Problem Solving : 문제 해결 (방법)
문자 그대로 문제를 해결하는 방법을 뜻합니다.  다음과 같은 단계로 진행 됩니다.

1. Defining the problem.

2. Generating alternatives.
3. Evaluating and selecting alternatives.
4 .Implementing solutions.
 
     ASCII : 미국에서 제정한 표준 문자세트입니다. 미국에서 만들었기 때문에 알파벳과 숫자등의 글자로 이루어져있고, 추후 유니코드로 확장하며 여러 언어들을 지원해 주게 됩니다.
 

Computational Thinking

 수 많은 문제가 있지만, 프로그래머들의 관심은 컴퓨터에 집중 되었습니다. 컴퓨터에게 ASCII를 준 프로그래머들은 이제 많은 일들을 컴퓨터로 할 수 있게 되었습니다. 그리고 문득 사람이 하기 힘든 일을 컴퓨터가 해결하면 어떨까 라는 상상을 하게 됩니다.  이전에 살펴본 ASCII 코드 때와 같이, 프로그래머들은 인간이 직면한 문제를 컴퓨터에게 해결시키고자 하는 “문제"를 직면하고, 이를 해결하기 위해 노력합니다. 이러한 과정을 Computational Thinking 이라고 부릅니다. 컴퓨팅 사고력 이라고도 부르지요.

 개개인 모두가 각자의 Computational Thinking을 가지고 있다면, 개인이 직면한 문제는 해결 할 수 있을지도 모릅니다. 하지만 그보다 더 큰 개인이 해결할 수 없는 문제는 해결할 수 없을지도 모릅니다. 때문에 우리는 표준적이고 보편적인 Computational Thinking이 필요합니다. 2006년 미국 카네기 멜론 대학의 Wing 교수의 연구로 인해 보편적으로 Computational Thinking 의 개념이 정립됩니다.

 Wing 교수는 컴퓨팅 사고력을 크게 추상화 (Abstraction)와 자동화(Automation)으로 구분하였습니다. 추상화(Abstraction)은 실제 세계의 문제를 컴퓨터가 해결 가능한 형태로 표현하기 위한 사고 과정입니다. 자동화(Automation)은 추상화 과정을 통해 만들어진 해결 모델을 컴퓨터가 이해할 수 있는 프로그래밍 언어로 표현하여 인간이 처리하기 어려운 많은 양의 반복작업이나 시뮬레이션을 실시하는 것 입니다. 추상화 된 문제를 자동화로 만드는 과정에서 보다 좋은 효율성을 고려하기위 알고리즘 이라는 개념이 도입됩니다.
 이후 국제교육공학협회(ISTE) 와 컴퓨터과학교사회(CSTA)에서 컴퓨팅 사고력의 조작적 정의를 내리며 9가지 요소로 세분화 하여 제시하기도 하였습니다.

[Key Note]
     Computational Thinking : 컴퓨팅 사고력 이라고 부릅니다.  현실세계의 문제를 컴퓨터가 해결할 수 있도록 사고하고, 구현하는 사고력을 의미합니다.


     Computational Thinking의 구성요소
     추상화(Abstraction)
현실 세계의 문제를 컴퓨터가 해결할 수 있도록 문제를 재정의 하는 것을 의미합니다.

     알고리즘
A문제를 푸는 방법이 2가지 있을 때, 한가지는 100년이 걸리고 다른 한 가지는 20분이 걸린다면 우리는 20분이 걸리는 방법을 사용할 것 입니다. 이처럼 알고리즘은 문제를 푸는 방법을 의미하지만, 그 속에 효율적으로 해결 해야한다는 것도 포함하고 있습니다.

     자동화(Automation)
추상화 과정을 통해 만들어진 해결 모델을 프로그래밍하여 컴퓨터가 할 수 있도록 만드는 것을 의미합니다. 단순 문제 뿐 아니라 유사한 문제에 대한 풀이도 재현가능하도록 만드는 것을 의미합니다.


     모든 문제를 컴퓨터가 풀 수는 없습니다. 때문에 Computational Thinking을 하기 전에 해결하려는 문제가 컴퓨터가 할 수 있는 것인지 아닌것인지 구분하는 것이 굉장히 중요합니다. 애인의 오늘 기분을 예측하는 문제는 아무래도 컴퓨터는 해결할 수 없을 것이니까요.

 Why Python?

  그렇다면 우리는 수많은 프로그래밍언어 중에서도 왜 Python을 배워야 할까요? 앞서서 우리는 현실 세계의 문제를 그 중에서 인간이 수행하기에 너무 많은 양이나 지루할만큼 반복 해야하는 일들을 컴퓨터가 대신 하도록 하기 위해서 Coding, PS ,CT등을 배우려 하였습니다. 그렇다면 내가 풀려하는 문제에 Python이 큰 강점을 가지고 있다면 우리가 Python을 써야하는 충분한 이유가 있을 수 있지 않을까요? Python에 대한 언어적특징, 구조에 대해서는 Part 3. Welcome to Python에서 다루어보도록 하겠습니다. 여기서 다룰 강점은 Python의 유연한 구조 덕분에 많은 API나 Framework와 함께 쓸 수 있다는 것 입니다. 혼자보다 나은 둘이라는 말처럼 Python은 현재 뜨거운 감자인 AI,ML(Machine Learning),DL(Deep Learning)을 위한 여러 도구들과 좋은 호환성을 무기로 많이 쓰이고 있습니다. 즉, 우리가 풀고 싶은 문제가 AI분야라면 Python을 배우는 것이 무엇보다 유리하다는 것 이죠!

[Key Note]
     Python은 여러가지 툴(tools, Framework)와 호환이 되는 강점을 가지고 있습니다. 이러한 강점은 AI,Machine Learning, Deep Learning의 장벽을 낮춰주고 또한 개발속도도 빠르게 향상 시켜주는 강점을 가지고 있습니다.


     때문에 우리가 풀고싶은 문제가 위의 3가지 분류에 해당된다면, 주저없이 Python을 고르는 것이 좋은 선택일 것 입니다.

AI , ML(Machine Learning) , DL(Deep Learning)

딥러닝, 머신러닝 , 인공지능에 관련된 과목을 개설하지 않은 곳을 찾아보기 힘들 정도 입니다. 기업에서는 앞다투며 AI기술을 도입한다고 발표하고 돈을 투자하며 R&D센터를 설립하고 있습니다. 원래 쓰던 어플들은 똑똑해져서 이제 검색 한번만 해도 몇일간은 내가 검색한 내용과 유사한 광고를 보여주며 지름신(?)을 유발하죠. 대체 AI가 뭐길래 세계는 이렇게도 뜨거운 관심을 보이는  걸 까요?
AI는 한마디로 정의한다면 기계가 인간처럼 행동하게 하는 것을 의미합니다. 영화 아이로봇에 나오는 모든 로봇들이 가지고 있는 기능이죠.

하지만 문제는 “인간처럼" 한다는 것에 대한 정확한 기준이 없다는 것입니다.  때문에 우리는 이러한 문제를 해결하기 위해 “인간처럼"에 대한 기준으로 인간의 특성중 가장 큰 특성인 “학습"을

뽑아서 사용하게 됩니다.

 

기계가 인간처럼 행동하는 것을 AI라고 했다면 모호한 기준을 “학습”으로 재정의하며 이를 Machine Learning 이라고 합니다. 즉 Machine Learning은 기계가 사람과 같이 “학습"하는 것을 의미 합니다. 학습의 방법에 따라서 3가지로 분류합니다. 정답이 있는(label) 데이터로 학습할 경우 지도학습(Supervised Learning), 정답이 없는 데이터로 학습할 경우 비지도 학습(Unsupervised Learning), 보상과 패널티를 통해 학습하는 강화학습(Reinforcement Learning)으로 분류됩니다.

Machine Learning은 꽤나 문제를 잘 해결 한다고 생각하며 사용되었지만 현실의 문제는 점점 복잡해져갔고, ML로 풀 수 없는 문제들이 등장하기 시작했습니다. 이를 위해 ML에 인공신경망이라는 뉴럴넷을 도입하였고 인공신경망 덕분에 더 많은 데이터를 기반으로 학습할 수 있게 되었습니다. 이를 Deep Learning이라고 합니다.

[Key Note]
     AI(Artificial Intelligence, 인공지능) : 기계가 사람처럼 행동하게 만드는 것


     ML(Machine Learning, 기계학습) : 기계가 사람과 같이 “학습"하도록 만드는 것


     DL(Deep Learning, 딥러닝, 뉴럴넷) : 인공신경망을 이용하여 빅데이터를 학습할 수 있게 만드는 것


     AI는 여러 도메인에서 쓰이지만 주된 도메인은 Computer Vision 과 Natural Language Processing이 존재합니다. 보다 상세한 지식은 다음과 같은 책을 참고하시는게 좋습니다.
     Comuter Vision
-COMPUTER VISION 컴퓨터 비전 기본 개념부터 최신 모바일 응용 예까지 (오일서 저)
- OpenCV 컴퓨터 비전 프로젝트 : 증강현실부터 자동차 번호판, 얼굴 인식, 3D 머리 포즈 추적까지 (다니엘 렐리스 바지우,셰르빈 이마미 등저)
- Stanford CS231n 2017(advisor: Fei-Fei)

     Natural Language Processing
-김기현의 자연어 처리 딥러닝 캠프(파이토치 편) (김기현 저)

     Common
- 핸즈온 머신러닝 (오렐리앙 제롱 저)
- 단단한 머신러닝(조우쯔화 저)
- 밑바닥부터 시작하는 딥러닝(사이토 고키 저)

 

Part 2. History of Computer


운영체제와 프로그래밍 언어

Part 1에서 우리는 Computational Thinking과 Coding을 배우는 이유, Python을 써야하는 이유, AI,ML,DL등에 대해서 알아보았습니다. Computer의 현재를 알게 되었죠. 그렇다면 미래의 Computer는 어떻게 나아갈까요? 미래를 알기 위해 우리는 Computer의 과거를 보아야 합니다. 이번 Part2 에선 Computer의 역사를 운영체제(OS : Operating System)과 프로그래밍언어의 입장에서 연도별로 살펴보겠습니다.

70’s  OS & Programming Language

 Operating System이란 컴퓨터를 사용하는 유저가 컴퓨터와 같은 시스템을 사용하기 쉽고 편리하게 해주는 소프트웨어 입니다. OS를 사용하며 컴퓨터를 쓰던 와중에 70년대에 Computer 이외에도 Server가 등장하게 됩니다. Server가 등장하면서 다수의 인원이 사용할 수 있도록 만들어주는 OS의 필요성이 생겨납니다. 이를 위해 UNIX라는 OS가 개발됩니다. Server 운영의 목적을 띄고 있기 때문에 UNIX는 다수의 유저들에게 시스템을 제공해주는 특성을 가지고 있으며 동시에 시분할(각 사용자들에게 컴퓨터 자원을 시간적으로 분할하여 사용할 수 있게 해 주는 시스템)적인 특성을 가지고 있었습니다.
 이처럼 컴퓨터 자원을 여러명이서 어떻게 효율적으로 사용해야할까를 고민하던 시기였고, 컴퓨터 관점에서의 사고가 활발히 이루어졌기 때문에 개발되는 프로그래밍 언어도 영향을 받을 수 밖에 없었습니다. 그래서 이 당시에 개발된 프로그래밍 언어인 C는 포인터등 컴퓨터관점(하드웨어)에서 사용하기 좋은 개념들을 포함하고 있고 컴퓨터의 관점에서 디자인 되었습니다.

[Key Note]
     OS: UNIX
Server의 등장으로 다수의 유저를 위해 개발 되었습니다.
시분할 특성을 가지고 있습니다.


     Programming Language : C
컴퓨터 관점(하드웨어) 에서 디자인 되어있습니다.
포인터 와 같은 여러 개념들이 하드웨어에 접근이 용이하도록 디자인 되어있습니다.
때문에 처음 배우는 시기에 진입장벽이 높습니다.

80’s  OS & Programming Language

 80년대의 가장 큰 이슈는 개인 PC의 보급화 입니다. IBM에 의해서 개인 PC의 보급에 성공하고, 개개인이 PC를 소유할 수 있게 되었습니다. PC를 사용하는 유저가 늘어날 수록 기존의 CLI(Command Line Interface)기반의 컴퓨터가 어렵다라는 반응이 나타났고, 84년 애플 매킨토시의 등장으로 CLI 기반 컴퓨터가 GUI(Graphical User Interface)으로 변화하게 됩니다. 이어 애플의 경쟁사인 MS에서도 Window를 출시하죠.
 프로그래밍 언어도 이와같은 변화에 영향을 받습니다. 기존의 하드웨어 관리에 유리하게 만들어진 C언어를 사용자 입장에서 보다 편리하게 사용하고자하는 목적으로 업그레이드 시킨 C++가 개발 되게 됩니다. 하드웨어 중심에서 인간중심으로 개발된 것 입니다!

[Key Note]
     OS : Macintosh(매킨토시), Window
개인 PC의 보급으로 기존에 사용되던 CLI        보다 GUI와 같이 편리한 OS에 대한 수요가 많아졌고 이에 맞춰 발달된 OS 입니다.


     Programming Language : C++
사용자의 입장이 중요시 되며 개발되는 OS의 변화에 맞춰서 기존의 하드웨어 적 관점에서 개발된 C를 사용자 중심으로 사용할 수 있는 언어로 개발된 언어입니다.
이는 추후의 객체 지향 프로그래밍의 근본이 됩니다.

90’s  OS & Programming Language

80년대에 보급되었던 PC의 성능은 나날이 향상 되어 갑니다. 또한 통신망의 발달로 네트워크가 넓어지고 89년 유럽의 연구소에서 시작된 프로젝트의 발전으로 WWW(World-Wide Web)가 태어납니다! 지금 쓰이고 있는 인터넷이 나오게 되는 것 이지요. 그런데 이런 발전에 비해 개개인이 UNIX를 쓰는것은 굉장히 비쌋습니다. 그 결과 OpenSource로 Linux라는 새로운 OS가 개발되고 WWW의 등장에 영향을 받아 분산시스템과 같은 영역으로 확장되었습니다.
 프로그래밍 언어 또한 당시에 발전하고 있었던 임베디스 시스템, 웹 등과 같이 빠른 반응과 가벼운 프로그램을 지향하는 방향으로 발전하였습니다. JAVA와 같은 프로그래밍 언어가 등장하였지요.

[Key Note]
     OS : Linux
WWW의 탄생으로 인터넷이 생기고 기존보다 훨씬 많은 데이터가 공유되면서 분산 시스템이 발전하였습니다. 또한 기존의 OS인 UNIX에 대해 비용등과 같은 문제로 모두가 개발하며 사용하는 OpenSource로 Linux OS가 탄생합니다.


     OpenSource : 공개적으로 액세스 할 수 있게 설계 되어 누구나 자유롭게 확인, 수정, 배포할 수 있는 코드 입니다. 오픈 소스 소프트웨어는 동료평가 와 커뮤니티 기반 프로덕션에 의지하므로, 분산된 동시에 협업 방식으로 개발됩니다. 때문에 독점적 소프트웨어보다 저렴하고, 유연하며, 지속성이 있습니다.


     Programming Language : JAVA
임베디드 시스템이나 웹 과 같은 반응이 빠르고 기존의 프로그래밍 언어보다 가볍게 사용하기 위해서 개발되었습니다.

 2000’s  OS & Programming Language

개인 PC를 넘어 개인에게 핸드폰과 같은 모바일기기가 보급되었습니다. 때문에 모바일 기기를 위한 OS가 개발되었습니다. 기존의 GUI 기반 OS를 개발한 적 있었던 두 회사가 Android 와 IOS라는 모바일 용 OS를 개발하게 됩니다.
 이때 모바일 시장의 크기가 확장되며 모바일 개발을 편리하게 해주는 여러가지 언어들이 등장하게 됩니다. scratch나 앱컨버터 같은 언어들이 여기에 해당됩니다.

[Key Note]
     OS : IOS, Android
2000년대에는 모바일 기기의 보급으로 새로운 시장이 개척되었고 여기에 필요한 OS로 개발되었습니다.


     Programming Language : Scratch etc..
새로운 시장이 개척되고 확장되며 영향을 받았고 모바일 개발을 도와주는 언어들이 등장 하였습니다.

After than?

70년대부터 2000년대 까지 OS와 프로그래밍 언어의 발전에 대해서 살펴보았습니다. 그렇다면 이 이후에는 어떤방향으로 나아갈까요? 현재의 우리를 보면 Python과 각종 Framework를 이용한 AI,ML,DL이 주목받고 있습니다. 통신으로는 5G 세대가 올것이라고 하며 5G 시대에 목표로 초고속, 초저지연, 초연결을 목표로 하고 있습니다. 이로 미루어보아 미래의 우리는 공간의 제약 없이 AI를 사용하는 시대가 올 것이라고 생각합니다. 저는 길을 걸어다니며 AI를 개발하고, 또 사무실, 연구소에 커다란 서버실 자리에 도서관이 자리잡는 미래를 상상합니다.

 

Part 3. Welcome to Python!


Python의 특징

Python이 개발된 1991년에는 이미 많은 종류의 OS가 개발되어있는 상태였습니다. 프로그래밍 언어의 복잡성이나 코드의 복잡성을 해소하고자 만든 Python의 언어가 OS의 장벽에 부딪치는 것을 원하지 않았을 것 입니다. 때문에 Python은 어떤 OS든 상관없이 동작할 수 있도록 설계 되었습니다. 이를 플랫폼 독립적 언어라고 부릅니다.
 또한 기존의 언어방식들은 전체 소스코드를 입력 후 컴파일을 하여야만 오류 등을 알 수 있는 형태였습니다. 이는 효율성을 떨어트릴뿐 아니라 코드를 복잡하게 만든다고 생각되었습니다. Python 은 쉽게 작성해보고 테스트하는 만큼 좋은 생산성이 없다는 믿음아래 소스코드를 한 줄 읽고 바로 실행해주는 방식을 택하였습니다. 이처럼 소스코드를 한 줄 마다 실행해주는 인터프리터 형식의 언어입니다.
 1991년 이전부터 이미 우리는 여러발전을 통해 하드웨어적 관점에서 유저, 사용자 중심의 관점으로 넘어오는 것을 보았고 때문에 Python 또한 해결해야하는 문제를 객체라는 관점에서 보도록 하였습니다. 때문에 객체 지향 프로그래밍을 지향하고 있습니다.
 Python의 개발자는 개발 당시 "파이썬 코드 자체로 슈도코드 역할을 하기도 합니다." 라는 신념을 가지고 있었습니다. Python을 쓰는 유저가 변수타입 선언에 머리를 싸매는 일이 없었으면 좋겠다는 생각을 가지고 있었지요. 덕분에 Python은 프로그램 실행 시점에서 데이터들의 타입을 결정해주는 동적 타이핑 언어가 되었습니다.

[Key Note]
     Python의 특징은 다음과 같습니다.
1.    플랫폼 독립적 언어
- 운영체제와 상관없이 사용할 수 있습니다.

2.    인터프리터 언어
- 소스코드를 한 줄씩 읽고 바로 실행해 줍니다.

3.    객체 지향 언어
- 해결해야할 문제를 객체로 분석하고, 데이터와 처리할기능(메서드)를 통하여 해결하고자 합니다,

4.    동적 타이핑 언어
- 프로그램의 실행시점에서 프로그램 데이터 타입을 결정 합니다.

     추가로 Python은 다른 언어에 비하여 많은 종류의 AI 라이브러리를 제공해주고 있습니다.

Python 구조

세상에는 다양한 종류의 프로그래밍 스타일이 존재합니다. Python은 그중에서 3가지의 프로그래밍 스타일 포괄적으로 수용하며 개발되었습니다. Python은 그 특징 중 인터프리터 형식을 담고 있기 때문에 코드를 제작함에 있어서 순서를 무시할 수 없습니다. 어느정도 절차지향적 프로그래밍의 성격을 품고 있습니다. 하지만 어디까지나 객체지향을 위하여 개발되었기 때문에 당연하게도 객체지향적 프로그래밍의 성격을 나타내고 있습니다. 사실 Python에서는 모든 것을 객체로 만들고 있습니다.
 마지막으로 모든 것이 객체로 이뤄져 있는 Python은 코드를 간결하게 만들고 가독성을 높이자는 개발 신념에 힘입어 함수형 프로그래밍도 지향하고 있습니다.

[Key Note]
      절차 지향 프로그래밍
처리해야할 문제 해결과정을 독립적 기능으로 나눠 일련의 순서에 따라서 처리하는 방식입니다. 때문에 함수가 필수적입니다.


     객체 지향 프로그래밍
해결해야하는 문제를 객체의 관점에서 바라보고 해결하고자 하는 방법 입니다. Python에서는 데이터와 함수(메서드)를 하나로 묶어서 선언하는 클래스(Class)라는 개념을 도입했습니다.


     함수형 프로그래밍
모든 것이 객체라는 가정하에 Immutable을 활용하여 SideEffect를 없애고자 하는 방법입니다. 코드를 간결하게 하고 가독성을 높여 로직에 집중하자는 목적이 Python의 신념과 잘 맞아떨어집니다. 또한 동시성 작업을 지양하여 쉽고 안전하게 구현하고자 합니다.

변수, 함수 와 클래스

Python은 str,int,set,dict등 여러가지 자료구조를 지원해 줍니다. 자료구조와 입출력에 대한 내용은 "점프 투 파이썬"(박응용 저) 를 참고하는 것을 추천합니다. 여기서 우리는 변수의 저장형태와 Python에서의 Mutable 과 Immutable , 호출방법에 대해서 알아보겠습니다.

변수는 기본적으로 메모리에 저장됩니다. 오른쪽 코드를 실행했을때 a,b,c,d 변수의 메모리 주소를 보면 a,b 가 값에 대한 같은 주소를 가지고 있다는 것을 확인 할 수 있습니다.  때문에 a,b변수를 호출한다면 a,b에 저장되어있는 주소를 통해 값만 꺼내오는 방식으로 호출된다는 걸 알 수 있습니다. 이러한 방식을 Call by Value라고 합니다. 또한 이러한 방식으로 Call되는 객체를 Immutable 객체라고 부릅니다. Immutable 객체는 값을 변화시켰을 때, 값 자체를 변화시키는 것이 아닌 변수의 주소를 변화시켜서 값을 불러오는 것이기 때문에 값을 변화시킬 수 없다고 표현합니다.
 이와 반대로 변수의 주소를 반환받아 변수 자체를 변화 시킬 수 있는 것을 Call by Reference라고 부르며 주소를 통해 제어되기 때문에 값 자체를 바꿀 수 있습니다. 이를 Mutable 객체라고 부릅니다.

[Key Note]
     변수 : 데이터를 저장하는 공간으로 메모리에 저장됩니다.


     함수 :독립적으로 프로그램을 실행할 수 있는 최소 단위 입니다.


     호출 방법
     Call by value : 주소를 주고 받는 것이 아닌 값을 주고 받습니다.
     Call by reference : 주소를 직접 받습니다. 때문에 직접적으로 변수를 수정할 수 있습니다.
     파이썬 객체
     Immutable 객체 (값 객체) : 숫자형,문자형,튜플형 자료구조가 해당됩니다. Call by value로 호출 됩니다.
     Mutable 객체 (참조 객체) : 리스트,딕셔너리,집합형 자료구조가 해당됩니다. Call by reference(assignment)로 호출 됩니다.

Part 4.  Object Oriented Programming


 Python은 객체지향프로그래밍으로 개발되었다 라는 내용을 앞서 보았습니다. 그렇다면 객체 지향 프로그래밍이라는 것이 무엇인지를 알아보겠습니다. 어느 날 프로그래머 B씨는 동물원을 짓기전에 시뮬레이션을 해보고자 동물원 관리 프로그램을 만들고자 하였습니다. 

추상화(Abstraction)

 동물원에서 가장 많은 객체를 차지하고 있는 포유류를 우선 만들고자 하였습니다. 포유류에게 공통점은 무엇일까요? 대부분의 포유류가 가지고 있는 공통점은 무엇일까요? 우선 뇌를 가지고 있을 것 입니다. 다리도 있을 것이구요.(다리가 없으면 0으로 표현하면 될 것 이구요!) 이처럼 사자나 토끼 , 원숭이와 같은 동물들을 포유류라는 큰 개념으로 묶고, 그 포유류를 뇌의 유무와 다리의 갯수로 세부적으로 묶을 수 있습니다. 이처럼 추상적인 객체를 정의해주는 것을 추상화라고 합니다.

 

캡슐화(Encapsulation)

 동물원의 동물들을 관리하기 위해서 이름을 지어주기로 했습니다. 저기 있는 잘생긴 개코원숭이 이름은 세윤이로 지었고, 느긋한 나무늘보이름은 윌리엄 4세 등 이름을 지어주었습니다. 그런데 내가 지은 이름을 누군가 자꾸 바꾼다면 어떻게 할까요? 매 번 확인하고 수정하는데에 큰 시간이 소비될 겁니다. 때문에 프로그래머 B씨는 관리 프로그램을 사용하는 유저에게 이름은 보여주지만 이름을 수정하는 방법은 알려주지 않은 방법으로 프로그래밍을 하였습니다. 동물들의 이름은 수정되지 않았으면 좋겠다고 생각하는 데이터이기 때문에 이러한 방법으로 개발한 것 입니다. 이러한 방법을 은닉화라고 부릅니다. 그리고 이처럼 데이터의 구조와 방법들을 결합시켜서 묶는 것을 캡슐화라고 부릅니다. 마치 알약과 같은 모습 때문에 이렇게 이름이 붙었습니다.

상속성(Inheritance)

 이제 사자를 만들었는데 사자의 종류가 너무 다양합니다. 아시아 사자와 아프리카 사자는 사자라는 특성은 똑같지만 차이점 또한 분명히 존재합니다. 이럴때 우리는 미리 만들어놓은 사자 객체에서 사자를 만들어내고, 아프리카사자와 아시아 사자의 특성에 맞게 특성을 추가해줄 수 있습니다. 즉 아시아사자보다 더 큰 상위개념의 사자한테 아시아사자인 하위개념은 그 특성을 물려받어 프로그래밍 할 수 있다는 것이지요. 이러한 개념을 상속성이라고 합니다.

Tip) Python에서 상속성을 사용하기 위해서 Method overriding 과 Method overloading을 이용합니다.

다형성(Polymorphism)

 동물들을 다 배치했으니 이제 먹이를 줄 차례입니다. 사육사 A에게 동물에게 먹이를 주는 법에 대한 함수(Method)를 프로그래밍했습니다. 그런데 우리 동물원에는 매우 다양한 종류의 동물을 보유하고 있습니다. 그렇다면 각 동물에 맞는 먹이주는 법을 만들어야 할까요? 아닙니다. 각 동물의 종류에 맞게 사육사는 먹이를 줄 것입니다. 이처럼 클래스에 맞게 함수들이 사용되는 개념을 다형성이라고 합니다. 여기서 동물에게 먹이를 주는 것은 부모 클래스의 가상 함수이고, 종류별 동물에게 먹이를 주는 것은 자식 클래스내에서 사용되는 것을 의미 합니다.

Tip) 이러한 특성을 Overloading이라고 합니다.

 

[Key Note]
     추상화 : 공통의 속성이나 기능을 묶어 이름을 붙이는 것입니다. 객체 지향적 관점에서 클래스를 정의하는 것이 추상화라고 할 수 있습니다.


     캡슐화 : 데이터 구조와 데이터를 다루는 방법들을 결합 시켜서 묶는 것을 의미합니다. 객체가 맡은 역할을 수행하기 위한 하나의 목적을 묶는다고 생각해야 합니다.
     은닉화 : 외부에서 직접 접근을 해선 안되는 것에 대해 접근하는 방법을 숨겨 데이터를 보호하는 것을 의미합니다.
     상속성 : 상위 개념에 대한 특징을 하위 개념이 물려받는 것을 의미합니다.


     다형성 : 부모 클래스에서 물려받은 가상 함수를 자식 클래스 내에서 오버라이딩 되어서 사용 하는 것입니다.


     오버로딩 : 기존의 메소드와 동일한 형태의 새로운 메소드를 정의 하는 것 입니다. 때문에 매개변수 와 같은 사항을 변경할 수 없습니다.
     오버라이딩 : 상속받은 기존의 메소드를 재정의 하는 것 입니다.

 

Reference 

[아스키 코드]https://minwan1.github.io/2018/06/09/2018-06-09-ASCII-Unicode/

[아스키 코드,유니코드 배경 ]http://www.allofsoftware.net/2015/06/6.html

[PS 단계 ]https://www.mindtools.com/pages/article/newTMC_00.htm

[컴퓨팅 사고력]
http://www.jinicoding.net/%EC%BB%B4%ED%93%A8%ED%8C%85-%EC%82%AC%EA%B3%A0%EB%A0%A5%EC%9D%98-%EC%9D%B4%ED%95%B4/

[아이로봇 이미지 ]https://brunch.co.kr/@dnd/1

[AI,ML,DL 이미지]
https://mc.ai/b-fundamentals-of-machine-learning-ml-deep-learning-dl-and-artificial-neural-networks-ann/

[시분할]https://ko.wikipedia.org/wiki/%EC%8B%9C%EB%B6%84%ED%95%A0_%EC%8B%9C%EC%8A%A4%ED%85%9C

[개인용 컴퓨터]
https://ko.wikipedia.org/wiki/%EA%B0%9C%EC%9D%B8%EC%9A%A9_%EC%BB%B4%ED%93%A8%ED%84%B0#1980%EB%85%84%EB%8C%80_16%EB%B9%84%ED%8A%B8_%EC%8B%9C%EB%8C%80_%EC%82%AC%EB%AC%B4%EC%8B%A4%EC%97%90_%EB%B3%B4%EA%B8%89

[오픈소스]https://www.redhat.com/ko/topics/open-source/what-is-open-source

[5G 특성] https://blog.kt.com/895

[파이썬의 철학] http://egloos.zum.com/mcchae/v/10719283

[함수형 프로그래밍]
https://medium.com/@lazysoul/%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%B4%EB%9E%80-d881230f2a5e

[점프투파이썬] https://wikidocs.net/book/1

[공학자를 위한 파이썬] https://wikidocs.net/32277

[파이썬 함수 호출 방법] https://code13.tistory.com/214

 

반응형