장르: 애초에 역경을 딛고 이룩하는 숭고한 사랑이란 없다. 그 역경 자체가 사랑이다.
프로그램 특징: 그 곳에서 살아남는 사랑이 어떤 모습으로 걸어오는지 기다려 보고 싶다.
-
[Class] Method1016분Method a.k.a. Interface Function a.k.a. Member FunctionMethod default formstatic return_type class name :: function (arguments) const;this pointer현재 설계 중인 제품의 전화 번호는 미래에 결정된다. 그런데 제작자는 아직 결정되지 않은 전화 번호를 이용해야 하는 코드를 작성해야 할 수 있다.현재 시점에서 미래의 전화 번호에 접근하는 방법이 this pointer 입니다.int main(){ USERDATA user = { , , print}; user.Print(&user); // cpp user.Print(); return 0;}클래스 객체(인스턴스) user가 ..
-
[cpp] Class1016분C의 절차지향에서 객체 지향으로 인식을 전환해야 합니다. 인식 전환의 방법을 나를 남보듯, 손님 대하듯이 - 제작자 마인드와 사용자 마인드를 분리하는 것입니다. (코드를 남보기 쉽게 짠다는 뜻) 왜냐면 6개월 후의 나는 코드를 이해할 수 없기 때문입니다.클래스란 C 구조체에서 확정된 변수, 객체, 함수를 포함한 하나의 틀 이다. C의 구조체는 함수를 포함할 수 없지만 C++는 가능하다.- 객체란 변수들과 관련된 메서드들이 모여서 만든 하나의 꾸러미다.- 메서드란 함수 형태로 클래스의 실제 동작과 상태를 구현하는 핵심 요소다.| 메서드랑 함수는 뭐가 다르고, 변수랑 함수가 모인 객체는 클래스랑 뭐가 다른가요? 왜 용어를 이렇게 여러 개 사용하시나요?객체 지향의 패러다임을 설명하기 위해 세분화된 것입니다.•..
-
[Polymorphism] Overloading1015분cpp 에서는 함수 원형이 달라지면 이름이 같아도 다른 함수가 된다. c와 중요한 차이점이다. # Overloading함수 원형(반환 형식(type), 호출 규칙, 함수 이름, Argument 구성) 중 함수 이름을 제외하고 다르게 변경할 수 있다. 그러나 반환 형식이나 호출 규칙만 다른 경우는 문법에 맞지 않다. 즉, 함수를 이름은 같고 내용은 다르게 재정의할 수 있다. - int Add(int a, int b) {} - double Add(double a, double b) {}- int Add(int a, int b, int c) {} 호출자 관점에서 호출되는 함수는 컴파일러에 의해 자동으로 결정된다. -> 모호성void TestFunc(int a){ std::cout 위 코드는 컴파일할 수 있는..
Method a.k.a. Interface Function a.k.a. Member Function
Method default form
static return_type class name :: function (arguments) const;
this pointer
현재 설계 중인 제품의 전화 번호는 미래에 결정된다. 그런데 제작자는 아직 결정되지 않은 전화 번호를 이용해야 하는 코드를 작성해야 할 수 있다.
현재 시점에서 미래의 전화 번호에 접근하는 방법이 this pointer 입니다.
int main()
{
USERDATA user = { , , print};
user.Print(&user);
// cpp
user.Print();
return 0;
}
클래스 객체(인스턴스) user가 선언되는 시점은 클래스를 정의하고 난 나중 일이다. Print()에서 user 구조체 주소를 넘겨 받아 데이터를 반환하려면 user의 주소가 필요한데 아직 주소를 모른다. cpp의 매개변수 칸에도 눈에 보이지 않을 뿐 &user를 전달하고 있다. 이렇게 첫 번째 argument로 전달된 instance address는 this 포인터(지역 변수)에 저장된다.
class abc
{
public:
abc(int param) : idx(param) {};
void print() { cout << this->abc::idx << endl;}
private:
int idx;
};
int main(){
abc a(1), b(2);
a.print();
1 이 나온다.
명확히 말하면
- a.print() 에 사실은 &a 매개변수를 넘겨준다.
- public: void print(abc * pdata) { abc * this = pdata; )를 위에 가지고 있어
-
- this = & a
this -> 를 이렇게 이용하는 것이다.
| 메서드 함수 내부에서 실제 클래스 인스턴스의 주소를 가리키는 포인터이다.
const
const는 안전 장치이자 배려이자 작성자 수준을 가늠하는 사용자 친화 코드 이자 미래이다. int Getdata() const {} 상수형 메서드로 정의하면 멤버 변수의 값을 write (변경) 수 없고, const 메서드 내에서 const가 아닌 함수를 호출할 수 없다.
추가 내용: 상수화 하는 방법은 Class *\this 를 const Class *\this 로 변경하는 것이다.
static
cpp에서 전역 변수를 사용하는 것은 좋은 선택이 아니다. 이를 해결하기 위해 전역 변수와 동일한 동작을 하지만 클래스 멤버로 소속을 가지는 static을 이용한다.
- 사용자 코드에서 클래스 메서드를 사용하려면 무조건 인스턴스 선언하거나 new 연산으로 동적 인스턴스를 생성하고 멤버 접근 연산자로 호출해야 한다.
정적 멤버 함수는 인스턴스 선언 없이 직접 호출할 수 있다. 그러나 *\this 사용이 불가능하며 선언과 정의를 반드시. 반듯이. 분리해야 한다.
class Class
{
public:
Class(int nparam) : mdata(nparam) { mCount++;}
int Getdata() { return mdata;};
void resetCount() {mCount = 0;};
// static method definition & declaration
static int GetCount() { return mCount; };
private:
int mdata;
// static method definition
static int mCount;
};
// static method declaration
int Class::mCount = 0;
int main(int argc, char* argc[])
{
Class a(10), b(0);
cout << a.Getdata() << endl; // static
cout << Class::GetCount() << endl; // access without an instance
b.resetCount();
cout << b.GetCount() << endl;
return 0;
}
결과값은
10
2
0
정적 멤버 함수는 인스턴스 및 멤버 접근 연산자(resetCount)를 이용해도 되고 클래스 이름::범위 지정 연산자(public)을 이용해 인스턴스 없이 직접 호출도 가능하다.
'Computer Science > Object Oriented Programming' 카테고리의 다른 글
[JAVA] 이것이 자바다(3판) 5장 9번 답안 (1) | 2025.04.15 |
---|---|
[cpp] 복사 생성자 (4) | 2024.11.13 |
[Template] Class template (0) | 2024.10.18 |
[cpp] Class (1) | 2024.10.16 |
[Polymorphism] Overloading (0) | 2024.10.15 |