-
Lecture3 FRIENDSDSP/Lecture 2024. 5. 23. 12:32
Friends (친구 함수 및 클래스)
C++에서 friend 키워드는 특정 클래스의 비공개(private) 또는 보호된(protected) 멤버에 접근할 수 있는 함수를 선언하는 데 사용됩니다. 이러한 친구 함수나 클래스는 그 클래스의 멤버가 아니지만, 해당 클래스의 비공개 멤버에 접근할 수 있습니다.
주요 개념
- 친구 함수:
- 친구 함수는 클래스의 비공개 멤버에 접근할 수 있습니다.
- 이러한 함수는 클래스 내부에서 선언되지만 클래스 외부에 정의됩니다.
class MyClass { private: int secret; public: MyClass() : secret(0) {} friend void revealSecret(MyClass& obj); }; void revealSecret(MyClass& obj) { std::cout << obj.secret << std::endl; // 비공개 멤버에 접근 }2.친구 클래스:
- 친구 클래스는 다른 클래스의 비공개 및 보호된 멤버에 접근할 수 있습니다.
- 이를 통해 두 클래스 간의 긴밀한 협력이 필요할 때 유용합니다.
class MyClass { private: int secret; public: MyClass() : secret(0) {} friend class FriendClass; }; class FriendClass { public: void accessSecret(MyClass& obj) { std::cout << obj.secret << std::endl; // 비공개 멤버에 접근 } };friend 키워드의 사용
- 장점:
- 클래스의 비공개 멤버에 대한 특별한 접근을 허용하여 특정 함수나 클래스가 내부 데이터를 수정하거나 조회할 수 있게 합니다.
- 특히 연산자 오버로딩 시 유용합니다.
- 단점:
- 캡슐화를 약화시킬 수 있습니다. 친구 함수를 남용하면 클래스의 내부 구현이 외부에 노출되어 유지보수가 어려워질 수 있습니다.
- 코드의 복잡성을 증가시킬 수 있습니다.
주의사항
- 친구 함수나 클래스는 클래스의 멤버가 아니므로 객체 지향의 원칙에 완전히 부합하지 않습니다.
- 필요한 경우에만 신중하게 사용해야 합니다.
#pragma once #include <iostream> class Vector2D { private: float fX; float fY; public: Vector2D(float aX = 1.0f, float aY = 0.0f) noexcept; Vector2D(std::istream& aIStream) : Vector2D() { aIStream >> *this; } float x() const noexcept { return fX; } float y() const noexcept { return fY; } Vector2D operator+(const Vector2D& aOther) const noexcept; Vector2D operator-(const Vector2D& aOther) const noexcept; Vector2D operator*(const float aScalar) const noexcept; float dot(const Vector2D& aOther) const noexcept; float cross(const Vector2D& aOther) const noexcept; float length() const noexcept; Vector2D normalize() const noexcept; float direction() const noexcept; Vector2D align(float aAngleInDegrees) const noexcept; friend std::istream& operator>>(std::istream& aIStream, Vector2D& aVector); friend std::ostream& operator<<(std::ostream& aOStream, const Vector2D& aVector); }; Vector2D operator*(const float aScalar, const Vector2D& aVector) noexcept;코드 분석
- 헤더 가드:
- #pragma once는 헤더 파일이 여러 번 포함되는 것을 방지합니다.
- 클래스 선언:
- class Vector2D는 2차원 벡터를 나타내는 클래스를 정의합니다.
- fX와 fY는 벡터의 x와 y 좌표를 나타내는 비공개 멤버 변수입니다.
- 생성자:
- Vector2D(float aX = 1.0f, float aY = 0.0f) noexcept는 기본 생성자로, 두 개의 부동 소수점 인자를 받아 초기화합니다. 기본값은 각각 1.0과 0.0입니다.
- Vector2D(std::istream& aIStream)는 입력 스트림으로부터 값을 읽어 벡터를 초기화합니다.
- 접근자 함수:
- float x() const noexcept와 float y() const noexcept는 각각 x와 y 좌표 값을 반환하는 상수 멤버 함수입니다.
- 연산자 오버로딩:
- Vector2D operator+(const Vector2D& aOther) const noexcept는 벡터 덧셈을 정의합니다.
- Vector2D operator-(const Vector2D& aOther) const noexcept는 벡터 뺄셈을 정의합니다.
- Vector2D operator*(const float aScalar) const noexcept는 스칼라 곱셈을 정의합니다.
- float dot(const Vector2D& aOther) const noexcept는 점 곱(내적)을 정의합니다.
- float cross(const Vector2D& aOther) const noexcept는 외적(크로스 곱)을 정의합니다.
- 기타 멤버 함수:
- float length() const noexcept는 벡터의 길이를 반환합니다.
- Vector2D normalize() const noexcept는 단위 벡터를 반환합니다.
- float direction() const noexcept는 벡터의 방향(각도)을 반환합니다.
- Vector2D align(float aAngleInDegrees) const noexcept는 벡터를 주어진 각도로 회전시킵니다.
- 친구 함수 선언:
- friend std::istream& operator>>(std::istream& aIStream, Vector2D& aVector)는 입력 연산자를 오버로딩하여 Vector2D 객체의 입력을 처리할 수 있도록 합니다.
- friend std::ostream& operator<<(std::ostream& aOStream, const Vector2D& aVector)는 출력 연산자를 오버로딩하여 Vector2D 객체의 출력을 처리할 수 있도록 합니다.
- 전역 연산자 오버로딩:
- Vector2D operator*(const float aScalar, const Vector2D& aVector) noexcept는 스칼라 곱셈을 오버로딩하여 스칼라와 벡터의 곱을 정의합니다.
요약
페이지 86은 Vector2D 클래스의 입력 및 출력 연산자를 친구 함수로 선언하여, 클래스 외부에서도 클래스의 비공개 멤버에 접근할 수 있도록 합니다. 이를 통해 Vector2D 객체의 데이터를 쉽게 입력하고 출력할 수 있게 됩니다.
접근자 함수인 float x() const noexcept와 float y() const noexcept가 왜 필요한지에 대해 이해하기 쉽게 설명해드릴게요.
객체 지향 프로그래밍과 캡슐화
먼저, 객체 지향 프로그래밍(Object-Oriented Programming, OOP)에서는 **캡슐화(Encapsulation)**라는 중요한 개념이 있습니다. 캡슐화는 데이터(변수)와 이 데이터를 조작하는 함수(메서드)를 하나의 단위로 묶는 것을 의미하며, 클래스가 이를 구현합니다. 캡슐화의 중요한 목표 중 하나는 데이터 보호입니다.
왜 접근자 함수가 필요한가요?
클래스 내부의 데이터는 외부에서 직접 접근하는 것을 방지하기 위해 보통 private으로 선언됩니다. 하지만, 데이터를 읽어오는 방법은 필요합니다. 이를 위해 접근자 함수를 사용합니다.
x()와 y() 함수의 필요성
데이터 보호
- 데이터 보호:
- fX와 fY는 벡터의 x좌표와 y좌표를 나타내는 변수입니다.
- 이 변수들은 private으로 선언되어 있기 때문에 클래스 외부에서 직접 접근할 수 없습니다.
- x()와 y() 같은 접근자 함수를 통해서만 값에 접근할 수 있습니다. 이렇게 하면 데이터가 안전하게 보호됩니다.
읽기 전용 접근
- 읽기 전용 접근:
- x()와 y() 함수는 값을 반환하지만, 값을 변경하지는 않습니다.
- const 키워드는 이 함수들이 데이터를 변경하지 않음을 보장합니다. 이렇게 하면 객체의 상태가 의도치 않게 변하지 않도록 보호할 수 있습니다.
코드의 가독성
- 코드의 가독성:
- x()와 y() 같은 함수는 클래스의 인터페이스를 제공합니다. 이를 통해 클래스 사용자가 쉽게 객체의 데이터를 읽을 수 있습니다.
- 예를 들어, vec.x()를 호출하면 vec 객체의 x좌표를 쉽게 얻을 수 있습니다. 이는 코드를 읽고 이해하기 쉽게 만듭니다.
예제와 함께 설명
예를 들어, 게임에서 캐릭터의 위치를 나타내는 Vector2D 객체가 있다고 생각해봅시다. 우리는 캐릭터의 위치를 읽어오고 싶지만, 위치 데이터를 직접 수정해서는 안됩니다.
'DSP > Lecture' 카테고리의 다른 글
OOP Desig (0) 2024.06.14 Lecture3 Vector Input Operator << (0) 2024.05.23 Lecture3 Vector2D 입력 연산자 >> (0) 2024.05.23 Lecture 2 - 정적 캐스트(static_cast) (0) 2024.04.25 Lecture 2 - Operator, Overloading and Vector (1) 2024.04.25 - 친구 함수: