본문 바로가기

IT/개발

객체지향(object oriented)의 개념

 자바에 대한 설명을 하기 위해서 우선적으로 필요한 것이 객체지향의 개념이라고 생각합니다.

 

 

 자바는 OOP(Object Oriented Programming)언어로 객체지향개념을 알아야지 진정한 자바프로그래밍을 할 수 있다고 생각하기 때문입니다.

 객체지향의 간단한 개념을 보면 "세상에 존재하는 논리적, 물리적으로 표현 할 수 있는 모든 것을 객체로 나타내는 것"이라고 정의 할 수 있습니다. 이러한 개념을 적용한 프로그래밍이 OOP이고 자바는 OOP이기에 자바프로그래밍을 하기 위해서 객체지향 개념은 필수라고 할 수 있습니다.

 

 그러면 이러한 객체지향프로그래밍언어는 왜 생기게 되었을 까요?

 

 객체지향개념을 적용한 프로그래밍을 하기 전에 사람들은 구조적 프로그래밍을 하였습니다. 구조적 프로그램은 함수기반으로 만들어졌습니다. 많은 프로그램을 개발하면서 사람들은 함수를 재사용하였습니다. 하지만 함수에 재사용에는 문제가 많았습니다. 우선 원래 작동하던 프로그램에 묶여있기 때문에 다른 프로그램에 맞춰서 쓰기 위해서는 많은 수정이 필요했고 복잡해져만 갔습니다. 거대한 프로그램일수록 그러한 문제는 심각하였습니다. , 구조적프로그래밍은 재사용과 확장, 관리측면에서 많은 문제가 있었습니다.

 

 그래서 사람들은 고민했습니다. 어떻게 하면 이러한 악순환의 고리를 끊을 수 있는가...

 

 

 그래서 생각한 것이 객체지향개념을 프로그램에 적용한 것입니다. 이 세상에서 예를 들면 벽돌을 예를 들겠습니다. 벽돌은 돌로 만들어집니다. 그리고 그 벽돌은 집을 만들 때도 쓰이고, 벽을 만들 때도 쓰이고, 계속 그 용도에 맞게 어디에서 든지 쓰입니다. 물론 벽돌이 망가지면 그 벽돌을 찍어내는 틀을 이용하여 다시 벽돌을 만들어야 합니다. 그 틀을 클래스, 벽돌을 인스턴스(객체)라고 표현한다고 생각합니다.

 

 즉 현실세상에 적용되는 개념을 프로그래밍에 적용을 하여 재사용과 확장성을 높이자는 것입니다.

 

 재사용성과 확장성이 뛰어난 객체들을 이 존재한다면 그러한 객체들을 모아서 멋진 프로그램을 만들 수도 있습니다. OOP를 사용하는 프로그래머는 재사용과 확성성이 뛰어난 클래스를 만들 수 있고 가져다가 쓸 수 있어야 합니다.

 

 객체지향과 절차지향의 가장 큰 관점이 차이를 본다면 데이터와 함수의 관계일 것입니다.

 

 절차지향같은 경우 함수와 데이터는 서로 분리되어 존재해서 결합도와 응집도가 매우 떨어집니다. 그렇기 때문에 프로그래밍을 하는데 있어서 코드가 난잡해지고 하나의 데이터나, 함수를 수정해도 많은 부분을 수정해야 하는 어려움이 발생합니다.

 

 객체지향 같은 경우 함수와 데이터과 서로 뭉쳐서 존재하기 때문에 결합도와 응집도가 높습니다.  데이터나 함수에 수정이 필요할 경우 절차지향처럼 다수의 데이터와 함수가 연관되는 것이 아니라 해당 데이터나 함수를 가진 객체만을 수정하면 됩니다. 즉 절차지향에 비해 확장성,유지보수성, 재사용성이 높아지게 됩니다. 그렇기에 추후에 유지보수를 함에 있어서 객체지향이 훨씬 유리하게 작용합니다.

 

 제가 생각하는 객체지향을 한번 써보겠습니다.

 

 저는 객체지향은 가상현실이다라고 생각합니다. 이유는 말 그대로 객체지향언어인 자바(OOP)라는 언어는 이 세상의 모든 것을 표현 할수 있는 개념을 넣었고 그렇다면 이 세상 모든 것을 구현 할 수 있다고 생각했기 때문입니다. 만약 관점이 가상현실을 만든다고 한다면 아마 우리 눈엔 보이지 않지만 만유인력의 법칙이라든가 하는 모든 물리법칙까지 클래스와, 인터페이스로 표현해야 한다고 생각합니다. , 우리가 먹는다라고 간단하게 표현하는 것 조차 사실 누가 먹는지, 무엇을 먹는지, 무엇으로 먹는지, 먹는 방법 등 굉장히 많이 있습니다.

 

 제가 가상현실이라고 나름대로 비유를 했지만 관점에 따라 다르게 표현 할 수 있는게 또한 객체지향, OOP, 자바라고 생각합니다. 물리학을 전공한 사람의 경우 앞에서 처럼 물리학적인 부분까지 생각해서 만들 수 있겠고 모르는 사람들은 그에 대한 부분을 만들지 않고 프로그래밍을 하겠죠. 결국 가장 중요한 것은 만들려는 프로그램에 대한 관점이 가장 중요하다고 생각됩니다.

 

 제가 알고있고 생각하는 객체지향개념에 대해서 설명을 드렸습니다. ㅎㅎ

 앞으로 개념설명에 있어서는 저만이 생각하는 해당 개념에 대한 예를 들어드리겠습니다.

 공부를 하다가보니 어떠한 개념에 대한 자신만의 생각(?)도 중요한 것 같습니다.

 여러분들도 자신만의 정의를 내려보세요!

'IT > 개발' 카테고리의 다른 글

다형성(polymorphism)  (0) 2013.08.15
상속(inheritance)과 확장(extend)  (0) 2013.08.15
레퍼런스(reference) 타입  (0) 2013.08.14
객체(object)  (0) 2013.08.13
클래스(class)  (0) 2013.08.13