Java 메서드에서 여러 값을 반환하는 방법

1. 개요

이 자습서에서는 Java 메서드에서 여러 값을 반환하는 다양한 방법을 배웁니다.

먼저 배열과 컬렉션을 반환합니다. 그런 다음 복잡한 데이터에 컨테이너 클래스를 사용하는 방법을 보여주고 일반 튜플 클래스를 만드는 방법을 배웁니다.

마지막으로 타사 라이브러리를 사용하여 여러 값을 반환하는 방법의 예를 살펴 보겠습니다.

2. 어레이 사용

배열은 원시 데이터 유형과 참조 데이터 유형을 모두 반환하는 데 사용할 수 있습니다 .

예를 들어 다음 getCoordinates 메서드는 두 개의 double 값으로 구성된 배열을 반환 합니다.

double[] getCoordinatesDoubleArray() { double[] coordinates = new double[2]; coordinates[0] = 10; coordinates[1] = 12.5; return coordinates; }

다른 참조 유형의 배열을 반환하려면 공통 부모 유형을 배열 유형으로 사용할 수 있습니다 .

Number[] getCoordinatesNumberArray() { Number[] coordinates = new Number[2]; coordinates[0] = 10; // Integer coordinates[1] = 12.5; // Double return coordinates; }

여기 에서는 IntegerDouble 요소 사이의 공통 클래스이기 때문에 Number 유형 의 좌표 배열을 정의했습니다 .

3. 컬렉션 사용

일반 Java 컬렉션 을 사용하면 공통 유형의 여러 값을 반환 할 수 있습니다 .

컬렉션 프레임 워크에는 광범위한 클래스와 인터페이스가 있습니다. 그러나이 섹션에서는 목록지도 인터페이스에 대한 논의를 제한합니다 .

3.1. 목록에서 유사한 유형의 값 반환

먼저 List 를 사용하여 이전 배열 예제를 다시 작성해 보겠습니다 .

List getCoordinatesList() { List coordinates = new ArrayList(); coordinates.add(10); // Integer coordinates.add(12.5); // Double return coordinates; }

마찬가지로 번호 []목록 집합 모두 동일한 일반적인 유형의 혼합형 요소의 시퀀스를 유지한다.

3.2. 맵에서 명명 된 값 반환

컬렉션의 각 항목에 이름을 지정하려면 대신 Map을 사용할 수 있습니다.

Map getCoordinatesMap() { Map coordinates = new HashMap(); coordinates.put("longitude", 10); coordinates.put("latitude", 12.5); return coordinates; }

getCoordinatesMap 메서드 사용자는 Map # get 메서드 와 함께 " 경도" 또는 " 위도" 키를 사용 하여 해당 값을 검색 할 수 있습니다.

4. 컨테이너 클래스 사용

배열 및 컬렉션과 달리 컨테이너 클래스 (POJO)는 데이터 유형이 다른 여러 필드를 래핑 할 수 있습니다 .

예를 들어, 다음 Coordinates 클래스에는 doubleString 두 가지 데이터 유형이 있습니다 .

public class Coordinates { private double longitude; private double latitude; private String placeName; public Coordinates(double longitude, double latitude, String placeName) { this.longitude = longitude; this.latitude = latitude; this.placeName = placeName; } // getters and setters }

Coordinates 와 같은 컨테이너 클래스를 사용하면 의미있는 이름으로 복잡한 데이터 유형을 모델링 할 수 있습니다 .

다음 단계는 Coordinates 인스턴스를 인스턴스화하고 반환하는 것입니다 .

Coordinates getCoordinates() { double longitude = 10; double latitude = 12.5; String placeName = "home"; return new Coordinates(longitude, latitude, placeName); }

우리는주의해야한다 우리가 같은 데이터 클래스 확인하는 것이 좋습니다 좌표 불변 . 이를 통해 간단하고 스레드로부터 안전하며 공유 가능한 객체를 만듭니다.

5. 튜플 사용

컨테이너와 마찬가지로 튜플은 다양한 유형의 필드를 저장합니다. 그러나 애플리케이션별로 다르지 않다는 점이 다릅니다 .

그것들은 우리가 처리하기를 원하는 유형을 설명하기 위해 사용할 때 전문화되지만 특정 수의 값을 포함하는 범용 컨테이너입니다. 즉, 사용자 정의 코드를 작성할 필요가 없으며 라이브러리를 사용하거나 공통 단일 구현을 만들 수 있습니다.

튜플은 필드 수에 제한이 없으며 종종 튜플 n 이라고 합니다. 여기서 n은 필드 수입니다. 예를 들어 Tuple2는 2 필드 튜플이고 Tuple3은 3 필드 튜플입니다.

튜플의 중요성을 보여주기 위해 다음 예제를 살펴 보겠습니다. Coordinates 포인트와 List 안의 다른 모든 포인트 사이의 거리를 찾고 싶다고 가정 해 보겠습니다 . 그런 다음 거리와 함께 가장 먼 좌표 객체를 반환해야합니다.

먼저 일반적인 두 필드 튜플을 생성 해 보겠습니다.

public class Tuple2 { private K first; private V second; public Tuple2(K first, V second){ this.first = first; this.second = second; } // getters and setters }

다음으로 로직을 구현하고 Tuple2 인스턴스를 사용 하여 결과를 래핑 해 보겠습니다 .

Tuple2 getMostDistantPoint(List coordinatesList, Coordinates target) { return coordinatesList.stream() .map(coor -> new Tuple2(coor, coor.calculateDistance(target))) .max((d1, d2) -> Double.compare(d1.getSecond(), d2.getSecond())) // compare distances .get(); }

사용 Tuple2를 이전 예제에서이 특정 방법으로 한 번 사용하기 위해 별도의 컨테이너 클래스를 만드는에서 우리를 구원했다 .

컨테이너와 마찬가지로 튜플은 불변이어야합니다 . 또한 범용 특성으로 인해 공개 API의 일부가 아닌 내부적으로 튜플을 사용해야합니다 .

6. 타사 라이브러리

Some third-party libraries have implemented an immutable Pair or Triple type. Apache Commons Lang and javatuples are prime examples. Once we have those libraries as dependencies in our application, we can directly use the Pair or Triple types provided by the libraries instead of creating them by ourselves.

Let's look at an example using Apache Commons Lang to return a Pair or a Triple object.

Before we step further, let's add the commons-lang3 dependency in our pom.xml:

 org.apache.commons commons-lang3 3.9 

6.1. ImmutablePair from Apache Commons Lang

The ImmutablePair type from Apache Commons Lang is exactly what we want: an immutable type whose usage is straightforward.

It contains two fields: left and right. Let's see how to make our getMostDistantPoint method return an object of the ImmutablePair type:

ImmutablePair getMostDistantPoint( List coordinatesList, Coordinates target) { return coordinatesList.stream() .map(coordinates -> ImmutablePair.of(coordinates, coordinates.calculateDistance(target))) .max(Comparator.comparingDouble(Pair::getRight)) .get(); }

6.2. ImmutableTriple from Apache Commons Lang

The ImmutableTriple is pretty similar to the ImmutablePair. The only difference is, as its name tells, an ImmutableTriple contains three fields: left, middle, and right.

Now, let's add a new method to our coordinates calculation to show how to use the ImmutableTriple type.

We're going to go through all points in a List to find out the min, avg, and max distances to the given target point.

Let's see how can we return the three values with a single method using the ImmutableTriple class:

ImmutableTriple getMinAvgMaxTriple( List coordinatesList, Coordinates target) { List distanceList = coordinatesList.stream() .map(coordinates -> coordinates.calculateDistance(target)) .collect(Collectors.toList()); Double minDistance = distanceList.stream().mapToDouble(Double::doubleValue).min().getAsDouble(); Double avgDistance = distanceList.stream().mapToDouble(Double::doubleValue).average().orElse(0.0D); Double maxDistance = distanceList.stream().mapToDouble(Double::doubleValue).max().getAsDouble(); return ImmutableTriple.of(minDistance, avgDistance, maxDistance); }

7. Conclusion

In this article, we've learned how to use arrays, collections, containers, and tuples to return multiple values from a method. We can use arrays and collections in simple cases since they wrap a single data type.

On the other hand, containers and tuples are useful in creating complex types, with containers offering better readability.

또한 일부 타사 라이브러리가 쌍 및 삼중 유형을 구현하고 Apache Commons Lang 라이브러리의 몇 가지 예를 확인했습니다.

평소처럼이 기사의 소스 코드는 GitHub에서 사용할 수 있습니다.