공부/C++

0. C++ 시작

bokob 2024. 3. 24. 17:09

객체지향과 절차지향

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

절차지향 언어는 문제를 여러 개의 작은 함수(function)로 나누어 그 문제를 해결

절차지향은 동사 중심의 프로그래밍 방식 : "어떤 처리 함수를 수행하는가?"

 

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

관련된 변수(속성)와 함수(기능)를 묶어서 '객체(object)'를 만들고, 객체 단위로 프로그래밍

  • C에서의 구조체 같은 것이다. C에어 구조체들은 변수들만 묶여있음
  • 세상 모든 것이 객체이다.

객체지향은 명사 중심의 프로그래밍 방식 : "어떤 객체가 동작하는가?"

 

절차지향 프로그래밍과 객체지향 프로그래밍

절차지향 프로그래밍

  • 실행하고자 하는 절차대로 일련의 명령어 나열
  • 흐름도를 설계하고 흐름도에 따라 프로그램 작성

 

객체지향 프로그래밍

  • 객체들을 정의하고, 객체들의 상호 관계, 상호 작용으로 구현

 

클래스와 객체

클래스(Class)

  • 사용자정의 자료형이라 생각하면 편하다(일종의 데이터 타입 역할).
  • 클래스에는 변수라는 저장공간 외에 기능이라는 프로시저(함수, 기능)가 포함되어 있다.
  • 객체가 가지는 공통된 특성을 기술하는 것
  • 클래스에 비유될 수 있는 것 : 붕어빵 틀

객체(Object)

  • 클래스 타입에 의해 만들어진 실제 사용되는 변수
  • 구체적인 갑승ㄹ 갖는 실체(Instance)
  • 객체에 비유될 수 있는 것: 붕어빵 틀에 의해 만들어진 실제 붕어빵
  • 객체는 자료와 일련의 처리 명령을 하나로 묶어 놓은 메소드(함수, 프로시저)로 구성되는 프로그램 단위, 함수보다 높은 수준의 모듈화 방법이라 할 수 있다.

 

클래스 정의

원을 추상화한 Circle 클래스

class Circle
{
    public:
        int radius; // 반지름
    public:
    	double getArea() { return 3.14*radius*radius; }
};

 

new  키워드 없이 정적으로 객체 생성이 가능하다.

Circle pizza;
Circle donut;
Circle waffle;

 

객체의 구성요소

객체의 선언

Circle pizza, donut, waffle;

 

멤버변수

객체 내부의 변수

  • 객체 내부의 정보 저장
pizza.radius = 15;

 

멤버함수

객체 내부의 프로시저

  • 객체가 수행할 수 있는 행위를 기술
pizza.getArea();

 

생성자

생성자(constructor)

  • 객체가 처음 생성될 때 객체의 초기화에 사용되는 특별한 멤버함수
  • 생성자는 생략 가능 -> 기본 생성자가 삽입된다.
class Circle
{
    public:
        int radius; // 반지름 값
    public:
        Circle(int r) // 생성자는 객체가 생성될 때 radius에 값을 할당한다.
        {
            radius = r;
        }
        double getArea()
        {
            return 3.14 * radius * radius;
        }
};

int main()
{
    Circle pizza(15);
}

 

클래스 특성

캡슐화(Encapsulation)

접근 지정자를 통한 캡슐화 구현

  • 객체의 내부 구성요소에 대한 접근을 제한하기 위한 수단
    • 객체를 사용하기 위해서 필요한 부분을 제외한 나머지 부분을 캡슐로 감싸서 숨기는 것
  • 전용(private) 속성과 공용(public) 속성
class Circle
{
    /*
    클래스 안의 구성요소들은 다른 프로그램 단위에서
    접근할 수 있는지 여부에 따라 공용이나 전용으로 표시됨
    */
    
    private:
        int radius; // 반지름 값
        
    public:
        Circle(int r)
        {
            radius = r;
        }
        double getArea()
        {
            return 3.14 * radius * radius;
        }
};

 

