OOP

[OOP] 객체(Object)

2h1824 2024. 12. 27. 21:08

TIL

컴퓨터 프로그래밍의 역사

저급 언어(Low Level)

1세대 : 초기 컴퓨터 에니악(ENIAC)

ㅡ> 거대한 크기, 수 많은 진공관들 사이의 전선 연결을 바꾸어 전기 신호 전달

2세대 : 어셈블리어

ㅡ> 컴퓨터에 직접 명령을 내리는 기계어와 매핑된 문자열, 간단한 동작만 가능. 때문에 더하기와 같은 동작도 어셈블리어로 수행하려면 일일히 어디서 불러오고 뭐랑 비교하는지 어디에 저장할지 지정해줘야 해서 복잡함.

2세대 : 초보적인 수준의 고급 언어(High Level)

은행, 금융 쪽에서 쓰이던 COBOL, 수치 계산용 FORTRAN, 쉬운 언어 BASIC

ㅡ> 고급 언어들은 어셈블리어에서는 복잡한 명령이었던 것들을 단순하게 처리 가능.

ㅡ> 하지만 아직 데이터 타입, 프로그램 문법 구조가 불완전, 데이터 타입을 모두 배열로 처리한다던가 논리 구조를 모두 goto문으로 처리하는 문제 존재. goto문을 남발하게 되면 오류가 발생해도 찾기가 힘듬.

3세대 : 절차 지향 언어(Procedural programming language) 파스칼, C

ㅡ> 파스칼에서는 함수라는 개념이 완성되었고, 변수의 타입이 정립되어 배열을 남발하지 않아도 되었음.

*절차 지향 : Procedure(함수)를 지향하여, 프로그램 설계 시 중요한 부분을 하나의 프로시져(함수)로 만들어 쪼개어 처리.

프로그램의 크기가 너무 거대해 지면서 새로운 언어의 필요성 부각 ㅡ> 객체 지향 언어(Object oriented language) 등장

ex) C++, Java, Python, C# 등

*C++은 템플릿을 이용해 Generic한 프로그램 작성 가능, 모던 C++에서는 함수형 프로그래밍 가능, 기존 C스타일 절차 지향 프로그래밍 가능. ㅡ> C++은 멀티 패러다임(Multi Paradigm) 언어!

객체란?

객체 : 변수들과 참고 자료들로 이루어진 소프트웨어 덩어리.

typedef struct Animal {
  char name[30];  // 이름
  int age;        // 나이

  int health;  // 체력
  int food;    // 배부른 정도
  int clean;   // 깨끗한 정도
} Animal;

play(animal);

 

위와 같은 구조체가 있을 때, 해당 구조체 내부의 정보를 이용해 뭔가를 하려면 함수에 해당 구조체를 인자로 전달해야함.

이때, 객체(class)를 이용해 아래와 같이 코드를 쓸 수 있게 되면,

Animal animal;
animal.play();
animal.sleep();

이미 함수를 수행하는 주체가 animal이기 때문에 animal을 인자로 함수에 전달해 줄 필요가 없어집니다.

추상화(abstraction)

객체의 중요한 속성만 표현하고, 복잡한 내부 구현은 숨김으로써 추상화하여 직관적으로 알 수 있도록 구현.

캡슐화(Encapsulation)

접근 제어자(private, protected, public)을 이용해 객체의 외부에서 내부 데이터를 직접 수정하지는 못하도록 막고, 내부 데이터를 수정하고자 한다면 객체에 정의되어 있는 함수를 이용하여 접근해 간접적으로 수정하도록 설계.

*객체의 변수나 함수를 인스턴스 변수(Instance Variable), 인스턴스 메소드(Instance Method)라고 표현.

ㅡ> 캡슐화를 통해 객체 내부 데이터를 보호함과 동시에 객체의 내부 동작을 이해하지 못해도 사용할 수 있게 됩니다.

클래스

클래스(Class) : C++에서 객체를 만들 수 있는 장치 또는 설계도.

클래스를 이용해 만들어진 객체 ㅡ> 인스턴스(Instance)

class Animal {
 private:
  int food;
  int weight;

 public:
  void set_animal(int _food, int _weight) {
    food = _food;
    weight = _weight;
  }
  void increase_food(int inc) {
    food += inc;
    weight += (inc / 3);
  }
  void view_stat() {
    std::cout << "이 동물의 food   : " << food << std::endl;
    std::cout << "이 동물의 weight : " << weight << std::endl;
  }
};

위 코드는 Animal이라는 클래스의 설계도를 만든 것입니다. 이때, private에는 객체 내부를 제외한 곳에서는 직접적으로 접근할 수 없도록 멤버 변수들을 정의해 두고 public에서는 멤버 변수에 접근하여 수정이 가능한 멤버 함수들을 구현해 놓은 것을 확인 할 수 있습니다. 

여기서 유의할 점은 위 코드는 설계도일 뿐이라서 인스턴스가 생성되면 그때 비로소 실제로 존재하게 됩니다.

*접근 지시자에는 private, protected, public이 있음.

ㅡ> private : 객체 내에서 보호하는 것, 객체 내부에서만 접근 가능.

ㅡ> public : 공개된 것, 외부에서 마음껏 접근 가능.

ㅡ> protected : 자신의 클래스와 이를 상속받은 클래스에서 접근 가능. (상속 관련 개념은 이후 설명)

 

참고자료

https://modoocode.com/172

 

씹어먹는 C++ - <4 - 1. 이 세상은 객체로 이루어져 있다>

모두의 코드 씹어먹는 C++ - <4 - 1. 이 세상은 객체로 이루어져 있다> 작성일 : 2012-02-29 이 글은 84509 번 읽혔습니다. 이번 강좌에서는 객체 지향 프로그래밍의 도래객체란 무엇인가, 클래스란 무엇

modoocode.com