• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

조금 엉뚱한 질문이 있습니다.

21.02.05 00:40 작성 조회수 169

0

base 클래스 내에 있는 변수 m_value를 derived에 상속해서 함수를 이용해 값을 바꾸는건 결국 derived에 있는(상속받은) m_value값을 바꾸는거 맞나요?

예를 들어 base my_base(5)와 derived my_derived(6)이 있을때 저 함수를 이용해서 값이 바뀌는건 my_derived 에 상속받은 변수 m_value 인건가요?

그게 맞다면 약간 엉뚱한 생각이 들었는데 derived 클래스 내에서 base 클래스 내의 변수를 접근해서 바꿀 수 있는 방법도 있나요?

저 위에 예시에서 나온 base my_base 의 현재 5인 m_value 값을 derived 클래스 내에서 함수를 통해 다른 수로 바꿀수도 있나요?

base 내에서 레퍼런스를 리턴하는 함수를 만들어서 m_value를 리턴하고 derived에서 그 리턴받은 함수를 이용해 값을 수정하려 해봤는데 안되더라구요.

답변 1

답변을 작성해보세요.

5

안소님의 프로필

안소

2021.02.06

안녕하세요.

"base 클래스 내에 있는 변수 m_value를 derived에 상속해서 함수를 이용해 값을 바꾸는건 결국 derived에 있는(상속받은) m_value값을 바꾸는거 맞나요?"

👉 네. 좀 더 정확하게 말씀드리자면, Derived 클래스를 바탕으로 만든 d 라는 객체 메모리 안에는 상속으로 인하여 Base 클래스로부터 만들어진 부분도 존재합니다. 즉, d 객체 메모리의 m_value 부분은 Base클래스를 바탕으로 만들어진 것이죠. 따라서 m_value의 값을 바꾸는건 d 객체 안에 들어 있는 m_value (Base클래스로부터 찍어내어 만든) 메모리(변수)의 값을 바꾸는 것이 됩니다. 

"예를 들어 base my_base(5)와 derived my_derived(6)이 있을때 저 함수를 이용해서 값이 바뀌는건 my_derived 에 상속받은 변수 m_value 인건가요?"

👉 '저 함수'라면 Derived 의 setValue 함수를 말씀하시는 것이죠? 네 맞습니다.

"그게 맞다면 약간 엉뚱한 생각이 들었는데 derived 클래스 내에서 base 클래스 내의 변수를 접근해서 바꿀 수 있는 방법도 있나요?"

👉 있긴 하지만 굳이 그렇게 코드를 짤 필요가 없습니다.

우선 "객체"와 "클래스"의 차이를 명확히 구분하셔야 합니다. 클래스는 그냥 객체의 추상적인 설계도일 뿐이며 메모리를 차지하고 실제로 존재하는 그런게 아니에요! Base 로부터 만든 객체들은 이러이러 한 속성과 기능을 가져야 한다는 머릿 속의 추상적인 설계도(실제로 메모리에 존재하는건 아닌) Base클래스를 그려놓고 이 Base 클래스(설계도)를 바탕으로 Base b1(5); Base b2(4) 이런 실제로 세상에 존재하는, 즉 메모리를 차지하고 있는 b1, b2 이런 객체들을 만들어내는 것이에요. 이 객체들은 당연히 서로 다른 메모리를 가집니다. 마치 "사람"이라는 존재는 이래야 해 하고 인터페이스만 머릿속으로 정해놓고(클래스) 실제로 그 "사람" 인터페이스를 바탕으로 "철수" "영희" 라는 실존하는 각각의 서로 다른 존재들이 만들어지는게 바로 객체입니다. 따라서 my_base와 my_derived 는 별개의 객체입니다. my_derived 객체 메모리 안에 들어있는 m_value와 my_base 객체 메모리 안에 들어있는 m_value는 아예 서로 관련도 없는 다른 존재에요. 메모리도 당연히 다르며 두 메모리가 그냥 다른 존재입니다. 그러니 my_derived 객체에서 실행하는 setValue 는 본인 안에 들어있는 m_value 만 관할할 뿐입니다. 굳이 my_derived 객체의 함수로 심지어 클래스도 다른 타객체의 멤버 변수를 변화시키도록 코드를 짤 이유가 없습니다!

이렇게 Derived 클래스에 Base 클래스로부터 만들어진 "객체" 를 파라미터로 받아서 그 Base 객체의 m_value를 변화시키는 함수를 추가했습니다. 질문자님께서 원하셨던 방향대로 my_derived가 my_base의 m_value를 변화시키도록 코드를 짜보았습니다. 

근데 Base 객체의 m_value 를 변화시킬거면 이 사진처럼 Base 클래스 안에서 setValue를 만들어 Base객체 본인이 자신의 m_value를 관리하게 하면 될텐데 첫 번째 사진의 코드처럼 Base 객체의 멤버 변수 세팅 함수를 굳이 Derived 클래스에 만들 이유가 없습니다. 그래서 제가 위에 굳이 이렇게 코드를 짜야할 이유가 없다고 말씀 드린 것입니다. 객체지향프로그래밍에 맞지 않는 코드에요! base 객체의 멤버 세팅은 본인 스스로가 하도록 Base 클래스에 작성해주는 것이 좋은 것 같아요.