상속(Inheritance)

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

 

C++ 상속

  • 객체가 자식 클래스의 멤버와 부모 클래스에 선언된 모양 그대로 멤버들을 가지고 탄생
class Phone
{
    void call();
    void receive();
};

class MobilePhone : public Phone // //Phone을 상속받는다.
{
    void connectWireless();
    void recharge();
};

class MusicPhone : public MobilePhone // MobilePhone을 상속받는다.
{
    void downloadMusic();
    void play();
}

 

다형성(Polymorphism)

  • 하나의 기능이 경우에 따라 다르게 보이거나 다르게 작동하는 현상
  • 연산자 중복(오버로딩), 함수 중복(오버로딩), 함수 재정의(overriding)

 

연산자 중복

ex) + 연산자 중복

2 + 3 -> 5
"남자" + "여자" -> "남자여자"
redColor 객체 + blueColor 객체 -> purpleColor 객체

 

함수 중복(오버로딩)

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

 

함수 재정의(오버라이딩)

#include <iostream>

class Animal
{
public:
    void PlaySound()
    {
        std::cout << "소리내기" << "\n";
    }
};

class Dog : public Animal
{
public:
    void PlaySound()
    {
        std::cout << "왈왈" << "\n";
    }
};

int main()
{
    Dog dog;
    dog.PlaySound();
}

 

프로그래밍 언어의 진화와 C++의 기원

 

C++ 언어에서 객체 지향을 도입한 목적

소프트웨어 생산성 향상

  • 소프트웨어의 생명 주기 단축 문제 해결 필요
  • 기 작성된 코드의 재사용 필요
  • C++ 클래스 상속 및 객체 재사용으로 해결

 

실세계에 대한 쉬운 모델링

  • 과거의 소프트웨어
    • 수학 계산이나 통계 처리에 편리한 절차 지향 언어가 적합
  • 현대의 소프트웨어
    • 물체 혹은 객체의 상호 작용에 대한 묘사가 필요
    • 실세계는 객체로 구성된 세계
    • 객체를 중심으로 하는 객체 지향 언어 적합

 

표준 C++ 프로그램의 중요성

C++ 언어의 표준

  • 1998년 미국 표준원(ANSI, American National Standards Institute)
    • C++ 언어에 대한 표준 설정
  • ISO/IEC 14882 문서에 작성됨. 유료 문서
  • 표준의 진화
    • 1998년(C++98), 2003년(C++03), 2007년(C++TR1), 2011년(C++11)

 

표준의 중요성

  • 표준에 의해 작성된 C++ 프로그램
    • 모든 플랫폼, 모든 표준 C++ 컴파일러에 의해 컴파일
    • 동일한 실행 결과 보장
    • 운영체제와 컴파일러의 종류에 관계없는 높은 호환성

 

비 표준 C++ 프로그램

  • Visual C++, Borland C++ 등 컴파일러 회사 고유의 비 표준 구문
    • 특정 C++ 컴파일러에서만 컴파일
  • 호환성 결여

 

표준/비표준 C++ 프로그램의 비교

__cdel은 Visual C++에서만 된다. 표준 C++ 규칙에 따라 작성하지 않으면 호환성이 좋지 않다.

 

C언어의 개선을 통해 탄생된 C++

C언어의 개선을 통해 탄생됨

  • 클래스와 여러 기능을 추가하여 C++라는 언어 탄생
  • 다른 언어에 비해 정보를 보다 효과적으로 관리하고 처리

 

C와의 호환성

  • C언어의 문법 체계 계승
    • 소스 레벨 호환성 - 기존에 작성된 C 프로그램을 그대로 가져다 사용
    • 링크 레벨 호환성 - C 목적 파일과 라이브러리를 C++ 프로그램에서 링크

 

객체 지향 개념 도입

  • 캡슐화, 상속, 다형성
  • 소프트웨어의 재사용을 통해 생산성 향상
  • 복잡하고 큰 규모의 소프트웨어의 작성, 관리, 유지보수 용이

 

