👤 면접 질문
객체 지향 프로그래밍이란 무엇인가요?

 

객체 지향 프로그래밍(Object-Oriented Programming, OOP) 란?

프로그래밍에서 필요한 데이터를 추상화 시켜 상태와 행위를 가진 객체로 만들고, 객체들 간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.

 


여기서 객체란, 프로그램에서 사용되는 데이터 또는 식별자에 의해 참조되는 공간을 의미하며 값을 저장할 변수와 작업을 수행할 메서드를 서로 연관된 것들끼리 묶어서 만든 것이라고 할 수 있다. 또한, 여러 군데에서 재사용할 수 있는데 이는 부품화 와 재사용성이라는 객체 지향 프로그래밍의 특징을 보여주기도 한다.


 

1️⃣ 객체 지향 프로그래밍의 특징

객체 지향 프로그래밍의 특징 크게 추상화, 캡슐화, 상속, 다형성으로 나누어진다.

추상화(Abstration)

  • 객체의 공통적인 속성과 기능을 추출하여 정의하는 것
  • 불필요한 세부 사항들은 제거하고 가장 본질적이고 공통적인 부분만을 추출하여 하나의 묶음으로 만들어내는 과정을 말함
  • 보다 유연하고 변경에 열려있는 프로그램을 설계하기 위해 역할과 구현을 분리 (여기서 역할에 해당하는 부분이 인터페이스를 통해 추상화될 수 있음)

캡슐화(Encapsulation)

  • 안에 서로 연관 있는 변수와 함수를 하나의 클래스로 묶고, 데이터를 외부로부터 보호하는 것(객체 내부의 세부적인 동작에 대한 구현을 감춤)
  • 외부에서 접근할 필요 없는 것들은 접근 지정자를 private으로 두어 접근에 제한을 둘 수 있다.
  • 정보 은닉(다른 객체에게 자신의 정보를 숨기고, 자신만의 연산을 통해 접근을 허용)을 활용할 수 있다.
  • 높은 응집도와 낮은 결합도를 유지(즉, 한 곳에서 변화가 일어나도 다른 곳에 미치는 영향을 최소화)

상속(Inheritance)

  • 이미 정의된 상위 클래스(부모 클래스)의 모든 속성과 연산을 하위 클래스가 물려받는 것
  • 기존 코드를 재활용해서 사용함으로써 반복적인 코드를 최소화하고 공유하는 속성과 기능에 간편하게 접근할 수 있어서 코드의 생산성을 높여줌
  • But, 클래스 간 결합도가 과도하게 높아져 유지보수가 어려움. 반드시 기능의 확장 관점으로써 사용해야 함
  • 즉, 상속은 자식 클래스를 외부로부터 은닉하는 캡슐화의 개념을 가지고 있음

다형성(polymorphism)

=> 객체 지향 프로그래밍의 꽃이라고 할 수 있다!

  • 하나의 변수 또는 함수(클래스의 객체)가 명령을 받았을 때, 상황에 따라 여러 가지 형태를 가질 수 있는 성질을 의미
  • 즉, 어떤 객체의 속성이나 기능이 그 맥락에 따라 다른 역할을 수행할 수 있는 객체 지향의 특성
  • 대표적으로 오버라이딩(Overriding)과 오버로딩(Overloading)이 있다.
    • 오버라이딩(Overriding): 상위 클래스의 메서드와 같은 이름, 매개변수를 사용하되 내부 소스를 재정의
    • 오버로딩(Overloading): 하나의 클래스 내에서 같은 이름의 메서드를 여러 개 중복하여 정의, 매개변수를 다르게 하여 같은 이름을 경우에 따라 호출해서 사용

가장 중요한 다형성의 정의
객체 지향 프로그래밍에서 다형성이란 한 타입의 참조변수를 통해 여러 타입의 객체를 참조할 수 있도록 만든 것을 의미합니다. 좀 더 구체적으로, 상위 클래스 타입의 참조변수로 하위 클래스의 객체를 참조할 수 있도록 하는 것입니다.



 

2️⃣ 객체 지향 프로그래밍의 장점

  • 프로그램을 보다 유연하고 변경이 용이하게 만들 수 있음
  • 코드의 변경을 최소화하고 유지보수를 하는데 유리
  • 코드의 재사용을 통해 반복적인 코드를 최소화하고, 코드를 최대한 간결하게 표현
  • 클래스 단위로 모듈화시켜서 개발하기 때문에 업무 분담이 편리하고, 대규모 소프트웨어 개발에 적합
  • 보다 인간 친화적이고 직관적인 코드를 작성하기에 용이함
 
 

3️⃣ 객체 지향 프로그래밍의 단점

  • 실행 속도가 느림
  • 전반적으로, 객체 지향 언어(C++, Java, Ruby)는 컴퓨터의 처리 구조와 비슷한 절차 지향 언어(C 언어)보다 상대적으로 실행 속도가 느림
  • 프로그램 용량이 커질 수 있음
  • 객체 단위로 프로그램을 많이 만들다 보면, 불필요한 정보들이 들어갈 수 있기 때문에 설계에 많은 시간 소요
  • 초기에 클래스별, 객체별, 상속 등의 구조 등을 모두 설계해야 하기 때문에 절차 지향 언어에 비해 설계 시간이 많이 듦
 
 


 
 


절차 지향 프로그래밍(Procedural Programming)

  • 개체를 순차적으로 처리해서 프로그램 전체가 유기적으로 연결되어야 함
  • 컴퓨터의 처리구조와 유사
  • 실행 속도가 빠른 것이 장점