본문 바로가기
(구) 자료/면접을 위하여

[1] 객체 지향(Object Oriented Programming)이란?

by 뜐뜐뜐 2017. 12. 8.

* 저의 면접을 대비해서 여러 사이트를 참고하여 제가 이해하기 쉽게 정리한 것입니다.

* 혹시라도 문제가 된다면 비공개조치 하겠습니다.

* 레퍼런스는 항상 표기 하겠습니다.

* 저는 두괄식을 좋아해서 모든 결론이 질문 밑에 달려있습니다.








지금 제일 먼저 생각나는거는


C와 C++, JAVA의 차이점이 뭔가요?? 

지만... 이번장에서는 절차지향과 객체지향의 차이부터 명확하게 알고 가죠!


결론부터 말하기 위해서, 예를 들어서 말씀드리자면....


반짝거리는 장식이 달려있는 크리스마스 트리를 만든다고 합시다.


절차지향

 받침대를 만든 뒤, 나무를 만들어서 그 위에 꽂고, 잎 위에 두를 장식을 만들어서 두르고, 전원을 연결해서 켜야 작동한다.


위의 과정에서, 순서가 조금이라도 바뀌면 장식에 불이 들어오지 않는다.


객체지향

 받침대, 나무, 장식, 전원을 각각 따로 만들고 나중에 합친 뒤, 전원을 켜서 작동시킨다.


위의 과정에서, 순서가 뒤바뀌어도 장식에는 무리가 없이 불이 잘 들어온다.


이런 차이가 전부입니다

1. 절차 지향 프로그래밍(Procedural Oriented Programming)이란?

- 순차적인 처리가 중요시 되는 프로그래밍 기법입니다.

- 대표적인 언어는 모두가 알다시피, C언어입니다.

- 데이터의 처리 방법에 초점을 두고 있는 프로그래밍 기법입니다.

- 말 그대로, 컴퓨터가 사고하는 대로 프로그래밍 하고 있다고 보면 되겠네요!


<출처 : (좌) [네버 블록]님 블로그, (우) [플러닝]님 블로그 클릭!>




1) 고객의 돈을 준비한다

2) 돈을 자판기에 넣는다

3) 자판기에서 돈을 검사한다.

4) 맞으면 준비된 제품과 잔돈을 꺼내주고, 틀리면 넣었던 돈을 돌려준다

5) 고객이 나온 것을 가져간다.

- 착착착 맞아 떨어지는 프로세스죠? 위에서 하나라도 틀어지면 에러납니다


- 이 처럼, 순차적으로 진행하는 것을 절차지향이라고 하고, 이 방식으로 프로그래밍하는 것을 절차 지향 프로그래밍이라고 한다.

  (굵은 글씨만 읽으면 [순차적 프로그래밍 = 절차 지향 프로그래밍] 이 된다.)


장점과 단점엔 뭐가 있을까?

장점

- 완성된 코드의 실행처리 속도가 빠르다.

ㄴ 왜 일까요?

ㄴ C언어는 고급 언어 중, Low Level이라서 동작이 빠릅니다.

ㄴ Low level이라서 빠르다는게 뭔소리냐구요?

ㄴ 초기 컴퓨터의 처리구조와 C언어가 비슷해서 그 실행속도가 빠르다는 의미


속도가 빠르다는건 웬만한 프로그래밍 해보신 분들이라면 아시겠지만 굉장히 중요한 요인이죠...


장점이 있다면, 단점도 있겠죠?


단점

- 유지, 보수가 어렵다

- 정해진 순서대로 입력을 해야 된다. 즉, 중간에 바뀌면 결과값을 예측하기 힘들다.

- 프로그램을 분석하기 힘들다.

- 대형 프로젝트하면 코드가 C++에 비해 적게는 몇 배에서 크게는 몇 십, 몇 백배로 늘어납니다..


단점은 딱 누가 이런 예를 들어줬었는데 단번에 이해가 되더라구요!!


