정신과 시간의 방

전체 글 273

카테고리 설명
게임 프로그래머가 되기 위한 청춘의 기록
  • 1.1  컴퓨터와 프로그래밍- 컴퓨터의 두뇌인 CPU는 이진수인 0과 1 밖에 이해하지 못함. 이를 기계어라고 한다.- 사람이 이해하고 표현하기 쉬우며 복잡한 알고리즘이나 다양한 프로그램 구조 및 자료를 효율적으로 표현하기 위해 고급언어가 생겨남.- 고급 프로그램을 기계어 프로그램으로 변환하는 과정을 컴파일이라고 함.  1.2 C++ 언어의 역사- C언어로 규모가 큰 소프트웨어를 개발할 때 프로그램 코드 관리에 어려움을 겪는 것과 기술 발전으로 컴퓨터의 속도가 빨라지며 소프트웨어의 크기가 커지는 문제, 기존의 절차 지향 프로그래밍으로는 하나의 흐름도에 의해 진행되지 않는 게임과 같은 프로그램을 개발하기 어려운 문제를 개선하기 위해 C++이 탄생함.- C++은 C언어에 객체 지향 특성 및 기능을 추가한 새..

작성일
2022. 7. 13. 23:46
작성자
risehyun

1.1  컴퓨터와 프로그래밍

< 프로그래밍과 프로그래밍 언어 >

- 컴퓨터의 두뇌인 CPU는 이진수인 0과 1 밖에 이해하지 못함. 이를 기계어라고 한다.
- 사람이 이해하고 표현하기 쉬우며 복잡한 알고리즘이나 다양한 프로그램 구조 및 자료를 효율적으로 표현하기 위해 고급언어가 생겨남.
- 고급 프로그램을 기계어 프로그램으로 변환하는 과정을 컴파일이라고 함.

 

 

1.2 C++ 언어의 역사
< 프로그래밍 언어의 진화와 C++ 언어>
- C언어로 규모가 큰 소프트웨어를 개발할 때 프로그램 코드 관리에 어려움을 겪는 것과 기술 발전으로 컴퓨터의 속도가 빨라지며 소프트웨어의 크기가 커지는 문제, 기존의 절차 지향 프로그래밍으로는 하나의 흐름도에 의해 진행되지 않는 게임과 같은 프로그램을 개발하기 어려운 문제를 개선하기 위해 C++이 탄생함.
- C++은 C언어에 객체 지향 특성 및 기능을 추가한 새로운 언어.

 

 

1.3 C++ 언어의 특징
< C++ 언어의 주요한 설계 목표 >
- 호환성 : 기존에 C로 작성된 프로그램과 C로 작성 + 컴파일된 목적 파일(Object file)이나 라이브러리를 C++ 프로그램에서 링크하여 사용할 수 있음.
- 객체 지향 개념 : 소프트웨어 재사용을 통해 생산성을 높이고 유지 보수와 작성 및 관리를 쉽게 만들도록 캡슐화, 상속, 다형성 등의 객체 지향 개념을 도입함.
- 타입 체크 엄격 : 실행 시간 오류의 가능성을 줄이고 디버깅을 돕기 위함.
- 효율성 저화 최소화 : 객체 지향 개념의 도입으로 멤버함수의 호출이 잦아지면서 발생하는 실행시간 저하의 비효율성을 막기 위해 인라인 함수를 도입하는 등 함수 호출로 인한 시간 저하를 막음.


< 기존 C언어에서 C++로 발전되면서 추가된 기능 >
- 함수 중복 : 매개 변수의 개수나 타입이 서로 다른 동일한 이름의 함수를 선언할 수 있게 함.
- 디폴트 매개 변수 : 매개변수에 값이 전달되지 않는 경우 디폴트 값이 전달 되도록 함수를 선언할 수 있게 함.
- 참조와 참조 변수 : 변수에 별명을 붙여 변수 공간을 같이 사용할 수 있는 참조 개념을 도입함.
- 참조에 의한 호출 : 함수 호출시 참조를 전달할 수 있게 함.
- new와 delete 연산자 : 동적 메모리 할당, 해제를 위한 new, delete 연산자를 도입함.
- 연산자 재정의 : 기존의 연산자에 새 연산을 정의할 수 있게 함.
- 제네릭 함수와 클래스 : 함수나 클래스를 데이터 타입에 의존하지 않고 일반화 시킬 수 있게 함.

 

