본문 바로가기

etc/Concept

객체지향 프로그래밍이란?

반응형

안녕하세요 오랜만에 글을 씁니다.


오늘은 "객체지향 프로그래밍(Object - Oriented Programming)" 에 대해 써보려고 합니다.


다양한 면접을 다니면서도 많이들 묻는 질문이죠. 



객체지향이란 무엇이냐?, 장점은 무엇이고 특징은 무엇이냐, 등등 단골 질문입니다.



시작하겠습니다~!!! (계속 수정하면서 써야겠네요...)


--------------------------------------------------------

객체지향프로그래밍이라고들 많이 하는데, 우선 객체가 무엇인지부터 알아보겠습니다.


객체(Object)란? 

 - 저장공간에서 할당되어 값을 가지거나 식별자에 의해 참조되는 공간을 의미하며, 변수, 자료구조, 함수 또는 메소드가 될 수 있다.(즉, 메모리가 할당되기 전까지 객체는 존재하지 않음). - 위키백과

 - 우리가 살고 있는 현실 세계에서 사람, 동물, 건물, 자동차 등 많은 "객체"가 존재하며, 이들은 나름대로의 고유한 "기능"을 수행하면서 다른 객체들과 상호작용 한다  - 참고(1)


이라고들 하네요. 쉽게 말하면 어떠한 "기능"을 행하기 위한 모든 것들을 말한다 생각하면 이해하기 쉬울거에요!




객체에 대해 알아봤으니, 객체지향프로그래밍이 무엇인지 알아볼까요?


OOP라 불리는 객체지향 프로그래밍은, 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나, 여러 개의 독립된 단위, 즉, "객체"들의 모임으로 파악하고자 하는 것을 의미. 각각의 객체는 메시지를 주고받고 데이터를 처리할 수 있다. -위키백과



라고 나와있네요. 솔직히 이해 가시나요?



- 데이터와 절차를 하나의 덩어리(객체)로 묶어서 생각하는 방법. - 참고(1)

- 프로그래밍에서 필요한 데이터를 추상화상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법. - 참고(2)



위의 정의가 더 쉽게 이해가지 않나요? 



이러한 정의를 가진 oop를 구성하는 기본 구성 요소1) Class, 2) Object, 3) Method/Message 가 있습니다.


1) Class : 어떤 문제를 해결하기 위한 데이터를 만들기 위해 추상화를 거쳐 집단에 속하는 속성(attribute)와 행위(behavior)를 변수와 메서드로 정의한 것

2) Object : Class의 Instance(실제로 메모리 상에 할당된 것)이자, 자신의 고유 속성을 가지며 Class에서 정의한 행위를 수행할 수 있는 데이터라고 보면 됩니다.

3) Method / Message : Class로부터 생성된 객체를 사용하는 방법으로서 객체의 명령을 내리를 메시지라 할 수 있음.


(보통 1, 2번만 잘 알아도 될거같네요.., 그것도 헷갈려서 ㅠㅠ)




OOP의 특징을 살펴보겠습니다.

1. 자료 추상화 : 간단히 말하면, 불필요한 정보를 숨기고 필요한 정보들만 표시하는 것입니다. 이렇게 표현된 것들을 "추상 자료형"이라 부르고, 이는 자료형의 자료 표현과 자료형의 연산을 "캡슐화" 한 것을 의미합니다.

2. 상속 : 새로운 클래스가 기존의 클래스의 자료와 연산을 이용할 수 있게 하는 기능. 쉽게 말해 "유산 상속" 이란 말이 있죠? 거기서 사용하는 상속과 같은 의미입니다. "부모"가 "자식"에게 준 유산(클래스)이죠. 

3. 다중상속 : 말 그대로입니다. class가 2개 이상의 class로부터 상속받게 할 수 있게 하는 기능입니다.

4. 다형성(polymorphism) : 어떤 한 요소에 여러 개념을 넣어 놓는 것. 일반적으로 오버라이딩이나 오버로딩을 의미한다.(자바 관련 질문 중 꽤 심도있는 질문을 할 때 나오더라구요. 잘 이해해 봅시다!), 예를 들면, 목소리 라는 함수가 취하는 동작에 따라 "개"의 목소리로, "닭"의 목소리로, "사람"의 목소리로 변할 수 있죠? 그렇게 객체가 취하는 동작에 따라 달라진다는 것을 의미하는 것입니다.

