[TIL-DAY19] 함수와의 대화

김유란·2025년 1월 20일

1. 함수(method, function)

  • 하고자 하는 말을 정확하게 표현
  • 확장성을 고려한 표현
  • 목적어와 함께 표현
    • 목적과 의도를 명확히 표현할 수 있는 매개변수 이름 명명, 적절한 데이터 타입 사용
    • 매개변수 3개 이하로 유지하며 필요에 따라 객체로 전달
    • setter 가 아닌 이상, 함수 내에서 매개변수의 참조 값 변경 지양
  • 상황에 맞는 직관적인 단어 선택
    public void terminateProcess()  // 프로그램 종료
    public void stopProcess()  // 프로그램 중단
    public boolean validateEmail()  // 전체 형식, 범위 검증
    public boolean checkEmail()  // 단순 확인, 일치 검사

2. 함수형 대화 방법

선언적 대화 방법

어떻게 할지를 작성하지 않고, 무엇을 할지 표현함으로써 대화의 본질과 흐름에 집중

int sum = numbers.stream()
    .filter(n -> n % 2 == 0)
    .map(n -> n * n)
    .reduce(0, Integer::sum);

순수 함수 대화 방법

항상 같은 값을 반환하는 순수 함수를 사용함으로써 대화의 신뢰도를 높임

public int add(int a, int b) { return a + b; }
  • 독립적이기 때문에 side effect가 발생하지 않음
  • 불변성을 유지하기 때문에 코드의 예측 가능성과 안정성을 높여줌 (thread safe 보장)
  • 함수 호출 시 항상 동일한 결과를 반환하기에 함수를 디버깅하거나 테스트하기 쉬워짐

고차 함수 대화 방법

함수를 매개변수로 받거나 함수를 결과값으로 반환하는 고차함수를 사용함으로써 유연한 대화 가능

List<Integer> customNumbers = numbers
    .filter(n -> n % 2 == 0)
    .map(n -> n * 2)
    .collect();

3. Stream vs for loop

Stream

  • Stream & Lambda 를 통해 간결한 대화 가능
  • Optional과 결합한 안정적인 대화 가능
  • 간편한 병렬 대화 가능

for loop

  • 가독성이 더 좋을 수 있음
  • 코드 중단 가능
  • 디버깅에 유리
  • primitive 원시 타입 기준으로 일반적인 for loop가 stream for에 의해 월등히 성능이 좋음
  • stream에서는 원시 타입을 객체로 감싸는 Boxing 작업에 의해 메모리 할당과 객체 생성 비용이 추가됨

0개의 댓글