주인장의 프로그래밍 개발 공부방

[자바 프로그래밍 기본] 0. 서론 (feat. 객체지향 언어) 본문

Java/자바 프로그래밍 기본

[자바 프로그래밍 기본] 0. 서론 (feat. 객체지향 언어)

거신 2022. 12. 14. 02:36

이 블로그에서 대부분 다루는 내용들을 몇 번 읽어본 사람들이라면

내용의 배경을 자바라는 언어를 가지고 설명하고 있다는 것을 다들 알고 있을 것이다.

하지만 설명을 자바로 한 것 뿐이지 다른 언어를 사용하고 있거나 배워본 사람들이라면

다른 언어들을 가져와 설명하더라도 특정 부분들을 제외하곤 대부분 다 비슷하다는 걸 느낄 것이다.

 

그래서 여기에서는 자바라는 언어와 그나마 직접적으로 관련이 있는 내용들을 다뤄보려고 한다.

다른 카테고리인 자바 프로그래밍 기초에서는

자바로 코딩이나 프로그래밍을 할 때 소스 코드를 "작성"할 때 유용한 내용들을 다룬다면

자바 프로그래밍 기본자바 프로그래밍 심화에서는

다른 사람들이 작성한 자바 소스 코드를 "분석"

이게 무슨 의미인지, 왜 이렇게 작성했는지를 이해하는 지식을 전달하는 것에 초점을 맞추려고 한다.

 

물론 이 글은 자바 프로그래밍을 이제 막 공부하기 시작한 사람과

아직 미숙한 사람들을 위해 전공지식처럼 복잡하고 어려운 부분을 가능한 간단하고

최대한 이해하기 쉽게 작성하는 것이 목표이기 때문에

이 글을 읽어서 면접 준비를 한다든가 취준을 하는데 사용하는 그런 심오한 일은 삼가해주길 바란다.

본인이 그렇게 이용하겠다면 말리진 않겠지만 지식에서 누락된 부분에 대해선

그 부분까진 필자가 책임을 질 순 없다.

 

1. 객체지향 (Object-oriented)

 

자바에 대해서 공부하다보면 한번쯤은 봤을 법한 단어이다.

바로 객체지향이라는 단어인데 자바를 설명할 때 꼭 등장하는 단어이기도 하다.

그런데 객체지향이 뭘 말하는걸까?

 

단어 그대로를 파악해보자면

객체를 지향한다는 뜻인데 아니 글쎄 그러니까 그게 뭔데?라고 할 것 이다.

좀 더 풀어서 설명하자면

프로그래밍을 그냥 하지 말고 객체화해서 좀 만들어라.

뭐 그런 의미인 셈이다.

객체(Object)......

자세한 건 뒤에서 차근차근 알아가보도록 하자.

 

아무튼 간단하게 설명하자면 객체라는 걸 만들어서 그걸 가지고 프로그램을 만든다.

라는 말인데 좀 더 이해하기 쉽도록 비유로 이해해보자.

 

그림 1)

사진 출처 : 국립특수교육원 - 볼펜조립

여기에 우리가 흔히 사용하고 있는 모나미 볼펜이 있다.

이 녀석이 우리가 만들려고 하는 결과물(우리에겐 프로그램)이 되겠다.

그런데 너무나도 당연한 이야기겠지만 모나미 볼펜을 하나 만드는데 여러 부품들이 필요하다는 걸 알고 있을 것이다.

 

그림 2)

사진 출처 : 국립특수교육원 - 볼펜조립

이렇게 볼펜 하나에 몇 가지의 부품들이 필요하고

이 부품들을 이리저리 조립해서 그림 1)의 결과물을 만들어 내는 것이다.

여기에서 우리는 객체라는 녀석을 조금이나마 이해할 수 있다.

 

바로 그림 2)의 볼펜을 구성하는 각각의 부품들이

객체(Object)인 것이다.

뚜껑이라는 객체, 스프링이라는 객체, 볼펜 몸통이라는 객체 등을 만들어서

그 객체들을 뚝딱뚝딱하면 하나의 모나미 볼펜 되는 것이다.

 

아마 이 정도만 설명하더라도 객체지향이라는 의미가

대충 어떤 의미인지는 이해했으리라 생각한다.

그런데 이렇게만 보면 한 가지 의문이 드는 부분이 있을 것이다.

객체지향이 뭔진 좀 알겠다.

근데 왜 객체지향으로 프로그래밍을 해야됨?

어....?

 

2. 객체지향 언어의 특징

 

앞에서 객체지향이 어떤 의미인지에 대해서 간단하게 알아봤지만

그래서 그걸 왜 써야하는지에 대해선 아직까지 물음표로 남아있다.

그래서 우리는 다시 모나미 볼펜을 조립하는 과정을 생각해 볼 필요가 있다.

 

그림 3)

사진 출처 : 국립특수교육원 - 볼펜조립

