안녕하세요 기형쌤입니다.

눈이 오기 시작했습니다. 한 해의 끝이 보이기 시작하니

마음이 싱숭생숭하네요. 올 해는 벌써? 라는 말을 제일 많이 쓰는 것 같아요.

어쨌든 다가오는 신년을 위해서 우리 잘 준비해보자구요!

 

오늘 들고 온 이야기는 객체지향언어에 관한 이야기입니다.

 

제가 그동안 이런저런 포스팅을 하면서 많이 쓰던 말이 바로

객체지향언어 일건데요

객체지향언어에 관해서는 따로 언급하지 않아 답답하셨을 수도 있을듯 하여

이렇게 따로 다루기로 했습니다!

 

객체지향언어란 무엇일까요?

일단 당연하게도 프로그램의 설계 방법론이자 그 개념입니다.

프로그램을 단순히 데이터와 처리 방법으로 나누는 것이 아니라,

프로그램을 수많은 '객체'라는 기본 단위로 나누고 이 객체들의 상호작용으로 서술하는 방식으로 이뤄집니다.
여기서 객체란 하나의 역할을 수행하는 '메소드와 변수(데이터)'의 묶음으로 보면 됩니다.

 

서술의 편의상 객체지향을 대표적인 언어인 Java 위주로 소개하고 있고

class나 public 같은 용어를 사용했었습니다.

다만 이 경우만 객체지향에 해당하는 것으로 오해하지 않게 주의해야 합니다.

모든 언어가 class나 접근 제한자(public이나 private)를 사용하는것은 아니기 때문입니다.

대표적인 예로 JavaScript는 프로토타입 객체지향을 사용하고 있고

Python의 경우에는 접근제한자가 없습니다.

객체지향은 특정 언어가 아니라 개념으로 생각해주셔야 합니다.

class는 객체이며 struct는 객체가 아닌 데이터의 집합이라는 설명 역시 맞는것이 아니며

특정 언어가 객체지향 언어라는 말도 완전히 틀린 표현입니다.

 

객체지향언어의 시작

객체지향언어 이전의 프로그래밍 방식은 절차적인 프로그래밍 방식이었습니다.

물론 모든 프로그램은 절차적으로 실행되긴 하지만 여기서 말하는 절차적 프로그래밍은 조금 다른 의미를 가집니다.

절차적 프로그래밍이란 루틴, 서브루틴, 메소드, 함수 등(이를 통틀어 프리시저라 함)을 이용한

프로그래밍 패러다임을 뜻합니다. 명령형 프로그래밍의 일종이라고 보시면 됩니다.

 

어쨌든, 이전에는 프로그래밍이란 학교대사전 고등학생 알고리즘처럼 입력을 받아 명시된 순서대로 처리한 다음

그 결과를 내는 것뿐이라는 생각이 지배적이었습니다.

즉, 프로그램을 명령어의 모음으로 인식한 것이지요.

또한 프로그래밍이란 어떻게 어떤 논리를 어떤 순서대로 써나가는 것인가에 집중되었습니다.

즉, 프로그램 자체가 가지는 기능에 대해서만 신경을 썼지,

이 프로그램이 대체 어떤 데이터를 취급하는 것인가에는 그다지 관심이 없었던 것이죠.

 

그러나, 이 방식은 간단한 알고리즘이면 모를까 조금만 복잡해지면

순서대로 나타내는 것이 불가능할 정도로 꼬인 "스파게티 코드"를 만들게 되기 십상입니다.

이렇게 꼬여버린 코드는 다른 사람이 보고 이해하는 것이 거의 불가능할 뿐더러

심지어는 작성한 본인조차도 유지보수에 어려움을 겪게 됩니다.

명령어의 양이 많아지는 것은 기본이고, 특정 코드 부분은 어디에 사용되는 코드고

해당 코드 부분은 어디까지 이어지는지의 흐름을 파악하기도 힘들어지며, 중복 코드 대처도 매우 골치가 아프죠.

 

