본문 바로가기

CS

[프로그래밍 방법론] - 객체지향 프로그래밍이란?

✳️ 객체지향(Object Oriendted Programming, OOP)

프로그래밍을 공부하면서 객체지향이라는 말을 정말 많이 들었는데, 대충 이런거겠지하고 넘겨버린지 어언 6개월. 드디어 객체지향에 대해서 찾아보고 공부해보았습니다.

⁉️ 객체지향 프로그래밍이란 무엇일까요?

객체지향 프로그래밍 : 절차적 프로그래밍, 구조적 프로그래밍의 문제점을 해결하기 위해 등장한 여러 가지 프로그래밍 방식, 방법론 중의 하나입니다.

여느 방법론이 그렇듯, 객체지향 프로그래밍 또한 프로그래밍을 더 쉽고, 잘 하기 위해 등장한 방식인거죠!

그래서 객체지향 프로그래밍이 무엇일까요?? 객체지향이 뭐야!!!

📌 객체지향 프로그래밍의 정의

프로그램을 단순히 데이터와 처리 방법으로 나누는 것이 아니라, 프로그램을 수많은 '객체(object)'라는 기본 단위로 나누고 이들의 상호작용으로 서술하는 방식이다. 객체란 하나의 역할을 수행하는 '메소드와 변수(데이터)'의 묶음으로 봐야 한다. - (namuWiKi)

나무위키에서 긁어온 정의인데요,,, 사실 봐도 감이 잘 안 오죠? 오신다구요? 그렇다면 그건 그것대로 훌륭합니다.

그래서 비유를 통해 이해해보도록 하겠습니다!

✨ 자 그럼 상상해봅시다!

내가 어느 학교의 선생이고, 전교생을 데리고 학교를 대청소해야한다구요!

이를 프로그래밍에 과정에 대응시켜보면...

작업 : 청소
자원 : 학생들
프로그래밍 : 학생들에게 청소 시키기

그런데 이 청소라는 작업을 각각의 학생에게 하나씩 부여하려니 해야 할 지시들이 너무 많아집니다.

ex)

학생 1 → 창문 닦아줘, 창문 닦는 방법은 ~~이야

학생 2 → 창문 닦아줘, 창문 닦는 방법은 ~~이야

학생 3 → 칠판 닦아줘, 칠판 닦는 방법은 ~~이야

학생 4 → 칠판 닦아줘, 칠판 닦는 방법은 ~~이야

학생 5 → 바닥 쓸어줘, 바닥 쓰는 방법은 ~~이야

...

이런 식이면 지시만 하다가 하루가 다 지나버리겠죠? 중간에 틀린 지시를 할 확률도 높아지고 나중에 지시를 수정하기도 힘들어져요!

❗그래서 생각해낸 방법❗

어떠한 작업이 어떤 순서로 진행되는지에 대해서 미리 공지해주고,
학생들에게 이 공지를 참조해서 작업하라고 하는 것입니다.

네 맞습니다~~! 이것이 여러분이 익히 아시는 함수 또는 메서드이죠(Function, Method)

이처럼 함수나 메소드를 사용하면 지시하는 수고도 덜 수 있고, 나중에 수정 사항이 생겼을 때 해당 함수만 수정하면 모든 학생들이 수정된 방법으로 일을 하게 될 것입니다!!

이러한 방식으로 효율이 많이 증대되었지만, 함수는 데이터의 처리 방법만을 구조화했지, 데이터 자체를 구조화하지는 못했습니다. 함수와 관련성을 가지고 영향을 받는 변수를 조사할 때 모든 변수를 조사해야 했기에, 변수까지도 구조화할 수 있는 방법을 고민하게 되었습니다.

그렇게 등장한 것이 바로 객체지향이죠!

❇️ 객체지향의 특성

1️⃣캡슐화 : 변수와 함수를 하나의 단위로 묶는 것

객체지향 프로그래밍의 첫 번째 요소는 캡슐화입니다.

캡슐화란 변수와 함수를 하나의 단위로 묶는 것인데, 대부분의 언어에서 class의 형식으로 구현되는 것이죠!

학교 대청소의 경우로 생각하면, 롤플레잉 게임의 클래스처럼 창문닦이, 칠판닦이, 바닥쓸이라는 직업을 만들어 두는 것입니다!

창문닦이라는 클래스를 살펴볼까요?

창문닦이라는 클래스의 안에는 창문을 닦을 때 사용하는 도구, 창문을 닦는 시간 등의 변수

창문을 닦는 순서, 방법, 판단을 나타내는 메소드가 존재합니다.

이러한 클래스가 지정되었다면, 이제는 학생들에게 클래스만 지정해주고 일을 시키면 되는 것입니다!

이렇게 해서 드디어 등장하는 것이 객체!

📌 데이터와 기능이 클래스로 캡슐화된 컴퓨터 자원의 묶음을 객체라고 한다.

객체지향 프로그래밍은 작은 문제들을 해결할 수 있는 캡슐화된 객체들을 조합하여 커다란 문제를 해결하는 방식이기에 Bottom-UP 프로그래밍 이라고도 합니다.

그리고 이러한 캡슐 구조 덕분에 생기는 객체지향의 특성 중 하나로 은닉성이 있습니다.