엄격한 타입 체크, 실행 시간 오류의 가능성을 줄임

 

실행 시간의 효율성 저하 최소화

  • 작은 크기의 멤버 함수의 잦은 호출 가능성 -> 인라인 함수로 실행 시간 저하 해소

 

C언어에 추가한 기능들

  • 인라인 함수(inline function)
    • 함수 호출 대신 함수 코드의 확장 삽입
  • 디폴트 인자(default parameter)
    • 매개 변수에 디폴트 값이 전달되도록 함수 선언
  • 함수 중복(function overloading)
    • 매개 변수의 개수나 타입이 다른 동일한 이름의 함수들 선언
  • 참조와 참조 변수(reference)
    • 하나의 변수에 별명을 사용하는 참조 변수 도입
  • 참조에 의한 호출(call-by-reference)
    • 함수 호출 시 참조 전달
  • new/delete 연산자
    • 동적 메모리 할당/해제를 위해 new와 delete 연산자 도입
  • 연산자 재정의
    • 기존 C++ 연산자에 새로운 연산 정의
  • 제네릭 함수와 클래스
    • 데이터 타입에 의존하지 않고 일반화시킨 함수나 클래스 작성 가능

기타 등등...

 

객체지향 및 제네릭 프로그래밍이 가능한 C++

제네릭 프로그래밍(generic programming) 기능

  • 템플릿을 사용하여 정보의 타입과 관계없이 동일한 방법으로 처리할 수 있는 알고리즘을 구현할 수 있게 함.
    • 제네릭 함수와 제네릭 클래스를 활용하여 프로그램을 작성하는 새로운 프로그래밍 패러다임
    • 점점 중요성이 높아지고 있음

 

제네릭 함수와 제네릭 클래스

  • 제네릭 함수(generic function)
    • 동일한 프로그램 코드에 다양한 데이터 타입을 적용할 수 있게 일반화 시킨 함수
  • 제네릭 클래스(generic class)
    • 동일한 프로그램 코드에 다양한 데이터 타입을 적용할 수 있게 일반화시킨 클래스
  • template 키워드로 선언
    • 템플릿 함수 혹은 템플릿 클래스라고도 부름
#include <iostream>

template<class T>
T max(T a, T b){
    return (a>b ? a:b);
}

int main(){
    int i1 = 5, i2 = 3;
    int i3 = max(i1, i2); // i3 = 5 max<int>(i1, i2)와 동일
    std::cout<<i3<<endl;
    
    double d1 = 0.9, d2 = 1.0;
    double d3 = max(d1, d2); // d3 = 1.0 max<double>(d1, d2)와 동일
    std::cout<<d3<<endl;
}

 

C++ 언어의 아킬레스

C++ 언어는 C언어와의 호환성을 추구

장점

  • 기존에 개발된 C 프로그램 코드 활용

단점

  • 캡슐화의 원칙이 무너짐
    • C++에서 전역 변수와 전역 함수를 사용할 수 밖에 없음. -> Java, C#은 안 되게 해놓음
    • 부작용(side effect) 발생 염려

 

C++ 프로그램 개발 과정

 

C++ 표준 라이브러리

C++ 표준 라이브러리는 3개의 그룹으로 구분

  1. C 라이브러리
    • 기존 C 표준 라이브러리를 수용, C++에서 사용할 수 있게 한 함수들
    • 이름이 c로 시작하는 헤더 파일에 선언됨
  2. C++ 입출력 라이브러리
    • 콘솔 및 파일 입출력을 위한 라이브러리
  3. C++ STL 라이브러리
    • 제네릭 프로그래밍을 지원하기 위한 템플릿 라이브러리

'공부 > C++' 카테고리의 다른 글

4. 클래스와 객체의 기본  (0) 2024.04.09
3. 개선된 함수 기능  (0) 2024.03.31
2. 포인터와 레퍼런스  (1) 2024.03.30
1. C++ 프로그래밍의 기본  (2) 2024.03.26
C++ 공부  (0) 2024.03.14