오늘 생성자 오버로딩을 배우면서 여러 사람들과 이야기를 나누고, 내 스스로 생각을 좀 해보면서 '도대체 생성자 오버로딩을 왜 사용할까?' 에 대한 고민을 해봤다. 사실 앞서 QnA 과정이 끝나고는 여전히 '그래서 왜 쓰는건데' 에 대한 명쾌한 해답을 얻지는 못 했다. 머릿 속에 들어온 정보들이 좀 두루뭉술하게 떠다니는 느낌이었다.
부트캠프 멤버분들 뿐만 아니라 지인에게도 물어봤다.
아니 필드 멤버에 값을 안넣고 그냥 초기화 된 데이터만 가지고 있는데 그게 불완전한게 아니라고? 그럼 해당 객체에 있는 0, null 같은 놈들은 어떻게 되는거지?
그러니까 나는, 필드 멤버로 존재하는 멤버변수들은 '반드시 그 값을 채워줘야'한다는 생각이 있었다. 그런데 해당 변수들에 대한 정보가 가변적으로 존재한다고 생각했고. 그러면 이제 굳이 생성자 오버로딩이라는 방법이 아니라 setter를 쓰면 되는데, 그럼에도 생성자 오버로딩이라는 기능을 제공하는 이유가 있다면, 그건 setter가 지닌 위험성밖에 없지 않을까. 라는 사고의 흐름이었다.
결국 마지막에 핵심적인 힌트를 얻었다. '어떤 객체는 몇 개 정도는 데이터를 안 받아도 완성이 된다.'.
처음에는 이게 무슨 말인지 당최 이해가 안됐다. '사용자가 설정하지 않았다면 완전 초기값만 가지고 있는건데, 그 상태로 완성이 된다고?'
'기본 값으로 정의한다.' 이 말을 듣고 이후 지인의 모니터와 관련한 예시를 듣고 나니 완벽하게 이해가 되었다. 지인의 예시는 다음과 같았다. 모니터 객체를 만들기 위해서는 수 많은 데이터가 필요하다. 그런데, 사용자가 관심있는 데이터는 한정적이다. 정격 전압, USB-C 지원 여부와 같은 데이터도 분명히 모니터 객체를 생성하는 데 필요하지만 '사용자는 그런건 알 빠가 아니다.' 그러니까 그런 값들은 애초에 그냥 설정을 한다는 말이다.
그러고 나니 QnA에서 Crew C분의 예시가 더욱 명확하게 이해가 됐다. 오버로딩을 통해 여러 생성자가 존재하는 클래스에서 기본 생성자는 init의 역할을 하는 놈일 뿐이다. 멤버 변수들의 값을 '프로그램의 설계 단계에서 설정한 초기값'으로 초기화를 할 뿐인 것이다. 모니터의 예시라고 한다면, 정격전압은 220V로 초기화 시키는거고, USB-C 지원 여부는 True로 초기화 시킬 뿐이다.
어떤 parameter를 받는 오버로딩 된 생성자가 있다면, this()를 통해서 굳이 입력할 필요가 없는 기본적인 멤버 변수들을 객체 내부에서 알아서 먼저 초기화를 시키고, 이후에 parameter로 온 값들, 다시 말해 사용자가 입력하고 싶은 일반적으로 초기화 하면 안되는 특수한 변수들만 새롭게 초기화, 또는 변경하는 역할을 하는구나!
이렇게 생각하고 나니 지인에게 다시 한 번 숙제가 내려왔다.
사실 생성자 오버로딩의 사용 방법과 그 이유에 대해서는 이해했는데, '그런데 진짜 써도 되나?' 라는 생각은 있었다. 아니, 객체 인스턴스를 만드는 중요한 놈을 이렇게 여러 개를, 심지어 이름도 겹치게 만든다는게 맞나...싶었다.
아무튼 '왜 오버로딩은 쓰면 안되는가?' 에 대해서는 추가적으로 고민해봐야겠다. 뭐니뭐니해도 훌륭한 개발역군이 되기 위해서는 '왜'에 대한 생각을 멈춰서는 안되니까. 주말동안 깊이 생각하고 선생님에게 검사 맡는 시간을 가져봐야겠다.
'Swimming > Think' 카테고리의 다른 글
스트림은 왜 사용해야 하는가. (1) | 2023.03.08 |
---|---|
TDD는 왜 공부해야 하는가. (0) | 2023.03.02 |
생성자 오버로딩은 왜 사용하면 안되는가. (2) | 2023.02.28 |
'왜'는 왜 생각해야 하는가. (1) | 2023.02.27 |
객체에 관한 고민 - 책임과 기능은 어디까지인가. (1) | 2023.02.25 |
댓글