예를 들어서 모나미 볼펜을 만드는 방법이 왼쪽 그림과 같이 부품을 조립해서 만드는 것이 아니라

3D 프린터같은 걸로 볼펜을 모델링해서 한번에 뽑아낸다고 상상해보자.

 

만드는 과정이야 달라지겠지만 결과물은 비슷하게 나올 것이다.(잉크 뭐 이런 거 둘째치고)

작업 명령을 내리면 볼펜심만들고 스프링만들고 몸통만들고 뚜껑만들고 뭐 이런 식으로 진행해서

하나의 완성품이 만들어진다.

 

그런데 볼펜 회사 사장이 정신이 나갔는지 지금까지 검은색 볼펜만 잘 만들고 있었는데

볼펜의 다향성을 추구하기 위해 빨간색 볼펜파란색 볼펜 만들라고 지시를 내렸다.

그렇다면 작업자는 빨간색 볼펜파란색 볼펜은 어떻게 만들어야 할까?

지금 3D 프린터로 볼펜을 만들고 있는 상황에선

어쩔 수 없이 빨간색 볼펜파란색 볼펜을 각각 새로 모델링을 해서

처음부터 다시 뽑아내야 할 것이다.

왜? 볼펜 하나를 만드는 공정이 그러하니까.

거기다 이제는 검은색 볼펜의 모델링과 공정 방식은 쓸모가 없어졌다.

 

이 상황만 놓고 봤을 때 우리는 뭔가 참신한 아이디어를 떠올리게 될 것이다.

'아니 볼펜심만 따로 만들어서 색만 다르게 하면 간단한 거 아님?'

이걸 여러분들이 당연하게 생각해냈다면

여러분들은 객체지향적인 사고를 하고 있다고 할 수 있다.

어쩌면 당연한 생각이라고 말할 수도 있겠다.

 

즉, 저 볼펜 하나를 만드는데 우리가 한번에 만들어내는 것이 아니라

부품(객체)별로 만들었다면

다른 색의 볼펜을 만드는 과정이 그렇게 번거롭지 않았을 것이다.

이것이 바로 우리가 객체지향 프로그래밍을 하고 있는 이유이기도 하다.

 

여기에서 객체지향의 특징과 장단점을 파악할 수 있는데

먼저 장단점부터 간단하게 살펴보자면

 

장점)

1. 재사용성

우리가 다른 색의 볼펜을 만들어야 하더라도 디자인이 바뀌지 않는 이상

각 부품의 형태 자체는 바뀌지 않기 때문에 여러 종류의 볼펜을 만들 때에 얼마든지 재사용할 수 있다.

심지어 볼펜심도 심에 들어가는 잉크의 종류는 달라지더라도

볼펜심의 형태 자체는 바뀌지 않기 때문에 역시 그대로 사용할 수 있다.

 

2. 생산성

새로운 색의 볼펜 만들겠다고 모델링부터 새로 해야하는 불상사가 사라진다.

우리는 다른 색의 볼펜심으로만 교체하면 얼마든지 다른 색의 볼펜을 만들어낼 수 있다.

 

3. 자연스러운 모델링

'볼펜심 색깔만 다르게 하면 되는거 아님?'

우리가 일상에서 당연하게 생각하는 것처럼 자연스럽게 구현할 수 있다.

 

4. 유지보수의 우수성

볼펜 하나를 만들 때 뚜껑이 잘못 만들어지면 우리는 뚜껑만 따로 다시 만들면 된다.

뚜껑을 잘못 만들었다고 볼펜 전체를 다시 만들어야 하는 불상사는 존재하지 않는다.

 

단점)

1. 개발 속도가 느림

근데 문제는 저렇게 볼펜을 부품화해서 만들기 위해선 일단 설계 단계에서

저렇게 계획하고 만들어야 하는데 저게 어디 하늘에서 떨어져서 뚝딱 만들어지는 건 아니니까....

저 부품들을 저 형태로 설계한 사람들은 천재가 아닐까?

 

2. 실행 속도가 느림

아니 3D 프린터로 한번에 쫙 뽑으면 볼펜 하나 나오는데

저건 부품들 다 만들어서 "조립"까지 해야되네???

 

3. 높은 난이도

설계하는 것도 시간이 오래 걸리고 아 조립도 해야되고

부품은 왜 또 저렇게 많은건지 참.... 이 부품은 어디에 쓰이는고??

 

 

이렇듯 장단점이 존재하지만 그럼에도 더 효과적인 방식이기에

현재 등장하고 있는 개발 언어들이 객체지향의 형태를 띄고 있는 것도 그러한 이유이다.

 

그리고 객체지향의 특징을 간단하게 살펴보면

 

상속(Inheritance)

캡슐화(Encapsulation)

다형성(Polymorphism)

추상화(Abstraction)

 

이렇게 4가지로 나타낼 수 있는데

자세한 내용은 다음 글에서 더 자세하게 살펴보도록 하자.

다음 글에서 만나자.

Comments