• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

(14:20) (const *Date*& original)

20.12.26 16:53 작성 조회수 198

0

안녕하세요!

매번 정성스러운 답변 감사합니다. 질문이 있어요~!

void copyFrom(const Date& original)
{
	m_month = original.m_month;
	m_day = original.m_day;
	m_year = original.m_year;
}

영상 (14:20)를 보면 copyFrom 함수 파라미터에 class 함수를 받는 것을 볼 수 있습니다.

=> (const Date& original)

Q1. 어떻게 받아드릴 수 있는건가요??

Date를 넣으면 class Date의 ptrivate: 에 있는 데이터에 접근할 수 있기 때문인가요?

Q2. 제가 지금 잘못 이해하고 있는 것 같은데,

public: 아래로는 전부 public으로 설정이 되는건가요?

아니면 해당 function마다 그 위에 public이라고 선언해줘야 하나요?

ex.)

1번

public:
void function1(){} 
void function2(){} 
void function3(){} 
// 전부 다 퍼블릭~

2번

public:
void function1(){}  // 이 친구만 퍼블릭
void function2(){} 
void function3(){}

어느 쪽이 맞는 public: 설정인가요?

답변 3

·

답변을 작성해보세요.

4

안소님의 프로필

안소

2020.12.26

안녕하세요!

Q1. 파라미터로 Date 클래스 함수를 받는 것이 아니라 Date 클래스로 만들어진 "객체"를 받는 다는 표현이 더 정확할 것 같습니다.  copyFrom 은 Date 클래스의 멤버 함수이니, 같은 Date 타입인 객체가 파라미터로 들어오면 이를 참조하여 이 객체의 멤버 변수들을 복사하여 내 멤버 변수값들을 세팅하기 위한 용도로 교수님께서 만드신 함수입니다! 즉, Date today, Date tomorrow, 이런 2 개의 Date 타입 객체가 있다고 가정하면, today 의 멤버 변수 값들을 복사하여 tomorrow 멤버 변수 값들을 세팅하고 싶다면 tomorrow 에서 copyFrom(today)를 호출하면 되겠죠! 이 today를 매개 변수 const Date & original 에서 참조하게 되겠구요. m_day 같은 멤버 변수는 private로 설정이 되어 있으므로 외부에서 직접 tomorrow.m_day = today.m_day 해주는건 불가능하기 때문에 이런 함수를 사용하는 것입니다. 이게 바로 접근 함수입니다.

private 멤버는 클래스 외부에선 접근이 불가능합니다. Date 클래스의 멤버 변수들인 m_month, m_day, m_year 은 private 하기 때문에 같은 클래스인 Date 의 멤버 함수들에서만 접근이 가능합니다. 따라서 main 함수는 Date 클래스에 속해있는 함수가 아닌 Date 클래스와 상관없는 외부 함수이므로 main 함수 내에서는 Date 클래스로부터 만든 today, tommorow 객체의 멤버들을 직접 호출할 수가 없습니다. 그래서 위와 같이 main 함수내에서 Date 타입의 두 객체의 private 멤버 변수들을 저렇게 직접 쓰기만 해도 바로 빨간 줄이 그어지는 것을 확인할 수 있죠. 

그렇다면 main함수같이 Date 클래스의 외부인 곳에서 Date 타입 객체들의 멤버 변수 값을 세팅하고 싶다면 어떻게 해야할까요?

private 멤버 변수들은 같은 클래스 내의 멤버 함수에서는 접근이 가능하다고 위에서 말씀드렸죠. 그래서 파라미터를 받아서 이를 통해 멤버 변수들 값을 세팅해주는 public 멤버 함수를 만드는 방법을 사용합니다. 이게 바로 '접근 함수'입니다. 외부에서 private 멤버들을 간접적으로 접근하기 위한 함수죠. 

setDate 는 Date 의 public 한 멤버 함수이기 때문에 이렇게 main 함수에서 직접 호출이 가능합니다. 외부에선 m_month 에 접근할 수가 없어 직접 today.m_moth = 8; 을 해주는게 불가능 했지만 setDate 멤버함수는 public 이라 호출이 가능하기 때문에  setDate(8, 4, 2025) 를 호출만 해주면 얘가 직접 함수 내부에서 today.m_month = 8; 을 해주는 셈입니다. setDate 는 같은 Date 클래스 멤버 함수라 private 한 멤버 변수들에 접근할 수 있는 자격을 가지고 있으니까요! 접근 함수는 이렇게 private 한 멤버들을 외부에서 간접적으로 접근하기 위해 만듭니다. 

만약 today 객체(Date타입)의 멤버 변수 값들로 tomorrow 객체(Date타입)의 멤버 변수 값들을 세팅하고 싶다면 위와 같은 내용의 접근 함수를 만들어주면 되는 것입니다! 

copyFrom 의 매개 변수인 const Date & original 은 Date 타입의 '객체'를 파라미터로 받는다는 것을 의미합니다. 같은 Date 타입의 다른 객체의 멤버 변수 값들로부터 내 멤버 변수 값들을 초기화 시킬 것이니, 그 같은 Date 타입의 다른 객체를 파라미터로 받아 와야겠죠! 

tomorrow.copyFrom(today); 가 호출되면 매개 변수인 original 가today 객체를 참조하게 됩니다. (today는 Date 타입 객체이니 const Date & 타입의 변수인 original에 할당할 수 있죠.) 이를 통해 tomorrow 의 세 멤버 변수들에 파라미터로 참조하게 된 today 객체의 멤버 변수 값들을 복사 받아 세팅할 수 있게 되었습니다. 위에서 today.setDate(8, 4, 2025) 를 통해 today 의 세 멤버 변수 값들을 8, 4 , 2025로 세팅해 준적이 있으니  tomorrow.copyFrom(today); 호출을 통하여 tomorrow의 세 멤버 변수 값들 또한 8, 4 , 2025 가 되게 됩니다. 

(덧붙여서 8.9 강의쯤에서 배우시겠지만 객체를 const 로 받으면 그 객체의 멤버 변수 값들을 변경할 수 없음을 의미합니다. 타 객체인 tomorrow의 멤버 변수값들을 바꾸는게 아니라 그냥 복사만 해올 것이므로 그 뜻을 강조하기 위해 const를 붙여주신 것 같습니다. )

Q2. 1번이 맞습니다. 

2

안소님의 프로필

안소

2020.12.27

네 맞습니다! original 은 객체라기보단 파라미터로 넘어오는 Date 객체를 참조하기 위한 레퍼런스 매개 변수라고 생각해주시면 됩니다. 만약 copyFrom 함수의 파라미터로 tomorrow 객체를 넘긴다면 original 은 tomorrow 객체 원본을 참조하게 될거에요.

0

홍길동님의 프로필

홍길동

질문자

2020.12.27

객체라는 개념을 이해하니까 이해가 됬어요!

date tomorrow도 date original도 date today도 모두 객체네요! 다만 original은 파라미터 안에 있는 객체이고,

그 이유는 original이 같은 객체 타입인 today를 참조하기 위해서군요!

주말에도 답변주시느라 고생이 많으십니다. 정말 감사합니다! 덕분에 다시 다음 챕터로 넘어갈 수 있게 됬어요~!!!