OOP [객체 지향 프로그래밍]

나무에물주기·2023년 1월 7일

CS

목록 보기
3/16
post-thumbnail

reference : https://velog.io/@gillog/OOP%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

OOP(Object Oriented Programming)

OOP(객체 지향 프로그래밍)이란 문제를 여러 개의 객체 단위로 나눠 작업하는 방식으로, 객체들이 서로 유기적으로 상호작용하는 프로그래밍 이론이다.

대표적으로 Java와 C#이 객체 지향 프로그래밍 언어이다.

객체 : 세상에 존재하는 모든것, 프로그래밍에서의 객체는 데이터의 분산을 막기 위해 데이터와 기능을 하나로 묶은 그룹

[EX] 컴퓨터(객체) = 데이터(본체, 모니터, 키보드) + 기능(화면, 소리, 입력, 출력)

OOP는 코드 재사용성과 생산성의 향상 효과를 볼 수 있고, 유지보수의 편의성 덕택에 협업이 중요하고 규모가 큰 대형 프로젝트에 사용되는 프로그래밍 이론이다.

아래는 OOP의 장점과 단점을 모아놓은 것이다.

OOP의 장점

  • 코드 재사용성 증가
  • 상속을 통해 프로그래밍시 코드의 재사용을 높일 수 있다.
  • 생산성 향상
  • 잘 설계된 클래스를 만들어서 독립적인 객체를 사용함으로써 개발의 생산성을 향상시킬 수 있다.
  • 자연적인 모델링
  • 우리 일상생활의 모습의 구조가 객체에 자연스럽게 녹아들어 있기 때문에 생각하고 있는 것을 그대로 자연스럽게 구현할 수 있다.
  • 유지보수의 우수성
  • 프로그램 수정시 추가, 수정을 하더라도 캡슐화를 통해 주변 영향이 적기때문에 유지보수가 쉬워서 매우 경제적이라할 수 있다.

OOP의 단점

  • 개발속도가 느린점
  • 객체가 처리하려는 것에 대한 정확한 이해가 필요하기에 설계단계부터 많은 시간이 소모 된다.
  • 실행속도가 느린점
  • 객체지향언어는 대체적으로 실행속도가 느리다.
  • 코딩 난이도 상승
  • 다중 상속이 지원되는 C++ 같은 경우에 너무 복잡해져 코딩의 난이도가 상승할 수 있다.

OOP 특징

객체 지향 프로그래밍의 가장 큰 특징은 클래스를 이용해 연관 있는 처리 부분(함수)과 데이터 부분(변수)을 하나의 객체(인스턴스)로 묶어 생성해 사용한다는 점이다.

객체 지향 프로그래밍은 캡슐화, 추상화, 상속성, 다형성 네 가지 특성을 지닌다.

  1. 캡슐화 (Encapsulation)
  • 캡슐화란 데이터와 코드의 형태를 외부로부터 알 수 없게하고, 데이터의 구조와 역할, 기능을 하나의 캡슐형태로 만드는 방법이다.

  • 캡슐화의 중요한 목적은 변수를 private로 선언하여 데이터를 보호하고, 보호된 변수는 getter나 setter등의 메서드를 통해서만 간접적으로 접근을 허용하는 것 이다.

  • 캡슐화를 하면 불필요한 정보를 감출 수 있기 때문에, 정보은닉을 할 수 있다는 특징이 있다.
    캡슐화와 정보은닉은 동일한 개념은 아니다.

[getter, setter를 사용하는 이유?]
 
멤버변수에 직접접근하지 못하게 private으로 접근지정자를 설정하고 public으로 getter, setter 메서드를 만드는 것을 많이 해왔다.
 
그러면서 이럴꺼면 어차피 아무나 접근가능한데 왜 private을 할까? 라고 생각했었다.
 
결론부터 말하면 getter, setter를 사용하면 메서드를 통해서 접근하기 때문에, 메서드 안에서 매개변수같이 어떤 올바르지 않은 입력에 대해 사전에 처리할 수 있게 제한하거나 조절할 수 있기 때문이다.
 
예를들면 setter에서 유효범위를 넘은 정수가 들어왔을 때의 처리를 하고나서 set하거나 예외처리를 해버릴 수 있는 것이다.
 
getter도 마찬가지로 굳이 예를들자면 자료에 무언가 더하거나 빼고 준다든지가 가능하다.

