📘 OOP 특징2

7장

  • 연산자 중복에 대한 특징을 설명할 수 있어야함

    c++본래있는 연산자만 중복가능

    모든 연산자가 중복 가능하지 않음

    피 연산자의 타입이 다른 연산을 새로 정의

    피연산자의 개수를 바꿀수 없음

    operator함수 형태로 구현

    반드시 클래스와 관계를 맺어야함(오퍼레이트에 왼쪽에 있는 피 연산자가 클래스여야함 왜나하면 오퍼레이트가 왼쪽에 있는 클래스의 멤버여야 하기때문에 없을수도 있는데 없으면 전역함수를 만들어야함 , 전역함수가 해당되는 피연산자를 클래스를 쓰기위해서는 스태틱을 선언해야됨 그래서 관계가 있음)

    연산의 우선순위 변경 안됨

  • 연산자 중복 함수 코딩으로 나옴
    1. 클래스의 멤버 함수로 구현

       class Power {
       ...
       Power operator+ (Power op2);
       };
       Power Power::operator+(Power op2) {
       Power tmp; // 임시 객체 생성
       tmp.kick = this->kick + op2.kick; // +
       tmp.punch = this->punch + op2.punch; // +
       return tmp; // 더한 결과 리턴
       }
      
    2. 외부 함수로 구현하고 클래스에 프렌드 함수로 선언

       Power operator+(Power op1, Power op2) {
       Power tmp; // 임시 객체 생성
       tmp.kick = op1.kick + op2.kick; //kick 더하기
       tmp.punch = op1.punch + op2.punch;//punch더하기
       return tmp; // 임시 객체 리턴
       }
       bool operator == (Power op1, Power op2) {
       ...
       }
       class Power {
       ...
       friend Power operator+ (Power op1, Power op2);
       friend bool operator== (Power op1, Power op2);
       };
      
  • 프랜드를 정의하고 프랜드 함수 쓰는 3가지 방법을 코드로 설명해라

    클래스의 모든 멤버를 접근할수있게 권한을 부여하는 것이다.

    1. 외부 함수를 프랜드함수로 선언 (Rect클래스가 외부함수 equals함수를 쓸수있다)

       class Rect;
       bool equals(Rect r,Rect s);
       class Rect { // Rect 클래스 선언
       ...
       friend bool equals(Rect r, Rect s);
       };
      
    2. 다른 클래스의 멤버 함수를 프랜드로 선언(RectManager클래스의 equals함수를 Rect클래스가 쓸수있다)

       class Rect;
       class RectManager{
       ...
       	bool equals(Rect r, Rect s);
       }
       class Rect {
       ...
       friend bool RectManager::equals(Rect r, Rect s);
       };
      
    3. 다른 클래스 전체를 프렌드로 선언(Rect클래스가 RectManager클래스의 모든 함수를 쓸수있다)

       class Rect;
       class RectManager{
       ...
       };
       class Rect {
       .............
       friend RectManager;
       };
      
  • 전위연산자 후위연산자를 어떻게 구별하는지를 알아야됨
    1. 전위 연산자

       Power& Power::operator++( ) {
       // kick과 punch는 a의 멤버
       kick++;
       punch++;
       return *this; // 변경된 객체 자신(객체 a) 참조 리턴
       }
      
    2. 후위 연산자

       Power Power::operator++(int x) {
       Power tmp = *this; // 증가 이전 객체 상태 저장
       kick++;
       punch++;
       return tmp; // 증가 이전의 객체(객체 a) 리턴
       }
      

      스크린샷 2023-06-12 오후 11.20.30.png

