Go, Vantage point
가까운 곳을 걷지 않고 서는 먼 곳을 갈 수 없다.
Github | https://github.com/overnew/
Blog | https://everenew.tistory.com/
티스토리 뷰
반응형
지금까지 배운 객체지향 언어는 Java와 C++ 이였는데, 필자는 C++를 먼저 접하고 Java를 공부했었다. 두 언어는 지향점이 다르더라도 둘 다 C언어 기반의 객체지향 언어라 비슷한 구조가 많다. 그런데 웬걸? 두 언어를 왔다 갔다 공부하다 보니 c++에서 계속 이해가 되지 않는 코드가 있었다.
아래의 예제 코드를 보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#include <iostream>
using namespace std;
class Test{
public:
Test(int n): data(n){}
Test(const Test& rhs){ //복사 생성자
data = rhs.data; //rhs의 private멤버인 data접근이 가능하다!
}
int GetData(){return data;}
private:
int data=0;
};
int main() {
Test a(7);
Test b=a; //복사 생성자 호출
cout<<b.GetData()<<endl;
return 0;
}
|
cs |
20번 줄에서 복사생성자를 호출하여 9번의 코드가 실행돼도 결과는 7로 오류 없이 나온다!! 도대체 이해가 가지 않아 구글링을 해보니 이유는 다음과 같았다.
9번 줄에서 rhs의 private 멤버에 접근이 가능한 이유는 C++에서 접근제한자는 인스턴트 단위가 아니라 클래스 단위 동작하기 때문이다. 즉 ,서로 다른 인스턴스라도 같은 클래스 타입이라면 private 접근 제한 멤버도 접근, 수정이 가능하다.
반면 철저한 객체지향을 고수하는 Java에서는 접근 제한자가 인스턴트 단위로 동작한다. 따라서 같은 클래스 타입의 인스턴스라도 각자의 private 멤버에는 접근을 할 수 없다. 즉, Java코드라면 9번 줄은 data = rhs.GetData(); 와 같이 바뀌어야 오류 없이 실행이 가능하다.
이것 저것 배우다 보니 했갈리는게 많아지는 것 같다..
반응형
'개발 > C++' 카테고리의 다른 글
[C++] Vector copy constructor의 깊은 복사 여부 (0) | 2023.07.04 |
---|---|
[C++] cout에서 endl보다는 \n이 권장되는 이유 (0) | 2020.10.09 |
댓글