본문 바로가기

공부생각/전산잡지식

[전산잡지식] 객체지향프로그래밍(OOP)



객체 지향 프로그래밍 (Object-Oriented Programing).
요놈은 프로그래밍 언어를 배우면서 항상 따라오는 부분이고, 참 중요한 부분인데, 아쉽게도 절차적 언어의 한계를 몸소 느끼지 못했다면 정말 이해하기도 힘든 부분이다.

아마 많은 프로그래밍과 팀프로젝트를 겪으면서 겨우 객체지향프로그래밍이 왜 좋은지를 느끼게 될 것이다. 나는 이런 상황이라 느꼈는데도, 어디가서 객체지향프로그래밍의 장점과 단점을 코드 실 예를 이용해서 보여준적은 없는듯...

아쉬운 부분...

여하튼!!

일단 절차적언어의 단점에서 부터 파생된 것이니 절차적언어부터...

절차형 언어에서는 흔히 기능을 분할에 그에 따르는 각 모듈을 만들어서 수행시키는데, 그 각 모듈이 따로 논다는거다(데이터취급이 완전하지 못하다). 뭐 따로 놀고, 그 각각이 서로 잘 돌아가면 전체 프로그램이 잘 돌아가겠지 당연히.. 하지만 따지고 본다면 그렇게 완벽하게 나눠질 수 없다. 그 단점을 보완하기 위해서

객체지향프로그래밍 (Object-oriented programing)이 나온거임!

이라고 하는데, 문제점을 모호하게 인식하고 있을뿐, 문제점에 대한 예나, 실제 상황을 보지못해서 조금 안타깝네... 혹시 누가 알거나 찾게 되면 알려줘요 ㅠㅠ


일단 간단하게

기본적인 구성요소를 살펴보면

1. Class : Class 되게 광범위하게 쓰인다. 쉽게 말해서 한묶음! 이라고 생각하면 되는데 그게 어떤 하나의 큰 변수나 object가 될 수도 있고, 어떤 한가지일을 수행하는 단위일 수도 있다. 근데 두가지 클래스가 일을 중첩되서 한다거나 하면 절대 곤란하다. 이러면 객체 지향프로그래밍의 단점을 최대화 시키는 코딩이된다. 따라서 작업이나 필요한 단위들을 잘 분석하고 클래스를 깔끔하게 짜는것이 중요하다고 생각한두아!!

2. Object : 쉽게 말해 메모리에 할당된 놈! 하면 된다. 변수건 구조체건 메모리에 할당되는 놈들은 다 Object라 할 수있다.

3. Method : 일련의 명령어인데 이놈들은 Object를 요리조리 바꾸는 일련의 명령어라 생각하믄 되겠다~



솔직히 Class같은 경우도 누가 하나 가르쳐주는 것도 없고, 실제로 사용하는 사람도 뭔가 단위인데 설명하기 좀 오묘한 감이 있다. 그냥 저런식으로 말해도 틀린 것은 아닐듯? 하다 =ㅁ= 혹시 다른 의견을 가지고 있으면 언제든지 고쳐주기 바람.



자 어쨋든, 기본적인 구성요소가 저 설명에 의해 조금 깔끔해졌다고 믿고, 특징들을 살펴보자.


1. 캡슐화 (Encapsulation) :

말이 상당히 어렵고 이해하기 힘들지만, 흔히 드는 예가 감기약이다. 감기약을 딱 받아들고 먹기전에 우리는 캡슐안을 자세히 볼 수없다. (투명한 캡슐도 있다 이딴소리하다간 이단옆차기 가삔다 확 그냥) 일단 요 캡슐이 Class drug 라고 생각하면 이놈의 drug 클래스가 감기를 치료하는 놈이라는 것은 아는데, 안에 어떤 알갱이가 코감기를 낫게하고 어떤 알갱이가 목감기를 낫게하고 등등은 우리가 알지도 못할뿐더러, 신경쓰지도 않는다. 프로그래밍에서도 앵간하면 한클래스단위로 캡슐을 만든다.

이놈을 부르면 인풋을 가지고 어떤어떤 아웃풋을 만들어냅니다!! 하는데, 그 안에 있는 메소드를 건드린다거나 변수를 직접건드린다거나 하는 것을 최소화 시켜서 독립적인 것으로 만든다.

우리는 주로 private이라는 변수 선언으로 클래스 외부에서 변수값을 조정하지 못하게 하거나 메쏘드를 부를수 없게한다. 요론놈을 설정해줌으로써, 변수도 최적화 시키고, 클래스를 조금 더 독립적으로 만들어 가는 것이두아!!

- 이건 모듈간에 서로 유기적인 관계에 있다는것 하고는 전혀 다른 문제이다.

2. 추상화(Abstraction):

아 이건 좀 이해못했는데 좀더 이해하고 쓰겠음.

3. 다형성(Polymorphism) :

흠 대게 메소드에 대해서 얘기를 하는데, 같은 이름으로도 다른일을 수행하게 할 수 있다는 뜻이다. 예를 들어 덧셈이란 메쏘드를 만들자.

int plus(int a, int b)

보통 이렇게 선언하면 int값의 인풋을 받아 더하는 함수이다.

그런데 덧셈은 int뿐만이 아니라 float, double에 대한 인풋을 받는 것도 또한 덧셈이라 그런다. 그럼 우리는 이 메소드를 모두 각각 선언해줘야 하나?

그걸 극복한것이 OOP에 다형성인데,
다른 인풋의 갯수(argument)와 다른 인풋의 타입을 분석해서 다른일을 수행할 수 있게 된다. 만약 모든 변수에 대해서 설정해놓았다면, plus는 인풋으로 int를 넣던지 double을 넣던지 상관없이 정말 보이는데로 "plus" 덧셈연산을 수행한다는 것이다.




하아..

객체지향프로그래밍, OOP의 개념은 되게 기본적이면서도 확실하게 정립하기는 힘든 개념이다. 뭐 대충 쓸줄은 아는데 말해보라 하면 되게 -_-.. .좀 막막한감이 없지 않아있다.

나름의 이해와 그에 따른 답을 준비해야 할듯...

이거 면접에도 은근히 많이 나오던데... 보너스질문으로...



여하튼 그렇다고~ ㅂㅂ