(우테코 8기 프리코스) 1주차 회고


seukeulinsyas-2025-10-23-152014.png

우테코 재도전~

3학년때 우테코 7기를 도전했었다. 1차합격도 못했었다;;; 지금 돌이켜보면 코드에도 문제가 있었겠지만 더 큰 문제는 아마 지원서가 남들이 이해하지 못하는 주제? 혹은 잘 못쓴 지원서가 아니었나 생각 들었다.

이번에 25년 우테코 질문 항목이 1개여서 그리고 그동안 1년동안 경험했던 것들 기반으로 진정성있게 작성을 했다. 정말 진심으로 하고 싶다 ㅠㅠ


문자열 덧셈 계산기

PR링크

👹설계는 넘 어려워~

작년에도 느꼈었지만 요구사항을 보고 구현해야할 기능으로 나누고 이 기능들을 구현하기 위해 어떻게 객체지향적으로 설계해야할까?가 항상 막막했다. 그래서 이번에는 오브젝트라는 유~명한 책과 인프런에서 강의를 구입해서 공부하기 시작했다.

seukeulinsyas-2025-10-23-153124.png seukeulinsyas-2025-10-23-153234.png 두 강의와 책 모두 아직 다 듣지는 않았지만 객체지향설계나 요구사항 분석하는 것에 감을 잡을 수 있었다.

오브젝트와 클린 코더스: 실전 객체 지향 프로그래밍과 TDD 마스터 클래스 강의에서 공통적으로 설명하는 부분은

설계 과정에 대한 설명부분이었는데

  1. 시스템이 사용자에게 제공해야하는 기능인 시스템 책임 파악한다.
  2. 시스템 책임을 더 작은 책임으로 분할한다.
  3. 분할된 책임을 수행할 수 있는 적절한 객체 또는 역할을 찾아 책임을 할당한다
  4. 객체가 책임을 수행하는 도중 다른 객체의 도움이 필요한 경우 이를 책임질 적절한 객체 또는 역할을 찾는다
  5. 해당 객체 또는 역할에게 책임을 할당함으로써 두 객체가 협력하게 한다.

완전히 이해해서 바로 적용하지는 못했지만 최대한 따라가면서 적용해봤었다. 그래서 그런지 생각보다 오래걸렸었다.

seukeulinsyas-2025-10-23-153952.png

우선 기능별로 구현 목록을 작성했고 seukeulinsyas-2025-10-23-154400.png 각 기능을 보고 이 기능을 구현하기 위한 객체들을 책임을 기준으로 뽑아서 정리를 했다.

각각의 책임과 역할을 작성한 것은 PR링크에서 확인할 수 있다.

👹Stream에 익숙해지자

stream 문법을 많이 사용했는데 공부를 했는데도 머뭇머뭇거렸던것 같다. 다시 복습해보자

1
2
3
4
5
public String getPattern() {  
    return allDelimiters.stream()  
            .map(Pattern::quote)  
            .collect(Collectors.joining("|"));  
}

.map : 각 요소를 다른 형태로 변환 .colloet : 수집 Collectors.joining() : 문자열 스트림을 하나로 합쳐서 연결한다. 구분자를 붙일 수 있다.

1
2
3
if (DEFAULT_DELIMITER.stream().anyMatch(customizeDelimiters::contains)) {  
    throw new IllegalArgumentException("커스텀 구분자는 기본 구분자를 포함할 수 없습니다");  
}

.anyMatch : 하나라도 조건을 만족하는지

1
2
3
4
5
6
7
private Set<String> createPatten(final String customizeDelimiters) {  
    if (customizeDelimiters.isEmpty()) {  
        return DEFAULT_DELIMITER;  
    }  
    return Stream.concat(DEFAULT_DELIMITER.stream(), Stream.of(customizeDelimiters))  
            .collect(Collectors.toUnmodifiableSet());  
}

Stream.concat() : 두 요소를 합친 스트림을 생성한다. .stream() : 컬렉션에서 스트림을 생성한다 Stream.of() : 직접 요소를 입력해 스트림을 생성한다

1
2
3
4
5
6
try {  
    return new Numbers(splitValues.stream()  
            .peek(Numbers::validatePositiveNumber)  
            .map(Integer::parseInt)  
            .toList());  
}

.peek() : 중간에 데이터를 처리

1
2
3
public Integer getSum() {  
    return values.stream().reduce(0, Integer::sum);  
}

.reduce() : 누적 함수를 사용해 모든 요소를 단일 결과로 합침, 초깃값이 없으면 Optional로 변환

1
2
3
4
return Arrays.stream(inputValue.split(delimiters))  
        .filter(s -> !s.isEmpty())  
        .map(String::trim)  
        .toList();

Array.stream() : 배열로 부터 스트림 생성 .filter() : 중간에 조건에 맞는 요소만 추려낸다.