Java 배열에 특정 요소가 있는지 확인하는 방법

JavaBeginner
지금 연습하기

소개

이 랩에서는 다양한 기술을 사용하여 Java 배열 내에 특정 요소가 존재하는지 확인하는 방법을 배우게 됩니다. 먼저, 전통적인 for 루프를 사용하여 배열을 반복 처리하여 요소를 검색하는 기본적인 접근 방식을 살펴보겠습니다.

기본적인 반복 처리 방법을 익힌 후, 요소 존재 여부를 확인하는 데 더 간결하고 잠재적으로 더 효율적인 방법인 Arrays.stream() 메서드를 활용하는 방법을 배우게 됩니다. 마지막으로, 검색 작업 중에 배열 내의 null 요소를 처리하는 중요한 고려 사항을 다룰 것입니다.

요소 확인을 위한 배열 루프

이 단계에서는 전통적인 for 루프를 사용하여 Java 배열을 반복 처리하여 특정 요소가 존재하는지 확인하는 방법을 배우게 됩니다. 이는 데이터 컬렉션 내에서 검색하는 기본적인 기술입니다.

먼저, ~/project 디렉토리에 ArraySearch.java라는 새 Java 파일을 생성해 보겠습니다. 왼쪽의 WebIDE 파일 탐색기를 사용하거나 터미널에서 다음 명령을 실행하여 이 작업을 수행할 수 있습니다.

touch ~/project/ArraySearch.java

이제 WebIDE 편집기에서 ArraySearch.java 파일을 열고 다음 Java 코드를 추가합니다.

public class ArraySearch {

    public static void main(String[] args) {
        // Define an array of strings
        String[] fruits = {"Apple", "Banana", "Cherry", "Date", "Elderberry"};

        // The element we want to search for
        String searchElement = "Cherry";

        // Variable to keep track if the element is found
        boolean found = false;

        // Loop through the array
        for (int i = 0; i < fruits.length; i++) {
            // Check if the current element is equal to the search element
            if (fruits[i].equals(searchElement)) {
                found = true; // Element found
                break; // Exit the loop since we found the element
            }
        }

        // Print the result
        if (found) {
            System.out.println(searchElement + " was found in the array.");
        } else {
            System.out.println(searchElement + " was not found in the array.");
        }
    }
}

이 코드를 자세히 살펴보겠습니다.

  • String[] fruits = {"Apple", "Banana", "Cherry", "Date", "Elderberry"};: 이 줄은 여러 과일 이름으로 fruits라는 문자열 배열을 선언하고 초기화합니다.
  • String searchElement = "Cherry";: 이 줄은 문자열 변수 searchElement를 선언하고 "Cherry" 값을 할당합니다. 이것이 배열에서 찾으려는 요소입니다.
  • boolean found = false;: 이 줄은 부울 변수 found를 선언하고 false로 초기화합니다. searchElement를 배열에서 찾으면 이 값을 true로 설정합니다.
  • for (int i = 0; i < fruits.length; i++): 이것은 배열을 반복 처리하는 표준 for 루프입니다. i는 0 에서 시작하여 fruits 배열의 길이 (포함하지 않음) 까지 증가합니다.
  • if (fruits[i].equals(searchElement)): 루프 내에서 이 if 문은 배열의 현재 요소 (fruits[i]) 가 searchElement와 같은지 확인합니다. Java 에서 문자열을 비교하기 위해 == 연산자가 아닌 .equals() 메서드를 사용합니다.
  • found = true;: 요소가 같으면 found 변수를 true로 설정합니다.
  • break;: 요소를 찾으면 더 이상 검색할 필요가 없으므로 break 문을 사용하여 루프를 조기에 종료합니다.
  • 마지막 if/else 블록은 found 변수의 값을 기반으로 searchElement가 발견되었는지 여부를 나타내는 메시지를 출력합니다.

ArraySearch.java 파일을 저장합니다 (Ctrl+S 또는 Cmd+S).

이제 터미널에서 프로그램을 컴파일하고 실행해 보겠습니다. ~/project 디렉토리에 있는지 확인하십시오.

코드를 컴파일합니다.

javac ArraySearch.java

오류가 없으면 ArraySearch.class 파일이 생성됩니다.

컴파일된 코드를 실행합니다.

java ArraySearch

다음 출력을 볼 수 있습니다.

Cherry was found in the array.

이제 searchElement를 배열에 없는 값 ("Grape" 등) 으로 변경하고 파일을 저장한 다음 다시 컴파일하고 실행하여 다른 출력을 확인해 보십시오.

Arrays.stream() 을 사용하여 요소 확인

이 단계에서는 Streams API, 특히 Arrays.stream()을 사용하여 Java 배열에서 요소를 확인하는 보다 현대적이고 종종 더 간결한 방법을 배우게 됩니다. 이 접근 방식은 함수형 프로그래밍 개념을 활용하며 특정 작업에 대해 코드를 더 읽기 쉽게 만들 수 있습니다.

이전 단계에서 생성한 ArraySearch.java 파일을 수정합니다. WebIDE 편집기에서 ~/project/ArraySearch.java를 엽니다.

기존 코드를 다음으로 바꿉니다.

import java.util.Arrays;

public class ArraySearch {

    public static void main(String[] args) {
        // Define an array of strings
        String[] fruits = {"Apple", "Banana", "Cherry", "Date", "Elderberry"};

        // The element we want to search for
        String searchElement = "Cherry";

        // Use Arrays.stream() to check if the element exists
        boolean found = Arrays.stream(fruits).anyMatch(fruit -> fruit.equals(searchElement));

        // Print the result
        if (found) {
            System.out.println(searchElement + " was found in the array.");
        } else {
            System.out.println(searchElement + " was not found in the array.");
        }
    }
}

