Java/자바 정리
160. 생성자 참조(Constructor Reference) – new 키워드도 메서드 참조처럼 사용하기
코딩하는냥이
2025. 5. 22. 14:56
반응형
자바의 메서드 참조 기능은 생성자도 참조할 수 있습니다.
람다식에서 new 키워드를 통해 객체를 생성하는 표현이 자주 쓰일 때,
이를 클래스명::new 형태로 간결하게 표현할 수 있습니다.
이번 예제에서는 두 개의 생성자를 가진 Member 클래스를 람다식 없이 생성자 참조로 구현해봅니다.
📦 Creatable.java
package ch16.sec05;
public class Creatable {
public interface Creatable1 {
public Member create(String id);
}
public interface Creatable2 {
public Member create(String id, String name);
}
}
📦 Member.java
package ch16.sec05;
public class Member {
private String id, name;
public Member(String id) {
this.id = id;
System.out.println("Member(String id)");
}
public Member(String id, String name) {
this.id = id;
this.name = name;
System.out.println("Member(String id, String name)");
}
public String toString() {
String info = "{ id: " + id + ", name: " + name + " }";
return info;
}
}
📦 Parson.java
package ch16.sec05;
public class Parson {
public Member getMember1(Creatable.Creatable1 creatable) {
String id = "winter";
Member member = creatable.create(id);
return member;
}
public Member getMember2(Creatable.Creatable2 creatable) {
String id = "winter";
String name = "한겨울";
Member member = creatable.create(id, name);
return member;
}
}
📌 예제 코드
package ch16.sec05;
public class ConstructorRefrenceExample {
public static void main(String[] args) {
Parson person = new Parson();
// 매개변수 1개 생성자 참조
Member m1 = person.getMember1(Member::new);
System.out.println(m1 + "\n");
// 매개변수 2개 생성자 참조
Member m2 = person.getMember2(Member::new);
System.out.println(m2);
}
}
💻 실행 결과
Member(String id)
{ id: winter, name: null }
Member(String id, String name)
{ id: winter, name: 한겨울 }
💬 코드 설명
- Creatable1은 String id 하나를 매개로 받아 Member 객체를 생성하는 함수형 인터페이스입니다.
- Creatable2는 String id, String name 두 개의 매개변수를 받아 객체를 생성합니다.
- Parson 클래스는 각각의 함수형 인터페이스를 매개로 받아 Member 객체를 생성하고 반환합니다.
- ConstructorRefrenceExample 클래스에서는 Member::new를 통해
각각의 생성자와 인터페이스를 자동 연결합니다.
💡 포인트 정리
- 생성자 참조는 클래스명::new 형태로 작성합니다.
- 생성자 시그니처(매개변수의 개수와 타입)는 함수형 인터페이스의 추상 메서드와 정확히 일치해야 합니다.
- Member::new는 내부적으로 new Member(...)를 대신합니다.
- 생성자 참조를 사용하면 코드가 더욱 직관적이고 재사용성이 높아집니다.
📌정리하자면, 이번 예제에서는 함수형 인터페이스와 생성자 참조를 조합해,
람다식 없이도 객체를 유연하고 간결하게 생성하는 방식을 살펴보았습니다.
::new 구문은 특히 팩토리 메서드나 스트림과 함께 사용될 때 유용하므로,
꼭 익혀두시길 추천드립니다.