[무친 단어장] 면접관 : 객체 지향 프로그래밍이 뭐에요?? 나 : 에..??

송명규·2023년 4월 23일
0

무친단어장시리즈

목록 보기
2/4

코딩을 하다보면 객체 지향 프로그래밍이라는 것을 알게 된다.
뭐 대충 객체를 쓰는 프로그래밍이겠지... 했지만 사실 뭔지 정확히 모르고 넘어갔었다.

그러다 아는 형과 대화도중 객체 지향 프로그래밍에 대해서 이야기를 나눴는데,

뭐 상속이 어쩌구, 다형성이 이러니까 OOP가 .. 시뮬라67이 ..
파이썬은 다중상속 없냐? 부럽다 ..

이번 기회에 확실히 잘 알고 가보자!

프로그램 설계방법론의 일종으로, 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악 ...

그렇다. 이렇게 쓰면 무슨 소리인지 잘 모른다.
정확히 파악하기 위해서

옛날에는 어떻게 했고,
객체 지향 프로그래밍이 정확히 어떤 것이고,
왜 객체 지향 프로그래밍이 있어야하고,
어떤 특징을 가지고 있고,
어떤 언어들이 해당되고,
어떤 장단점을 가지고 있는지

알아보는 시간을 가지도록 하자.

정의(객체 지향 프로그래밍이 뭐에요?)

정의 : 프로그램 설계방법론의 일종으로, 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.

그러니까 쉽게 생각하면 새로운 집에 이사를 간다고 해보자.
그럼 필요한 가전들이 냉장고, 가스레인지, 전자레인지, 식탁,소파, 침대 등등.. 여러가지가 있는데,
우리는 각각 다른 냉장고와 가스레인지, 소파 등을 사지 않는가?

여기서의 "냉장고", "가스레인지", "식탁" 등이 객체이다.

만약 "냉장고"에 있는 "돼지고기"를 "전자레인지"에 넣고, "3분"을 돌린 다음, "식탁"에 넣는다는 시행을 한다고 생각해보자.

그럼
"냉장고" 는 "돼지고기"를 차가운 환경에서 보관하는 일을,
"전자레인지"는 "돼지고기"를 3분 동안 익히는 일을,
"식탁"은 사람이 먹을 수 있게 "돼지고기"를 배치하는 일을,
담당한다.

즉, 각 객체의 역할의 합으로 데이터를 주고 받으면서 시행을 처리하는 프로그램 설계방법론을 OOP 라고 한다!

이유(이전에는 어떻게 쓰였길래, 객체 지향 프로그래밍이 쓰이나요?)

이전에는 모든 것을 일일히 지정해서 사용했다.
객체라는 것이 따로 없고, 모든 명령어를 입력해야만 수행이 가능했다.(절차지향 프로그래밍)

이게 불편한 이유는 크게 2가지이다.

  1. 다른 사람이 봤을 때, 코드를 이해하기 어렵다.
    작성자가 봐도 헷갈리는 코드를 다른사람이 보면 어떻게 이해하겠는가?
    한 프로그램을 만드는데 약 10000줄이 필요하다고 하면, 다른 사람은 이 10000줄을 모두 읽고 이해해야할 것이다.
    생각만 해도 끔찍하다.
  2. 유지 보수가 어렵다.
    작성자와 이것을 유지보수 하는 사람 모두에게 불편함을 제공한다.
    만약 위의 예시에서 "돼지고기"는 최소 4번 이상 나오게 되는데, 이를 "소고기"로 바꾸려면 모든 "돼지고기"를 찾아서 "소고기"로 바꾸어 주어야한다.

이를 바꾸기 위해서 Top-down(프로그램을 거시적인 측면에서부터 미시적인 측면으로 설계)에서
Bottom-up(미시적인 측면에서부터 거시적인 측면으로) 방식을 사용한 OOP를 사용하게 된다.

