friend 키워드
C++에서는 캡슐화를 위한 접근지정자(private, protected, public)들을 갖고 있다.
그 중 private과 protected로 지정된 함수 및 변수들은 외부에서 접근이 불가능하다.
(protected는 하위클래스에서 접근 가능)
이러한 상황에서 어떤 특정 객체 or 함수에서만 예외적으로 접근을 허용하도록 하기 위해 friend 키워드를 이용한다.
ex)
Item이라는 클래스가 있다.
이 클래스는 Init이라는 함수를 통해 내부 변수들을 초기화한다.
그러므로 외부에서 Item 객체 생성 후 반드시 Init 함수를 따로 호출해야한다.
그리고, Item 클래스는 반드시 ItemManager 클래스를 통해 생성되어야한다.
(이유는 여러가지겠지만, ItemManager에서 Item을 위한 추가작업을 한다고 가정)
이 부분을 직접 구현하기 위해, ItemManager에서 Item을 생성 후, Item의 Init 함수를 호출해주면 될 것이다.
하지만, 여기에 애매한 문제가 하나 있다.
ItemManager에서 Item의 Init 함수를 접근하기 위해 Init 함수가 public으로 설정되어야 하는데,
이렇게 되면 ItemManager외의 다른 곳에서도 Init 함수가 호출될 가능성이 생긴다.
이 가능성을 완전히 배제할 수는 없는 것인가?
이것이 가능하도록 하기 위해 Item의 Init 함수는 private으로 설정하고, ItemManager만 friend로 접근이 가능하도록 해주면 된다. (첫번째 방법)
하지만 ItemManager의 다른 함수에서도 Init 함수의 접근이 가능하다. 굳이 그럴 필요가 있을까?
ItemManager의 함수들 중에서도 Init함수를 호출해주는 함수(CreateItem)만 접근이 가능하도록 해주면 될 것이다.
(두번째 방법)
만약 ItemManager의 CreateItem함수가 템플릿 버전으로 구현되어 있더라도 friend 설정이 가능할까?
템플릿 멤버함수 friend 설정 방법 참고. (템플릿 버전)
class ItemManager
{
public:
void CreateItem();
//template <class T>
//T* CreateItem(){}
}
class Item
{
private:
void Init();
// #첫번째 방법 ItemManager에서 Item의 모든 멤버함수, 멤버변수 접근가능
friend ItemManager;
// #두번째 방법 ItemManager의 CreateItem()에서 Item의 모든 멤버함수, 멤버변수 접근가능
//friend void ItemManager::CreateItem();
// #템플릿 버전
//template <class T>
//friend T* ItemManager::CreateItem();
};
Loop 중 원소 삭제
루프 도중 원소가 삭제되면 어떻게 될까?
원소가 삭제되면 순회 작업이 망가지고 예외가 발생할 것이다.
for (auto e : arr)
{
// arr의 원소를 제거하는 어떤 코드 ...
}
이 문제를 어떻게 해결하기 위해서 순회를 역순으로 하는 방법이 있다.
이렇게 작성하면 문제없이 순회 도중에도 원소를 삭제할 수 있다.
for (int i = arr.Num(); i >= 0; --i)
{
// arr의 원소를 제거하는 어떤 코드 ...
}
'프로그래밍 > C++' 카테고리의 다른 글
[C++] C++에서 Partial Class 구현 방법 (0) | 2023.09.23 |
---|---|
[C++] C++에서 Interface 구현 방법 (0) | 2023.09.23 |
[C++] Casting 총정리 (0) | 2023.09.23 |
[C++] 객체 복사 (0) | 2021.04.27 |
[C++] C++의 데이터 타입 종류 (0) | 2021.04.17 |