inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

CS 지식의 정석 | 디자인패턴 네트워크 운영체제 데이터베이스 자료구조

Q. static키워드는 왜 사용하며 단점은 무엇인가요? ★☆☆

자바 코드를 C++코드로 변형하면서 궁금한 점이 생겼습니다 :)

106

한유태

작성한 질문수 79

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가지 궁금한 점이 있습니다.

 

  1. a->talk(*a, *b); b->talk(*a, *b);

 

(2번은 답변안해주셔도 괜찮습니다!! 아.. 너무 간단한걸 기억을 못했었네요 ㅠㅠ Person::talk(*a, *b);)

  1. Person->talk(*a, *b);

면접 운영체제 기술면접

답변 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

한유태

즐거운 명절보내세요 :)

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 한유태님 😊

질문해주신 내용에 대해 답변드리겠습니다.

  1. Static 키워드와 메모리 할당:

Java와 C++ 모두에서 static 메서드는 인스턴스화된 각 객체가 아닌 클래스 자체에 귀속됩니다. 따라서, 인스턴스를 통해 호출해도 메모리 할당이 여러 번 일어나지 않고, 하나의 메서드가 공유됩니다.

C++에서 static 메서드를 인스턴스를 통해 호출할 수 있지만, 이는 별로 추천되지 않으며 클래스 이름을 통해 호출하는 것이 일반적입니다.

   a->talk(*a, *b); // 가능하지만 권장되지 않음
   Person::talk(*a, *b); // 권장되는 호출 방법

a->talk(*a, *b);와 같은 방식으로 호출할 때도 결국 클래스 범위의 talk 메서드가 호출되므로, 메모리 할당이 클래스당 1회만 되며 이는 동일합니다.

  1. C++에서 클레스 이름을 통한 메서드 호출:

C++에서는 클래스명으로 직접 static 메서드를 호출해야 합니다. Person->talk(*a, *b);는 문법적으로 올바르지 않습니다. 대신, 다음과 같이 작성해야 합니다.

   Person::talk(*a, *b); // 클래스명을 사용한 호출

이는 Java와 C++의 차이점 중 하나로, Java에서는 클래스명과 인스턴스 모두를 통해 static 메서드를 호출하는 것이 가능하지만 가독성과 코드의 명확성을 위해 클래스명을 사용하는 것이 추천됩니다.

유사한 질문에 대해서는 아래 링크를 참고해 주세요:
- C++에서의 static 메서드 사용

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

REST API (Self-descriptive messages)

0

25

1

시스템 엔지니어 관련 질문입니다.

0

51

2

오버라이딩 관련하여 질문드립니다.

0

62

2

교착상태의 4가지 필요조건이 필요충분조건이 아닌 이유

0

89

1

렌더 트리, 렌더 레이어와 그래픽 레이어

0

56

2

로컬스토리지, 세션스토리지, 쿠키의 공통점

0

67

1

IPv4가 IPv6보다 빠른 경우

0

98

2

UDP가 전송계층의 역할을 못하는 건 아닌지

0

59

1

Path MTU 발견하였음에도 패킷 분할이 필요한 이유?

0

65

2

교재의 LFU 알고리즘에서 6번이 왜 히트인가요?

0

64

2

페이지 교체 알고리즘? 프레임 교체 알고리즘?

0

81

2

Static 키워드가 메모리에 올라가는 시점

0

77

2

헤더 압축부분 질문드립니다

0

72

2

공유 캐시 관련 질문 드립니다.

0

56

2

컨텍스트는 context와 contextual information으로 나눠진다는게 무슨뜻인가요?

0

198

1

회선과 대역폭의 관계

0

60

2

44강 질문

0

92

2

버스 토폴로지 질문 있씁니다

0

53

1

자바스크립트, xml 문법 관련

0

66

2

전략패턴과 의존성주입 질문

0

69

2

Model이 비즈니스 로직을 담당하나요?

0

106

2

CS 공부 하는 법

0

181

2

큰돌님 블로그에 개념정리해서 올려도될까요!

0

137

2

FIN 세그먼트 질문

0

70

2