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

koyo·2020년 11월 26일
10

개발상식

목록 보기
1/2
post-thumbnail

객체 지향 프로그래밍(Object Oriented Programming)

여러 sw기업 신입사원 기술면접에서 워밍업느낌으로 처음으로 자주 나오는 질문이다.
"객체 지향 프로그래밍에 대해 설명 한 번 해주세요"

가장 기본이면서 이것마저 대답을 명확하게 못하면 첫인상이 안좋아지는 결과를 만드는 질문이다.

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

객체 지향 프로그래밍은 컴퓨터 프로그래밍 패러다임중 하나로, 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.

여기서 파생되는 질문

  • 객체 지향 프로그래밍을 했을 때 장점은?
  • 객체 지향 프로그래밍의 특징
  • 객체(또는 클래스)가 뭐에요?

결국 객체 지향 키워드 5가지와 관련된 내용과 장단점을 알고있는지에 대한 질문이다.

객체지향 프로그래밍의 장단점을 간단하게 설명해주세요

  • 장점

    • 코드 재사용이 용이
      남이 만든 클래스를 가져와서 이용할 수 있고 상속을 통해 확장해서 사용할 수 있음.

    • 유지보수가 쉬움
      절차 지향 프로그래밍에서는 코드를 수정해야할 때 일일이 찾아 수정해야하는 반면, 객체 지향 프로그래밍에서는 수정해야 할 부분이 클래스 내부에 멤버 변수 혹은 메서드로 있기 때문에 해당 부분만 수정하면 됨.

    • 대형 프로젝트에 적합
      클래스 단위로 모듈화시켜서 개발할 수 있으므로 대형 프로젝트처럼 여러 명, 여러 회사에서 개발이 필요할 시 업무 분담이 쉽다.

  • 단점

    • 처리속도가 상대적으로 느림
    • 객체가 많으면 용량이 커질 수 있음
    • 설계시 많은 시간과 노력이 필요

객체지향 프로그래밍 키워드 5가지

1) 클래스 + 인스턴스(객체)
2) 추상화
3) 캡슐화
4) 상속
5) 다형성

클래스와 인스턴스(객체)는 무엇인지 설명해주세요

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

인스턴스(객체) : 클래스에서 정의한 것을 토대로 실제 메모리상에 할당된 것으로 실제 프로그램에서 사용되는 데이터

객체 지향 프로그래밍에서 추상화(자료의 추상화)

불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 공통의 속성이나 기능을 묶어 이름을 붙이는 것이다.
이는 객체지향 관점에서 클래스를 정의하는 것으로, abstract와는 무관하다.

캡슐화가 무엇인가요?

캡슐화의 목적 : 코드를 재수정없이 재활용하는 것.
프로그램 코드에서 변수와 함수를 재활용하기에는 분산되어 있기 때문에 재활용이 어려웠으나, 캡슐화를 통해 관련된 기능과 특성을 한 곳에 모으고 분류하기 때문에 재활용이 원활해졌다.
객체 지향 프로그래밍에서 기능과 특성의 모음을 "클래스"라는 "캡슐"에 넣어서 분류해서 넣는 것이 캡슐화다.
객체가 맡은 역할을 수행하기 위한 하나의 목적을 한데 묶는다.

참고
추상화와 캡슐화가 어찌보면 헷갈리는 부분일 수 있다.
추상화는 구현 세부 사항을 포함하지 않고 필수 기능을 나타내어 일반화하는데 초점이 맞춰져있다.
캡슐화는 구현에 대한 세부정보를 은닉화하고 데이터에 접근을 일관된 형식으로 유지하여, 사용되는 기능과 특징을 모아두는데에 초점이 맞춰져있다.

상속은 무엇인가요?

절차지향 프로그래밍에서도 "라이브러리"를 통해서 남이 짜놓은 소스 코드를 가져와 사용할 수 있었다.
하지만 내 의도에 맞게 수정하게되면 다른 라이브러리가 되어 버전에 따라 동작하지 않을 수 있고 불필요한 코드의 수정작업을 해야한다는 것이다.
이런 문제를 해결하기 위해 상속이라는 것을 도입하였다.

상속은 부모클래스의 속성과 기능을 그대로 이어받아 사용할 수 있게하고 기능의 일부분을 변경해야 할 경우 상속받은 자식클래스에서 해당 기능만 다시 수정(정의)하여 사용할 수 있게 하는 것이다.