즉, OOP는 코드중복을 줄이고 코드의 가독성을 높히기 위해서 사용한다!(상태에 관한 이유는 하단에 기재한다)

4가지 특징(OOP는 어떤 특징을 가지고 있나요?)

OOP는 추상화, 상속, 다형성, 캡슐화 이 4가지의 특징을 가지고 있다.
하나하나 알아보도록 하자.

1. 추상화

객체에서 공통된 속성과 행위를 추출 하는 것이다.

예를 들어 설명하면,
"조리기구"라는 큰 카테고리 안에
"후라이팬", "냄비", "볼" 등이 있는 것과 같다.

이는 다음과 같은 사용 방법을 가진다.

  • 무엇을 담는가?
  • 불을 사용해서 조리하는가?
  • 폭과 깊이는 어떻게 되는가?

모두 같은 조리기구 내에 있지만, 위의 질문에 각기 다른 대답을 한다.
즉, 공통된 속성과 행위를 추출하여 카테고리화 시킨다고 생각하면 쉽다!

근데 왜 .. 이 추상화라는 것을 써야 하죠..?

위에서 말했듯이, 우리는 거시적인 측면에서 봤을때 "어떤 기능을 해야하는가?"(절차지향) 보다 "누가 어떤 일을 해야하고, 그것을 조합해 어떤 기능을 만들어야하는가?"를 조금 더 중점적으로 생각해야 한다.

이 뜻은 언제든지 "누가" 가 추가될 수 있다는 점이고, 우리는 그것을 간단한 방법으로 하고싶다는 뜻이다.

만약 저기 위의 list에 "밥그릇"을 추가하고 싶다고 해보자.

절차지향 방식이라면, "밥그릇"을 전체코드에 추가하고 "밥그릇"을 사용할 때마다 바꾸어 주어야 한다는 것이다.

그러나 객체 지향 방식에서는 단순히 "조리기구" 안에서 "밥그릇"을 추가해주기만 하면 된다!

이렇게 쉽게 객체를 추가하고 뺄 수 있으므로 추상화를 사용한다.

2. 상속성

하나의 클래스가 가진 특징(함수, 데이터)을 다른 클래스가 그대로 물려받는 것이다.

만약 "조리기구" 아래 카테고리로 "그릇류"를 추가한다고 생각해보자.
그릇류가 "밥그릇", "국그릇", "간장종지", "고기그릇" 이렇게 있다고 생각할때, "조리기구"의 속성을 "그릇류"가 그대로 상속하여 "고기그릇"도

  • 무엇을 담는가?
  • 불을 사용해서 조리하는가?
  • 폭과 깊이는 어떻게 되는가?

라는 질문에 답할 수 있게 된다!

위에서 설명한 것 처럼 일일히 속성을 추가하지 않아도 상속을 받으면 상위 클래스의 속성을 모두 받아와 사용할 수 있어 매우 간편하다.

3. 캡슐화

정보 은닉화를 통해 높은 응집도, 낮은 결합도를 유지할 수 있도록 설계하는 것이다.

무슨 개똥 같은 소리냐면,
먼저 응집도와 결합도에 대해서 설명해보겠다.

(1) 응집도란, 클래스 내부 모듈의 관계 정도라고 생각하면 되겠다.
위의 "조리기구"의 예를 들면,
"조리기구"의 속성 중 "타고 이동할 수 있는가?" 라는 속성이 있다고 생각해보자.

후라이펜이나 냄비를 타고 이동할 수 있을리가;

즉, 상관이 없는 속성을 줄이면 줄일수록 응집도는 높아진다라고 생각하면 쉽다.

(2) 결합도란, 다른 클래스 사이와의 의존도라고 생각하면 쉽다.

애초에 OOP가 객체를 지향함으로써 객체에게 각기 다른 일을 시키고 싶어서 만들어진 설계방법론인데, 객체 사이에 과한 의존도를 지게 할 경우 OOP의 의미 자체가 없어진다.

