한국인을 위한 코드 미리보기
#include <iostream>
class MyClass
{
int num = 0;
public:
int Get() { return num; }
void Set(int a) { num = a; }
MyClass Sum1(MyClass obj)
{
MyClass temp;
temp.Set(obj.Get() + this->Get());
return temp;
}
friend MyClass Sum2(MyClass obj1, MyClass obj2);
};
MyClass Sum2(MyClass obj1, MyClass obj2)
{
MyClass temp;
// MyClass에서 friend 키워드를 주었기 때문에 private멤버에 접근이 가능한ww
temp.num = obj1.num + obj2.num;
return temp;
}
int main()
{
MyClass x; x.Set(1);
MyClass y; y.Set(2);
MyClass z1 = x.Sum1(y);
MyClass z2 = Sum2(x, y);
std::cout << z1.Get() << " " << z2.Get();
return 0;
}
미친 나도 친구가 없는데 class가 친구가 있네
friend 키워드를 통해 해당 함수에 자기의 private 멤버에 접근할 수 있다.
뭐야 ㅅㅂ 미친거아님?wwww 이라고 생각할 수도 있겠지만.... class의 캡슐화에 위배된다...라네요.
사실 저는 캡슐화 알빠노(물론 중요함. 하기 귀찮아서 그렇지) 라는 입장이기 때문에 별 생각 안들지만, 딱 보자마자 든 생각이.. 의존성이 너무 강해진다? 였다는 것.
(의존성이라는 것은 서로가 서로를 너무 의존해서 하나가 바뀌거나 없어지면 의존하던 코드도 같이 무너지는? 그런 느낌이라고 생각합니다. 사실 제 생각임 팩트인진 모름.)
어쨋든 friend 써보니까 매우 신세계긴 하네요. 하지만 안쓸듯. 일단 앞서 말했듯이 캡슐화를 위배하는 것도 있지만, 저는 그런거 알빠노고, 사실 의존성이 강해지는게 너무 맘에 걸리긴 한다는ww 추가적으로 friend를 남발하다 보면 여기저기서 멤버를 가져오기 때문에 그 유명한 스파게티코드가 될거 같다는? 느낌적인 느낌
그래도 연관성이 높은 객체끼리 쓰면 편의성이 아주 높아진다고 하니 감당가능하신 분들은 알아서 쓰시길.... 전 지능딸려서 남발하다가 나중에 유지보수를 못할 것 같아서 안쓸 것 같습니다 ㅅ_ㄱ...
20240907추가
friend..... 쓰는 날이 오긴 하더라.......
캡슐화를 위반하는 대신 은닉성을 좀 더 강화할 수 있어서 가끔 쓸거같습니다....
다만 남발하면 여전히 복잡해지고, 어쨋든 캡슐화를 위반하는거니 조심해서 써야 된다는 강박을 가지고 있는 중..
friend가 좋긴한데 너무 치트키 느낌이라 공부하는 입장에선 자제해서 써야겠습니다.
'프로그래밍 > C++' 카테고리의 다른 글
[C++] operator 연산자 (0) | 2024.06.14 |
---|---|
[C++] 중첩 클래스를 알아보자.araboza (0) | 2024.06.12 |
[C++] const, 근데 class를 곁들인 (0) | 2024.06.11 |
[C++] static, 근데 class를 곁들인 (0) | 2024.06.11 |
[C++] 헤더를 미리 컴파일 하는 방법 (0) | 2024.04.11 |