C++ Day1

tw·2024년 2월 25일

어셈블리어, 컴파일러, 컴파일

어셈블리어 : 0과 1로 구성되어 기계어의 각 명령어를 ADD, SUB, MOVE 등과 같이 사람이 표현하기 쉬운 상징적인 니모닉 기호로 일대일 대응 시킨언어이다.

컴파일러 : 고급 프로그래밍 언어로 작성된 프로그램은 컴파일러라고 부르는 시스템 프로그램에 의해 기계어로 변환되어 컴퓨터에서 실행된다.

컴파일 : 고급 프로그램을 기계어 프로그램으로 변환되는 과정을 컴파일 이라고 부른다.

C언어의 주요한 설계 목표

1) C언어와 호환성을 유지하낟.

2) 캡슐화, 상속, 다형성등 객체지향을 도입했다.

3) 타입 체크를 엄격히 하여 실행 시간 오류의 가능성을 줄이고 디버깅을 돕는다.

객체지향

1) 캡슐화

데이터를 캡슐로 감싸서 외부로부터의 접근을 보호한다.

객체는 클래스라는 틀에서 생겨난 실체(instance)이다.

C++ 클래스는 멤버 변수들과 멤버 함수들로 이루어진다. 멤버들은 캡슐 외부에 공개하거나(public) 보호(private)할 수 있다. private로 이루어지면 보이지 않는다.

사실상 멤버변수들은 pirvate로 선언하여 데이터를 보호하는게 더 완전한 객체지향을 추구했다고 볼 수 있다.

class Circle {
private:
int radius;
public:
Circle(int r) {radius = r; }
double getArea() { return 3.14 * radius * radius; } 
};

2) 상속성(inheritance)

객체 지향 언어에서 상속이란, 자식이 부모로부터 유산을 물려받는 개념이다.

자식이 부모의 유전자를 물려받는 것과 유사하다.

뭐 예를들면 휴대 전화기 클래스는 Phone 클래스의 기능을 물려받고, MusicPhone 클래스는 Mobile 클래스를 물려 받는다.

3) 다형성(polymorphism)

다형성은 하나의 기능이 경우에 따라 서로 다르게 보이거나 다르게 작동하는 현상을 일컫는다. 다형성의 한 예로서 더하기 연산자(+)를 보면 + 연산자는 다음과 같이 정수덧셈이나 문자열 연결(concaternation), 객체 더하기 등 피연자에 따라 서로 다른 연산이 이뤄진다.

함수중복, function overloading