여러분 게임 같은거 할때 직업 뭐뭐있어요? 보병, 궁수, 마법사 뭐 요런거 있죠??


걔네가 몬스터 사냥할 때, 일반 공격 모션이 다 똑같던가요?? 다르죠 당연히... 보병은 칼 휘두르고, 궁수는 활쏘고, 마법사는 지팡이에서 뿅뿅 나가잖아요..


이 모션들을 죄다 C언어로 짜면.... 공격 모션의 이름을 Attack_보병, Attack_궁수, Attack_마법사 이런식으로 세 개나 만들어줘야 해요.


근데 여기서 말하는게 세 개지, 만약에 캐릭터당 1000개의 모션을 만들어야 한다고 치면, x3... 코드가 3천줄이 되는겁니다...


이렇게 하면 일단 안좋은게 가독성이 떨어집니다. 읽기 싫어요!!!!! 오류라도 하나 나면 진짜 토나옵니다...


(근데 이게 객체지향에서는 그렇게 안하고 간편하게 Attack 함수를 오버라이딩 함으로써 처리할 수 있습니다. 지금은 C언어 얘기하니까 이건 패스~)


아무튼.. 단점은 이러합니다.


2. 객체 지향 프로그래밍(Object Oriented Programming)이란?

- 위에서 신나게 절차 지향을 까댔으니 이제 객체 지향이 왜 나와야만 했는지에 대한 이유가 충분히 만들어졌네요


- 결론부터 말하면 그 이유는, 소프트웨어의 발전 속도를 하드웨어가 따라오지 못하는 상황이 발생했기 때문입니다.


- 그래서 소프트웨어가 하드웨어를 위해 변신을 시도한 것이죠! 어떻게 변신했냐구요?


1) 개발하려는 데이터들을 기능별로 묶어 모듈화하고

2) 하드웨어가 같은 기능을 중복 연산 하지 않도록 하고

3) 모듈을 재활용 하여 하드웨어 처리량을 획기적으로 줄일 수 있도록 말이죠!


- 절차 지향이 데이터의 처리 방법에 초점을 두었다면, 객체 지향은 데이터 그 자체에 초점을 두고 있습니다.


- 다른 말로 하면, 절차 지향이 컴퓨터에 초점을 두었다면, 객체 지향은 인간에 초점을 두고 있다고 보면 됩니다!


- 즉, 현실 세계를 모델링하여 소프트웨어를 개발하는 프로그래밍 기법입니다.


잠깐만, 그럼 객체가 뭐야?

- Instance(인스턴스) 라고도 부릅니다.


1
2
3
4
5
class 인간{
    int 머리카락_갯수;
    int 키;
    int 몸무게;
}
cs


- 인간이라는 Class(계층) 안에 특정 인간의 머리카락갯수, 키, 몸무게를 저장할 수 있도록 데이터들이 선언되어 있네요


- 여기서 잠깐, Class는 설계도라고 생각하시면 편합니다. 인간을 만들때 요소는 많겠지만... 저는 저 세 요인으로 인간을 만드는 설계도를 갖고 있다고 할게요


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class 인간{
    int 머리카락_갯수;
    int 키;
    int 몸무게;
    public 인간(int 머리카락_갯수, int 키, int 몸무게){
        this.머리카락_갯수 = 머리카락_갯수;
        this.키 = 키;
        this.몸무게 = 몸무게;
    }
}
 
int main(void){    
    인간 철수 = new 인간(1,190,10000);
    인간 영미 = new 인간(10000,200,1);
    
    return 0;
}

cs


- 이렇게 만들면, 머리카락 한개, 키 190, 몸무게 1만의 철수가 생성되고


- 머리카락 10000개, 키 200, 몸무게 1의 영미도 생성되었네요!


- 여기서 생긴 철수와 영미가 바로 인스턴스, 객체라고 불리우는 존재들입니다.


- 객체는 설계도(Class)구현한 제품(객체)이라고 한 줄로 정의할 수 있겠네요!