(3) 정보은닉화란, 클래스 외부에서 내부의 정보를 조회할 수 없도록 한다는 것이다.

엥? 어짜피 같은 프로그램인데 뭔 상관티비?

상관이 있다.

정해진 메서드 이외에 접근은 private으로 제한하여 예상하지 못한 접근을 막아주면 보안상의 이슈도 막을 수 있고, 또 코드상 오작동이 발생하는 것을 막는다.

4. 다형성

서로 다른 클래스의 객체가 같은 동작 수행 명령을 받았을 때, 각자의 특성에 맞는 방식으로 동작하는 것이다.

이게 무슨 소리냐면,
"식재료" 라는 class에 "상추","배추","돼지고기","밥"이 있고, 속성으로

  • 바로 먹을 수 있는가?
  • 탄수화물을 포함하는가?
  • 단백질을 포함하는가?
    있다고 생각해보자.

"상추","배추","돼지고기","밥"은 모두 각기 다른 속성을 가질 것이다.
상추와 배추는 탄수화물을 포함하지 않고, 바로 먹을 수 있는 반면,
돼지고기와 밥은 바로 먹을 수 없지만 탄수화물과 단백질을 포함하고 있다. 식물성이지만.

이것이 다형성이다. 이는 상속과 더불어 OOP의 꽃, 존재 이유가 된다.

언어(어떤 언어가 객체 지향 프로그래밍을 지원하나요?)

지원하는 언어는 정말 많다.
대표적으로 자바, c++, 파이썬 등등 이 있고, 수많은 언어가 지금도 나오고 있다.

절차 지향 프로그래밍을 지원하는 언어는 대표적으로 C언어.. 가 있다.

장단점(객체 지향 프로그래밍은 어떤 장단점이 있나요?)

장단점을 비교하기 위해서 비교 대상은 절차 지향 프로그래밍으로 하겠다.

장점 :

(1) 디버깅이 쉽다.

정말 정말 큰 장점이다.
어떤 객체를 수정하면, 특정 객체 혹은 특정 객체가 관여하는 부분만 수정하면 되기 때문에 매우 EZ 하다.
절차 지향 프로그래밍은 순서 혹은 코드가 조금만 바뀌더라도 전체 코드가 작동을 하지 않는다.

(2) 코드의 재사용률이 증가한다.

상속, 다형성, 캡슐화를 통해 한 곳에서 쓴 코드를 반복적으로 사용하기 때문에 코드의 재사용률이 증가한다.

(3) 구조가 자연스럽다.

우리가 사는 세상, 정확히 말하면 인간은 세상을 수 많은 객체의 조합으로서 인지하기 때문에 실사용에 있어서 매우 적합하고, 구조 선택을 자유롭게 할 수 있는 장점이 있다.

(4) 다양한 개발자가 참여하기 좋다.

객체 지향 프로그래밍은 모든 개발자가 모든 코드에 대해서 알 필요없이 각 개발자가 각 객체를 맡아 개발하면 되어, 협업에 좋은 프로그램 설계방법론이다.

단점 :

(1) 실행 속도가 느리다.

절차 지향 프로그래밍과 비교하여, 객체를 사용하기 때문에 추가적인 포인터가 필요하게 되고, 필요 메모리와 시간이 증가한다.

(2) 높은 난이도

각 객체의 생성과 객체에게 할당할 작업을 생각하고, 그것을 기반으로 프로그래밍을 해야하기 때문에 난이도가 어렵다. 특히 C++같은 경우 다중상속이 가능하기 때문에 진짜 엄청나 대단해 어렵다.

reference

https://namu.wiki/w/%EA%B0%9D%EC%B2%B4%20%EC%A7%80%ED%96%A5%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D
https://www.codestates.com/blog/content/%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%8A%B9%EC%A7%95

profile
안녕하세요

0개의 댓글