자바의 모든 클래스에는 하나 이상의 생성자가 정의되어 있어야 한다. 하지만, 자바 컴파일러가 기본 생성자를 제공해주기 때문에 생성자를 정의하지 않아도 인스턴스를 생성할 수 있다.
public class MemberAccess{
private String id = "goguma";
private String name = "고구마";
private String tel = "010-8888-7777";
private String email = "goguma@daum.net";
public String getInfo(){
return "아이디:" + this.id + " 이름:" + this.name + " 번호:" + this.tel + " 이메일:" + this.email;
}
}
public class Main{
public static void main(String[] args){
MemberAccess memA = new MemberAccess();
System.out.println(memA.getInfo());
}
}
MemberAccess 클래스의 인스턴스인 memA는 기본 생성자를 사용해 생성된다. 기본 생성자가 아무런 동작을 하지 않기 때문에, 인스턴스 변수는 클래스 필드에서 바로 초기화 된다. 이렇게 인스턴스 변수의 초기화는 생성자를 통해 수행되기도 하고, 클래스 필드에서 바로 수행될 수도 있다. 하지만, 매개변수를 가지는 생성자를 따로 정의했다면, 기본 생성자는 자동으로 추가되지 않는다는 것을 명심해야 한다.
public class MemberAccess{
private String id;
private String name;
private String tel;
private String email;
public MemberAccess(String id, String name){
this.id = id;
this.name = name;
}
public String getInfo(){
return "아이디:" + this.id + " 이름:" + this.name + " 번호:" + this.tel + " 이메일:" + this.email;
}
}
public class Main{
public static void main(String[] args){
MemberAccess memA = new MemberAccess();
//MemberAccess memA = new MemberAccess("goguma", "고구마");
System.out.println(memA.getInfo());
}
}
매개변수를 갖는 생성자를 정의한 이후 기본 생성자를 호출하면 오류가 발생한다
위 예시의 경우 2개의 매개변수를 갖는 생성자를 정의하고 있기 때문에 컴파일러는 MemberAccess 클래스에 별도의 기본 생성자를 추가하지 않는다. 그렇기 때문에 기본 생성자를 호출해 인스턴스를 생성하려고 하면 오류가 발생할 것이다. 그러므로 주석처리된 부분처럼 2개의 매개변수를 전달하거나, 애초에 기본 생성자를 정의해놔야 에러가 생기지 않고 인스턴스 생성이 가능하다.
그렇기 때문에 기본 생성자는 이런 에러 발생을 막기 위해 그냥 무조건 정의해주고 시작하는게 좋다.
더 자세한 이유로는
1. 생성자 종류가 많을 경우 어떤 생성자를 사용할지 고르기 어렵고
2. 생성자에 로직이 있을 경우 원하는 값을 바로 넣어줄 수가 없기 때문이고
3. 파라미터들의 탑이기 같은 경우 필드와 이름이 다르면 정확한 값을 넣어주기 힘들기 때문이다.
기본 생성자를 정의해놓으면 이러한 점을 고려하지 않아도 된다. 기본 생성자로 객체를 생성하고, 필드 이름에 맞춰 원하는 값을 넣어주면 된다.
사실, 처음 배울때는 '기본 생성자는 꼭 넣어주긴 해야되는데, 매개변수를 넣은 생성자를 만들어서 좀 더 편하게 사용할 수 있게 하자!' 라는 흐름으로 배웠다. 그런데, 많은 시간이 흐르고 '아 기본 생성자 꼭 필요하다는데 그 이유가 뭐였지?' 하고 공부를 하다보니 '수많은 매개변수를 갖는 생성자들이 복잡하니 기본 생성자를 써서 좀 더 편해지자' 라는 내가 처음 배운 흐름과 정반대의 방향으로 사고가 전개됐다.
참고 : https://miyakita.tistory.com/202
Java - 기본 생성자(Default Constructor)
자바의 모든 클래스에는 하나 이상의 생성자가 정의되어 있어야 한다. 하지만 특별히 생성자를 정의하지 않고도 인스턴스를 생성할 수 있는데, 자바 컴파일러가 기본 생성자를 기본적으로 제공
miyakita.tistory.com
https://colour-my-memories-blue.tistory.com/16
[Java] 기본 생성자가 필요한 '진짜' 이유 (리플렉션 오해 바로 잡기!!!)
'기본 생성자가 필요한 이유'라고 검색해보면 여러 블로그에서 하나같이 하는 소리가 있다. 기본 생성자가 필요한 이유는 Reflection API로 가져올 수 없는 정보 중 하나가 생성자의 인자 정보이기
colour-my-memories-blue.tistory.com