1️⃣.1️⃣ 은닉성 : 외부 구조는 private으로 감춰 놓고, 외부에서 조작할 수 있는 명령어만 Public으로 공개해 둔다.

캡슐 구조 덕분에 바깥의 간섭으로 발생할 수 있는 오류를 방지할 수 있고, 동시에 남이 만든 클래스의 객체를 일일히 뜯어볼 필요가 없이 클래스 지정과 메서드 호출 만으로도 클래스의 기능을 사용할 수 있습니다.

그러나 아직까지도 대청소 작업에는 개선의 여지가 남아 있습니다.

클래스 지정을 통해서 직관적이고 효율적으로 창문닦기, 칠팔닦기, 바닥쓸기의 작업과 지정 학생에 대해 관리할 수 있게 되었지만, 지시는 여전히 여러 번 이루어지게 됩니다.

이러한 지시를 “청소하라”는 말로 간단히 끝낼 수는 없을까요?

‘역할만 다를 뿐, 다 함께 청소를 하는 것인데, 한 명령어로 모두에게 시킬 수 있으면 좋겠다’

✨ 이러한 생각에서 나온 개념이 interface라는 것입니다.

창문닦이, 칠판닦이, 바닥쓸이라는 클래스를 하나의 바운더리로 묶고, 이를 관리할 수 있도록 하는 것이죠!

방법은 아래와 같습니다.

청소 당번이라는 인터페이스를 만들고 이 청소 당번 인터페이스에 청소()라는 메서드를 선언해줍니다.

그리고 창문닦이, 칠판닦이, 바닥쓸이의 클래스에 청소 당번이라는 인터페이스를 채택해줍니다.

인터페이스를 채택하면 그 안에 정의된 청소()라는 메서드를 반드시 정의해야만 합니다.

이렇게 되면 세 개의 클래스 모두 청소()라는 메서드를 통해 명령을 시킬 수 있지만, 각기 다른 동작을 할 수 있게 되는 것입니다.

✅ 아까 객체지향 프로그래밍이 Bottom-UP 방식이라고 했었죠? 객체는 서로 조합하여 새로운 문제를 해결할 수 있는 객체를 구성할 수 있습니다.

예를 들어, 이번에는 선생님이 각 교실마다 청소를 시킬 수 있는 ‘교실청소팀’을 만들고 싶어한다고 생각해 봅시다.

교실청소팀을 꾸리기 위해 이미 존재하는 세 개의 청소 클래스를 이용할 수 있습니다.

먼저 교실청소팀이라는 팀규모의 클래스를 만들고, 이 안에 특정 클래스(창문닦이, 칠판닦이, 바닥쓸이) 들을 다시 불러와 줍니다.

그리고 교실청소팀 클래스에는 교실청소라는 메서드를 정의해주고, 각 클래스의 청소 메소드를 불러와주면 되는 것이죠.

이렇게 교실청소팀이라는 클래스를 조립했고.

교실청소팀을 지정해준 다음, 교실청소팀의 청소 메서드를 실행해주면

소속 클래스들이 모두 각자의 청소를 실행하게 되는 것입니다.

2️⃣ 상속

이번에는 새로운 문제에 봉착했습니다. 과학실을 청소하기 위해서는 위험한 도구들을 만질 수 있게 하는 새로운 도구(변수)와 방법이 필요합니다.

그런데 과학실 청소는 교실청소팀의 청소와 크게 다른 점이 없습니다.

단지 “특수장갑”을 이용해야 한다는 것과, 이 장갑을 이용해서 “위험물질”을 폐기해야 한다는 점만 다른 것이죠.

객체지향에서는 과학실청소팀이라는 특수 클래스를 추가할 수 있습니다.

이미 존재하는 교실청소팀을 상위클래스로 하여 “특수장갑”과 “위험물질 처리방법”을 가진 과학실청소팀이라는 자식 클래스를 만들 수 있는 것이죠.

이러한 방식은 override 청소()와 같은 형태로 구현됩니다.

교실 청소팀의 청소()에 “위험물질 처리방법”을 덮어씌우는 거죠.

그리고 이러한 객체지향의 특징을 ‘다형성’이라고 합니다.

3️⃣ 다형성 : 부모 클래스에서 정의된 메소드의 작업이 자식 클래스에서 다른 것으로 override될 수 있는 것을 다형성이라 한다.

이처럼 이미 존재하는 클래스를 활용하여 효율적으로 새로운 작업에 확장해 나갈 수 있습니다.

또한, 부모 클래스의 내용을 수정하면 자식 클래스의 내용도 수정되기에 효율적인 수정도 가능합니다.

❇️ 장단점?

객체지향 프로그래밍은 상속을 통해 코드의 재사용성을 높이고, 생산성을 향상하며 직관성을 높이고 유지보수를 용이하게 해줍니다.

그러나 객체지향 프로그래밍이라고 장점만 있는 것은 아닙니다. 클래스를 설계해야 하기 때문에 개발 속도가 느려지고 코드 난이도가 올라가며, 캡슐화로 인해 통제된 접근성으로 인해 메모리 변조에 문제가 생기며, 클래스의 상속이 너무 복잡해지면 코드의 해석이 어려워질 수도 있습니다.

다음에는 함수형 프로그래밍으로 돌아오겠습니다.

참조

객체지향 프로그래밍이 뭔가요?

나무위키