< C++의 객체 지향 특성 >
- 객체와 캡슐화 (Encapsulation)
캡슐화란, 데이터를 캡슐로 싸서 외부의 접근으로부터 데이터를 보호하는 것을 포함.
클래스는 C++에서 캡슐의 역할을 하며 객체를 정의하는 틀임.
객체는 클래스라는 틀에서 생겨난 실체(Instance)로 접근 지정자를 이용해 내부 데이터에 대한 접근을 제한할 수 있음.

- 상속성 (Inheritance)
객체를 정의하는 클래스 사이에 상속 관계를 두어, 자식 클래스의 객체가 생성될 때 자식 클래스에 선언된 멤버 뿐만 아니라 부모 클래스에 선언된 멤버들도 함께 가지고 탄생하는 것.

- 다형성 (Polymorphism)
하나의 기능이 경우에 따라 서로 다르게 보이거나 다르게 작동하는 현상으로 연산자 중복, 함수 중복, 함수 재정의(함수 오버라이딩)이 다형성의 예시이다.


< 절차 지향 프로그래밍과 객체 지향 프로그래밍 >
- 절차 지향 프로그래밍
C언어 등을 이용해 실행하고자 하는 절차대로 일련의 명령어를 나열해 프로그래밍하는 것을 절차 지향 프로그래밍(procedural programming)이라고 하며 이것을 위해 사용되는 언어를 절차 지향 언어라고 함.
절차 지향 프로그래밍은 작업을 절차로 표현하며, 명령들의 순서나 흐름에 중점을 둠.
그러나 실제 물체 간의 관계와 상호작용은 단순한 흐름으로 구현하는데 한계가 있음.

- 객체 지향 프로그래밍
절차 지향 프로그래밍의 단점을 극복하기 위해 실제 세상의 물체를 모델링하여 객체로 표현함.
각 객체들의 상호작용을 멤버 함수와 멤버 변수로 구분함.


< C++ 언어와 제네릭 프로그래밍 >
- 제네릭 프로그래밍이란 개발자가 원하는 데이터 타입을 적용시켜 프로그램 코드를 틀에서 찍어내듯이 생산하는 기법을 의미함.
동일한 프로그램 코드에 다양한 데이터 타입을 적용할 수 있도록 함수와 클래스를 일반화시킨 제네릭 함수와 제네릭 클래스가 이것에 해당됨.

- C++에서는 입출력 라이브러리를 템플릿으로 선언하여 제네릭화하였고, 개발에 필요한 대부분의 자료구조를 제네릭 함수와 제네릭 클래스로 구현한 STL을 표준화하였음.


< C++ 언어의 아킬레스 >
C++은 C 코드와의 호환성을 중요 목표로 설계되었기 때문에 기존 C 코드를 재활용 할 수 있지만, 이것 때문에 객체 지향의 핵심 개념인 캡슐화의 원칙이 다소 무너졌음.
캡슐화의 기본 원칙은 코드와 데이터를 외부의 접근으로부터 보호하기 위해 변수와 함수를 캡슐(클래스) 안에 선언하도록 하는 강력한 원칙인데, C++에서는 C언어의 특성을 계승했기 때문에 클래스라는 캡슐 바깥에 함수나 전역 변수를 만들 수 있게 허용해버림. 따라서 기존 C 프로그래밍에 있던 전역 변수의 사용에 따른 부작용이 여전히 존재하게 됨.

 


1.4 C++ 프로그램 개발 과정
C++로 프로그램을 개발하는 과정은 C++ 소스 프로그램 작성, 컴파일, 링킹을 통해 하나의 실행 파일(exe)을 만드는 과정으로 세분화 됨.
일단 실행 파일이 생성되면 실행 파일은 독립적으로 실행 가능하므로, 실행되는 동안 소스 파일이나 목적 파일이 필요 없음.

- 컴파일(compile)
C++ 소스 프로그램은 C++ 컴파일러를 이용하여 컴파일하여 만약 소스코드가 문법에 맞지 않은 경우 컴파일 오류를 발생시킴.
C++ 컴파일러는 소스 프로그램이 문법에 맞게 작성되었는지 검사한 뒤 이를 기계어 코드로 변환해 목적 파일을 생성하고 다음 과정인 링킹으로 넘어감.

 

- 링킹(linking)

목적 파일이 필요로 하는 함수나 객체를 다른 목적 파일이나 라이브러리에서 찾고 결합해 실행 파일을 만드는 과정을 의미함.
링킹의 결과 비로소 실행에 필요한 모든 요소를 포함한 하나의 실행 파일이 만들어짐.
만약 링킹 과정 동안 목적 파일에서 참조하는 코드를 다른 목적 파일이나 C++ 표준 라이브러리 속에서 발견할 수 없다면 링크 오류가 발생함.