[C++] 객체 지향 프로그래밍

limce·2024년 1월 21일
0

C++

목록 보기
1/5
post-thumbnail

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

  • 컴퓨터 프로그램을 어떤 데이터를 입력받아 순서대로 처리하고 결과를 도출하는 명령어들의 목록으로 보는 시각에서 벗어나
    여러 독립적인 부품들의 조합, 즉 객체들의 유기적인 협력과 결합으로 파악하고자 하는 컴퓨터 프로그래밍의 패러다임
  • 객체를 먼저 만들고 이렇게 만들어진 여러 객체들을 조립해서 하나의 완성된 프로그램을 만드는 프로그래밍 방법론

장점

1) 프로그램을 보다 유연하고 변경이 용이하게 만들 수 있다.
2) 코드의 변경을 최소화하고 유지보수를 하는 데 유리하다.
3) 코드의 재사용을 통해 반복적인 코드를 최소화하고, 코드를 최대한 간결하게 표현할 수 있다.
4) 인간 친화적이고 직관적인 코드를 작성하기에 용이하다.

특징

1) 추상화

  • 가장 본질적이고 공통적인 부분만을 추출하여 표현
  • 객체의 공통적인 속성과 기능을 추출하여 정의하는 것

  • 예를 들어, 자동차와 오토바이는 모두 이동 수단이고, 전진과 후진을 할 수 있다는 공통점이 있다.
    자동차와 오토바이라는 하위 클래스들공통적인 기능(전진과 후진)을 추출하여 이동 수단이라는 상위 클래스에 정의했다.

  • 추상화를 구현할 수 있는 문법 요소로는
    추상 클래스(abstract class)인터페이스(interface)가 있다.

추상 클래스

  • 순수 가상 함수를 멤버 함수로 갖는 클래스
  • 순수 가상함수란?
    • 함수 헤더만 존재하고 함수의 몸체는 없는 함수
    • virtual 반환형 함수이름(매개변수 리스트) = 0;
      예) virtual void draw() = 0;
  • 객체 생성 불가. 단, 객체 포인터와 참조변수는 선언 가능(up-casting 가능)
  • 추상 클래스의 파생 클래스는,
    • 순수 가상 함수를 재정의 해야 일반 클래스로 정의된다. 재정의 하지 않으면 추상 클래스로 정의된다.
// 추상 클래스
class Shape { 
protected: int x, y; 
public:
    void setOrigin(int x, int y){ 
        this->x = x;
        this->y = y;
    }
    virtual void draw() = 0;
};
// 파생 클래스
class Rectangle : public Shape {
private: 
    int width, height;
public: 
    void setWidth(int w) {width = w;}
    void setHeight(int h) {height = h;}
    void draw() {cout << "Rectangle Draw" << endl;} // 재정의
};
int main(){
    Shape *ps = new Rectangle();
    // Shape s; 선언 시 에러!
    ps->draw(); delete ps; 
}

인터페이스

  • 순수 가상 함수만 갖고 멤버 변수나 구체적으로 구현된 함수 가지지 않는다.
    즉, 인터페이스에는 가상 소멸자와 순수 가상함수만 포함하면 된다.
#define interface struct

interface IPlay 
{
    virtual void Play()=0;
};

class Man:public IPlay
{
    string name;
public:
    Man(string name)
    {
        this->name = name;
    }

    virtual void Play()
    {
        cout<<name<<" 연주하다."<<endl;
    }    
}; 

void Concert(IPlay *iplay)
{
    iplay->Play();
}

int main()
{
    Man *man = new Man("홍길동");
    Concert(man);
    delete man;
    return 0;
}

2) 상속

  • 기존의 클래스를 재활용하여 새로운 클래스를 작성하는 것
  • 상위 클래스로부터 확장된 여러 개의 하위 클래스들이 모두 상위 클래스의 속성과 기능들을 간편하게 사용할 수 있도록 한다.
  • 반복적인 코드를 최소화하고 공유하는 속성과 기능에 간편하게 접근하여 사용할 수 있도록 한다.
// 부모 클래스
class Car {
public: 
    int speed; int gear; string color;
    void setGear(int newGear) { gear = newGear;}
    void speedUp(int increment) { speed += increment;} 
    void speedDown(int decrement) {speed -= decrement;}
};
// 자식 클래스
class SportsCar : public Car {
    bool turbo;
public: 
    void setTurbo(bool newValue) {turbo = newValue;} 
};

int main() { 
    SportsCar c; 
    c.color = "Red"; 
    c.setGear(3); 
    c.speedUp(100); 
    c.speedDown(30); 
    c.setTurbo(true);
}

3) 다형성

  • 어떤 객체의 속성이나 기능이 그 맥락에 따라 다른 역할을 수행할 수 있는 특성
  • 한 타입의 참조변수를 통해 여러 타입의 객체를 참조할 수 있도록 만든 것을 의미한다. 좀 더 구체적으로, 상위 클래스 타입의 참조변수로 하위 클래스의 객체를 참조할 수 있도록 하는 것이다.
    대표적인 예: 메서드 오버라이딩, 메서드 오버로딩

4) 메서드 오버라이딩(Overriding)

  • 부모클래스의 메소드와 같은 이름을 사용하며 매개변수도 같되 내부 소스를 재정의하는 것
    같은 이름의 메서드가 상황에 따라 다른 역할을 수행하는 것
// 부모 클래스
class Mammal {
    virtual void move() = 0; 
    virtual void eat() = 0; 
    virtual void speak() = 0;
};
// 자식 클래스
class Lion : public Mammal {
    void move() {cout << "사자의 move() << endl;} 
    void eat() {cout << "사자의 eat() << endl;}
    void speak() {cout << "사자의 speak() << endl;}
};

메서드 오버로딩(Overloading)

  • 같은 이름의 함수를 여러 개 정의한 후 매개변수를 다르게 하여 같은 이름을 경우에 따라 호출하는 것
public class Rectangle {
    Rectangle(int width, int height) { this(0, 0, width, height);} 
    Rectangle(int x, int y, int width, int height) {
    this.x = x;
    this.y = y; 
    this.width = width; 
    this.height = height;}
}

캡슐화

  • 클래스 안에 서로 연관있는 속성과 기능들을 하나의 캡슐(capsule)로 만들어 데이터를 외부로부터 보호하는 것

캡슐화의 목적

  • 데이터 보호: 외부로부터 클래스에 정의된 속성과 기능들을 보호
  • 데이터 은닉: 내부의 동작을 감추고 외부에는 필요한 부분만 노출
  • 외부로부터 클래스에 정의된 속성과 기능들을 보호하고, 필요한부분만 외부로 노출될 수 있도록 하여 각 객체 고유의 독립성과 책임 영역을 안전하게 지키고자 한다.

캡슐화 구현 방법

1) 접근제어자

  • 접근제어자는 클래스 또는 클래스의 내부의 멤버들에 사용되어 해당 클래스나 멤버들을 외부에서 접근하지 못하도록 접근을 제한, 데이터를 보호하는 역할
  • 총 4가지 종류의 접근 제어자: public, default, protected, private
    (오른쪽으로 갈수록 더 좁은 접근 범위)

2) getter/setter

  • public의 getter/setter 메서드로 private으로 선언된 속성값의 외부 접근을 선택적으로 허용할 수 있다.

참고
https://www.codestates.com/blog/content/객체-지향-프로그래밍-특징
https://csj000714.tistory.com/408
https://ehclub.co.kr/2136
Power C++

0개의 댓글