다중 상속은 불가하다.
클래스의 상속 관계에서 혼란을 줄 수 있기 때문에, 상속은 반드시 하나만 가능하고 필요에 따라 인터페이스를 사용할 수 있게 했다.

다형성은 무엇인가요?

하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석될 수 있는 것이다.
즉, 오버라이딩(Overriding), 오버로딩(Overloading)이 가능하다는 얘기다.
오버라이딩 : 부모클래스의 메서드와 같은 이름, 매개변수를 재정의 하는 것.
오버로딩 : 같은 이름의 함수를 여러 개 정의하고, 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있게 하는 것.

getter, setter를 사용하는 이유는 무엇인가요?

메서드를 통해서 접근하기 때문에, 메서드 안에서 매개변수같이 어떤 올바르지 않은 입력에 대해 사전에 처리할 수 있게 제한하거나 조절할 수 있기 때문이다.

출처 : 기본기를 쌓는 정아마추어 코딩블로그

Overview

객체 지향 프로그래밍 이전의 프로그래밍 패러다임을 살펴보면, 중심이 컴퓨터에 있었다. 컴퓨터가 사고하는대로 프로그래밍을 하는 것이다. 하지만 객체지향 프로그래밍이란 인간 중심적 프로그래밍 패러다임이라고 할 수 있다. 즉, 현실 세계를 프로그래밍으로 옮겨와 프로그래밍하는 것을 말한다. 현실 세계의 사물들을 객체라고 보고 그 객체로부터 개발하고자 하는 애플리케이션에 필요한 특징들을 뽑아와 프로그래밍 하는 것이다. 이것을 추상화라한다.

OOP로 코드를 작성하면 이미 작성한 코드에 대한 재사용성이 높다. 자주 사용되는 로직을 라이브러리로 만들어두면 계속해서 사용할 수 있으며 그 신뢰성을 확보할 수 있다. 또한 라이브러리를 각종 예외상황에 맞게 잘 만들어두면 개발자가 사소한 실수를 하더라도 그 에러를 컴파일 단계에서 잡아낼 수 있으므로 버그 발생이 줄어든다. 또한 내부적으로 어떻게 동작하는지 몰라도 개발자는 라이브러리가 제공하는 기능들을 사용할 수 있기 때문에 생산성이 높아지게 된다. 객체 단위로 코드가 나눠져 작성되기 때문에 디버깅이 쉽고 유지보수에 용이하다. 또한 데이터 모델링을 할 때 객체와 매핑하는 것이 수월하기 때문에 요구사항을 보다 명확하게 파악하여 프로그래밍 할 수 있다.

객체 간의 정보 교환이 모두 메세지 교환을 통해 일어나므로 실행 시스템에 많은 overhead가 발생하게 된다. 하지만 이것은 하드웨어의 발전으로 많은 부분 보완되었다. 객체 지향 프로그래밍의 치명적인 단점은 함수형 프로그래밍 패러다임의 등장 배경을 통해 알 수 있다. 바로 객체가 상태를 갖는다는 것이다. 변수가 존재하고 이 변수를 통해 객체가 예측할 수 없는 상태를 갖게 되어 애플리케이션 내부에서 버그를 발생시킨다는 것이다. 이러한 이유로 함수형 패러다임이 주목받고 있다.

객체 지향적 설계 원칙

  1. SRP(Single Responsibility Principle) : 단일 책임 원칙
    클래스는 단 하나의 책임을 가져야 하며 클래스를 변경하는 이유는 단 하나의 이유이어야 한다.
  2. OCP(Open-Closed Principle) : 개방-폐쇄 원칙
    확장에는 열려 있어야 하고 변경에는 닫혀 있어야 한다.
  3. LSP(Liskov Substitution Principle) : 리스코프 치환 원칙
    상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다.
  4. ISP(Interface Segregation Principle) : 인터페이스 분리 원칙
    인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 한다.
  5. DIP(Dependency Inversion Prinsiple) : 의존 역전 원칙
    고수준 모듈은 저수준 모듈의 구현에 의존해서는 안된다.
profile
클라우드 개발자가 될 코요입니다.

2개의 댓글

comment-user-thumbnail
2023년 7월 13일

개발을 글로 했나요? 님 같은 사람이 있어서 세상이 썩어가는 거에요... 개발 해본 적 없는 티가 다 나네요

1개의 답글