3 분 소요


절차적 프로그래밍이란?


chatgpt는 이렇게 답합니다.

여기서 중요한 포인트를 집어보자면

  1. 함수안에 어떤 내용을 담을 것인가 (함수의 추상화)
  2. 이러한 함수들은 어떤 순서로 실행 시킬 것인가 (알고리즘)

이 두가지를 고려하는 프로그래밍 기법이라고 할 수 있습니다.



객체지향 프로그래밍이란?


chatgpt는 이렇게 답합니다.

여기서 중요한 포인트를 집어보자면

객체란 현실 세계에서 존재하는 실체(entity)나 개념(concept)을 프로그래밍에서 표현한 것입니다.

그렇다면 나무를 프로그래밍으로 어떻게 표현할 수 있을까요?

이때 필요한 것이 클래스 (Class) 입니다. 클래스란 프로그래밍에서 객체를 표현하기 위해 사용되는 도구, 즉 객체를 특징을 정의한 것입니다.

마지막으로 인스턴스(Instance) 라는 개념이 있습니다. 인스턴스란 실체화된 객체입니다. 즉, 메모리가 할당되어 우리가 사용할 수 있는 객체를 말합니다.


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


  1. 캡슐화(Encapsulation)

    객체의 속성(데이터)과 기능(메소드)을 하나로 묶어서 외부에서 접근하지 못하도록 보호한다. 즉, 객체 내부의 데이터와 메소드를 외부로부터 숨기고, 객체의 인터페이스만을 노출하여 외부와의 상호작용을 제어한다. 이를 통해 코드의 재사용성과 유지보수성을 높일 수 있다.

  2. 상속(Inheritance)

    이미 존재하는 클래스를 기반으로 새로운 클래스를 만들 수 있습니다. 이를 통해 기존 클래스의 속성과 기능을 물려받고, 이를 확장하거나 변경하여 새로운 클래스를 정의할 수 있습니다. 이는 코드의 재사용성과 유연성을 높이며, 클래스 간의 계층 구조를 만들어 구조화된 프로그래밍을 가능하게 합니다.

  3. 다형성(Polymorphism)

    같은 이름의 메소드나 연산자를 다른 형태로 구현할 수 있습니다. 즉, 동일한 인터페이스를 가진 객체들이 다른 방식으로 동작하도록 구현할 수 있습니다. 이를 통해 코드의 가독성과 재사용성을 높일 수 있습니다.

  4. 추상화(Abstraction)

    객체의 복잡한 내부 구현을 숨기고, 필요한 부분만 노출하여 단순화시키는 것입니다. 즉, 객체를 단순화된 모델로 만들어 복잡성을 낮추고, 핵심적인 부분에 집중할 수 있게 합니다.



정리!

제가 생각하는 절차의 의미는 다음과 같습니다.

"무엇을 어떤 절차로 할 것인가?"
즉, 기능(함수)을 어떤 순서(알고리즘)로 처리할 것인지에 초점을 맞춰 코드를 작성하는 것

제가 생각하는 객체지향의 의미는 다음과 같습니다.

"누가 어떤 기능을 할 것인가?"
즉, 객체를 도출하고 각각의 역할을 정의하는 것에 초점을 맞춰 코드를 작성하는 것 



클래스

클래스의 정의 방법

  1. 클래스를 정의할 때는 먼저 클래스의 이름부터 적는다.
  2. 그리고 중괄호 안에 이 클래스의 데이터 멤버(속성)와 메서드(동작)을 선언한다.
    • 데이터 멤버 == 멤버 변수 메서드 == 멤버 함수
  3. 각각의 데이터 멤버와 메서드 마다 public, private, protected 등으로 접근 수준을 지정한다.


클래스의 멤버

  • 클래스는 여러 개의 멤버를 가질 수 있으며, 멤버는 함수일 수도, 변수일 수도 있다.

    • 멤버함수 == 메서드
    • 멤버변수 == 데이터 멤버
  • 클래스가 가질 수 있는 멤버 함수와 데이터 멤버의 수에는 제한이 없다, 또한 데이터 멤버의 이름과 메서드의 이름이 같이도 된다.


클래스 멤버들의 적용범위(중요☆)

  • 데이터 멤버는 그 클래스에 대한 인스턴스인 객체 단위로 적용된다. 단, 정적(static) 멤버 변수는 예외적으로 클래스 단위로 적용된다.

  • 멤버 함수는 클래스 단위로 적용된다

다음 그림을 보면 이해하기 쉽습니다.


접근제한자

  • 클래스의 각 멤버는 세가지 접근 제한자인 public, protected, private 중 하나를 지정해야한다.
  • 클래스의 접근 제한자를 따로 명시하지 않으면 private으로 적용된다.

개인적인 생각으로 모든 클래스의 멤버를 private로 설정하고 필요 시 public, protected로 바꾸는 것이 좋다.




추상화

추상화란 간단하게 말해서 내부 구현과 외부 인터페이스를 명확하게 분리하는 것입니다.

  • 인터페이스란?

      인터페이스는 어떤 메소드를 노출시킬지 결정합니다.
    
      예를 들자면, 인터페이스는 '자동차 브레이크 같은 것'입니다. 
      여기서 설명하고자 하는 '자동차 브레이크 같은 것'의 특징은 크게 두 가지입니다. 
    
          1. 첫 번째는 '사용이 편리하다(사용성)'
          2. 두 번째는 '내부 구현은 숨겨져 있다(정보 은닉)'는 것입니다.
    
      인터페이스는 구현과 사용을 분리하고 기능을 추상화하여 사용하기 쉽게 만듭니다.
    

    출처: https://yozm.wishket.com/magazine/detail/727/

  • c의 Header와 c++의 Header의 차이점

    • C 언어의 해더 파일은 함수 원형, 매크로, 구조체 등의 선언을 포함
    • C++ 언어의 해더 파일은 클래스, 함수 원형, 매크로 등을 포함




다형성

  • 함수의 재정의(오버로딩)은 다형성을 적용하는데 사용한다.
  • 다형이란 말은 다양한 형태를 가진다는 의미이며. 함수의 다형은 하나의 함수가 다양한 형태를 가진다는 것이다.


함수 오버로딩 방법

함수의 오버로딩은 매개변수 리스트가 서로 다른 여러 개의 함수를 하나의 이름으로 만들면 된다.

    Ex)
    void print(const char* str, int width);
    void print(double d, int width);
    void print(long l, int width);
    void print(int i, int width);




생성자

C++는 객체를 생성시 초기값을 설정하기 위한 ‘생성자’라고 부르는 특수한 메서드를 제공합니다. 객체의 생성(선언) 시 자동으로 호출되며, 객체의 정의된 생성자 중 적합한 것이 실행됩니다.


생성자는 외부에서 접근 가능하도록 접근 제한자로 Public을 사용해야하고 반환형이 없습니다.



스택에 생성되는 객체는 선언하는 시점에 생성되고, 힙에 생성되는 객체는 공간이 할당된 시점에 생성됩니다.



댓글남기기