C++ - C++ 언어의 특징

rizz·2024년 1월 18일
0

C

목록 보기
24/25

📒 C++ 언어의 특징

📌 C++ 언어의 주요 설계 목표

  • C언어와의 호환성(Compatibility) : 기존에 작성된 C 프로그램을 그대로 사용할 수 있도록 C언어의 문법적 체계를 그대로 계승하였다. 또한, C 언어로 작성되어 컴파일된 목적 파일(object file)이나 라이브러리를 C++ 프로그램에서 링크하여 사용할 수 있도록 하였다.
  • 객체 지향 : 소프트웨어의 재사용을 통해 생산성을 높일 수 있도록 객체 지향 개념을 도입하였다.
  • 타입 체크 : 타입 체크를 엄격히 하여 실행 시간 오류의 가능성을 줄이고 디버깅을 돕는다.
  • 효율성 저하 최소화 : 멤버 함수에 인라인 함수를 도입하는 등 함수 호출로 인한 시간 저하를 막는다.


📌 C 언어에 추가한 기능

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


📌 C++의 특성

  • 흔히 말하는 객체 지향 언어의 특징들을 갖고 있다. 그러나 객체 지향 언어와 다르게 클래스나 객체를 생성하지 않고도 컴파일될 수 있다.
  • 프로그래밍 모델 : 절차 지향 프로그래밍과 객체 지향 프로그래밍 모두를 지원한다.
  • 플랫폼 종속성 : C++은 플랫폼에 종속적이다.
  • 주요 특징 : 연산자 오버로딩, Goto Statement, 구조체, 포인터, 유니온 등을 지원한다.
  • 컴파일과 인터프리션 : 컴파일만 가능, 인터프리트는 불가
  • 라이브러리, 코드 재사용성 : C++은 제한적인 라이브러리와 저 레벨 함수 기능들을 가진다. 또한 기본적인 시스템 라이브러리에 대한 직접 호출을 허용한다.
  • 메모리 관리 : C++은 메모리 관리를 수동으로 하게 된다.
  • 전역 범위 : C++은 전역, 네임스페이스 범위를 지원한다.
  • 접근 관리와 객체 보호 : 지속해서 보호되는 유연한 모델이 가능하다.


📌 C++의 주요 기능

  • 동적 및 정적 메모리 할당 : C++에서는 동적, 정적 할당이 모두 가능하다. 이는 사용자가 컴파일 시간과 실행 시간에 변수 객체 등에 메모리를 할당할 수 있게 한다.
  • 템플릿 생성 : 제네릭을 이용하여 제네릭 함수, 클래스 등을 만들고, 이는 여러 가지 데이터 타입에 대해 특정 기능을 지원하게 할 수 있다.
  • 연산자 오버로딩 : 사용자로 하여금 특정 연산자들이 원래 사용되던 기능이 아닌 문맥과 상황에 맞게 변형되어 사용할 수 있다.


📌 C++의 객체 지향 특성

1) 추상화(Abstration)

  • 추상화란 공통성과 본질을 모아 추출한 것을 의미한다.
  • 인터페이스를 통해 구현할 객체들의 공통적인 특성을 정의하고(추상화), 이것을 상속받아 객체들을 구현하는 방식의 패턴으로 자주 쓰이는데, 이것을 '역할과 구현의 분리'라고 한다.
  • 추상화를 잘 이용하여 설계한다면 객체 간의 결합도를 낮출 수 있어, 교체가 용이하고 확장성이 좋아진다.

2) 상속(Inheritance)

  • 상속이란 자식 클래스가 부모 클래스의 속성을 물려받는 것을 의미한다.
  • 객체를 정의하는 클래스 사이에 상속 관계를 두어, 자식 클래스의 객체가 생성될 때 자식 클래스에 선언된 멤버뿐 아니라 부모 클래스에 선언된 멤버들도 함께 가지고 생성된다.
  • 상속은 코드의 재사용성을 높여, 소프트웨어 생산성을 높인다.

3) 다형성(Polymorphism)

  • 다형성이란 어떠한 기능이 상황과 맥락에 따라 다르게 동작하는 것을 의미한다.
  • 예를 들어, + 연산자는 숫자끼리의 연산은 덧셈으로, 문자열끼리의 연산은 문자열 연결 연산으로 동작하는데, 이를 연산자 오버로딩(operator overloading)이라 부른다.
  • 다형성은 코드를 유연하게 작성할 수 있도록 해준다.

4) 캡슐화(Encapsulation)

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

절차 지향 프로그래밍(Procedural Programming)

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

객체 지향 프로그래밍(Object-Oriented Programming)

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


📌 컴파일과 링킹

컴파일(Compile)

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

링킹(Linking)

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

전체적인 C++ 컴파일 과정

    1. 전처리 단계 : 전처리기 매크로들을 처리(#include, #define 등)
    • 1) 문자 해석하기
    • 2) '\' 문자 해석하기
    • 3) 전처리 토큰들로 분리
      • 소스 파일을 주석 -> 공백 문자 -> 전처리 토큰으로 분리하는 단계
    • 전처리 실행 단계
      • #include 파일 내용 복사 -> #define 코드 치환 -> #if, #ifndef 코드 치환 -> #pragma 등 컴파일러 명령문 해석
    • 실행 문자 셋으로 변경
    • 인접한 문자열 합치기

    1. 컴파일 단계 : 소스 파일들을 어셈블리어로 변환
    • 해석 유닛 생성(Translation Unit)
      • 전처리기 토큰을 컴파일 토큰으로 변환 -> 컴파일러가 컴파일 토큰을 해석해 해석 유닛 생성(해석 유닛을 각 소스 파일 별로 하나씩 존재하게 됨)
    • 인스턴스 유닛 생성(Instantiation Unit)
      - 컴파일러가 해석 유닛을 분석해 템플릿 인스턴스 확인 -> 템플릿들의 정의 위치가 확인되면 해당 템플릿들의 인스턴스 화가 진행 -> 이를 통해 인스턴스 유닛 생성

    1. 어셈블 단계 : 실제 기계어로 이루어진 목적 파일(obj)로 변환

    1. 링킹 단계 : 목적 파일들을 하나로 모아 실행 파일 생성(exe)
profile
복습하기 위해 쓰는 글

0개의 댓글