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 구문은 특히 팩토리 메서드나 스트림과 함께 사용될 때 유용하므로,
꼭 익혀두시길 추천드립니다.