이러한 문제를 해결하기 위해 에츠허르 다익스트라가 1968년 GOTO문의 해로움이라는 논문에서

프로그램을 함수(procedure) 단위로 나누고 프로시져끼리 호출을 하는 구조적 프로그래밍 방식을 제안하면서

이러한 위기를 벗어날 수 있었습니다.

프로그램이라는 큰 문제를 해결하기 위해

그것을 몇개의 작은 문제들로 나누어 해결하기 때문에

하향식(Top-down) 방식이라고도 부릅니다.

 

하지만 함수는 데이터의 처리 방법을 구조화했을뿐, 데이터 자체는 구조화하지 못했습니다.

이는 전역 네임스페이스 포화 문제 즉, 변수 이름을 다 써서 이름 짓기도 힘든 상황을 낳게 되었습니다.

게다가 실행 콘텍스트를 저장할 마땅한 방법이 없어지는 문제까지 생기게 되었죠.

 

 

또한 엉뚱한 데이터가 엉뚱한 함수에 전달돼서 데이터를 오염시키는 문제가 발생하고

그런 가능성 때문에 프로그래머가 한 함수의 작동에 영향을 받는 변수를 조사해야 할 때

모든 변수를 다 조사해야 하는 어려움에 봉착하게 되었습니다.

이 과정이 변수가 수백개 이하의 코드에서는 사람의 힘으로 가능했지만(물론 이 방법도 힘들지만)

코드의 덩치들이 커지면서 도저히 사람의 힘으로는 가능하지 못 할 지경이 되었습니다.

 

이를 극복하기 위한 대안으로 등장한 것이 바로 객체 지향 프로그래밍입니다.

큰 문제를 작게 쪼개는 것이 아니라, 먼저 작은 문제들을 해결할 수 있는 객체들을 만든 뒤,

이 객체들을 조합해서 큰 문제를 해결하는 상향식(Bottom-up) 해결법을 도입한 것입니다.

이 객체란 것을 일단 한번 독립성/신뢰성이 높게 만들어 놓기만 하면

그 이후엔 그 객체를 수정 없이 재사용할 수 있으므로 개발 기간과 비용이 대폭 줄어들게 되었죠.

 

지원하는 언어?

객체지향언어가 지원하는 언어에는 Smalltalk 언어, Ruby와 Python, C언어에 객체 처리 기능추가 된버젼,

Java, C#, Objective-Pascal 등이 있습니다.

그 중 대표적인 Ruby는 Smalltalk의 계보를 잇는 순수 객체지향 언어입니다.

기존의 C++나 Java 등에 비해서 난이도가 더 쉽습니다.

 

Python 역시 순수 객체지향을 지원하고 있습니다.

Ruby와 비슷한 구조를 가지고 있으며, 미세한 명령어나 기법 차이 등이 있을 뿐,

거의 형제처럼 가까운 언어들입니다.

기초반이나 취미 코딩반 등에서는 이 두 언어를 거의 똑같은 언어라고 설명하면서

루비와 파이썬의 코딩을 동시에 가르치는 곳도 있습니다.

 

객체지향언어라고 대표적으로 소개하는 Java나 C#의 경우 순수한 객체지향이라기보다는

기존 프로그래밍 언어에 객체 지향 요소를 추가한다거나 확장한 형태로 만들어졌습니다.

 

어떻게 배울 수 있나요?

사실 객체지향언어는 프로그래밍을 배울 때 만나게 되는 난관이기도 합니다.

C를 배운 뒤 C++을 배우는 상황에서 특히 심하긴 한데,

곧바로 Java Python으로 배우기 시작하는 경우에도 마찬가지 입니다.

왜냐하면 이전까지 배웠던 것은 프로그래밍 언어의 문법이었다면(절차적 프로그래밍으로서의 문법),

OOP는 가장 문제가 덜 생기는 방향으로 코딩하게끔 하는 가이드라인이기 때문이죠.

이제 막 알파벳과 기초 영문법을 뗀 학생에게

