작성
·
36
·
수정됨
0
안녕하세요 선생님 🙂
코테부터 CS지식까지 선생님께 많은 지식을 배우는 것 같습니다 ㅎㅎ 정말 감사합니다 ^^
다름이 아니라 Java 코드를 C++ 코드로 변형하면서 궁금한 부분이 생겨서 질문 드립니다. 먼저, 아래는 C++로 변형한 코드입니다.
#include <iostream>
using namespace std;
class Person {
public:
// constructor
Person()
: name("alanwalker"), IQ(100), str(100)
{
}
Person(string Name, int Iq, int Str) {
name = Name;
IQ = Iq;
str = Str;
}
// 메서드
void levelup() {
IQ = IQ + 1;
str = str + 1;
cout << name << "의 지능과 힘이 증가했습니다! " << IQ << " / " << str << '\n';
}
/*void talk(Person a, Person b) {
cout << a.name << " & " << b.name << "이 대화를 시작했다!" << '\n';
}*/
static void talk(Person a, Person b) {
cout << a.name << " & " << b.name << "이 대화를 시작했다!" << '\n';
}
private:
string name;
int IQ;
int str;
};
int main()
{
class Person* a = new Person(); // 객체 >> 인스턴스
a->levelup();
class Person* b; // 객체
b = new Person("한유태", 1000, 1); // 인스턴스
b->levelup();
a->talk(*a, *b);
b->talk(*a, *b);
//Person->talk(*a, *b);
return 0;
}
2가지 궁금한 점이 있습니다.
a->talk(*a, *b); b->talk(*a, *b);
위와 같이 a라는 객체와 b라는 객체가 static키워드로 선언되어있는 talk함수를 사용해도 메모리할당이 1번만 된다고 이해했는데요, 제가 제대로 이해한걸까요?
(2번은 답변안해주셔도 괜찮습니다!! 아.. 너무 간단한걸 기억을 못했었네요 ㅠㅠ Person::talk(*a, *b);)
Person->talk(*a, *b);
C++은 위와 같이 코드를 작성하면 식별 자체를 하지 못합니다. JAVA만 가능한 코드인건가요?
답변 2
1
안녕하세요 유태님 ㅎㅎ
1번답변을 드리면요.
저렇게 호출하시면 객체를 호출 -> 함수호출하게 되는 꼴입니다.
Person::talk(*a, *b)
이렇게 호출해야 메모리할당이 1번만 됩니다.
참고코드는 다음과 같습니다.
#include <iostream>
using namespace std;
class Person {
public:
// constructor
Person()
: name("alanwalker"), IQ(100), str(100)
{
}
Person(string Name, int Iq, int Str) {
name = Name;
IQ = Iq;
str = Str;
}
// 메서드
void levelup() {
IQ = IQ + 1;
str = str + 1;
cout << name << "의 지능과 힘이 증가했습니다! " << IQ << " / " << str << '\n';
}
/*void talk(Person a, Person b) {
cout << a.name << " & " << b.name << "이 대화를 시작했다!" << '\n';
}*/
static void talk(Person & a, Person & b) {
cout << a.name << " & " << b.name << "이 대화를 시작했다!" << '\n';
}
private:
string name;
int IQ;
int str;
};
int main()
{
class Person* a = new Person(); // 객체 >> 인스턴스
a->levelup();
class Person* b; // 객체
b = new Person("한유태", 1000, 1); // 인스턴스
b->levelup();
a->talk(*a, *b);
b->talk(*a, *b);
Person::talk(*a, *b);
return 0;
}
아 그리구
즐거운 추석 보내세요 ㅎㅎ
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다. 한유태님 😊
질문해주신 내용에 대해 답변드리겠습니다.
Java와 C++ 모두에서 static
메서드는 인스턴스화된 각 객체가 아닌 클래스 자체에 귀속됩니다. 따라서, 인스턴스를 통해 호출해도 메모리 할당이 여러 번 일어나지 않고, 하나의 메서드가 공유됩니다.
C++에서 static
메서드를 인스턴스를 통해 호출할 수 있지만, 이는 별로 추천되지 않으며 클래스 이름을 통해 호출하는 것이 일반적입니다.
a->talk(*a, *b); // 가능하지만 권장되지 않음
Person::talk(*a, *b); // 권장되는 호출 방법
a->talk(*a, *b);
와 같은 방식으로 호출할 때도 결국 클래스 범위의 talk
메서드가 호출되므로, 메모리 할당이 클래스당 1회만 되며 이는 동일합니다.
C++에서는 클래스명으로 직접 static
메서드를 호출해야 합니다. Person->talk(*a, *b);
는 문법적으로 올바르지 않습니다. 대신, 다음과 같이 작성해야 합니다.
Person::talk(*a, *b); // 클래스명을 사용한 호출
이는 Java와 C++의 차이점 중 하나로, Java에서는 클래스명과 인스턴스 모두를 통해 static
메서드를 호출하는 것이 가능하지만 가독성과 코드의 명확성을 위해 클래스명을 사용하는 것이 추천됩니다.
유사한 질문에 대해서는 아래 링크를 참고해 주세요:
- C++에서의 static 메서드 사용
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
즐거운 명절보내세요 :)