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 : 자신의 클래스와 이를 상속받은 클래스에서 접근 가능. (상속 관련 개념은 이후 설명)
참고자료
씹어먹는 C++ - <4 - 1. 이 세상은 객체로 이루어져 있다>
모두의 코드 씹어먹는 C++ - <4 - 1. 이 세상은 객체로 이루어져 있다> 작성일 : 2012-02-29 이 글은 84509 번 읽혔습니다. 이번 강좌에서는 객체 지향 프로그래밍의 도래객체란 무엇인가, 클래스란 무엇
modoocode.com
'OOP' 카테고리의 다른 글
[OOP] 객체 지향 설계 5원칙(SOLID) : ISP(Interface Segregation Principle)-인터페이스 분리 원칙 (1) | 2025.01.10 |
---|---|
[OOP] 객체 지향 설계 5원칙(SOLID) : LSP(Liskov Substitution Principle)-리스코프 치환 원칙 (0) | 2025.01.09 |
[OOP] 객체 지향 설계 5원칙(SOLID) : OCP(Open Closed Principle)-개방, 폐쇄 원칙 (0) | 2025.01.08 |
[OOP] 객체 지향 설계 5원칙(SOLID) : SRP(Single Responsibility Principle)-단일 책임 원칙 (0) | 2025.01.06 |
[OOP] 객체 지향 설계 5원칙 : SOLID (1) | 2025.01.03 |