본문 바로가기
개발

[C++] C++ 정복 메모장2

by 수인분당선 2023. 12. 9.
반응형

저번 포스팅에 이어 C++ 개념 정리 메모용으로 작성하였습니다.


함수의 인자 전달 방식

  • 값에 의한 호출 : 값이 복사
    • 1. 함수호출
    • 2. 매개변수가 스택에 생성
    • 3. 호출하는 코드에서 값을 넘겨줌
    • 4. 넘어온 값이 매개변수에 복사됨
  • 주소에 의한 호출 : 주소를 매개변수에 전달 (*,&)
    • 1. 함수 호출
    • 2. 포인터 타입의 매개 변수가 스택에 생성
    • 3. 호출하는 코드에서 명시적으로 주소를 넘겨줌
    • 4. 넘어온 주소값이 매개 변수에 저장

함수의 객체 전달

  • 값에 의한 호출 
    • 호출하는 쪽의 객체가 매개변수객체에 그대로 복사됨-> 매개변수객체의 생성자는 호출되지 않음
    • 함수 종료 시, 매개변수객체의 소멸자를 호출함!! 
    • == 생성자/소멸자의 비대칭 실행
  • 주소에 의한 호출
    • 함수 호출 시, 생성자/소멸자가 실행되지 않는 구조 -> 매개변수인 포인터만 소멸

객체 리턴/객체 치환

  • 동일한 클래스 타입의 객체끼리 치환 가능
  • 객체의 복사본 리턴 (객체의 모든 데이터가 비트 단위로 복사됨)
  • 치환된 두 객체는 내용물만 같을 뿐 독립적인 공간을 유지함

참조 변수 &

  • 참조: 이미 존재하는 객체나 변수에 대한 별명
  • 활용: 참조 변수, 참조에 의한 호출, 참조 리턴
  • 이름만 생기며 새로운 공간을 할당하지 않는다.
  • 초기화로 지정된 기존 변수를 공유함
  • 특징: 초기화 필수, null/상수 참조 불가, 참조대상 변경불가, 참조의 배열 생성 불가, 참조변수에 대한 참조선언가능.

참조와 함수

  • 참조에 의한 호출 : 참조 매개변수가 인자 변수 공간 공유
    • 원본 객체가 변경되고, 생성자와 소멸자가 없음
    • -> 반면 값에 의한 호출은 원본객체의 변경이 없으며, 소멸자가 실행됨(생성자는 x)
  • 참조 리턴 : 공간에 대한 참조 리턴
  • char &ref = find(); //ref는 c에 대한 참조

얕은 복사 & 깊은 복사

  • 얕은 복사 : 메모리를 공유하여 복사함
  • 깊은 복사 : 원본이 가진 메모리 크기만큰 동적 할당 -> 원본의 동적 메모리 내용 복사
  • 복사 생성자 :
    • 한 클래스에 오직 한 개만 선언 가능

    • 객체의 복사 생성 시 Circle(const Circle& c); //Circle src; Circle desc(src);
    • 클래스에 대한 참조 매개 변수를 가지는 독특한 생성자
    • 복사 생성자는 보통 생성자와 클래스내에 중복 선언 가능
  • 디폴트 복사 생성자 : 컴파일러 자동 삽입, 얕은 복사

클래스 상속과 객체

  • 상속 : 기본 클래스가 파생 클래스의 변수와 함수를 물려받음
    • 기본 클래스 : 부모 클래스, 상속해주는 클래스
    • 파생 클래스: 자식 클래스, 상속받는 클래스
//상속받기(자식클래스)
class Student : public Person{ //파생 클래스명 : 상속접근지정 기본클래스명{
//...
};
  • 장점 : 클래스 간소화, 클래스 재사용을 통한 SW 생산성, 관리의 용이함

상속과 객체 포인터

  • 업 캐스팅 : 기본 클래스 포인터로 파생 객체를 가리키는 것
    • ex) Person클래스로 선언된 포인터가 상속 클래스 Student로 생성된 객체를 가리킴.(Person *p = &student1;)
  • 다운 캐스팅 : 파생 클래스 포인터에 기본 클래스 타입의 주소 치환
    • 업캐스팅의 반대
    • ex) Person포인터가 Student를 가리키는데(업캐스팅) 이걸 또 Student포인터가 가리킴..(Student *pDer1 = (Student) pBase1;)

상속과 생성자

  • 파생 클래스 생성자: 기본 클래스 생성자를 먼저 호출 후, 파생 클래스 생성자를 호출-> 결론: 둘 다 호출!
  • 상속된 클래스는 묵시적으로 기본 클래스의 기본 생성자를 호출함
    • 기본 클래스에 기본 생성자가 없다면? -> 컴파일 오류! 
      • 1. 기본생성자 만들어준다
      • 2. 명시적으로 다른 생성자를 가리킨다(B(int x) : A(x+2){ ...} 이런 식으로!)
  • 파생 클래스의 소멸자 실행 -> 기본 클래스 소멸자 실행

상속과 접근 지정

  • 기본 클래스의 protected멤버 : 기본 클래스 + 파생 클래스에서 접근 가능, 객체에서의 접근 불가!
  • 기본 클래스 상속 시 - public/protected/private 상속
    • public : 기본 클래스의 protected, public 멤버 속성을 그대로 계승
    • private: 기본 클래스의 protected, public 멤버를 private로 계승
    • protected: 기본 클래스의 protected, public 멤버를 protected로 계승

다중 상속 vs 가상 상속

  • 다중 상속 - 다이아몬드 상속 구조 시 데이터 중복 문제 발생

  • 가상 상속 : 다중 상속으로 인한 기본 클래스 멤버의 중복 상속 해결
    • virtual 키워드를 이용한 상속

함수 재정의 vs 오버라이딩

  • 함수 오버라이딩 : 파생 클래스에서 기본 클래스의 가상 함수와 동일한 타입의 함수를 재작성하는 것
  • 가상함수 이름, 매개변수 개수/타입, 리턴 타입까지 일치
  • 파생 클래스에서 범위지정자(::)를 사용하면 기본 클래스 함수 호출
    • 1. 정적 바인딩(함수의 재정의): 부모, 자식 함수들이 모두 동등한 호출 기회를 가짐.
    • 2. virtual 함수, 동적바인딩(가상함수의 재정의=오버라이딩): 부모의 존재감은 상실하고 항상 자식것만 호출

다형성을 구성하는 3가지 요소

1. 호환 객체(상속) 

2. 가상(virtual)함수

3. 포인터 변수 / 레퍼런스 변수

추상 클래스

  • 순수 가상 함수: 함수의 코드가 없고 선언만 있는 가상함수
    • 멤버함수의 원형 = 0; 으로 선언(virtual void draw()=0;)
  • 추상 클래스: 최소한 하나의 순수 가상 함수를 가진 클래스
  • 추상 클래스는 온전한 클래스가 아니기 때문에 객체 생성 할 수 없으나 포인터는 선언 가능
  • 추상 클래스의 목적: 인터페이스역할(순수 가상 함수를 통해 파생 클래스에서 구현할 함수의 형태를 보여줌)
  • 추상 클래스의 모든 멤버 한수를 순수 가상 함수로 선언할 필요는 없음.

템플릿/제네릭 프로그래밍

  • 매개변수 타입만 다르고 코드는 동일한 함수를 템플릿으로 만듦. -> 코드의 중복을 줄이다!
template <class T> //템플릿 선언 <제네릭타입 선언 키워드 T>

반응형

 

반응형

'개발' 카테고리의 다른 글

[c++] - 템플릿을 이용한 가변인자  (0) 2024.09.02
[C++] C++ 정복 메모장  (2) 2023.12.08