CPP

    [C++ Primer Plus] 15. Friends, Exceptions, and More

    대답해야 할 질문들 Friend class와 Friend member function의 사용법이 무엇인가? Nested class를 쓰는 이유는 무엇인가? return과 throw의 차이점이 무엇인가? exception을 레퍼런스로 catch하는 이유는 무엇인가? undefined exception과 unexpected exception이 무엇인지 설명하고 어떻게 해결할 수 있는지 설명하시오. RTTI의 세가지 구성요소는 무엇인가? C++의 explicit casting을 설명하시오. Friends 이제까지 friend function만 배웠지만, friend class도 가능하다. friend class가 마치 OOP를 해칠 것만 같은 느낌을 주지만 그렇지 않다. 그 이유는 2개다. 먼저 friend ..

    [C++ Primer Plus] 14. Reusing Code in C++

    대답해야 할 질문들 has-a 관계를 가지는 두 가지 방법은 무엇인가? 다이아몬드 상속을 할 때, 신경써줘야하는 부분은 무엇인가? template class에서 implicit/explicit instantiation과 specialization의 문법은 무엇인가? Classes with Object Members 클래스가 오브젝트 멤버를 가지는 방법은 2가지다. 오브젝트를 변수로 선언한다. (containment) protected or private으로 상속한다. Private Inheritance 상속할 때, Private으로 상속하면 base-class의 public 멤버와 protected 멤버가 derived-class의 private 멤버가 된다. 즉, 인터페이스가 똑같이 이어지는 게 아니기..

    [C++ Primer Plus] 13. Class Inheritance

    대답할 질문 상속을 통해 어떤 일을 할 수 있는가? derived-class의 constructor와 destructor는 어떻게 작동하는가? Is-a relationship은 무엇인가? dynamic binding이 default가 아닌 이유가 무엇인가? virtual function은 어떻게 작동하는가? derived-class에서 함수를 재정의할 때 무엇을 유의해야 하는가? Abstract Base Class는 어떻게 만들 수 있는가? 왜 만드는가? Class Inheritance OOP의 목적 중 하나가 코드 재사용성이다. Inheritance(상속)는 이 특성을 강화한다. C library를 생각해보자. 따로 소스 코드가 제공되지 않는 라이브러리라면 우리는 특정 함수를 입맛대로 바꾸기 어려울 것..

    [C++ Prime Plus] 12. Classes and Dynamic Memory Allocation

    Dynamic Memory and Classes C++은 Memory allocation을 runtime에 정하는 방식이다. C++은 Dynamic Memory allocation을 위해 new와 delete 연산자를 사용한다. 이로 인해, 우리는 새로운 문제를 풀어야만 한다. Special Member Functions C++은 다음 멤버 함수를 자동으로 만들어낸다. 만약 생성자가 없으면, default constructor를 만들어낸다. 따로 정의하지 않았다면, default destructor를 만들어낸다. 따로 정의하지 않았다면, copy constructor를 만들어낸다. 따로 정의하지 않았다면, = operator를 만들어낸다. 따로 정의하지 않았다면, & operator를 만들어낸다. 좀더 ..

    [C++ Prime Plus] 11. Working with Classes

    Operator Overloading Operator Overloading은 C++ Polymophism 중 하나다. Operator Overloading을 통해 사용자에게 실제로 어떻게 이런 연산이 이뤄지는지 감출 수 있다. 추상화는 OOP의 목표 중 하나다. Operator Overloading을 정의하는 문법은 다음과 같다. operator op(argument-list) 이 때, op는 새로운 symbol을 만들어낼 수 없다. 즉, operator@ 같은 건 만들 수 없다. 아래 예시를 보자. 컴파일러는 기본적으로 operator 왼쪽에 있는 오브젝트에서 정의됐다고 예상한다. district2 = sid + sara; district2 = sid.operator+(sara); // same Int..

    [C++ Primer Plus] 7. Funtions: C++'s Programming Modules

    Function Review 함수를 사용하려면 다음 절차를 거친다. 함수를 정의한다. 함수 프로토타입을 소스코드 서두에 쓴다. 함수를 호출한다. Why Prototypes? 함수 프로토타입은 컴파일러에게 함수 인터페이스를 알려주는 역할이다. 어떤 값이 리턴 되는지, 어떤 타입의 매개변수들을 받아야 하는지 등을 알려준다. 그러면 왜 프로토타입을 쓰는지 궁금할 수 있다. 그냥 main()에서 함수를 쓸 때마다 거기가서 찾아보면 되지 않나? 컴파일러는 그렇게 돌아가지 않는다. 너무 비효율적이기 때문이다. 애초에 함수의 정의가 다른 파일에 있을 수도 있다. 그럼 main() 위에 바로 함수를 정의하면 컴파일 되던데? 그건 맞다. 하지만 이는 별로 선호되지 않는다. main()이라는 주요 과정을 바로 볼 수 없기..

    malloc(), new

    'new' keyword new는 C++에서 등장한 키워드로 C의 malloc()을 대신한다. A* ptr = (A*)malloc(sizeof(A)); // malloc()을 활용한 동적 메모리 할당 A* ptr = new A; // new을 활용한 동적 메모리 할당 기본적으로 malloc()과 new의 차이점은 2개다. malloc()은 함수지만 new는 연산자다. 그래서 new는 연산자 오버로딩도 가능하다. new는 클래스의 생성자를 호출해준다. 이로 미뤄보아 new 연산자를 굳이 추가한 이유는 2가지를 들 수 있겠다. malloc()에 비해 문법이 간결하다. OOP는 C++의 주요 컨셉 중 하나이고 new는 오브젝트를 동적할당할 때 생성자 호출을 간단하게 구현해준다. 그렇다면 'new'는 mallo..