출처: https://jeong-pro.tistory.com/95 [기본기를 쌓는 정아마추어 코딩블로그]

  1. 추상화 (Abstraction)
  • 추상화는 객체의 공통적인 속성과 기능을 추출하여 정의하는 것을 말한다.

  • 다시 말해 실제로 존재하는 객체들을 프로그램으로 만들기 위해 공통 특성을 파악해 필요없는 특성을 제거하는 과정을 가르킨다.

  • 객체들은 실제 그 모습이지만, 클래스는 객체들이 어떤 특징들이 있어야 한다고 정의하는 추상화된 개념이다.

  • 정리하면 추상화는 객체들의 공통된 특징을 파악해 정의해 놓은 설계 기법이라 할 수 있다.

// 예제 : 학생 정보 저장 시스템

#include <iostream>
using namespace std;

class Student{
public :
    string name;
    int studentNumber;
    int grade;
    int class;
    string phone;
    string gender;

    Student( string name, int studentNumber, int grade, int class, string phone, string gender ) {
    this->name = name;
    this->studentNumber = studentNumber;
    this->grade = grade;
    this->class = class;
    this->phone = phone;
    this->gender = gender;
};

int main(void) {
    Student jingu = Student( "노진구", 13, 2, 1, "010-1234-5678", "남" );
    Student jjanggu= Student( "신짱구", 21, 1, 1, "010-9876-5432", "남" );
    Student eseul = Student( "신이슬", 7, 1, 5, "010-8520-3695", "여" );
    Student doil= Student( "남도일", 15, 3, 6, "010-0123-4567", "남" );
    Student gildong = Student( "고길동", 10, 2, 4, "010-6543-2109", "남" );
}
  1. 상속(Inheritance)
  • 상속이란 기존 상위클래스에 기능을 가져와 재사용할 수 있으면서도 동시에 새로운 하위 클래스에 새로운 기능도 추가할 수 있는 것이다.

  • 즉, 부모가 자식에게 유전자를 물려주듯이 부모의 특징을 자식에게 모두 물려준다.

  • OOP에서 이를 부모 클래스, 자식 클래스라고 표현한다.

  • 상속이 필요한 이유는 코드의 중복을 없애기 위해서다.

  • 코드의 중복이 많아지면 개발 단계와 유지 보수에서 많은 비용이 들게 된다.

  • 상속관계를 맺으면 자식 객체를 생성할 때 부모 클래스의 속성들을 자동으로 물려받기 때문에 자식 클래스에서 또 정의할 필요가 없다.

  1. 다형성(Polymorphism)
  • 다형성이란 상속과 연관있는 개념으로 한 객체가 상속을 통해 기능을 확장하거나 변경하여 다른 여러형태(객체)로 재구성 되는 것을 말한다.

  • 쉽게 말하면 한 부모의 밑에서 태어난 자식들이 조금씩 다르다는 것이다.

  • 오버로드(Overload) 또는 오버라이드(Override)가 다형성의 대표적인 예라 할 수있고, 이것을 구현하는 걸 오버로딩(Overloading)과 오버라이딩(Overriding)이라고 한다.

  • 간단하게 설명하자면,
    오버라이딩은 하위 클래스(자식)가 상위 클래스(부모)에서 만들어진 메서드를 자신의 입맛대로 다시 재창조해서 사용하는 것을 말한다.

  • 오버로딩은 하나의 클래스 안에서 같은 이름의 메서드를 사용하지만 각 메서드마다 다른 용도로 사용되며 그 결과물도 다르게 구현하는 것을 말한다.

  • 오버로딩이 가능하려면 메서드끼리 이름은 같지만 매개변수의 개수나 데이터 타입이 달라야 한다.

  • 다형성을 사용하면 같은 이름의 속성을 유지함으로서, 속성을 사용하기 위한 인터페이스를 유지하고, 메서드 이름을 낭비하지 않는다.

  • API가 많아질수록 복잡성은 증가하기 때문에 다형성은 유용하며 코드 재사용성을 늘려주어 유지보수가 용이하도록 도와주는 개념이다.


결국 OOP는 위 네 가지 특성들을 통해서 어떤 대상을 추상화(Abstraction)하여 공통점을 찾고, 그것을 캡슐화(Encapsulation)해 한 군데에 모아 객체를 만들고, 새로운 객체가 상속(Inheritance)받아 재사용이 가능하게 만들어 준다.

상속받은 객체는 다형성(Polymorphism)을 통해 기능을 수정 또는 추가하여 재사용할 수 있다.

profile
개인 공부를 정리함니다

0개의 댓글