5. 동적바인딩 : 실행시간 중에 일어나거나 실행 과정에서 변경될 수 있는 바인딩(이 부분은 잘 이해가 안가고 그닥 물어보질 않아서 공부를 안했네요..)




OOP의 장단점을 살펴볼까요?

1. 장점

- 코드 재사용이 용이합니다. 즉, 남이 만든 클래스를 가져와서 이용할수도, 상속을 통해 확장할 수도 있습니다.

- 유지보수가 쉽습니다. 일일이 찾아야 하는 절차지향 프로그래밍이 아니니 수정해야 할 부분이 클래스 내부에 멤버변수 혹은 메서드로 있기 때문에 해당 부분만 수정하면 됩니다.

- 대형 프로젝트에 적합합니다. 이부분은 대형 프로젝트가 아니더라도 클래스 별로 관리하기 때문에 업무 분담이 쉽습니다.



2. 단점 :

- 처리 속도가 상대적으로 느림(뭐에 대해 상대적인지.. 아마 절차지향에 비해?)

- 객체가 많으면 용량이 커짐(class file들이 많아질수록(.java, .kt 등)용량은 자연스레 커지겠죠?

- 설계 시 많은 시간과 노력이 필요(구분하기 쉽고 공통 부분을 묶기 위해서는 설계가 중요합니다. 설계가 제대로 되지 않으면 찾는데도 오래 걸리고 헷갈리기 시작합니다.)





이렇게 간단하게 살펴봤습니다. 다양한 곳에서 참조하면서 추가적인 공부를 할때마다 수정할게요!

저도 공부하면서 같이 적는 거라 틀리는 부분도 있을 거에요! 틀린 부분 지적해주시면 감사하겠습니다. 또는 추가할 부분 지적해주시면 감사하겠어요!


우형의 기술 블로그에서 http://woowabros.github.io/study/2016/07/07/think_object_oriented.html 이런 자료가 있어요 참조해보세요!




--------------------------------------------------------

- 추상화란? 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것(-위키백과) 를 말합니다. 쉽게 말해, 중요한 자료만 보여주고 불필요한 자료들은 숨긴다는 말이죠.


- 캡슐화란? 객체의 속성(data fields)과 행위(메서드, methods)를 하나로 묶고, 실제 구현 내용 일부를 외부에 감추어 은닉한다. 즉, 접근제어자인 private, protected, public 에서 private 로 해당 클래스 내부에서만 호출할 수 있도록 한다고 생각하면 이해가 될 겁니다.


- 오버라이딩(Overriding)이란? 같은 이름의 메서드가 여러 클래스에서 다양한 기능을 하는 것. 즉, class A 에 있는 void B() {} 라는 함수가 class C 에서 다른 기능을 하게 하는 것이라 생각하면 됩니다. android 하시면 onClick 이라는 같은 이름의 메서드가 다른 클래스에서도 많이 사용되는거 아시죠? 그거라 생각하시면 됩니다.


- 오버로딩(Overloading)이란? 같은 이름의 메서드가 인자의 갯수나 자료형에 따라서 다른 기능을 하는 것. 즉, void A(){}, void A(int a){}, void A(String a, int b){} 가 다 다르다는 것입니다. 같은 이름의 메서드이지만, 인자가 다르고 개수도 다르므로 같은 메서드의 이름을 오버로딩 했다고 볼 수 있습니다.

--------------------------------------------------------

- 참고 : 

(1) http://luckyyowu.tistory.com/190

(2) http://jeong-pro.tistory.com/95

반응형

'etc > Concept' 카테고리의 다른 글

객체지향 모델링 공부법 참고 싸이트  (0) 2018.12.11
Activity와 Fragment Lifecycle 참고 싸이트  (0) 2018.05.28
DTO란?  (0) 2018.05.12
자바 기본 문법 공부..  (0) 2018.05.10