프로필사진

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(); 와 같이 바뀌어야 오류 없이 실행이 가능하다.

 

이것 저것 배우다 보니 했갈리는게 많아지는 것 같다..

반응형
댓글
반응형
인기글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함