Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바 배열에 특정 값이 포함되어 있는지 확인하는 3가지 방법

자바(Java)로 개발하다 보면 배열에 특정 값이 들어 있는지 확인해야 하는 상황이 자주 발생합니다.

예를 들어 이번 시즌의 조류 관찰 기록을 관리하는 프로그램을 만든다면, 특정 새 종류를 이미 관찰했는지 확인하는 기능이 필요할 것입니다.

배열에 특정 값이 포함되어 있는지 확인하는 방법은 여러 가지가 있습니다. 이 글에서는 for-each 루프, contains(), stream() 세 가지 방법을 예제 코드와 함께 자세히 살펴보겠습니다.

자바에서 배열이란?

자바에서 배열은 동일한 타입의 데이터를 담는 컨테이너입니다. 예를 들어 올해 뒷마당 조류 관찰에서 본 새 14종의 이름 목록을 저장하는 배열을 만들 수 있는데, 이 배열에는 문자열 값 14개가 담기게 됩니다.

배열은 하나의 변수에 많은 값을 저장할 수 있게 해 주기 때문에 중요한 자료형입니다. 값을 각각 별도의 변수로 저장하는 것보다 효율적일 뿐만 아니라, 코드의 가독성도 높여 줍니다.

다음은 자바에서 배열을 선언하는 예시입니다.

String[] bagelShops;
bagelShops = new String[4];

위 예제에서는 문자열 값을 저장하는 bagelShops라는 배열을 선언하고, 이 배열이 문자열 4개를 저장할 수 있도록 크기를 지정했습니다. 네 개의 베이글 가게 이름을 할당하는 코드는 다음과 같습니다.

String[] bagelShops = {"Absolute Bagels", "Bo's Bagels", "Brooklyn Bagel and Coffee Company", "Forest Hills Bagel"};

그렇다면 배열에 특정 값이 포함되어 있는지는 어떻게 확인할 수 있을까요? 예를 들어 Forest Hills Bagel이 좋아하는 베이글 가게 목록에 있는지 확인하고 싶다면 어떻게 해야 할까요? 지금부터 몇 가지 방법을 하나씩 알아보겠습니다.

방법 1: for-each 루프 사용하기

for-each 루프(향상된 for문)는 배열이나 컬렉션의 모든 항목을 순회할 때 사용할 수 있는 for 루프의 한 형태입니다. 예를 들어 동전 컬렉션을 저장한 배열의 모든 동전을 하나씩 확인할 때 유용하게 활용할 수 있습니다.

배열에 특정 값이 포함되어 있는지 확인하려면 for-each 루프로 배열의 모든 요소를 순회하면서, 각 요소가 찾고자 하는 값과 일치하는지 검사하면 됩니다.

뉴욕에서 좋아하는 베이글 가게 목록이 있고, 그 목록에 Absolute Bagels가 있는지 확인하고 싶다고 가정해 보겠습니다. 다음과 같은 간단한 루프로 구현할 수 있습니다.

class Main {
    public static void main(String[] args) {
        String[] bagelShops = {"Absolute Bagels", "Bo's Bagels", "Brooklyn Bagel and Coffee Company", "Forest Hills Bagel"};
        String shopToFind = "Absolute Bagels";
        boolean found = false;

        for (String shop : bagelShops) {
            if (shop.equals(shopToFind)) {
                found = true;
                break;
            }
        }

        if (found) {
            System.out.println("Absolute Bagels는 당신이 좋아하는 베이글 가게 목록에 있습니다!");
        } else {
            System.out.println("Absolute Bagels는 당신이 좋아하는 베이글 가게 목록에 없습니다.");
        }
    }
}

실행 결과:

Absolute Bagels는 당신이 좋아하는 베이글 가게 목록에 있습니다!

코드를 단계별로 살펴보겠습니다. 먼저 뉴욕에서 좋아하는 베이글 가게 네 곳을 저장하는 bagelShops 배열을 선언합니다.

그다음 찾고자 하는 가게 이름인 "Absolute Bagels"를 shopToFind 변수에 할당합니다. 그리고 검색 결과를 추적하기 위한 found라는 boolean 변수를 선언하고 false로 초기화합니다.

이후 for-each 루프가 bagelShops 배열의 모든 요소를 하나씩 순회하며, if 문으로 각 가게 이름이 shopToFind와 일치하는지 비교합니다. 이때 문자열 비교에는 반드시 equals() 메서드를 사용해야 합니다. 참조값을 비교하는 == 연산자는 의도치 않은 결과를 낳을 수 있습니다.

조건이 참이면 found가 true로 설정되고, break 문에 의해 루프가 즉시 종료됩니다. 조건이 거짓이면 if 문 안의 코드는 실행되지 않습니다.

마지막으로 found가 true이면 "목록에 있습니다"라는 메시지를, 아니면 "목록에 없습니다"라는 메시지를 콘솔에 출력합니다.