수사법 내지는 논리적 작문을 가르치는 것과 동일한 느낌으로 생각하시면 이해가 편할듯 합니다.

 

이 문제라는 것도 수천, 수만 줄의 코드를 수년간 유지보수할 때에 몸에 와닿는 종류인데,

기껏해야 과제 제출하고 다시 손대지 않을,

길어야 수백 줄짜리 코드 정도만 짜봤을 학생들에게는

전혀 체감이 잘 되지 않는것이 당연합니다.

게다가 대부분의 언어들은 기존의 언어에 객체지향을 얹어놓은 형태이기 때문에

굳이 OOP에 맞춰서 짜지 않아도 원하는 결과가 일단 나오기 때문에 이러한 현상이 더 합니다.

 

그렇다면 이런 난관인 언어를 어떻게 배우면 될까요?

 

기초부터 차근차근 쌓아나가실 수 있는 전문가 과정으로 안내합니다.

국비지원으로 무료로 수업을 들으실 수 있고

나아가 취업까지 잘 하실 수 있도록 실력을 키워드립니다.

관심있으시다면 아래의 네임카드를 클릭하여

문의주세요!

 

네임카드를 클릭해주세요!!

안녕하세요? 기형쌤입니다!!

 

오늘 제가 들고 온 것은 바로 Python입니다.

Python은 수많은 프로그래머들의 기본소양이라고 할 정도의 언어입니다.

 

Python은 그 기원이 굉장히 특이한 언어인데요.

바로 창시자인 귀도 반 로섬(Guido van Rossum)이

1989년 크리스마스주에 연구실 문이 닫혀있어서 심심한 김에 만든 프로그래밍 언어입니다.

 

재밌지않나요?

지금에 이르러서의 Python은  풍부한 머신러닝 라이브러리와 프레임웍으로

머신러닝, 딥러닝등 인공지능 개발을 위한 언어로서 각광을 받고 있는데

이러한 언어가 그저 심심한 김에 만든 언어라니...아이러니하죠ㅎㅎ

 

Python을 배우는 이유?

심심한김에 만든 언어를 왜 배우기 시작했을까요?

일단 문법이 매우 쉬워서 초보자들이 처음 프로그래밍을 배울 때 추천되는 언어입니다.

오죽하면 Python의 별명이 '실행할 수 있는 의사 코드(Executable pseudocode)'일 정도이니까요.

 

또한 가장 큰 이유는

전 세계의 모든 프로그래밍 언어 중에서 파이썬 정도의 낮은 난이도를 가지면서,

범용성을 갖추고, 파이썬 수준의 프로그램 개발 속도를 따라잡는 언어가 없기 때문입니다.

 

요점은 쉬운데 현업에서 사용하여도 엄청난 효율을 낼 수 있다는 점 때문에 배우는 것입니다.

C언어로 2년동안 완성하지 못한 프로젝트를 파이썬으로 한달만에 해냈다 는 극적인 경험담이 있을 정도이니

말 다 한 셈이죠.

Python의 특징?

단지 쉽다는 특징 말고 어떠한 특징이 있을까요?

 

Python의 기본 철학은 가장 아름다운 하나의 답이 존재한다 를 기본으로 하고 있습니다.

파이썬의 이런 철학은 이후 다른 프로그래밍 언어들에도 수출되어, 2010년대 들어서는 기존 언어들도

파이썬처럼 최대한 문법 구조를 단순화시키고 통일하려는 문법 대통일 운동이 일어나기 시작했다.

 

그렇다면 왜 이러한 현상이 이루어졌던걸까요?

 

단순히 말하자면  프로그래머들이 프로그램을 돌려보기 좋게 한다는 매우 좋은 영향이 있어서 입니다.

 

다른 객체지향 언어인 C,C++,Java같은 경우의 코딩은 각자의 취향에 맞게 발산 진화하는 반면

파이썬은 위의 철학들을 만족 시키는 하나의 스타일로 수렴 진화하는 성향이 있습니다.