변경 사항을 살펴보겠습니다.

  • import java.util.Arrays;: stream() 메서드를 사용하려면 Arrays 클래스를 가져와야 합니다.
  • boolean found = Arrays.stream(fruits).anyMatch(fruit -> fruit.equals(searchElement));: 이것이 새로운 접근 방식의 핵심입니다.
    • Arrays.stream(fruits): fruits 배열을 Stream으로 변환합니다. 스트림은 다양한 작업을 지원하는 요소 시퀀스입니다.
    • .anyMatch(fruit -> fruit.equals(searchElement)): 이것은 스트림 연산입니다. anyMatch()는 스트림의 모든 요소가 주어진 조건과 일치하는지 확인합니다. 조건은 람다 표현식 fruit -> fruit.equals(searchElement)로 제공됩니다. 이 람다 표현식은 스트림에서 각 fruit를 가져와 searchElement와 같은지 확인합니다. 일치하는 항목이 발견되면 anyMatch()는 즉시 true를 반환합니다.

이 스트림 기반 접근 방식은 for 루프와 동일한 결과를 얻지만, 어떻게 할 것인지 (단계별로 반복) 가 아닌 무엇을 할 것인지 (어떤 요소가 조건과 일치하는지 찾기) 를 설명하는 더 선언적인 스타일로 수행합니다.

ArraySearch.java 파일을 저장합니다 (Ctrl+S 또는 Cmd+S).

이제 ~/project 디렉토리에서 터미널에서 수정된 프로그램을 컴파일하고 실행합니다.

코드를 컴파일합니다.

javac ArraySearch.java

컴파일된 코드를 실행합니다.

java ArraySearch

이전과 동일한 출력을 볼 수 있습니다.

Cherry was found in the array.

다시, else 케이스를 테스트하기 위해 searchElement를 자유롭게 변경하십시오.

Null 요소 처리

이 단계에서는 Java 에서 흔히 발생하는 시나리오인 배열의 null 값 처리를 고려합니다. 배열에 null 요소가 포함된 경우 이전 메서드에서 문제가 발생할 수 있습니다. 요소 검색 시 null을 안전하게 처리하는 방법을 배우게 됩니다.

WebIDE 편집기에서 ~/project/ArraySearch.java 파일을 다시 엽니다.

fruits 배열을 수정하여 null 요소를 포함합니다.

import java.util.Arrays;
import java.util.Objects; // Import the Objects class

public class ArraySearch {

    public static void main(String[] args) {
        // Define an array of strings with a null element
        String[] fruits = {"Apple", null, "Banana", "Cherry", "Date", "Elderberry"};

        // The element we want to search for
        String searchElement = "Cherry";

        // Use Arrays.stream() and handle nulls
        boolean found = Arrays.stream(fruits)
                              .anyMatch(fruit -> Objects.equals(fruit, searchElement)); // Use Objects.equals

        // Print the result
        if (found) {
            System.out.println(searchElement + " was found in the array.");
        } else {
            System.out.println(searchElement + " was not found in the array.");
        }

        // Let's also search for null itself
        String searchNullElement = null;
        boolean foundNull = Arrays.stream(fruits)
                                  .anyMatch(fruit -> Objects.equals(fruit, searchNullElement));

        if (foundNull) {
            System.out.println("null was found in the array.");
        } else {
            System.out.println("null was not found in the array.");
        }
    }
}

변경 사항은 다음과 같습니다.

  • import java.util.Objects;: null을 안전하게 처리하는 것을 포함하여 객체에 대한 유틸리티 메서드를 제공하는 Objects 클래스를 가져옵니다.
  • String[] fruits = {"Apple", null, "Banana", "Cherry", "Date", "Elderberry"};: fruits 배열의 두 번째 요소로 null을 추가했습니다.
  • .anyMatch(fruit -> Objects.equals(fruit, searchElement)): fruit.equals(searchElement) 대신 Objects.equals(fruit, searchElement)를 사용합니다. Objects.equals() 메서드는 null 값을 적절하게 처리하도록 설계되었습니다. 두 인수가 모두 null인 경우 true를 반환하며, 첫 번째 인수 (이 경우 fruit) 가 null인 경우 NullPointerException을 발생시키지 않습니다.
  • 동일한 Objects.equals() 메서드를 사용하여 배열 자체에서 null을 찾는 것을 보여주기 위해 두 번째 검색을 추가했습니다.

ArraySearch.java 파일을 저장합니다 (Ctrl+S 또는 Cmd+S).

~/project 디렉토리에서 터미널에서 수정된 프로그램을 컴파일하고 실행합니다.

코드를 컴파일합니다.

javac ArraySearch.java

컴파일된 코드를 실행합니다.

java ArraySearch

다음 출력을 볼 수 있으며, "Cherry"와 null이 모두 발견되었음을 보여줍니다.

Cherry was found in the array.
null was found in the array.

Objects.equals()를 사용하는 것은 특히 하나 또는 두 객체가 null일 가능성이 있는 경우 객체를 비교하는 권장 방법입니다. 이렇게 하면 예기치 않은 NullPointerException 오류를 방지할 수 있습니다.

요약

이 Lab 에서는 Java 배열 내에 특정 요소가 존재하는지 확인하는 기본적인 방법, 즉 전통적인 for 루프를 사용하여 배열을 반복하는 방법을 배웠습니다. Java 파일을 생성하고, 배열과 검색 요소를 정의하고, 요소를 비교하는 루프를 구현하고, 요소가 발견되었는지 추적하기 위해 부울 플래그를 사용하는 연습을 했습니다. 이 실습을 통해 기본적인 검색 작업을 수행하고 요소가 배열에 있는지 여부에 따라 결과를 출력하는 방법을 보여주었습니다.