void add(int a, int b) { '''}
void add(int a, int b, int c) { '''}
void add(int a, double d) {'''}

함수 재정의 function overriding

다형성은 상속관계에서도 나타난다.

예를들면 강아지, 고양이, 닭은 모두 동물 클래스의 속성을 상속받고, ‘소리내기’ 함수를 강아지, 고양이, 닭에서 모두 다르게 구현한다. 이것을 함수 재정의 혹은 함수 오버라이딩이라고 부른다.

C++ 언어와 제네릭 프로그래밍

제네릭 프로그래밍이란? 패러다임중 하나이다.

동일한 프로그램 코드에 다양한 데이터 타입을 정의할 수 있도록 함수와 클래스를 일반화시킨 제네릭 함수(generic function)와 제네릭 클래스르 만들고, 개발자가 원하는 데이터 타입을 적용시켜 프로그램 코드를 틀에서 찎어내는 듯이 생산하는 기법이다.

제네릭 클래스를 정의하고 STL 라이브러리를 찍어낸다고 생각하면 된다.

C++ 프로그램 개발 과정

프로그램 작성 → 컴파일 → 링킹 → 파일실행

1) 컴파일

소스 코드 작성이 완려 되었다면 컴파일러를 이용하여 컴파일한다.

컴파일러는 프로그램이 문법에 맞게 작성이 되었는지 검사하고 기계어 코드로 변환하여 목적 파일을 생성한다. 만약 문법이 틀렸으면 오류를 발생시킨다.

컴파일 이 끝나고나면 기계어로 변환된 모양을 보여 준다.

2) 링킹

컴파일 이후 기계어로 구성된 목적 파일(object file)이 생성된다. 목적 파일은 바로 실행될 수 없다.

std::cout << "Hello";

cout도 객체이다.

우선 위의 코드를 보면 cout와 << 연산자 함수 코드는 C++ 라이브러리에 컴파일된 형태로 존재하고 hello.obj에는 이들에 대한 참조표시만 존재한다.

그러므로 hello.obj와 cout, << 연산자 함수의 코드를 결합하는 링킹이 필요하다.

즉 링킹(linking)이란 목적 파일이 참조하는 C++ 라이브러리나 다른 목적 파일 속에 있는 함수, 객체, 데이터를 포함하여 실행에 필요한 모든 기계어 코드를 확보하여, 하나의 실행 파일로 만드는 과정이다.

C++ 표준 라이브러리

개바잘자들은 자신이 필요한 함수나 클래스를 스스로 작성하기도 하지만, 이미 만들어진 함수나 클래스를 활용하여 프로그램 개발에 걸리는 시간을 단축하고 프로그램의 확장성이나 정확성을 높인다. C++ 표준 라이브러리는 개발자들이 불러 쓸 수 있는 다양한 종류의 함수와 클래스가 컴파일된 목적 파일들이다.

목적파일은 존재하지만, 원시 소스코드는 공개x, 라리브러리는 컴파일된 목적으로 제공된다.

  • C++ 라이브러리 - 기존 c 표준 라이브러리를 수용하여 C++ 에서 사용할 수 있게 한 함수들로서 이름이 c로 시작하는 헤더 파일에 선언된다.
  • C++ 입출력 라이브러리 - 콘솔 및 파일 입출력을 위한 함수의 클래스들로서, 재네릭 프로그래밍을 지원하기 위해 템플릿으로 작성되있다.
  • C++ STL 라이브러리 - 제네릭 프로그래밍을 지원하기 위해 템플릿으로 작성된 유용한 함수와 클래스를 포함하는 라이브러리

컴파일과 빌드

hello.cpp 을 컴파일 하면 hello.obj가 생성된다.

hello.exe를 만들려면 ? build를 누르면 생성된다.

빌드 명령 실행 결과 컴파일과 링킹을 거쳐 만들어진다.

main() 함수

C언어와 마찬가지로 main() 함수는 C++ 프로그램의 실행 시작점이다. C++ 응용 프로그램에는 반드시 main 함수가 존재해야 하며, main 함수가 종료되면 프로그램이 종료된다.

main() 함수의 함수의 표준형식

int main() { //ANSI C++ 표준의 main() 리턴 타입은 int

return 0; //return이 실행되면 main() 함수가 종료하고 프로그램이 종료된다.

int main() // return 0 은 개발자의 편의를 위해 생략할 수 있지만 그렇다고 없는 것은 아니다. 
void main() {

} 

// void는 표준 타입은 아니다.

#include

전처리기에 대한 지시문이다. 컴파일하기 전에 헤더 파일을 읽어 C++ 소스 파일 안에 삽입할 것을 지시한다.

C++ 컴파일러는 처음에 전처리기를 호출하여 #include로 된 라인을 모두 처리하도록 한 후, C++ 소스 파일을 컴파일한다.

헤더 파일에는 C++ 표준 입출력을 위한 클래스와 객체가 선언되어 있으므로, 키보드 입력이나 화면 출력을 위해서는 꼭 필요하다.

std::cout << "Hello\n";
  • cout 객체
    • cout는 스크린 장치와 연결된 C++ 표준 출력 스트림 객체(standard output sream object)이다.
    • cout 앞에 std::의 접두어는 cout의 이름공간(namesapce)이 std임을 표시한다.
  • << 연산자
    • 오른쪽 피연산자 데이터를 왼쪽 스트림 객체에 삽입한다. 앞의 소스가 실행되면 Hello가 화면에 출력되고 뒤이어 ‘\n’이 출력되어 커서가 화면의 다음줄로 넘어간다.
  • 여러 개의 << 연산자로 한 문장에 여러 데이터를 출력
std::cout << "Hello" << "첫 번째 맛보기입니다.";

화면에서 다음 줄로 넘어가기

'\n' 대신 endl을 사용해도 된다.

std::cout << "Hello" << std::endl;

namespace와 std::

이 절에서 이름 공간(namespace)와, cout, endl 앞에 붙여 사용하는 std:: 접두어의 실체에 대해 알아본다. 우리 아파트 단지에 마이클이 여럿 살고 있다.

하지만 마이클은 많고 몇동에 사는 마이클인지 구분해야 한다.

10동에 사는 마이클을 찾고 싶다

10동::마이클 을 찾아야하고 여기서 10동이 namespace이다.

namespace

일상 생활뿐 아니라 C++ 프로그래밍 과정에서 이름(indentifier)이 충돌하는 경우가 있다.

  • 프로젝트를 여러 명이 나누어 개발하는 경우
  • 다른 사람이 작성한 소스 코드나 목적 파일을 가져와서 사용하는 경우

std::란 ?

std는 C++에서 정한 표준 이름 공간으로서, 모든 C++ 표준 라이브러리는 std 이름 공간에 만들어져 있다. 그러므로 응용 프로그램이 C++ 표준 라이브러리에서 선언된 이름(indentifier)을 사용할 때 std::를 접두어로 붙여야 한다.

std::의 생략과 usung 지시어

std 이름 공간에 선언된 수많은 이름에 대해 사용할 때 마다 std를 붙이는 것은 번거롭다. 그럴 떄 using 지시어를 이용하면 std를 생략가능하다

using namespace std; // std 이름 공간에 선언된 모든 이름에 std:: 생략

cout << "Hello" << endl; // cout 와 endl 앞에 std:: 생략
  • std 이름 공간에 선언된 모든 이름에 std:: 생략
  • cout 와 endl 앞에 std:: 생략

키 입력 받기

cin과 >> 연산자를 이용한 키 입력

C++ 에서는 cin과 >> 연산자를 이용하여 사용자로부터 키를 입력 받는다.

cin은 console input의 약어이다.

#include <iostream>

int main() {
    int num;

    std::cout << "Enter a number: ";
    std::cin >> num; // 사용자로부터 정수 입력 받기

    std::cout << "You entered: " << num << std::endl;

    return 0;
}
int width; //width 변수 선언
cin >> width; // 키보드로부터 정수를 입력받아 width에 저장
char c; //c 변수 선언
cin >> c; // 키보드로부터 문자를 입력받아 c에 저장

cin은 여러개의 >> 연산자를 이용하여 어러 값을 입력받을 수도 있다.

연산자들은 왼쪽부터 오른쪽으로 순서대로 키보드로부터 입력받는다.

cout << " 너비와 높이를 입력해라>>";
cin >> width >> height;
cout << width << endl << height << endl;
  • cin 객체
    • cin은 표준 입력 스트림 객체이다(standard input stream object) 이다.
    • 키보드로 입력되는 값들은 모두 cin 객체의 스트림 버퍼로 들어오며, 응용프로그램은 cin 객체로부터 입력된 키를 읽는다.
  • 연산자

    • 스트림 추출 연산자(stream extraction operator)로 불리면 왼쪽 피연산자인 스트림 객체로부터 데이터를 읽어 오른쪽 피연산자에 지정된 변수에 삽입한다.
profile
안녕하세요

0개의 댓글