왜 그럴까? 쉽게 풀면, 모두다 이렇게 숙지하고 사용하기 때문이다. 이 모두 다 는 C++ 역시 마찬가지여서 이렇게 해야만 한다, (유들있게 한다면, 뭐 대충 해도 되겠지만) 이 의미는 어떤것을 지니게 될까? 학생 is a 사람, 하지만 사람 is a 학생 은 되지 않는것이다. C++로 풀자면 "상속받은 녀석은 상속해준 녀석이 될수 있지만, 상속해준 녀석은 상속받은 녀석이 될수 없다"는것이다. 그렇기 때문에, 이런 오류를 하지 말라고 필자는 강하게 말하고 있다. 왜냐하면 이런 오류가 C++의 엄청난 기능인 "다향성" 기능을 사용할 때 쉽게 범하는 오류이기 때문이다. 그렇다고 현실에 있는것이 바로 이런것들을 적용할수는 없다. 대표적인 예가 정사각형은 직사각형의 일종이지만, 정사각형이 직사각형을 상속하는 형..
책 정리/Effective C++ 3판 검색 결과
이 말이 무엇을 의미 하는가? 쉽게 말한다면 #include 관계를 뜻하고, 이 #include 관계를 줄이자는 뜻이다. 왜 파일 간 의존성을 줄어야 할까? 컴파일에 소모되는 시간을 줄여주기 때문이다. #include 관계가 많을수록 코드 수정 후 재컴파일에 들어가는 시간이 비례한다. 이게 프로젝트 중이라면, 정말 많은 시간을 컴파일하는데만 써야 할 것 이다. 어떻게하면 파일간의 의존성을 줄일수 있는가? "구현 세부사항이 필요한 경우와 필요 없는것 경우를 나누면 된다" 이것이 원리이다. 구현 세부 사항이 필요한 경우가 어떤 경우인가? 풀면 이해가 쉽다. 구현 하는데 그 세부사항이 필요하다는것을 뜻하는데, 그 예로 A라는 클래스가 B라는 클래스의 객체를 가질 때, 객체 구현시 그 세부사항이 필요한 경우이다..
인라인 함수를 모른다면 이야기가 .. 진행되지 않으나, 기초기 때문에 넘긴다. 미주얼고주알 따져서 이해해두어야 하는 이유는 여러개가 있다. .. 뭐 .. 이해하고 나니 인라인도 인라인 나름이라는 생각을 하게 되어서 결론만 나오게 된다. 인라인 사용법 첫째, 간단한것만 inline 키워드를 사용 한다.(클래스 내부의 .. 그냥 멤버 리턴같은 것들) 이것밖에 없다. 둘째, 생성자와 소멸자를 inline 으로 사용 하려 들지 말자.(생성자와 소멸자 호출 구역이 상대적으로 많고, 생성자 수정을 하게 된다면, 생성자 호출 구역을 전부 재컴파일 해야 되기 때문이다) 이것만은 잊지 말자! 1. 함수 인라인은 작으면서 자주 호출되는 함수에 대해서만 하는 것으로 묶어 두자. 2. 함수 템플릿이 대개 헤더 파일에 들어 간..
예외 안전성이란 무슨 말인가? "예외적 상황에 대해서 안전한가?"에 대한 말이다. 왜 확보해야 하는가? .. 코딩중에 컴파일타임에 에러를 다 찾아내면 좋겠지만, 컴파일 타임에 찾지 못하는 에러들은 정말 찾기가 힘들어진다. 그렇기 때문에, 예외적 상황에 대해서 대처를 해야지만 디버깅이 용이해지고, 프로그램 자체도 더 견고해지기 때문에 확보해야 한다. 함수들의 예외 안전성은 어떻게 동작해야 하는가? 1. 자원이 절대 새도록 만들지 않는다. 2. 자료구조가 더렵혀지는 것을 허용하지 않는다.(.. 이 말은 자료가 자료가 아닌게 되는 상황을 말한다.) 그렇다면, 예외 안전성을 갖춘 표준 보장은 무엇인가? 1. 기본적인 보장(basic guarantee) : 예외 발생에 있어, 자원 누수를 시키지 않겠다는 보장 2..
이해하기 전에 알아야 하는 핸들이란? 다른 객체에 손을 댈 수 있게 하는 매개자를 지칭하며, 참조자등의 성격을 띄우고 있다.(외부 참조) 그렇다면 왜 '핸들'을 반환하는 코드를 피하는것일까? 쉽게 말해서 클래스 내부 멤버 변수는 private 으로 해야 한다고 배웠을 것이다. 그런데 멤버 변수에 대한 포인터나 레퍼런스를 반환하게 된다면, 그것이 const 로 한다해도, 외부에서 아주 손쉽게 변환을 가할수 있는 상태가 된다. 이 상태는 바로 캡슐화가 깨진 상태가 된다. 캡슐화가 왜 중요한지는 다들 알것이므로 생략한다. 저자 역시, 핸들을 반환해야 하는 어쩔수 없는 경우에만 핸들을 반환한다고 말한다. 어찌 되었던, 클래스 private에 넣는것을 간과하여, 코딩을 하면 안된다는 것을 알려 준다. 이것만은 잊..
C++에서 캐스팅을 왜 절약해야 하는지 알아가기 전에 우선 알아야 할것은 C++ 스타일식 캐스팅 변환을 왜 해야 하는지 부터 알아야 한다. 기존의 C스타일의 캐스팅은 (T)표현식, T(표현식), 이렇게 사용 했었지만, 이것을 C++에선 '구형 스타일 캐스트' 라고 불린다. C++에서는 새로운 캐스팅 변환은, const_cast(표현식), dynamic_cast(표현식), reinterpret_cast(표현식), static_cast(표현식) 등이 있다. 각각의 중요한점만 말한다면, const_cast 는 객체에 걸려있는 상수성을 없애는데 사용 한다. dynamic_cast 는 상속 계통으로의 캐스팅을 '확인'해 가면서 캐스팅을 해주며, 이것으로 인항 많은 비용을 지불하는 캐스팅 연산자이다. reinter..
최근댓글