8장

  • 업케스팅 다운 케스팅 포인트가지고 장난치는거 코드로 설명 이해

    업케스팅이란 파생 클래스 포인터가 기본 클래스 포인터에 치환되는것이다.

      class Point { … }
      class ColorPoint : public Point { … }
      ColorPoint cp;
      ColorPoint *pDer = &cp;
      Point* pBase = pDer; // 업캐스팅
    

    다운 캐스팅이란 기본클래스의 포인터가 파생클래스의 포인터에 치환되는것이다

      pDer=(ColorPoint*)pBase;
    
  • 다운케스팅 런타임 오류 상황 코드로 설명

    다운케스팅할때는 항상 오른쪽에 있는 포인트 값이 정상적으로 업케스팅 된 상태여야함 이 내용을 잘 생각해서 코드로 설명

      setColor()가 ColorPoint의 멤버일때
      Point po, *pBase;
      ColorPoint *pDer;
      pBase = &po;
      pDer=(ColorPoint*)pBase;
      pDer->set(3, 4);
      pDer->setColor(“red”); 이 부분에서 pBase포인트값이 업케스팅 된 상태에서 불러와져야되는데
      바로 다운케스팅 해버려서 실행 오류가 발생한다
    
  • 상속관계에서 생성자 호출하는것

    스크린샷 2023-06-12 오전 4.09.32.png

    명시적으로 호출 설명하는것 까지

    스크린샷 2023-06-12 오전 4.11.56.png

  • 접근지정자

    멤버 접근 을 예제 보고 이해해야됨

      class Point {
      protected:
      int x, y; //한 점 (x,y) 좌표값
      일때
      Point p; // 기본 클래스의 객체 생성
      p.set(2,3); // ②
      p.x = 5; // ③ 오류
      p.y = 5; // ④ 오류
      p.showPoint();
      ColorPoint cp; // 파생 클래스의 객체 생성
      cp.x = 10; // ⑤ 오류
      cp.y = 10; // ⑥ 오류
        
      x,y가 protected로 선언되어있어서 외부에서 접근 x getter setter적용해야됨
    
  • 다중상속을 허용하니까 다중상속일 경우 문제가 발생

    기본클래스의 멤버를 중복해서 사용하는거 그때 문제해결하는법(가상상속 virtual키워드)

    스크린샷 2023-06-12 오전 4.21.42.png

9장

  • 추상클래스를 코딩하는거 동적바인딩을 이용한 다형성을 코드로 표현하는거

    다형성을 구현하는 방법을 설명하시오 → 코드로 설명

    업케스팅해서 오버라이딩해서 하는 코드 (상속으로만 설명 하면 감점)

      파생 클래스의 객체에 대해 기본 클래스에 대한 포인터로 가상 함수를 호출하는경우 동적 바인딩이 일어남
      객체 내의 오버라이딩한 파생클래스의 함수를 찾아서 실행한다.
      class Shape {
      public:
      void paint() { draw(); }
      virtual void draw() {
      }
      };
      class Circle : public Shape {
      public:
      virtual void draw() {
      }
      };
      일때 main에서 
      Shape *pShape = new Circle(); // 업캐스팅
      pShape->paint();
      을 하면 draw는 Circle의 draw가 실행된다
    
  • 오버라이딩 함수 재정의 오버로딩 설명하고 차이점을 설명할 수 있어야함 동적바인딩도 설명할 수 있어야함 virturl 키워드도 설명가능해야됨

    오버로딩은 매개 변수 타입이나 개수가 다르지만, 이름이 같은 함수들이 중복작성되는것이고

    함수재정의란 기본클래스의 멤버함수를 파생클래스에서 완벽히 같은 원형으로 재작성하는것이고

    오버라이딩이란 기본클래스의 가상함수를 파생클래스에서 완벽히 같은 원형으로 재작성하는것이다

    오버로딩 함수재정의 둘다 컴파일시에 함수를 호출하는 정적바인딩이 일어나지만 오버라이딩은 실행시점에 오버라이딩한 파생클래스를 찾아서 실행하는 동적바인딩이 일어난다 이때 컴파일러에게 동적바인딩하게 하는것이 가상함수를 만드는 virturl키워드 이다.

  • 상속관계에서 소멸자

    소멸자가 가상함수가 아닌경우 기본클래스의 소멸자만 실행된다 소멸자를 virtual키워드로 선언하면 소멸자 호출시 동적바인딩 발생해 파생클래스 소멸자실행되고 그 다음 기본 클래스의 소멸자가 실행된다

    스크린샷 2023-06-12 오후 12.07.19.png

  • 추상클래스의 특징을 설명할 수 있어야함 순수 가상 함수

    추상클래스는 인스턴스를 생성할 목적이 아닌 인터페이스 역할이다.

    온전한 클래스가 아니므로 객체 생성 불가능

    추상 클래스의 포인터는 선언 가능

    최소한 하나의 순수 가상 함수를 가진 클래스

10장

  • 제네릭 일반화에서 코드 물어볼수있음

    stl에 관련된 코딩을 써서 iterator, 람다식 구현

    제네릭 함수 또는 클래스를 물어볼수있음

    스크린샷 2023-06-12 오후 9.53.27.png

    스크린샷 2023-06-12 오후 9.54.08.png

    스크린샷 2023-06-12 오후 9.55.35.png

    스크린샷 2023-06-12 오후 9.55.24.png

  • 제네릭의 정의

    함수클래스를 일반화하는 도구인 템플릿

    일반화 구체화 의 개념

    제네릭이란 변수나 매개변수의 타입만 다르고, 코드 부분이 동일한 함수를 하나의 틀로 만들어 함수나 클래스 코드를 생산하는 기법이다.

    함수나 클래스를 일반화 하는 c++도구인 template키워드로 함수나 클래스 선언하고 템플릿 함수로부터 컴파일시 구체화된 함수의 소스 코드를 생성한다.

  • stl의 구성요소

    컨테이너 - 템플릿 클래스

    • 데이터를 담아두는 자료 구조를 표현한 템플릿 클래스(리스트,큐,스택,맴,셋,벡터)
    • 컨테이너 클래스를 사용하기 위해 헤더파일을 include해야됨

    iterator - 컨테이너 원소에 대한 포인터

    • 컨테이너의 원소들을 순회하면서 접근하기 위해 만들어진 컨테이너 원소에 대한 포인터

    알고리즘 - 템플릿 함수

    • 컨테이너 원소에 대한 복사,검색,삭제,정렬등의 기능을 구현한 템플릿 함수
    • 컨테이너의 멤버 함수 아님
  • auto의 개념

    컴파일러에게 변수 타입을 추론할 수 있게끔 선언해주는것

  • 람다식의 구성요소를 설명할 수 있어야함

    어떻게 신텍스 구조를 이루어 져 있는지

    스크린샷 2023-06-12 오후 3.01.27.png

    스크린샷 2023-06-12 오후 10.24.17.png

    스크린샷 2023-06-12 오후 10.24.23.png

11장

  • get함수와 getline함수의 차이점 개념설명

    엔터키의 차이점, 문제점 해결방안 (ignore get에서 문제)

    get함수와 getline함수 둘다 개행 문자를 만날 때 까지 문자를 읽는 함수이다. 하지만istream&get(chars,int n , char delim=’\n’) 함수는 최대 n-1개의 문자를 읽어 배열 s에 저장하고 마지막에 \0문자 삽입한다, 입력도중 delim에 지정된 구분 문자를 만나면 지금까지 읽은 문자를 배열 s에 저장하고 리턴한다. 이때, \n을 스트림 버퍼에 남게되어 무한루프에 빠진다. cin.ignore(1);을 통해 \n을 스트림에서 버려야 한다. 하지만 istream&getline(char s,int n, char delim =’\n’함수는 get() 과 동일하지만 delim에 지정된 구분 문자를 스트림에서 제거한다.

    스크린샷 2023-06-12 오후 9.13.57.png

    스크린샷 2023-06-12 오후 9.14.08.png

  • 포맷을 하기 위한 방법 3가지

    플래그 : setf설정 unsetf설정

    스크린샷 2023-06-12 오후 9.20.06.png

    포맷 :

    스크린샷 2023-06-12 오후 9.23.35.png

    조작자 : 조작자는 c++표준 라이브러리에 구현된 조작자나 개발자 만의 조작자 작성 가능 하다. 항상 « 나 » 연산자와 함께 사용된다. 조작자를 실행하면 컴파일러에 의해 변경되고 조작자의 주소를 전달하여 해당 조작자를 실행한다.

13장

  • try-throw-catch 개념 설명할 수 있어야함 &처리하는방식도

    예외 발생을 탐지하고 예외를 처리하는 방식인데, try는 예외가 발생할 가능성이 있는 코드를 묶고, throw는 발견된 예외를 처리하기 위해 예외 발생을 알리는 문장이다. catch는 throw에 의해 발생한 예외를 처리하는 코드이다.

    스크린샷 2023-06-12 오후 10.29.32.png

  • c++코드에서 c라이브러리 호출할때 이름 규칙의 개념

    호출할때 컴파일러에게 지시하는 지시어의 키워드를 알아야한다

    이름규칙(naming mangling) : 컴파일 후 목적 코드에 이름 붙이는 규칙

태그:

카테고리:

업데이트: