https://lagifun-inforecord.tistory.com/106

위의 링크에 해당하는 강의를 수강하면서 기록한 필기

 


1.
객체 - 실물을 객체라고도, 인스턴스를 객체라고도 함
클래스 - 객체를 추상화
인스턴스 - 클래스를 프로그램에서 선언. 메모리에 할당된 상태

클래스 맴버
 - 맴버 함수 : 메소드 라고도 함
 - 맴버 변수 : 필드 라고도 함


2.
변수 종류, 위치에 따라
 1) 클래스 내
   - 인스턴스 변수, 일반 변수
   - 클래스 변수: 인스턴스 변수에 static을 붙임. 모든 인스턴스 객체에서 공유되는 변수(메모리가 공유된다)
                  클래스 밖에서 초기화과정이 필요하다
 2) 클래스 매소드 혹은 클래스 밖 일반함수내
   - 지역변수
   - 정적 변수, 함수종료 시에도 남아있다
 3) 클래스 밖
   - 전역변수
   - 정적변수

 


3.
맴버 초기화
 - 클래스 정의 시 초기화가 불가능 하여 클래스가 생성되는 순간에 초기화 리스트를 사용하여 초기화를 수행해야하는 맴버
    : 참조형 맴버, 상수맴버
 - 초기화 리스트란 클래스 생성사 옆에 ':'를 사용하여 정의한다
    ex) car() : speed(10) {} ;

 1) 상수 맴버 초기화 
    - const int a = 10; -> 컴파일 오류(변수가 생성되기 전 정의)
    - const int a; a = 10; -> 컴파일 오류(상수 선언이후 값 변경 불가)
    - const int a; 클래스생성자():a(10){} -> 가능
 2) 참조형 맴버 초기화
    - string &a; 클래스 생성자(string input):a(input){}
 3) 객체 맴버 초기화
    - int x, y; 클래스생성자(int a, int b):x(a), y(b){}


4.
const를 사용한 함수선언 방식 3가지
 - 반환형, 매개변수, 함수뒤(ex: void func() const {} )
 - https://dhdnjswo5000.tistory.com/m/5


5.
함수 중복(overloading) vs 함수 재정의(overriding)
 - 함수 중복
     같은 이름의 함수를 여러개 정의하는 것
     같은 이름의 함수에서 매개변수, 반환자료형이 다르게 정의하는 것

 - 함수 재정의
     부모 클래스의 함수를 사용속받아 자식클래스에서 함수를 제정의 하는것
     반환 자료형 및 매개변수의 개수, 자료형이 동일하다


6.
연산자 중복(overloading)
 - cpp에서 기존에 존재하는 연산자를 기반으로 연산자 함수를 중복 정의한다
 - 해당 연산자를 기반으로 한 새로운 타입의(보통 객체) 연산을 위해 연산자 중복을 사용한다
 - 연산자 중복이 불가능한 연산자가 있다. ex) *, ::, ? 등


7.
변환 생성자
 - 생성자에서 초기값을 입력받아 객체의 맴버변수를 초기화하는 것
 - 버그의 원인이 될 수 있다.(int a = 3.14; 처럼)
 - 생성자 앞에 explict 키워드를 붙이면 컴파일러가 컴파일시 자동형변환을 제한한다(막는다)

변환 연산자
 - 형변환 연산자를 '연산자 중복'하여 특정 자료형에 객체를 대입 연산하는 것
   ex)
     book class 안에서,
        operator int() const { return a;}
     main() 안에서,
        void main() { book b1; int target = b1; }


8.
연산자 결합방향(연산자 연산방향)
 - 참조링크 : https://studymake.tistory.com/201

 


9.
상속은 is-a관계이다 ex) 자동자는 탈것이다(car is a vehicle, vehicle : 부모, car : 자식)


10. 상속의 접근 지정자
 - 아래의 링크 2개가 제일 깔끔하게 표로 정리되었다고 생각한다
 - 참조링크 1: https://jerryjerryjerry.tistory.com/10
 - 참조링크 2: https://computer-science-student.tistory.com/52


11.
객체 간의 형변환
 1) 상향 형변환(upcasting)
   - 자식클래스 타입을 부모클래스 타입으로 변환
      ex) 부모 *a = new 자식();
 2) 하향 형변환(downcasting)
   - 부모클래스 타입을 자식 클래스 타입으로 변환
      ex) 자식 *b = new 부모();

* 보통 상향 형변환이 수행되면, 해당 객체는 부모의 맴버에만 접근이 가능하다.
* 상향 형변환된 부모 객체가 자식 클래스의 맴버에 접근하기
    ((자식 *)a) -> 자식의맴버함수(); -> 하향 형변환이 수행된다

* 참조자를 이용한 형변환
자식 b;
부모 &a = b; -> 상향 형변환 수행
((자식 &)a).자식의맴버함수(); -> 하향 형변환이 수행

* 함수 호출 시에서도 형변환 규칙이 그대로 적용된다. 따라서 함수의 매개변수에 객체입력 시, 자식보다는 부모 클래스 탑으로 선언하는 것이 좋다.
  ex)
      void 함수(부모 &s, int x, int y)
      {
       s.부모함수(x, y);
      }

      int main()
      {
       자식 a;
       함수(a, 0, 0);
      }


12.
출력 스트림의 출력형식
 - 참조링크 : https://cplusplus.com/reference/ios/
 - 몇 개만 정리한다면..
      1) fixed : 고정 소수점 표기법 사용
      2) dec : 10진법 출력
      3) oct : 8진법 출력
      4) hex : 16진법 출력
      5) uppercase : 대문자 표기

 

 

13.
가상함수
 - 부모 클래스에서 상속받을 클래스에서 재정의할 것으로 기대하고 정의해놓은 함수
 - 예) virtual void func();
 - 참조링크 : https://coding-factory.tistory.com/699

추상 클래스
 - 하나 이상의 순수 가상 함수가 있는 클래스
 - 순수 가상함수 : virtual void func() = 0;
 - 참조링크 : https://velog.io/@hyongti/C%EC%B6%94%EC%83%81%ED%81%B4%EB%9E%98%EC%8A%A4-vs.-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-%ED%81%B4%EB%9E%98%EC%8A%A4

인터페이스 클래스
 - cpp에서는 interface 클래스라는 키워드가 없다.(개념이 없다고 보아도 좋을 듯. java와의 차이점)
 - 따라서 인터페이스라는 개념을 구현하기 위해 순수 가상함수를 사용한다.
 - 단, 인터페이스 클래스(부모)에 가상소멸자를 사용해야 정상적으로 소멸이 된다.
 - 참조링크1 : https://hwan-shell.tistory.com/223
 - 참조링크2 : https://bloodstrawberry.tistory.com/515


14.
정적바인딩 vs 동적 바인딩
 - 정적 바인딩 : 컴파일 단계에서 바인딩이 완료되는 것.
 - 동적 바인딩 : 함수 호출시에 실제 호출되는 함수가 결정되는 것(지연바인딩(late binding)라고도 한다)
 - 참조링크 : https://www.techiedelight.com/ko/difference-between-static-dynamic-binding-cpp/


15. string 클래스 맴버함수
 - https://cplusplus.com/reference/string/string/


'Study > 프로그래밍_언어' 카테고리의 다른 글

cpp와 java의 차이  (0) 2023.03.03
cpp - 후기  (0) 2022.10.07
시작  (0) 2020.07.22
C언어 보충6 - 18, 19장, 추가사항  (0) 2018.02.03
C언어 보충5 - 16, 17장  (0) 2018.02.03

+ Recent posts