일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 브랜치
- CRUD
- lv1
- Codeup
- DTO
- 캡슐화
- 부스트코스
- @AllArgsConstructor
- 프로그래머스
- 기본생성자
- entity
- 깃허브
- git
- 상속
- github
- 알고리즘
- HTML
- 파이썬
- stringbuffer
- @builder
- 에러
- 코드업
- SQL
- @NoArgsConstructor
- 자바
- HashSet
- 부트캠프
- Python
- html tag
- java
- Today
- Total
잉?
[Java] 기본 생성자 + 기본 생성자가 필요한 이유 본문
키오스크 프로그램을 만들면서 생성자에 의문점을 가지게 되었다.
내가 필요한 메서드를 사용하기 위해서는 그 메서드가 위치한 클래스의 기본생성자를 객체로 만들어서 다 불러오면 되겠구나 싶어 뭣도 모르고 사용했다. 그러다 스택오버플로우 에러도 나고, 코드도 더럽고, 비효율적이다 싶어서 이 생성자가 무엇이고, 어떻게 써야 잘 썼다 소문이 날까 해서 찾아보게 되었다.
생성자란?
자신이 원하는 값으로 변수를 초기화 시킬 수 있는 메서드이다.
Car() {...} // 클래스이름(){...} 매개변수가 없는 생성자
Car(int num, String name) {...} // 클래스이름(자료형 매개변수){...} 매개변수가 있는 생성자
기본생성자란?
모든 클래스에는 하나의 생성자가 정의되어야 하는데 우리가 만들지 않아도 기본적으로 제공해 주는 생성자이다.
클래스이름 () {}
Car (매개변수가 없다.) {아무런 명령어도 포함하고 있지 않다.}
매개변수를 가지는 생성자를 하나라도 정의했다면, 기본 생성자는 추가되지 않는다.
여기까지가 실습을 통해 내가 간단하게라도 머릿속에 가지고 있는 내용이다.
그렇다면 언제 생성자를 쓰고 언제 기본 생성자를 쓰는지?
생성자가 있는데 굳이 기본생성자를 왜 사용해야하는지에 대해 알아보자.
지금 내가 설명하는게 생성자를 잘 나타낸 게 아닐 수 있지만 느낀 바로는 이랬다.
팀프로젝트를 진행하면서 잘 짜여진 코드를 들여다보면 기본생성자가 아닌 매개변수가 들어있는 생성자를 알차게 사용하는 모습을 볼 수 있었다. 내가 원하는 값으로 초기화해 주기 위해 그리고 다른 클래스에서 불러오기 쉽게 필요한 변수들과 값을 넣어 생성자로 묶어놓는다.
그렇다면 이렇게 매개변수가 있는 생성자를 잘 활용하는데 굳이 기본생성자가 필요할까? 왜?
여러 블로그를 탐색한 결과 부모클래스와 리플렉션에 관한 이야기가 있었다.
부모클래스와 연관된 기본생성자?
자식 클래스는 부모클래스를 상속받고 있다.
자식 클래스에서는 내부적으로 생성된 기본생성자에서 super()를 이용해 부모의 정보를 불러온다.
그렇기에 부모 클래스는 자식 클래스에게 자신의 정보를 줄 기본 생성자가 필요하다.
(자식은 super()명령어를 이용해 부모의 기본 생성자를 부르기 때문에 필요!)
리플렉션과 연관된 기본생성자?
리플렉션(Reflection ; 반사)
클래스 정보를 JVM 메모리에 저장한다. 그렇게 저장된 클래스에 대한 정보가 거울에 투영된 모습과 닮아있어 이런 이름을 가지게 되었다. 리플렉션을 이용해 생성자, 메서드, 필드 등 클래스에 대한 정보를 자세히 알아낼 수 있다.
그렇다면 이렇게 클래스에 대한 정보를 가져올 수 있는데 기본생성자는 왜?라고 묻는다면
리플렉션으로는 생성자의 인자(파라미터) 정보를 가져올 수 없기에 기본 생성자가 필요하다는 것이다.
(후... 잘 이해하고 있는 게 맞나..)
사실상 java7까지는 파라미터 정보를 가져올 수 없었다고 한다.
그래서 기본 생성자를 이용하여 파라미터 정보를 가져왔는데 java8부터 파라미터 정보를 가져올 수 있게끔 기능이 추가되었다는데 그럼에도 기본생성자를 사용하는 이유는?
1. 기본 생성자로 객체를 생성하고 값을 넣어주는 가장 간단한 방법이기 때문에.
2. 생성자에 로직이 있을 경우 원하는 값을 넣을 수 없다. (이거 좀 공감됐다. 결국엔 기본생성자로 값 넣어버리기..)
등등...
객체지향적 관점에서 모든 클래스는 자신의 기본 정보인 기본 생성자에 연결이 되도록 만들어야 하기 때문에 기본 생성자를 반강제 하는 게 아닌가 하는 결론이 되었다.
아직 내 지식은 많이 얕아서 내 경험을 기반으로 어렴풋이 이해하고 있는 것이기때문에 옳다 아니 다를 따지기는 힘들다. 그저 이런이유로 사용하는구나를 머릿속에 주입시키고 앞으로 더 많은 프로젝트를 경험하다 보면 자연스레 깨닫지 않을까 싶다. 아래의 블로그를 읽어보면서 내가 이해한 대로 따라 작성한 것이다. 글이 많은 피드를 안 좋아해서 내가 실행해 본 것 위주로 올리는데 이번 기록은 완벽히 이해를 하지 못해 글로만이라도 올려본다.
'자바(Java)' 카테고리의 다른 글
[Java] 오버로딩(Overloading)과 오버라이딩(Overriding)의 차이점 (0) | 2023.06.29 |
---|---|
[Java] 다차원 배열 중 2차원 배열 (0) | 2023.06.13 |
[Java] Wrapper 클래스 박싱과 언박싱 + 문자와 문자열 알아보기 (0) | 2023.06.07 |
[Java] 메모장 만들기 + 향상된 for문, Linkedlist<> 타입 (0) | 2023.06.05 |
[Java] static이란? (클래스변수, 인스턴스변수) (0) | 2023.06.02 |