|
오전&오후 님이 쓰신 글 :
: 프랜드함수를 이용하면 좋으점이 많지요..^^
: 특히 프랜드함수는 연산자오버로딩에 많이 쓰이지요..
: 멤버함수로 표현못하는것들을 friend함수로 하시면
: 간단 명료하게 만드실수 있으니까요..(특히 연사자에 관해서..)
:
: 제가 말씀드린건..
: 프랜드함수로 만드시면 더이상 클래스의 멤버함수가 아니라는거죠..
: 그런데..클래스의 데이타멤버에 아무런 제약없이 엑세스가 가능하게 됩니다..
: 이점이 바로 클래스의 추상화에 위배된다는거죠..^^
: 원래의 클래스 설계에서는 클래스의 데이타멤버는 멤버함수(인터페이스)를
: 통해서만 엑세스가 가능해야 합니다..
: 그런데 일반함수에서도 가능하게 되는거지요..friend라는 키워드를 사용하면
: 그러기때문에..
: 꼭 필요한 경우에만 사용하라는거지요..
: 클래스의 모든 멤버함수를 friend함수로 만들수는 없는거잖아요..^^
: 뭐 어떻게 구현하느냐는 프로그래머의 마음이겠지만요..^^
아직도 뭔가 오해가 있으시네요.
역시 성안당 번역의 C++ 기초 플러스(C++ Primer Plus)에 있는 글을 올립니다.
------------------------------------------------------------------------------------
프렌드는 OOP에 충실하지 않을 것일까?
멤버가 아닌 함수가 개별 데이터에 접근할 수 있게 하는 프렌드 메커니즘은, 얼핏보면 데이터 은닉이라는 OOP의 원칙을 위반하는 것 같다. 그러나 그것은 지나치게 좁은 시각이다. 그러지 말고, 프렌드 함수를 확장된 클래스용 인터페이스의 일부라고 생각해 보라.
예를 들어 개념적으로 보면, double을 Vector에 곱하는 것은, Vector를 double에 곱하는 것과 거의 같은데, 전자는 프렌드 함수를 요구하는 반면, 후자는 멤버 함수로도 수행할 수 있다. 이것은 아주 깊은 개념적인 차이가 아니라, 단지 C++ 문법의 결과일 뿐이다. 프렌드 함수와 클래스 메소드(멤버 함수)를 모두 사용하면, 같은 사용자 인터페이스를 가지고 두 연산을 모두 표현할 수 있다. 또한 클래스 선언만이 어느 함수가 프렌드인지를 결정할 수 있으므로, 개별 데이터에 접근하는 함수를 제어하는 것은 여전히 클래스 정의이다. 쉽게 말해서 클래스 메소드와 프렌드는, 클래스 인터페이스를 서로 다른 방법으로 표현하는 메커니즘이다.
|