이런 성향은 다른 언어에는 없는 파이썬스러움(pythonic)이라는 독특한 개념을 낳게 되었는데,

복잡하지 않으면서 의미가 명확하고, 코드의 축약보다 뚜렷하게 보이는 흐름을 중시하는

파이썬의 철학을 지칭하는 개념이 되었습니다.

 

이러한 철학 때문인지 Python의 문법체계는 상당히 엄격한 편입니다.

예를 들자면 다른 언어에서는 해도 되고 안 해도 되는 들여쓰기가 이 언어에서는 의무로 해야하는 등이 있습니다.

 

또 다른 특징으로

파이썬의 가장 큰 특징 중 하나. 파이썬은 반복 가능한 객체(iterable)라는 강력한 기능을 제공합니다.

이 객체는 집합, 문자열, 리스트, 튜플, 딕셔너리, 그리고 함수까지도 반복이 가능하며,

이것을 for 구문에서 사용할 수 있게 해줍니다.

리스트와

튜플 등은 좀 편해지는 정도라 할 수 있지만, 함수의 값을 반복할 수 있다는 것은 큰 장점이됩니다.

Python의 다양한 구현체

Python은 다양한 언어들과 함께 구현화되기도 합니다.

구현체로서 Python을 지칭할 때에는 CPython(싸이선)이라고 불리우는데

이는 Python이 기본적으로 C로 구현되었기 때문입니다.

 

구현체의 종류는 Stackless Python, C언어를 확장한 Cython, Python으로 Python을 만든 독특한 형태의 PyPy,

Java로 구현한 Jython, .Net Framwork로 구현한 IronPython, Java Script로 구현한 Brython 등의 다양한

언어들의 구현체들이 존재합니다.

 

이는 Python의 가장 큰 장점인 쉽고 범용성이 넓다는 특징 덕분에 가능한데요.

다만 Jython과 IronPython은 둘 다 CPython에 비하면 실행 속도가 매우 느리며,

Jython은 경우에 따라서 심각할 정도로 많이 느립니다.

그래서 주요 기능을 수행하는 데에는 문제가 있지만,

보조 기능에서 사용하면 번거로운 작업들을 매우 손쉽게 Python 스크립트로 Java, .NET Framework의

자원을 그대로 끌어다 써서 할 수 있기 때문에 개발 공수와 편리함에서 큰 장점이 있어 주로 보조적인 기능 수행을 할 때 사용되곤 합니다.

 

가장 특이한 구현체는 Python으로 Python을 만든 PyPy일텐데요

2007년에 처음 발표된 Python의 언어 구현 중 하나로, C로 짜인 기존의 CPython과 달리

Python으로 Python을 만드는 프로젝트입니다.

이 프로젝트의 진짜 놀라운 점은 기존 CPython보다 전혀 느리지 않을 뿐더러,

오히려 성능면에서 CPython을 능가하고 있다는 점입니다.

나아가 계발이 진행되고 연구가 진행됨에 따라 점점 더 빨라지는 추세입니다.

표준 구현인 CPython과의 속도비교. PyPy를 개발하면서 지속적으로 업데이트 하는중입니다.

Python은 개발자를 꿈꾸신다면 배워놓으시는게 필수라고 추천드릴만큼

중요한 언어입니다.

그렇다면 Python을 배우시려면 어떻게 해야할까요?

개인적으로 책을 보며, 인터넷 강의를 보며 공부하셔도 괜찮을 정도로

쉬운 언어인지라 이런저런 책을 추천드려도 괜찮을 것 같지만

 

Python을 배우고 그 심화과정까지 배워 전문가가 되셔서

결국 취업까지 해결하고 싶으시다면 저와 함께

IT 전문가 과정을 진행 해보시는것을 추천드립니다.

 

아직은 블루오션인 IT 시장에 어서 뛰어들어 봅시다!

관심있으시다면 하단의 이미지링크를 클릭해주세요. 바로 무료상담 가능합니다.

이미지를 클릭해주세요!

+ Recent posts