아아, 이해하는데 시간 걸렸다. friend 함수를 사용하라는게 아니라 비멤버 비프렌드 함수를 이용하라는 뜻이다! 자, 왜 비멤버 비프렌드 함수와 가까워져야 할까? 우선 이 말은, 클래스 공개 내부 멤버함수를 조합하는 편의 함수에게만 적용된다.. 이 함수는 클래스 내부에 접근할수가 없고, 1. 무조건 클래스의 멤버 함수만을 이용해야 하며, 2. 멤버 함수를 이용하기 위해서는 매개체인 객체가 항상 필요하기 때문이다. 즉, 어디서 호출되는지 한눈에 파악할수 있으며, 수정 구역도 한정되기 때문이다. 이것으로 구체적인 장점은 무엇이 있을까? 첫째, 캡슐화를 더 강화 할수 있다 왜냐하면, private 멤버 데이터 접근 함수가 적어지기 때문이다.(많은 수의 private 접근 허용 함수가 있다면, 많은 수의 변경..
EC++ 검색 결과
참조자를 왜 반환해도 되지 않나? 매개변수가 참조자이고, 그 참조자를 반환하는 경우에는 상관이 없다. 하지만, 함수 내부에서 선언된 객체의 경우에는 크게 잘못 된다. 그 이유는 어디에 있나? .. RAII 방식을 이해 했다면 그 이유를 알수 있을 듯 하지만, 설명하자면, 스택에 올라간 객체는 존재 할수 있는 범위(Scope)가 있다. 함수 내부에 선언(스택에 올려진)된 객체의 경우, 함수 종료 후 전기적 쇼크로 날라 간다. 그러므로 안에 있던 객체를 참조자로 리턴하게 되면 큰일난다. 그러면, 생성되고 소멸되는 객체를 어떻게 최적화 시키나? 리턴 타입을 임시객체 형태로 하기만 하면, 컴파일러가 알아서 처리해 준다. 이런 방법은 많은 컴파일러 회사들이 지원하고 있으며, 흔히들 "RVO(return value..
'값에 의한 전달' 이란 무엇을 뜻하는 것일까? 함수에 전달되는 인자를 복사하여 전달되는 방식 '상수객체 참조자에 의한 전달'이란 무엇을 뜻하는 것일까? 포인터나 레퍼런스 즉 * 나 & 로 전달하는 방식을 뜻한다. 상수 이므로 const type * 나 const type& 을 뜻한다. 둘의 차이점이 있다면 무엇일까? 복사 할때 들어가는 비용에 차이가 있다. 값에 의한 전달은 전달되는 인자의 크기가 크면 클 수록 복사 되는 비용이 점점 많이 지불해야 할것이다. 하지만 상수객체 참조자는 주소값인 4Byte(64bit 환경에선 8Byte)의 비용만 지불하면 되기 때문에 그 비용은 일정하다. 또한 참조에 의한 전달 방식은 슬라이싱 문제(복사 손실 : Slicing problem)가 없어진다. 그렇다면 무엇이 ..
클래스 설계? 타입 설계? C++에서 새로운 클래스를 설계하는다는것은 타입을 설계하는 것과 같다. 왜냐하면 그 클래스에는 operator 오버로드, 메모리 할당 및 해제, 객체 초기화 및 종료 등 모두 클래스에서 하기 때문이다. 타입은 어떻게 설계 할것인가? EC++ 3판에서는 많은 것들 중 고수들은 몇가지 질문을 스스로 던저 자신을 괴롭히며 만든다고 한다. 1. 새로 정의한 타입의 객체 생성 및 소멸은 어떻게 이루어져야 하는가? 2. 객체 초기화는 객체 대입과 어떻게 달라야 하는가? 3. 새로운 타입으로 만든 객체가 값에 의해 전달되는 경우에는 어떤 의미를 줄 것인가? 4. 새로운 타입이 가질 수 있는 적법한 값에 대한 제약은 무엇으로 잡을 것인가? 5. 기존의 클래스 상속 계통망에 맞출 것인가? 6...
인터페이스 설계란 무엇을 말하는 것일까? 클래스의 접근 권한을 이야기 하는것이 아닌, 클래스나 함수, 템플릿의 사용 환경을 말하는것이다. 그렇다면, 엉터리로 쓰게인 어렵게 하자는 말이 도데체 무슨 말일까? void f(int a, int b) 라는 함수가 있다고 치면, 이 두개의 int형은 서로 다른 속성이 있을 것이다. 그런데 사용하는 입장에선 엉터리로 1번째 매개변수 자리에 2번재 매개변수를 넣어도, 함수는 그 데이터 그대로 받아들여, 원하는 연산을 해주지 않게 된다! 그래서, 햇갈려 하는 함수에는 int형이 아닌, 속성을 가진 int형을 넣어 버리면, 제대로 쓰기엔 쉽게 되고 엉터리로 쓰기엔 어렵게 된다!(값을 넣을때 형 변환을... ㅋㅋㅋ) 이런 마인드로 동적 메모리로 할당한 객체의 참조자를 리턴..
무슨말?(제목이 조금 길다) 객체 생성 직 후 스마트 포인터에 저장한 다음, 그 스마트 포인터로 사용하라는 뜻 왜!? 메모리 누수가 발생될 수 있기 때문이다. 언제? 함수의 매개변수로써 스마트 포인터를 받을 때, 함수의 매개변수가 초기화가 이루어지는 타이밍이 각각의 컴파일마다 다르기 때문에, 매개변수 초기화가 만약.. 1. 동적 메모리를 할당 예, new CBabo 처럼 2. 함수의 리턴값을 매개변수로 할당 예, sence() 3. 스마트포인터에 동적 메모리를 담는다. 예) Smart_PTR pw에 1번의 리턴 담음 바로 이때 2번에서 예외가 발생하면, .. 1번은 영영 잃어 버리게 된다. 이렇게 매개변수 초기화 타이밍이 각 컴파일마다 다르고 바뀔 수 도 있다. 그래서 매개변수의 초기화가 언제 발생 되는..
최근댓글