아래의 코드를 작성하고 실행한다면
java: no suitable constructor found for
에러를 만날 수 있다.
MemberConstruct Class 코드
package construct;
public class MemberConstruct {
String name;
int age;
int grade;
//생성자
MemberConstruct(String name, int age, int grade) {
this.name = name;
this.age = age;
this.grade = grade;
}
}
ConstructMain 클래스에서 객체를 생성, 사용하는 코드
package construct;
import java.lang.reflect.Member;
public class ConstructMain {
public static void main(String[] args) {
MemberConstruct member1 = new MemberConstruct("user1", 15, 90);
MemberConstruct member2 = new MemberConstruct("user2", 15, 80);
MemberConstruct member3 = new MemberConstruct(); // 컴파일오류
MemberConstruct[] members = {member1, member2, member3};
for (MemberConstruct m : members) {
System.out.println("이름: " + m.name + " 나이: " + m.age + " 성적: " + m.grade);
}
}
}
Java에서 "java: no suitable constructor found for"은 주로 객체를 생성할 때 적절한 생성자가 없을 때 발생한다.
위 코드를 실행하면 MemberConstruct member3 = new MemberConstruct();에서 컴파일 오류가 발생한다.
오류의 원인은 MemberConstruct 클래스에 매개변수가 없는 기본 생성자(default constructor)가 없기 때문이다. 자바에서는 클래스에 명시적으로 생성자가 정의되지 않으면, 컴파일러가 자동으로 기본 생성자를 제공한다. 하지만 생성자가 하나라도 정의되면 컴파일러는 기본 생성자를 자동으로 생성하지 않는다.
위 코드에서는 MemberConstruct(String name, int age, int grade)라는 생성자가 정의되어 있지만, 매개변수가 없는 기본 생성자가 정의되어 있지 않기 때문에 new MemberConstruct();와 같은 생성자 호출이 불가능한 것이다.
이 문제는 다음의 방안으로 해결할 수 있다.
기본 생성자를 명시적으로 추가한다. 예를 들어, 매개변수가 없는 생성자를 추가하면 new MemberConstruct();와 같은 호출이 가능하다.
package construct;
public class MemberConstruct {
String name;
int age;
int grade;
// 생성자1
MemberConstruct(String name, int age, int grade) {
this.name = name;
this.age = age;
this.grade = grade;
}
// 기본 생성자 추가
MemberConstruct() {
System.out.println("기본 생성자 호출");
}
}
위와 같이 각 멤버 변수에 대해 기본값을 정의해주지 않을 경우 코드를 실행했을 때 아래의 결과가 나온다.

기본 생성자에 작성한대로 "기본 생성자 호출"은 출력이 되지만 초기값을 명시적으로 지정해주지 않았기때문에 String 타입 멤버 변수인 name에는 null이, int타입 멤버 변수인 age와 grade는 0으로 초기화된다.
다음은 기본 생성자에 초기값을 명시적으로 지정한 경우이다.
package construct;
public class MemberConstruct {
String name;
int age;
int grade;
// 생성자1
MemberConstruct(String name, int age, int grade) {
this.name = name;
this.age = age;
this.grade = grade;
}
// 기본 생성자 추가
MemberConstruct() {
System.out.println("기본 생성자 호출");
this.name = "Unknown";
this.age = 0;
this.grade = 0;
}
}
위의 경우 아래와 같이 명시된 값으로 출력이 되는 것을 확인할 수 있다.

또 다른 방법은 기본 생성자를 사용하지 않고, 생성자 호출 시 항상 매개변수를 제공하는 것이다. 이 경우, MemberConstruct 클래스의 객체를 생성할 때 반드시 매개변수를 포함해야 한다.
package construct;
public class ConstructMain {
public static void main(String[] args) {
MemberConstruct member1 = new MemberConstruct("user1", 15, 90);
MemberConstruct member2 = new MemberConstruct("user2", 15, 80);
// 매개변수를 제공하여 객체 생성
MemberConstruct member3 = new MemberConstruct("user3", 16, 85);
MemberConstruct[] members = {member1, member2, member3};
for (MemberConstruct m : members) {
System.out.println("이름: " + m.name + " 나이: " + m.age + " 성적: " + m.grade);
}
}
}
위와 같이 member3 객체를 생성할 때 매개변수를 넣어줌으로써 초기에 필요한 데이터를 부여할 수 있고, 컴파일 오류를 피할 수 있다.

"java: no suitable constructor found" 오류는 클래스에 필요한 생성자가 정의되지 않은 경우 발생한다. 이를 해결하려면 기본 생성자를 명시적으로 추가하거나, 객체 생성 시 매개변수를 제공하는 방법으로 해결할 수 있다.
객체를 생성할 때 바로 필요한 데이터를 넣어줘야 하는 시스템이라면 매개변수를 사용해 생성자를 직접 만드는 것이 유리하다. 코드의 중복 없이 객체를 생성하면서 바로 데이터를 넣어줄 수 있기 때문이다. 하지만 개발자가 실수로 넣어줘야 하는 데이터를 넣지 않았을 때 이와 같은 컴파일 오류가 발생할 수 있으며, 이는 유령 객체를 생성하지 않도록 해주는 좋은 오류라고 할 수 있다.
하지만 객체 생성 시 바로 필요한 데이터를 넣어주지 않아도 되는 시스템이라면 위의 방법을 사용할 시 생성자를 호출할 때마다 매개변수를 반드시 제공해야 하므로, 상황에 따라 선택하여 코드를 짤 필요가 있다.