간단정리, 자바에서 기본 생성자의 의미 (feat. Java Reflection, Jackson, JPA)

Jake Seo·2021년 9월 15일
2

자바 잡지식

목록 보기
16/17

기본 생성자란?

기본 생성자는 클래스에 아무런 생성자를 만들지 않았을 때, 자동으로 생성되는 생성자이다.

이를테면, 다음과 같다.

public class User {
  Long id;
  String name;
}

위와 같이 User 클래스를 만들었다면, 자동으로 다음과 같은 기본 생성자가 생긴다.

User() {

}

그래서 우리는 위와 같이 클래스를 선언하면 new User()와 같은 코드로 User 객체를 생성할 수 있다.

기본 생성자 없애는 법

아이러니하게도 기본 생성자를 없애는 방법은 기본 생성자 코드를 지우는 것이 아니다. 다른 사용자 정의 생성자를 만드는 것이다.

public class User {
  Long id;
  String name;
  
  User(Long id, String name) {
    this.id = id;
    this.name = name;
  }
}

위와 같이 사용자 정의 생성자를 만들면, 기본 생성자는 자동으로 사라진다.

겉보기에는 별 일 아닌 것 같은데, 이렇게 기본 생성자를 없애서 에러를 만들 수도 있다. 심지어 내가 기본 생성자를 사용하지 않는 경우인데도 말이다.

기본 생성자가 갖는 의미?

'음? 그래서 저게 뭐가 중요한건데?' 라는 생각이 들 수 있다.

기본 생성자가 갖는 진정한 의미는 자바 리플렉션에 있다.

자바 리플렉션의 용도는 간단히 말하자면 런타임에 해당 클래스의 정보를 알아내는 역할이다.

리플렉션을 이용하면 구체적인 클래스 타입을 알지 못해도 해당 클래스의 정보를 알 수 있다. 자바 리플렉션은 다른 언어에서는 본 적 없는 기능인데, 로딩이 완료된 클래스에서 다른 클래스를 동적으로 로딩하여 생성자, 멤버 필드, 멤버 메서드 등을 사용할 수 있게 만든다.

근데 그러면 '기본 생성자 말고 다른 생성자를 쓰면 되는 거 아냐?' 라고 생각이 들 수 있다.

그러나 리플렉션도 가져올 수 없는 정보가 있는데, 그게 바로 생성자의 인자 정보들이다. 그래서 기본(빈) 생성자 없이 파라미터가 있는 생성자만 존재한다면, 자바 리플렉션이 객체를 생성할 수가 없다.

프레임워크와 자바 리플렉션

일반적으로 우리가 작성하는 코드에는 자바 리플렉션이 전혀 필요 없다. 왜냐면 우리는 당연히 우리가 작성한 클래스에 대한 정보를 다 알고 있다. 하지만, 우리가 프레임워크를 작성해야 한다고 가정하면 리플렉션은 매우 유용할 것이다.

내 프레임워크를 사용하는 사용자의 객체 정보를 알면 처리할 수 있는 예외도 늘어나고, 객체 정보를 알아야만 작성 가능한 많은 로직도 존재할 것이다.

우리는 자바 리플렉션을 직접적으로 사용할 일이 없기 때문에 프레임워크를 사용하다가 자바 리플렉션과 관련된 에러를 만나면 더욱 당황하게 된다.

JPA의 경우

JPA는 스프링 프레임워크로 웹을 구성하면 반드시 한번쯤 써보게 된다. 이 때, 기본 생성자를 실수로 안만들면 난항을 겪을 수 있다. 이에 대한 설명은 다른 분의 포스팅으로 대신하겠다. (물론 다 리플렉션 때문이다.)

관련링크: Java Reflection API에 대하여...

Jackson의 경우

Jackson에서도 리플렉션을 활용하기 때문에, 기본 생성자가 필수이다.

관련링크: 기본 생성자가 필요한 이유

소중한 레퍼런스

리플렉션에 대한 상세한 설명
Deserialize json with Java parameterized constructor

profile
풀스택 웹개발자로 일하고 있는 Jake Seo입니다. 주로 Jake Seo라는 닉네임을 많이 씁니다. 프론트엔드: Javascript, React 백엔드: Spring Framework에 관심이 있습니다.

2개의 댓글

comment-user-thumbnail
2023년 11월 21일

안녕하세요. 글 잘 봤습니다.

리플렉션 관련하여 잘못된 정보가 있는것 같아 댓글 남겨요

https://colour-my-memories-blue.tistory.com/16

해당 정보글에서는 리플렉션으로 생성자 인자도 가져올수 있다고 해요

어느것이 맞는지 한번 확인 부탁드립니다. 감사합니다.

1개의 답글