작성
·
556
1
처음에 생성자에서 초기화한 setID(id) (12번째 줄)은 어떤거를 초기화하신 건가요??? 아직까지 클래스 생성자가 필요한 이유랑 생성자에서 초기화할 수 있는 것들이 무엇이 있는지 감이 잘 안잡힙니다ㅠㅠㅠ
답변 3
3
Simple(int id)
{
setID(id);
}
void setID(int id)
{
m_id = id;
}
main()
{ Simple sp2(2); }
1. 생성자 개념
생성자는 객체(instance)가 생성될 때 호출되는 클래스의 특별한 함수입니다. 프로그래머가 생성자 함수를 만들지 않았을때도 클래스 내부적으로 숨겨진 '기본 생성자 함수'가 호출이 됩니다.
이처럼 어쨋건 저쨋건 생성자 함수는 클래스의 객체가 생성될 때 무조건 호출이 된다면, 초기화 작업에 유용하게 사용이 가능할 것 같습니다. 근데 무엇을 초기화 해야할까요? 객체가 생성될때 호출되는 녀석이니까 객체를 초기화할 때 쓰면 유용하지 않을까요?
이번 강의에서 클래스를 처음 접하는 분들에게 오해가 생길 수 있는 부분은, 생성자는 객체를 초기화를 해주는 함수가 아닙니다. '객체 생성했네? 그럼 내가 나서야지!' 하고 객체가 생성되면 맨 처음으로 발벗고 나서는 녀석일 뿐 입니다.
그런 성질을 이용하여 '그럼 생성자를 객체 초기화 하는데 쓰면 유용하겠다~' 하고 판단하여 생성자 함수를 초기화 작업에 유용하게 이용하는것 뿐 입니다.
생성자는 무조건 초기화 하는데 쓰인다! 보다는
'생성자는 객체가 생성되면 맨 처음 발벗고 나서는 애' 라고 개념을 익히시면 좋을 것 같습니다.
'음.. set 함수도 있고, 딱히 생성자 같은거 필요 없어보이는데?' 하고 private 로 생성자의 활동범위를 클래스 내부로 줄여버리면, main에서 객체 생성이 되질 않습니다. 이러나 저러나 발벗고 나서는꼴을 보면 쟤가 왜저러나 싶지만, 객체를 만들어 사용하고 싶다면 꼭 필요한 생성자 입니다. 생성자를 사랑해줍시다.
2. 코드분석
예제의 Simple 의 생성자를 함께 차근차근 뜯어봅시다
먼저 main 에서 Simple 타입의 s2 이라는 객체를 만들었고, 인자값으로 정수 2을 넣고 있습니다. (s1은 1을 넣어주고 있어서 헷갈릴 것 같아 s2 를 예로 들어보겠습니다.)
객체가 생성되면 제일 먼저 호출되는 함수가 생성자고, Simple 타입의 객체 s2 를 만들었으니 정수 2 를 들고 Simple 생성자 함수로 가봅시다.
Simple생성자는 인자로 정수 하나를 받으면 setID 함수를 호출을 하는데, 받은 정수를 그대로 보내주고 있습니다.
난 정수 2를 들고왔으니 2를 들고 setID 함수로 다시 가봅시다.
setID에서는 정수 하나를 멤버변수 m_id에 값을 대입해 초기화 하고 있습니다.
최종적으로 m_id 를 2 로 초기화 하고 있는 모습이 됩니다.
1
인문학적으로 설명해주셔서 이해하기 쉬웠습니다. 감사합니다 DoJin님.
Simple {} 안에 있는 setID는 그 밑에 있는 void setID에서 선언되어 있는 상태인데,
제가 보고 배운대로는 상식적으로 컴파일러는 위에서부터 아래로 읽으니 아직 선언되지 않은 setID를 Simple{}안에서 사용하고 있는게 이상합니다.
애초에 빌드 에러가 뜨지 않고 실행이 된다는 게 납득이 안가네요.. 디버깅을 하시면 어느정도 이해는 갑니다.
그러나 여전히 저는 이해가 안되네요..
함수 선언되지 않은 setID가 어떻게 Simple안에서 컴파일러가 이해를 하는지요.. 마치 public으로 설정해두면 그 안에 함수들은 전역 함수가 되는 것 마냥..
<제가 생각하는 상식: setID가 먼저 선언되어야 Simple생성자에서 사용할 수 있다.>
<현실은 다음 사진처럼>
이 문제에 대해서는 영상 (2:30)이 해결해 주었군요!
혹여 저와 같은 고민이 한 분이 계시다면..
0
강의가 많기 때문에 제가 강의를 다 외우지를 못합니다. 코드와 영상의 어디인지 등 정확하게 질문해주셔야 도와드릴 수 있습니다. 질문하신 내용은 앞 부분 강의인 것 같네요. 해당 강의에서 질문해주세요. 질문하신 내용은 복습이나 문제 풀이 등의 연습이 필요하신 것 같습니다.