Day 27 - Stream +

haxxru log;·2026년 4월 8일
post-thumbnail

이 글은 2026년 04월 08일 작성된 글입니다.

오늘은 프로그래머스 자바 입문 문제를 풀면서
클래스, 생성자, 접근제어자 등 객체지향 개념을 복습했다.
또한 Stream API를 활용하여 반복문과의 차이를 비교하며 구현해봤다.


1. 클래스와 객체

클래스는 객체를 만들기 위한 설계도이고
객체는 클래스를 기반으로 생성된 인스턴스이다.

class Person {
    String name;
}

2. 생성자 (Constructor)

객체 생성 시 초기화를 담당하는 메서드이다.

특징

  • 클래스 이름과 동일
  • 반환 타입 없음
  • 객체 생성 시 자동 호출
  • 필드 초기값 설정 가능
public Person(int id, String name, int age, char gender) {
    this.id = id;
    this.name = name;
    this.age = age;
    this.gender = gender;
}

3. 접근제어자

클래스의 접근 범위를 제어한다.

접근제어자설명
public어디서든 접근 가능
protected같은 패키지 + 자식 클래스
default같은 패키지
private해당 클래스 내부

4. 캡슐화 (Encapsulation)

필드를 private으로 선언하고 getter/setter로 접근하는 방식이다.

사용하는 이유

  • 데이터 보호
  • 잘못된 값 방지
  • 유지보수 용이
  • 내부 구현 숨김
private int age;

public int getAge() {
    return age;
}

5. Stream API 핵심

컬렉션 데이터를 선언형으로 처리하는 방식이다.

대표적인 메서드

메서드설명
stream()컬렉션을 Stream으로 변환
filter()조건에 맞는 데이터만 추출
map()데이터 변환
mapToInt()int 타입으로 변환
average()평균 계산
sum()합계 계산
findFirst()첫 번째 요소 반환

6. map vs mapToInt

Stream에서 데이터 타입을 변환할 때 사용하는 메서드이다.

  • map() → 객체 타입 변환
  • mapToInt() → int 타입으로 변환

예시

int[] array = Arrays.stream(new String[]{"1번", "2번", "3번"})
        .map(e -> e.substring(0, e.length() - 1))
        .mapToInt(Integer::parseInt)
        .toArray();

7. 반복문 vs Stream 비교

7.1 문자열 → 숫자 변환

반복문

String[] messages = new String[]{"1번", "2번", "3번"};
int[] numbers = new int[messages.length];

for (int i = 0; i < messages.length; i++) {
    String message = messages[i];
    message = message.substring(0, message.length() - 1);
    int number = Integer.parseInt(message);

    if (number % 2 == 0) continue;

    numbers[i] = number;
}

Stream

int[] array = Arrays.stream(new String[]{"1번", "2번", "3번"})
        .map(e -> e.substring(0, e.length() - 1))
        .mapToInt(Integer::parseInt)
        .filter(number -> number % 2 != 0)
        .toArray();

7.2 조건 데이터 합계

반복문

int sum = 0;

for (Person person : people) {
    if (person.getGender() == 'M') {
        sum += person.getAge();
    }
}

Stream

int sum = people.stream()
        .filter(e -> e.getGender() == 'M')
        .mapToInt(e -> e.getAge())
        .sum();

7.3 평균 계산

반복문

int sum = 0;
int count = 0;

for (Person person : people) {
    if (person.getGender() == 'M') {
        sum += person.getAge();
        count++;
    }
}

double avg = (double) sum / count;

Stream

double avg = people.stream()
        .filter(e -> e.getGender() == 'M')
        .mapToInt(e -> e.getAge())
        .average()
        .orElse(0);

7.4 데이터 추출

반복문

List<String> names = new ArrayList<>();

for (Person person : people) {
    if (person.getGender() == 'M') {
        names.add(person.getName());
    }
}

String result = String.join(", ", names);

Stream

String result = people.stream()
        .filter(e -> e.getGender() == 'M')
        .map(Person::getName)
        .collect(Collectors.joining(", "));

7.5 특정 데이터 찾기

반복문

Person found = null;

for (Person person : people) {
    if (person.getId() == 2) {
        found = person;
        break;
    }
}

Stream

Optional<Person> op = people.stream()
        .filter(e -> e.getId() == 2)
        .findFirst();

Person found = op.orElse(null);

8. 배열 → List 변환

기본형 배열(int[])은 바로 List로 변환할 수 없기 때문에
boxing 과정이 필요하다.

List<Integer> list = Arrays.stream(new int[]{10, 20, 30})
        .boxed()
        .toList();

✅ 정리

  • 클래스는 객체를 생성하기 위한 설계도이다
  • 생성자는 객체 초기화를 담당한다
  • 캡슐화를 통해 데이터 보호와 유지보수를 쉽게 할 수 있다
  • Stream API는 반복문을 간결하게 표현할 수 있다
  • map / filter / collect 흐름이 핵심이다
  • map과 mapToInt의 차이를 이해해야 한다
  • 기본형 배열은 boxing 후 List로 변환해야 한다

0개의 댓글