C++보다 더 극단적인 객체지향을 지원하는 자바에서는 당연히 프라이빗 필드에 접근 불가능할 줄 알았는데 아니었네?1
foo에서 other의 프라이빗 변수에 접근하는데 정상적으로 컴파일 및 실행됨.
저게 되는 이유는 같은 클래스에서 동일한 클래스의 다른 인스턴스를 다룬다면,
이미 해당 클래스에 대한 세부적인 구현 내용을 알고 있다고 할 수 있기 때문에 캡슐화가 큰 의미가 없어진다는 듯?
https://stackoverflow.com/questions/17027139/access-private-field-of-another-object-in-same-class
아니 근데 자바는 기본적으로 pass-by-value 아닌가 왜 저게 바뀌지
https://stackoverflow.com/questions/17027139/access-private-field-of-another-object-in-same-class
클래스 변수는 value가 reference임
pass-by-value 라는 용어에 경도돼서 오개념이 생겼네
그럼 객체 자체를 복사해서 넘겨주는 게 아니고 참조 변수를 복사해 넘겨서 원본에 접근이 된다고 이해하면 되나?
참조를 넘겨서 원본에 접근하는 방식을 pass by referenced라고 함. 주소값을 넘겨서 주소가 가리키는 데이터에 접근하는 것이 문맥에 따라 pass by value, pass by reference 모두 쓸 수 있어서 혼동이 올듯
ㄹㅇ 크-린 한 C 하다가 자바 넘어오면 개헷갈림
c 포인터 넘기는 것도 본질은 pass by value잖아
근데 C는 명시적이잖아
근데 이건 내가 C를 먼저 배워서 그렇게 느끼는 걸 수도
자바도 스칼라든 객체든 명시적으로 그리고 본질적으로 값을 복사하는건 똑같은데 스칼라는 값을 복사하고 객체는 참조한다고 생각하는건 아직 동작을 잘 이해못한거임
자바는 primitive type에 대해서는 pass by value고, 객체 type이면 reference로 접근함
pass된 건 b를 가리키는 포인터 변수인 거고 포인터가 기리키는 b는 그대로 있으니 당연히 값이 변경되는 것
c++에서 int* a(new int(0)), *b = a; 하면 b와 a가 가리키는 값은 같은 주소에 있지만 a와 b는 각각 다른 변수임. 주소가 다름.
그래서 포인터 변수가 가리키는 값을 바꾸고 싶으면 인자를 int*&로 레퍼런스를 가져오거나 int**로 포인터 변수의 주소를 가져오는 거임
잘 이해가 안된다면 foo 함수 내에서 other.value에 직접 접근하는 게 아니라 other = new Foo(20)를 해보면 됨.
C 포인터 갖고 이해하면 되는구나 ㄱㅅㄱㅅ
자바 클래스 디자인이 그렇게 된 듯..
private는 instance레벨에서 설정되는게 아님.. class level이야. 해당 클래스에서만 다루겠다는거임 call by value 맞는데 assignment가 아니라 mutation(field 변경)잖아 assignment가 영향을 받는게 call by reference고. call by value는 deep copy하는 개념이 아님
이거 맞는 듯. 근데 cpp에서 레퍼런스로 받아도 assignment 하면 원본은 안 바뀌잖아 그거랑 또 다른 건가?
이거 코드가 댓글로 안써지네.. ref일때 assign하면 원본 바뀜