[99클럽 코테 스터디_ DAY 2] 평균

yewon·2024년 7월 23일
0

스터디

목록 보기
2/22
post-thumbnail

자연수로 뒤집어 배열로 만들기

✏️오늘의 문제 : 정수를 담고 있는 배열 arr의 평균값을 return하는 함수 만들기



💡나의 풀이


    public double solution(int[] arr) {
        double answer = 0;
        for(int i=0; i<arr.length;i++){
            answer+=arr[i];
        }

        return answer/arr.length;
    }

반복문을 이용해 배열의 값을 모두 더한 후 배열의 크기로 나누어주었습니다.



💡향상된 for문 풀이


	public double solution(int[] arr) {
			double answer = 0;
			for(int i : arr) {
				answer+=i;
			}
			return answer/arr.length;
		}

처음 작성했던 풀이에서 for문의 형식을 바꾸어 보았습니다.



💡다른 사람의 풀이


public int getMean(int[] array) {
    return (int) Arrays.stream(array).average().orElse(0);
  }
  • Arrays.stream(array): 주어진 배열 array를 스트림으로 변환합니다. 이 스트림은 배열의 요소들을 처리할 수 있게 해줍니다.
  • .average(): 스트림의 평균값을 계산합니다. 이 메서드는 OptionalDouble을 반환합니다. 이는 평균값이 존재할 경우 그 값을 포함하고, 배열이 비어 있을 경우에는 아무 값도 포함하지 않습니다.
  • .orElse(0): 평균값이 존재하지 않을 경우(즉, 배열이 비어 있는 경우) 기본값으로 0을 반환합니다.
  • (int): OptionalDouble에서 반환된 평균값을 정수형으로 형변환(casting)하여 반환합니다.


➕ 참고: 자바의 스트림

현대 소프트웨어 개발에서 데이터 처리는 매우 중요한 요소입니다. 자바는 이러한 데이터 처리를 보다 간편하고 효율적으로 할 수 있도록 지원하는 스트림(Stream) API를 제공합니다. 이번 포스팅에서는 자바의 스트림에 대해 자세히 알아보고, 생성 방법, 활용 방법, 그리고 장점에 대해 소개하겠습니다.

자바 스트림의 기본 개념

자바의 스트림은 연속적인 데이터 흐름을 다루는 추상화된 개념입니다. 자바 8에서 도입된 스트림 API는 컬렉션 프레임워크의 데이터를 처리하기 위한 인터페이스로, 데이터를 필터링, 변환, 집계하는 등의 작업을 간편하게 수행할 수 있게 해줍니다. 스트림은 데이터를 변경하지 않고, 데이터의 흐름을 조작하는 데 중점을 둡니다.

스트림 생성 방법

자바에서 스트림을 생성하는 방법은 다양합니다. 다음은 스트림을 생성하는 몇 가지 주요 방법입니다.

1. 컬렉션에서 스트림 생성

import java.util.Arrays;
import java.util.List;

public class StreamFromCollection {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
        
        names.stream() // 스트림 생성
             .forEach(System.out::println);
    }
}

2. 배열에서 스트림 생성

import java.util.Arrays;

public class StreamFromArray {
    public static void main(String[] args) {
        String[] fruits = {"Apple", "Banana", "Cherry"};
        
        Arrays.stream(fruits) // 배열에서 스트림 생성
              .forEach(System.out::println);
    }
}

3. 파일에서 스트림 생성

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

public class StreamFromFile {
    public static void main(String[] args) {
        try {
            Files.lines(Paths.get("example.txt")) // 파일에서 스트림 생성
                 .forEach(System.out::println);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

4. 숫자 범위에서 스트림 생성

import java.util.stream.IntStream;

public class StreamFromRange {
    public static void main(String[] args) {
        IntStream.range(1, 6) // 1부터 5까지의 정수 스트림 생성
                 .forEach(System.out::println);
    }
}

스트림의 주요 특징

  • 선언적 프로그래밍: 스트림 API는 데이터 처리 과정을 선언적으로 표현할 수 있게 해줍니다. 즉, "무엇을 할 것인지"에 집중할 수 있으며, "어떻게 할 것인지"에 대한 복잡한 로직을 신경 쓰지 않아도 됩니다.
  • 중간 연산과 최종 연산: 스트림은 중간 연산과 최종 연산으로 나뉘어집니다. 중간 연산은 스트림을 변형하는 작업으로, 여러 번 사용할 수 있습니다. 반면, 최종 연산은 스트림을 소비하고 결과를 생성하는 작업으로, 한 번만 사용할 수 있습니다.
  • 지연 평가: 스트림의 연산은 지연 평가(lazy evaluation) 방식으로 이루어집니다. 즉, 최종 연산이 호출될 때까지 실제 데이터 처리가 이루어지지 않기 때문에, 성능을 최적화할 수 있습니다.

자바 스트림의 활용 방법

자바에서 스트림을 사용하는 방법은 매우 간단합니다. 기본적인 예제를 통해 스트림의 활용 방법을 소개하겠습니다.

1. 리스트에서 스트림 생성하기

import java.util.Arrays;
import java.util.List;

public class StreamExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
        
        names.stream()
             .filter(name -> name.startsWith("A"))
             .forEach(System.out::println); // Alice
    }
}

2. 숫자 리스트의 합계 구하기

import java.util.Arrays;
import java.util.List;

public class StreamSumExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
        
        int sum = numbers.stream()
                         .mapToInt(Integer::intValue)
                         .sum();
        
        System.out.println("Sum: " + sum); // Sum: 15
    }
}

자바 스트림의 장점

  • 코드 가독성 향상: 스트림 API는 복잡한 반복문을 간결하게 표현할 수 있게 해줍니다. 덕분에 코드가 더 읽기 쉬워집니다.
  • 병렬 처리: 자바의 스트림은 손쉽게 병렬 처리를 지원합니다. parallelStream() 메서드를 사용하면 데이터를 여러 스레드에서 동시에 처리할 수 있어 성능을 극대화할 수 있습니다.
  • 유연한 데이터 처리: 스트림을 사용하면 데이터 필터링, 변환, 그룹화 등 다양한 작업을 유연하게 수행할 수 있습니다.

0개의 댓글