객체 지향 프로그래밍 (OOP)

luneah·2022년 3월 2일
0

Seminar - OOP

목록 보기
1/4
post-thumbnail

절차 지향 프로그래밍

절차지향(Procedural Programming)이란, 이름에서 나타나듯, 물이 위에서 아래로 흐르는 것처럼 순차적인 처리가 중요시 되며 프로그램 전체가 유기적으로 연결되도록 만드는 프로그래밍 기법이다.

즉 객체를 순차적으로 처리하여 프로그램 전체가 유기적으로 연결되어야 한다는 특징이 있으며, 사용되는 대표적인 언어로는 C언어가 있다. 절차 지향 프로그래밍의 장점으로는 컴퓨터의 작업 처리 방식과 유사하기 때문에 실행 속도가 빠르며, 시간적으로 유리하다는 점이 있다. 하지만 여기에는 큰 단점이 있다.

  1. 유지보수의 어려움
    모든 구성요소가 유기적으로 연결되어 있다는 말은, 하나가 고장났을 때 시스템 전체가 고장난다는 뜻이다. 또한 문제를 해결하기 위해 일부분이 아닌 시스템 전체를 수리해야 한다는 말이기도 하다. 절차 지향 언어는 이러한 유지 보수가 매우 까다로운 편이며, 특히 프로그램의 문제를 찾아내어 고치는 과정인 디버깅이 어렵다.

  2. 엄격하게 순서가 정해져 있어 비효율적
    실행 순서가 정해져 있기 때문에 코드의 순서가 바뀌면 결과가 달라질 가능성이 높다. 즉, 언어의 융통성이 부족하여 생산 효율이 떨어진다. 예를 들어 위의 사진에서 프로세스 3에서 문제가 발생했을 때 절차 지향 프로그래밍은 다시 프로세스 1부터 디버깅을 하기 때문에 아주 비효율적이다.

이러한 단점들은 스파게티 코드를 유발할 수 있고, 클린 아키텍처에서의 관심사 분리에 위배된다고 할 수 있다. 그래서 절차적 프로그래밍들의 단점들을 보완하며, 효율적인 분산 개발 및 협업과 유지 보수성을 상향 시키기 위해 객체 지향 프로그래밍이 등장하게 되었다.

객체 지향 프로그래밍

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

객체지향 프로그래밍의 가장 큰 특징은 클래스를 이용해 연관 있는 처리 부분(함수)과 데이터 부분(변수)을 하나로 묶어 객체(인스턴스)를 생성해 사용한다는 점이다. 이 방식은 오늘날 가장 많이 사용하는 대표적인 프로그래밍 방식으로 JAVA, C++ C# 등이 대표적인 객체지향 프로그래밍 언어로 사용되고 있다.

이러한 특징을 가진 객체지향 프로그래밍은 클린 아키텍처의 관심사 분리를 위배했던 절차 지향 프로그래밍과 달리, 관심사 분리를 지키면서 유지보수와 재사용성에 용이하다는 장점이 있다는 점이 있다.

클래스 & 객체(인스턴스)

그림과 같이 클래스에는 Car가 지정 되어있으며, 객체인 오브젝트에는 각 차의 유형인 아우디, 니싼, 볼보가 나열되어 있다. 그림에서 유추할 수 있듯이, 클래스는 붕어빵 틀처럼 객체를 정의하고 만들어내기 위한 설계도 혹은 틀의 역할을 하며, 객체는 붕어빵 틀을 통해 만들어진 붕어빵과 같이 클래스를 통해 실제로 생성된 단어 그대로의 실체가 있는 객체를 의미한다.

클래스 : 객체를 정의하고 만들어 내기 위한 설계도 혹은 틀로써, 연관되어 있는 변수와 메서드의 집합을 의미한다. 클래스의 특징으로는 객체의 상태를 나타내는 필드와 객체의 행동을 나타내는 메소드로 구성되어 있으며, 필드에는 변수, 메소드에는 특정 작업을 수행하기 위한 명령문의 집합이 포함된다. 예시 코드에는 필드와 메소드가 생략되어 있는 Car라는 클래스가 선언되어 있다.

객체 : 클래스를 기반으로 생성된 실체로써, 실제 프로그램에서 사용되는 데이터를 의미한다. 즉 소프트웨어 세계에 실제로 구현될 대상을 의미한다. 예시 코드에서는 선언을 통해 Audi, Nissan, Volvo 등의 객체가 생성되며, 이후 메모리에 할당이 될 때 객체의 인스턴스화가 되는 것을 확인할 수 있다.

인스턴스 : 클래스를 기반으로 생선된 객체가 메모리에 할당이 되어 실제 사용 될 때 인스턴스라고 부른다. 즉, 이러한 특징을 통해 인스턴스는 객체에 포함된다고 할 수 있다. 인스턴스는 추상적인 개념과 구체적인 객체 사이에 초점을 맞출 경우에 사용되며, 클래스를 기반으로 소프트웨어 세계에 구현된 실체라고 할 수 있다. 예시 코드에서와 같이 Audi, Nissan, Volvo 등이 실제로 메모리에 할당 되면서 인스턴스화가 진행된다.

클래스 vs 객체 vs 인스턴스

클래스 vs 객체
클래스와 객체의 관계에서 클래스가 설계도라고 한다면, 객체는 설계도로 구현한 대상 을 말할 수 있다.

객체 vs 인스턴스
객체와 인스턴스의 관계에서 객체는 클래스의 타입으로 선언 되었을 때를 객체라고 할 수 있으며, 인스턴스는 객체가 메모리에 할당되어 실제로 사용 될 때 인스턴스라고 말할 수 있다.

객체 지향 프로그래밍의 장단점

  • 장점
  1. 협업에 용이함
    객체지향 프로그래밍에서는 프로젝트를 독립적인 객체 단위로 분리해서 작업할 수 있기 때문에 여러 개발자와 협업을 진행함에 있어서 용이한 장점이 있다.

  2. 대형 프로젝트에 적합
    클래스 단위로 모듈화를 시켜서 개발할 수 있기 때문에 개발을 유연하게 해주고, 변경 용이성을 높혀준다. 이는 대형 프로젝트처럼 여러명, 여러 회사에서 프로젝트를 개발할 때 업무 분담 효율을 높혀줄 수 있기 때문에 대형 프로젝트에 적합하다는 장점이 있다.

  3. 유지 보수가 쉬움
    프로그램을 수정하거나 추가하는 경우에도, 캡슐화를 통해 주변 영향이 적기 때문에 유지보수가 쉽다는 장점이 있으며, 매우 경제적이라는 이점이 있다.

  4. 코드 재사용이 용이
    다른 사람들이 만든 클래스를 재사용할 수 있으며, 상속을 통해 확장해서 사용할 수 있기 때문에 코드 재사용에 용이하다는 장점이 있다.

  • 단점
  1. 개발속도가 느림
    객체가 처리하려는 것에 대한 정확한 이해가 필요하기에 설계 단계부터 많은 시간이 소모 된다는 단점이 있다.

  2. 실행속도가 느림
    객체 지향 언어는 절차 지향에 비해 대체적으로 실행속도가 느리다는 단점이 있다.

  3. 코딩의 난이도 상승
    다중 상속이 지원되는 C++ 같은 경우에 코드가 너무 복잡해질 수 있으며, 코딩의 난이도가 상승할 수 있다는 단점이 있다.

  4. 용량문제
    대규모 프로젝트에서처럼 객체가 많이 사용된다면 용량이 커질 수 있다는 단점이 있다.

profile
하늘이의 개발 일기

0개의 댓글