[C++] C++ 시작하기 - 특징, 객체 지향, 컴파일과 링킹



1. C++ 언어의 특징

1-1. C++ 언어의 주요 설계 목표

  • C언어와의 호환성 : 기존에 작성된 C 프로그램을 그대로 사용할 수 있도록 C언어의 문법적 체계를 그대로 계승함
  • 객체 지향 : 소프트웨어의 재사용을 통해 소프트웨어 생산성을 높이기 위해 객체 지향 개념을 도입함
  • 타입 체크 : 타입 체크를 엄격히 하여 실행 시간 오류의 가능성을 줄이고 디버깅을 도움
  • 효율성 저하 최소화 : 멤버 함수에 인라인 함수를 도입하는 등 함수 호출로 인한 시간 저하를 막음

1-2. C 언어에 추가한 기능

  • 함수 중복 (function overloading) : 매개 변수의 개수나 타입이 다른 동일한 이름의 함수들을 선언할 수 있게 함
  • 디폴트 매개 변수 (default parameter) : 매개 변수에 값이 전달되지 않는 경우 디폴트 값이 전달되도록 함수를 선언할 수 있게 함
  • 참조 (reference) : 변수에 별명을 붙여 변수 공간을 같이 사용할 수 있는 참조의 개념을 도입함
  • 참조에 의한 호출 (call by reference) : 함수 호출 시 참조를 전달할 수 있게 함
  • newdelete 연산자 : 동적 메모리 할당/해제를 위한 new, delete 연산자를 도입함
  • 연산자 재정의 (operator overloading) : 기존의 연산자에 새로운 연산을 정의함
  • 제네릭 함수와 클래스 (generics) : 함수나 클래스를 데이터 타입에 의존하지 않고 일반화시킬 수 있게 함



2. C++의 객체 지향 특성

C++는 객체 지향 개념을 도입하여 이미 만들어진 C++ 클래스를 상속받거나, 재사용하거나, 부분 수정을 통해 소프트웨어의 생산성 을 높였다. 또한 물체들의 상호 작용으로 모델링을 하여 실세계에 적합한 프로그래밍 을 할 수 있도록 하였다.

2-1. 객체와 캡슐화(EnCapsulation)

캡슐화는 데이터를 캡슐로 싸서 외부의 접근으로부터 데이터를 보호하는 객체 지향 특성이다. 클래스 는 캡슐의 역할을 하며 class 키워드를 통해 작성한다. 객체 는 클래스라는 틀에서 생겨난 Instance (실체) 이다.

class Circle {                                       //클래스
private:                                             //접근 제어자
  int radius;                                        //멤버 변수
public:                                              //접근 제어자
  Circle(int r) { radius = r; }                      //생성자
  double getArea() { return 3.14*radius*radius; }    //멤버 함수
};

2-2. 상속성(Inheritance)

상속이란 자식 클래스가 부모 클래스의 속성을 물려받는 것이다. 객체를 정의하는 클래스 사이에 상속 관계를 두면, 자식 클래스의 객체가 생성될 때 자식 클래스에 선언된 멤버 뿐만 아니라 부모 클래스에 선언된 멤버들 도 함께 가지고 생성된다.

class Phone{
  void call();
  void receive();
};
class MobilePhone : public Phone{           //Phone을 상속받음
  void connectWireless();
};
class MusicPhone : public MobilePhone{       //MobilePhone을 상속받음
  void playMusic();
};

2-3. 다형성(Polymorphism)

다형성이란 어떠한 기능이 경우에 따라 서로 다르게 동작 하는 현상이다.

  • 연산자 중복 (Operator Overloading) : 같은 연산자라도 피연산자에 따라 서로 다른 연산이 이루어짐
    • 2 + 3 = 5
    • “여자” + “남자” = “여자남자”
    • red 객체 + blue 객체 = purple 객체
  • 함수 중복 (Function Overriding) : 부모 클래스에서 구현된 어떠한 함수를 자식 클래스에서 서로 다르게 구현함
    void add(int a, int b) { ... }
    void add(int a, int b, int c) { ... }
    void add(int a, double b) { ... }
    void add(double a, double b) { ... }
    



3. 절차 지향 프로그래밍 VS 객체 지향 프로그래밍

3-1. 절차 지향 프로그래밍(Procedural Programming)

절차 지향 프로그래밍이란 실행하고자 하는 절차대로 일련의 명령어를 나열하여 프로그래밍하는 방법이다. 작업을 절차로 표현하여 명령들의 순서나 흐름 에 중점을 둔다. 절차 지향 프로그래밍흐름도 를 설계하여 흐름도상의 동작들을 함수로 작성 후 흐름도에 따라 동작이 실행되도록 작성한다.

3-2. 객체 지향 프로그래밍

객체 지향 프로그래밍은 물체 간의 관계, 상호 작용 등으로 복잡하게 구성된 실세계에 가깝게 프로그래밍을 모델링한다. 실제 세계의 물체를 객체 로 표현하고, 객체들의 관계상호 작용객체 지향 기법으로 구현한다.



4. 컴파일과 링킹

4-1. 컴파일(Compile)

C++ 컴파일러를 이용하여 소스 프로그램을 컴파일하면 C++ 컴파일러는 프로그램이 문법에 맞게 작성되었는지 검사 후, 기계어 코드로 변환하여 목적 파일(Object File) 을 생성한다. 목적 파일 이 생성되었다고 해도 이 파일은 바로 실행될 수 없다. 목적 파일 에는 C++ 프로그램에 있는 함수, 객체, 데이터 등의 참조 표시만 있을 뿐 코드를 포함하지 않는다. 따라서 이들과 결합되기 위해 링킹과정을 거친다.

4-2. 링킹(Linking)

링킹이란 어떤 목적 파일이 참조하는 C++ 표준 라이브러리나 다른 목적 파일 속에 있는 함수, 객체, 데이터를 포함하여 실행에 필요한 기계어 코드를 확보해 하나의 실행파일(.exe)로 만드는 과정 이다. 실행 파일 에는 실행에 필요한 모든 요소들이 들어있다. 만약 링킹 과정 동안 목적 파일 에서 참조하는 코드를 발견하지 못하면 링크 오류가 발생한다.

:bulb: JAVA의 경우 컴파일 후 클래스 파일(.class) 이 생성되며, 이들을 하나로 뭉쳐 실행파일로 만드는 링킹 과정이 없다.



:bookmark: REFERENCE
명품 C++ Programming [개정판], 황기태