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

객체?

아무리 생각해도 우리나라 번역가들의 어려운 말 사랑은 이해가 안된다. 굳이 쓴 단어가 객체라니...

우리 주위의 있는 모든 것(가구, 태양, 모니터, 컴퓨터, 프린터, 연필 등등...)을 보통 사물이라 부른다. 그러니까, 객체보단 사물이 어울리는 말이다. 사물지향 프로그래밍.

이제 다시 말을 뜯어보자. 사물을 지향한다? 이건 구조적 프로그래밍을 해봤다면 이해가 빠르다.

구조적 프로그래밍은 기능 위주였다. 예를들어 바람이 부는것, 볕이 내리 쬐는것, 걷는것, 쉬는것, 이런식이다.

그럼 사물을 지향하는건? 공기를 구현하고, 태양을 구현하고, 사람을 구현하는거다. 심지어 각각 특성이나 속성도 그 사물 내부에 넣어서 쓴다. 예를들어 사람은 키나 몸무게 등등.

그래서 생기는 장점들

  • 특성이나 속성을 같이 붙여두니, 재사용 기회가 증가하고 확장하기도 편하다.
  • 어떤 기능을 하나하나 고치는것이 아닌, 사물 단위로 고치니 수정해야 하는 기능들이 하나에 들어가 있으므로 유지보수가 편하다.

객체, 클래스와 인스턴스

개념을 이해했다면 다시 객체라는 용어를 써보자.

클래스는 객체의 속성을 정의하는 설계도다. 예를 들어 태양의 설계도는 항성쯤 되는거 같다.
그럼 태양은 무엇인가? 인스턴스다. 클래스로부터 만들어지고 고유하며 실질적으로 메모리에 올라가서 연산되는것.

별을 기준으로 만들어 본 클래스 다이어그램

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

1.추상화

  • 복잡한 정보속에서 추상적으로 정보를 뽑아내 저장하는걸 말한다.
  • 예를 들어 너무 많은 정보를 가진 인물에게서 안경을 썼는지, 직업이 무엇인지를 뽑아내는것과 같다.

2.캡슐화

  • 내부에서 일어나는것 끼리 결합해서 외부 접근을 막는걸 말한다.

3.상속성

  • 하위 클래스가 상위 클래스가 가진걸(자료나 연산) 그대로 내려받는걸 말한다.
  • 예를 들어 항성은 별의 하위 클래스이며 별이 가진 특징들을 포함한다.

4.다형성

  • 오버로딩이나 오버라이딩이 여기에 속한다.
  • 단순하게, 이름 하나로 여러개의 연산을 처리 할 수 있도록 하는 방법이다.
#include <iostream>
class Man {
    public: //클래스 외부에서 접근 가능
        int getAge(){ //출력
            return age;
        }
        void setAge(int newAge){ //저장
            age = newAge;
        }
        double getWeight(){ //출력
            return Weight;
        }
        void setWeight(int newWeight){ //저장
            weight = newWeight;
        }
    private: //클래스 내부에서만 접근 가능
        int age; //멤버
        int height;
};

int main(void){
    Man chan;
    chan.setAge(10);
    // chan.height = 160; //불가능
    std::cout << chan.getAge() <<" Hello World!\n"; // 10 Hello World!
    return 0;
}
클래스를 구현해본 코드
위 코드의 클래스 다이어그램

private와 public(접근권한)

위 코드에선 private와 public을 이용한다. 그게 뭘까?

  • private : 비밀스럽게도, 클래스 내부에서만 접근이 가능하다. 즉 외부에서는 읽고 쓰기 전부 불가능하다.
  • public : 공개적으로, 모두가 읽고 쓴다.
  • protected : private처럼 외부 접근을 막지만 자식이라면 접근 가능
Keyword C# C++ Java Swift
private class class
and/or
friend classes
class enclosing declaration only
+ extensions of declaration in same file
fileprivate - - - same file
file same file - - -
private protected derived classes in the same assembly - - -
protected internal same assembly
and/or
derived classes
- - -
protected derived classes derived classes
and/or
friend classes
derived classes
and/or
within same package
-
package - - within its package -
internal same assembly - - same module
public everybody everybody everybody everybody
open - - - everybody
+ subclass outside module
+ override outside module

private

  • 자료를 은폐하여 보호함(캡슐화)
  • C++에서 생략 가능
  • 해당 클래스의 맴버들만 접근 가능

public

  • 외부에서 접근 가능
  • 생략 불가능
  • 주로 멤버 함수를 public으로 선언해서 private변수에 접근

알면 좋은것들

  • 멤버 함수가 클래스 내부에서 정의되면 자동적으로 inline함수가 된다.
    그걸 피하기 위해서는 클래스 안에 선언 후, 외부에 정의하면 된다.
class Dog{
private:
    int age;
public:
    int getAge();
    void setAge(int a);
};
int Dog::getAge(){
    return age;
}
void Dog::setAge(int a){
    age=a;
}
외부에서 정의한 메소드함수

객체의 멤버 호출

  • 직접참조연산자 : . 을 쓰며, 일반 객체가 멤버에게 접근할때 사용
  • 간접참조연산자 : -> 을 쓰며, 포인터 객체가 멤버에게 접근할때 사용

객체의 활용

배열

  • 배열 사용하듯이 선언하면 된다.

포인터

  • 클래스명 *포인터변수이름 으로 사용한다.
  • 멤버에는 ->으로 접근 해야한다