카테고리 없음

C++강좌(공부) #1~2장

바래다주기 2024. 5. 7. 05:06

1. 객체지향과 클래스

절차지향

  1. 동사 중심의 언어
  2. ~하다
  3. 함수/ 포인터 / 구조체 중심의 언어

객체지향

  1. OOP(Object Oriented Programming)
  2. 주어 중심의 언어
  3. 프로그램을 구성하는 객체 사이의 의사소통 중심

!객체
주어를 제외한 모든 대상
!추상화
공통되는 특징이나 속성을 추론하는 과정
!기능의 추상화
데이터를 통해 함수를 만드는 행위

결론 >> 현실에 존재하는 사물, 피사체를 추상화 작업을 통해 데이터와 기능의 형태로 구현하는 프로그래밍

C++?

객체 지향 프로그래밍 + 제네릭(일반화) 프로그래밍

객체지향의 특징

  1. 현실세계를 프로그램에 그대로 반영
  2. 상속이라는 기능을 사용하여 코드의 재사용성을 높임
  3. 유지보수 및 관리에 용이

* 안정성과 속도 측면에서 보면 절차지향이 객체지향보다 우월함
절차지향은 프로그램의 흐름을 중시하는 프로그래밍 방식이기에 보다 안정적이다
BUT! 그러한 특성 탓에 특정 부분에 문제 발생 시 흐름에 따라 모든 부분을 확인해야 한다

메세지

발신자가 수진자에게 정보를 전달하는 행위 통신 수단을 통해 전송에 적합한 형태로 만듦

메세지 패싱

프로그램을 구성하는 객체 사이의 의사소통 방식 -> 함수를 통해 의사소통하는 객체

클래스

데이터와 데이터(멤버 변수)의 가공을 담당하는 기능(멤버 함수)을 하나로 묶은 자료형

프로그램에서 객체란?

클래스 + 인스턴스
인스턴스 : 클래스를 메모리에 등록하는 순간 발생하는 메모리 상의 데이터 + 기능의 집합체
-> 클래스 = 자료형, 인스턴스 = 할당된 메모리 공간

클래스의 4대 성질

  1. 은닉화
  2. 캡슐화
  3. 상속성
  4. 다형성
    >> 모두 연관되어 있는 성질이다

은닉화

데이터의 보호 수단으로, 외부에서 아무나 멤버에 접근하는 행위를 방지
(내부 : 중괄호 내부의 범위 / 외부 : 중괄호 외부의 모든 범위)

  1. 구조체의 경우 default 접근 제어 지시자 public
  2. 클래스이 경우 default 접근 제어 지시자 private

접근 제어 지시자

접근 가능한 범위에 대해 지정해주는 지시자

  1. public : 가장 큰 범위로, 내부 / 외부 상관없이 모두 접근 가능
  2. protected : 상속된 상황에 한해 사용하는 지시자로, 자식 클래스에 한해 접근 가능
  3. private : 내부에서만 접근 가능

Access Method

변수에 접근할 때 클래스에 public으로 멤버 함수를 만들어 해당 함수를 통해 멤버 변수에 접근
-> 은닉화의 기본 개념
-> 멤버 변수는 지역 변수지만, 클래스 내에 한해서는 전역 변수 처럼 사용이 가능하다

기타 등등...
C++에서 구조체와 클래스의 기능적인 차이점은 없지만
구조체는 사용자의 정의 자료형 클래스는 객체
목적으로 사용하기에 굳이 바꿔서 사용할 필요가없다.

2. 객체

Pre - Compile 헤더 (자주 이용할 헤더들을 미리 등록하여 추가 호출 없이 한번에 호출하여 사용 하는 방식)

클래스의 기본요소

  1. Initizlize() : 초기화 대입 및 동적 할당의 용도로 사용
  2. Update() : 기능을 작동 시키므로써 멤버 변수 및 매개 변수의 값을 가공하는 용도
  3. Release() : 동적할당 해제 등 클래스가 소멸할 때 진행할 작업

동적 할당 배열의 크기 교환하는 방법

  1. 기존 배열(A) 와 크기를 조절하여 새로 만든 배열 (B) 존재
  2. A의 정보를 memcpy 연산을 통해 B에 붙여넣음
  3. A를 Safe_Delete 진행한 후 A의 주소값이 들어왔던 변수에 B의 주소값을 대입
    !!! 배열의 인덱스는 절대 변경될 수 없다
    !!! 모든 배열의 크기 변경 방식은 해당 절차를 따른다

클래스의 크기

클래스의 크기는 변수의 크기만을 고려한다
-> 멤버 함수의 경우 코드 영역에 등록하게 되며, 클래스는 해당 함수의 주소를 소유하여
필요시 주소를 통해 호출하여 사용하는 방식

생성자

객체 생성 시 자동 호출되는 함수
소멸자와 달리 default 생성자 외에 매개변수를 받는 생성자를 만들어 오버로딩을 할 수 있다
해당 함수 내에서 멤버 변수에 대한 초기화 및 대입을 진행한다

소멸자

객체 소멸 시 자동 호출되는 함수
객체 내에 오로지 하나만 존재 가능하며, 함수의 오버로딩이 적용되지 않음
해당 함수 내에서 Release()함수를 호출하여 할당된 Heap영역의 메모리를 해제한다

 

객체의 생성 과정
메모리 할당 -> 생성자 호출
객체의 소멸 과정
소멸자 호출 -> 메모리 해제

클래스 선언 시 자동 생성되는 4가지 요소

  1. default 생성자
  2. default 복사 생성자
  3. default 대입 연산자
  4. 소멸자
    !!! 프로그래머가 명시적으로 선언하게 될 경우 자동 생성되지 않음

생성자의 동작

생성자에서 값을 넣는 행위는 원칙적으로 대입이지만, 클래스의 특성 상 초기화라고 할 수 있다
클래스의 멤버 변수는 객체가 생성된 이후에 유효성을 가지게 되는데 객체는 메모리가 할당되고 생성자가 호출된 이후에 그 유효성을 가지게 된다
이 과정에서 생성자가 호출되는 시점에 값을 대입하므로 값이 대입 -> 객체 유효화 방식으로 동작
따라서 객체가 유효성을 가진 시점에 이미 값을 가지게 되므로 초기화라고 할 수 있다
BUT! 생성과 동시에 초기화를 하는 행위와는 별개이다

클래스에서 Malloc/Calloc 과 New의 동작

Malloc / Calloc / Free
C언어 시절의 문법으로, 향상된 버전인 C++에서 생겨난 클래스라는 문법을 알 수 없음
따라서 해당 동작을 통해 클래스를 생성하면 생성자와 소멸자가 호출되지 않을 뿐 더러
구조체가 만들어지게 된다.
New / Delete
C++에서 추가된 문법으로 클래스 생성 시 정상적으로 생성자와 소멸자가 호출된다

다른객체의 멤버에 접근하려면?

동적 할당된 객체의 주소값을 넘기게 되면 해당 객체 내의 멤버에 접근이 가능하다
이런 형식이 아닌 새로 객체를 선언하게 되면 별개의 객체가 생성되게 된다.
!!! 클래스는 틀, 객체는 틀로 찍어낸 쿠키