이 방법은 문자열뿐만 아니라 숫자 배열에도 동일하게 적용할 수 있습니다. 숫자 목록에서 특정 숫자가 있는지 확인할 때도 같은 패턴의 코드를 사용하면 됩니다.

방법 2: contains() 메서드 사용하기

배열을 리스트로 변환한 뒤 contains() 메서드를 사용하면 더 간결하게 포함 여부를 확인할 수 있습니다. contains()는 매개변수로 검색할 값을 하나 받으며, 해당 값이 존재하면 true, 없으면 false를 반환합니다.

참고로 자바의 기본 배열에는 contains() 메서드가 없으므로, Arrays.asList()를 사용해 배열을 리스트로 변환한 후 호출해야 합니다. 이 방법은 문자열 배열에 주로 사용되며, 숫자 배열을 검색할 때는 앞서 소개한 for-each 루프나 아래에서 설명할 stream() 방식이 더 적합합니다.

좋아하는 밴드 목록에 Beatles가 있는지 확인하는 예제입니다.

import java.util.Arrays;

class Main {
    public static void main(String[] args) {
        String[] favoriteBands = {"Beatles", "Revivalists", "Jonas Brothers"};
        String favoriteToFind = "Beatles";
        boolean found = Arrays.asList(favoriteBands).contains(favoriteToFind);

        if (found) {
            System.out.println("Beatles는 당신이 좋아하는 밴드 목록에 있습니다!");
        } else {
            System.out.println("Beatles는 당신이 좋아하는 밴드 목록에 없습니다.");
        }
    }
}

실행 결과:

Beatles는 당신이 좋아하는 밴드 목록에 있습니다!

먼저 좋아하는 밴드 이름들을 저장하는 favoriteBands 배열을 선언하고, 검색할 밴드 이름을 favoriteToFind 변수에 담습니다.

그다음 Arrays.asList()로 배열을 리스트로 변환한 뒤 contains()를 호출해 favoriteToFind("Beatles")가 목록에 있는지 확인하고, 그 결과를 found라는 boolean 변수에 할당합니다.

found가 true이면 "목록에 있습니다" 메시지를, false이면 "목록에 없습니다" 메시지를 콘솔에 출력합니다.

방법 3: stream() 메서드 사용하기

자바의 Arrays 클래스는 배열을 다룰 때 유용한 다양한 함수를 제공합니다. 그중 stream()을 사용하면 배열에 특정 값이 포함되어 있는지 확인할 수 있으며, 이때 anyMatch() 메서드와 함께 사용해야 합니다.

친구 Ada가 좋아하는 TV 프로그램 목록에 'Parks and Recreation'이 있는지 확인하는 예제입니다.

import java.util.Arrays;

class Main {
    public static void main(String[] args) {
        String[] favoriteShows = {"Billions", "Silicon Valley", "Superstore"};
        String showToFind = "Parks and Recreation";
        boolean found = Arrays.stream(favoriteShows).anyMatch(show -> show.equals(showToFind));

        if (found) {
            System.out.println("Parks and Recreation은 Ada가 좋아하는 TV 프로그램 목록에 있습니다.");
        } else {
            System.out.println("Parks and Recreation은 Ada가 좋아하는 TV 프로그램 목록에 없습니다.");
        }
    }
}

실행 결과:

Parks and Recreation은 Ada가 좋아하는 TV 프로그램 목록에 없습니다.

코드를 살펴보겠습니다. 먼저 import java.util.Arrays; 문장으로 Arrays 클래스를 임포트합니다.

그다음 Ada가 좋아하는 TV 프로그램 목록을 담은 favoriteShows 배열을 선언하고, 찾고 싶은 프로그램 이름인 "Parks and Recreation"을 showToFind 변수에 할당합니다.

이후 Arrays.stream()으로 배열을 스트림으로 변환하고, anyMatch()에 람다 표현식을 전달해 showToFind와 일치하는 요소가 하나라도 있는지 검사합니다. 검사 결과(true 또는 false)는 found 변수에 저장됩니다.

found가 true이면 "목록에 있습니다" 메시지를, 그렇지 않으면 "목록에 없습니다" 메시지를 콘솔에 출력합니다.

마무리

배열에 특정 값이 포함되어 있는지 확인하는 것은 자바에서 매우 흔히 사용되는 연산입니다. 정리하면 다음 세 가지 방법이 대표적입니다.

  • for-each 루프: 모든 타입의 배열에 사용할 수 있으며, 검색 로직을 직접 제어할 수 있습니다.
  • contains(): Arrays.asList()로 변환한 리스트에서 간결하게 사용할 수 있습니다.
  • stream(): anyMatch()와 함께 사용하면 함수형 스타일로 깔끔하게 처리할 수 있습니다.

이 글에서는 예제 코드와 함께 자바 배열에 특정 값이 포함되어 있는지 확인하는 세 가지 방법을 살펴보았습니다. 이제 프로 개발자처럼 자바 배열의 값 포함 여부를 손쉽게 확인할 수 있을 것입니다.