JAVA 언어 사양에 따라 JAVA의 메서드는 한 번에 하나의 값만 반환할 수 있다.
따라서 메서드에서 여러 값을 반환하는 것은 이론적으로 JAVA에서 불가능하다.
이에 JAVA는 몇 가지 현명한 해결 방법으로 원하는 작업을 수행할 수 있게 해주었는데,
그 방법은 다음과 같다.
1. 사용 POJO (Plain Old Java Object) 클래스 인스턴스
이것은 JAVA의 메소드에서 여러 값을 리턴하는 데 가장 일반적으로 사용되는 메소드이다.
아이디어는 반환하려는 모든 필드를 포함하는 클래스의 인스턴스를 반환하는 것이다.
*POJO란 객체 지향적인 원리에 충실하면서 환경과 기술에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트를 말한다. 그러한 POJO에 애플리케이션의 핵심로직과 기능을 담아 설계하고 개발하는 방법을 POJO 프로그래밍이라고 한다.
이 클래스는 필수 값 또는 JavaBean 개인 멤버 변수 및 인수가 없는 공개 생성자에 대한
해당 getter 및 setter 가 있다.
// 여러 필드를 그룹화 하기 위한 POJO
final class Person
{
public String name;
public int age;
public char gender;
public Person(String name, int age, char gender)
{
this.name = name;
this.age = age;
this.gender = gender;
}
}
class Main
{
public static Person getDetails(){
// 메소드에서 개인 정보를 반환합니다.
String name = "Ryan";
int age = 25;
char gender = 'M';
return new Person(name, age, gender);
}
// Java의 메소드에서 여러 값을 반환합니다.
public static void main(String[ ] args)
{
Person person = getDetails();
System.out.println("Name is " + person.name);
System.out.println("Name is " + person.name);
System.out.println("Name is " + person.name);
}
}
위 코드의 이점은 형식 안정성을 제공하고 코드의 가독성을 상당히 향상시킨다는 것이다.
아래의 코드는 객체 Array를 사용하여 모든 필수 필드를 저장하는 위 프로그램의 더 간단한 버전이다.
그러나 형식 안정성을 제공하지 않거나 호출자에게 필드 정보를 전달하지도 않는다.
import java.util.Arrays;
// 여러 필드를 그룹화하기 위한 클래스
class Collection
{
private Object[ ] items;
private final int size;
// 객체 어레이를 생성하고 주어진 값으로 초기화
public Collection(Object. . . values)
{
this.size = values.length;
this.items = Arrays.copyOf(values, size);
}
public Object get(int i){
return items[i];
}
public int getSize(){
return size;
}
@Override
public String toString() {
return Arrays.toString(items);
}
}
class Main
{
public static Collection getDetails()
{
String name = "Ryan";
int age = 25;
char gender = 'M';
long income = 100000;
return new Collection(name, age, gender, income);
}
// Java의 메소드에서 여러 값을 반환합니다.
public static void main(String[ ] args)
{
Collection details = getDetails( );
System.out.println("The returned values are " + details);
System.out.println("The collection size is " + details.getSize( ));
System.out.println("The name field has value " + details.get(0));
}
}
결과 :
The returned values are [Ryan, 25, M, 100000]
The collection size is 4
The name field has value Ryan
또한 메서드에서 두 개 또는 세 개의 필드를 반환해야 하는 경우 형식 안정성을 제공하는 일반 쌍 또는 일반 Tuple을 구현할 수도 있습니다.
2. 사용 javafx.util.pair class
java 8부터 다음을 사용할 수 있습니다.
Pair에 포함된 클래스 javafx.util 이름-값 쌍을 나타내는 패키지
import javafx.util.Pair;
class Main
{
public static Pair[ ] getDetails( )
{
return new Pair[ ] { new Pair<>("name", "Ryan"),
new Pair<>("age", 25),
new Pair<>("gender", 'M') };
}
// Java 8 이상의 메소드에서 여러 값을 반환합니다.
public static void main(String[ ] args)
{
Pair[ ] person = getDetails( );
for (int i=0 ; i < person.length ; i++){
System.out.println("{" + person[ i ].getKey( ) + " : " + person[ i ].getValue( ) + "}");
}
}
}
결과 :
{name : Ryan}
{age : 25}
{gender : M}
3. 특정 유형의 Array 또는 객체 Array 반환
import java.util.Arrays;
class Main
{
public static int [ ] getDetails( )
{
int v1 = 30;
int v2 = 50;
int v3 = 100;
return new int[ ] { v1, v2, v3 };
}
// Java의 메소드에서 여러 값을 반환합니다.
public static void main (String[ ] args)
{
int [ ] ints = getDetails( );
System.out.println(Arrays.toString(ints));
}
}
결과 :
[ 30, 50, 100 ]
다중 유형 인수의 경우 아래와 같이 Object Array를 반환할 수 있다.
import java.util.Arrays;
class Main
{
public static Object [ ] getDetails( )
{
String name = "Ryan";
int age = 25;
char gender = 'M';
long income = 100000;
return new Object[ ] { name, age, gender, income };
}
// Java의 메소드에서 여러 값을 반환합니다.
public static void main (String[ ] args)
{
Object[ ] person = getDetails( );
System.out.println(Arrays.toString(person));
}
}
결과 :
[ Ryan, 25, M, 100000]
4. 컬렉션 반환
Array를 반환하는 대신 다음을 반환할 수도 있습니다.
import java.util.Arrays;
import java.util.List;
class Main
{
public static List<Object> getDetails( )
{
String name = "Ryan";
int age = 25;
char gender = 'M';
long income = 100000;
return Arrays.asList ( name, age, gender, income );
}
// Java 의 메소드에서 여러 값을 반환합니다.
public static void main(String[ ] args)
{
List<Object> person = getDetails( );
System.out.println(person);
}
}
결과 :
[ Ryan, 25, M, 100000 ]
사용 List 필드 정보를 호출자에게 전달하지 않습니다.
아래와 같이 필드 이름과 값을 키-값 쌍으로 전달하는 대신 Map을 만들 수 있습니다.
import java.util.AbstractMap;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
class Main{
public static Map<String, String> getDetails( )
{
return Stream.of (
new AbstractMap.SimpleEntry<>("name", "Ryan"),
new AbstractMap.SimpleEntry<>("age", 25);,
new AbstractMap.SimpleEntry<>("gender", "Male");
new AbstractMap.SimpleEntry<>("income", "100000$")
)
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
}
// Java 메소드에서 여러 값을 반환합니다.
public static void main(String[ ] args)
{
Map<String, String> person = getDetails( );
for(String key : person.keySet( )){
System.out.println(key + "is" + person.get(key));
}
}
}
결과 :
income is 100000$
gender is Male
name is Ryan
age is 25
5. 구분 기호 사용
여기서 아이디어는 구분 기호로 구분된 모든 값으로 구성된 문자열을 반환해야 하는 것입니다.
그런 다음 호출자 메서드 내에서 값을 사용하기 전에 동일한 구분 기호를 사용하여 문자열을 분할해야 합니다.
이 접근 방식은 깔끔하지 않지만,
여전히 많은 레거시 프로젝트 모델과 보기 간 데이터를 전송하는 데 널리 사용됩니다.
class Main
{
public static String getDetails( ){
return "George" + "~" + "Martiniiiii"
}
// JAVA의 메소드에서 여러 값을 반환합니다.
public static void main(String[ ] args)
{
String[ ] name = getDetails( ).split("~");
for (String s : name){
System.out.println(s);
}
}
}
결과 :
George
Martin
참조 : Java의 메서드에서 여러 값을 반환하는 5가지 방법 (techiedelight.com)