- 절차 지향이랑 뭐가 다른지 이제 감이 오시나요?


- 절차 지향은 철수와 영미를 만들어 줄 때, 저렇게 간단하게 클래스 하나로 두 줄로 끝나는게 아니라


- 인간이라는 struct를 만들고 그 값들을 설정해줄 함수들을 일일이 다 만들어줘야 한단 말입니다.


- 추후에 또 얘기 하겠지만, 클래스의 구조는 변수 영역과 메소드 영역으로 나뉩니다.



<출처 : [플러닝]님 블로그>



그럼 객체지향 언어의 3대 특성을 알아볼까요!?


1. 캡슐화(Encapuslation)

ㄴ 위의 코드처럼, 필요한 데이터들을 하나의 묶음, 즉 캡슐에 집어넣듯이 처리한다는 의미입니다.

데이터는 은닉화(Private)하고, 메소드(public)를 통해 외부와 상호 작용이 가능합니다!

ㄴ 메소드가 뭐냐구요? 우리가 흔히 알고 있는 함수요!! 자바로 치면 set함수 get함수가 대표적인 메소드라고 할 수 있습니다.


2. 상속(Extends)

ㄴ 이미 작성된 클래스(부모 클래스라고 하죠)를 이어받아서 새로운 클래스를 생성(자식 클래스라고 하죠)하는 기법!

ㄴ 기존 코드를 재활용해서 사용하는 것이 바로 이것입니다!


3. 다형성(Polymorphism)

ㄴ 하나의 이름(방법, 메소드)으로 많은 상황을 컨트롤 하는 기법입니다.

ㄴ 이게 뭔 멍멍이 소린가 싶죠?? 위에서 제가 게임 예로든거 기억나시나요? Attack이라는 함수 하나만으로 모든 캐릭터들의 공격 모션을 바꿀 수 있습니다!

ㄴ 이것이 바로 다형성입니다!


자 이제 장단점 보고 끝내시죠!


장점

- 만들어 놓은 코드의 재활용이 가능하다 (상속)

ㄴ 왜냐구요? new연산 있죠? new로 생성된 것들은 Heap영역에 쌓이게 됩니다. (동적 할당이라고 부릅니다)

ㄴ 이건 나중에 또 얘기하죠 ㅎㅎ

- 코딩이 간단하다 (캡슐화)

- 유지보수 및 업그레이드가 쉽다 (다형성)

- 디버깅도 쉽다.

- 대형 프로젝트에도 무리가 없다


단점

- C언어에 비해서 느리다....(C++이나 JAVA)

ㄴ 객체를 많이 만들다보니까, 처리속도가 많이 느려집니다.

- 객체가 많아질 수록 필요한 메모리량도 늘어난다

- 설계할 때 제대로 안하면 프로그램이 꼬인다(지옥이 시작된다)



+ 절차 지향은 순서를 중요시 한다고 하고, 객체 지향은 그 반대다! 라고 해서 뭔가 객체는 순서가 썅마이웨이로 해도 잘 돌아가는 것처럼 들릴 수도 있습니다


+ 이는 잘못된 생각입니다.


+ 절차 지향은, 데이터의 처리 기법을 중시한다고 했으니 Flow Chart를 짜는 것을 우선순위에 둡니다


+ 객체 지향은, 데이터 자체를 중시한다고 했으니 Data Modeling과 Flow Chart 중에서 Data Modeling이 우선순위적으로 더 위에 있는 것 뿐입니다!

'(구) 자료 > 면접을 위하여' 카테고리의 다른 글

[6] Memory Mapped IO, I/O Mapped I/O  (0) 2018.04.28
[5] 부동 소수점(floating Point)  (0) 2018.03.01
[4] 유사 코드(Pseudo-Code)  (0) 2017.12.27
[3] Array vs LinkedList  (0) 2017.12.09
[2] MVC 패턴이란?  (0) 2017.12.08