간단하게 예제로 알아보는 코드의 자유도

2025. 2. 13. 22:30·개발/개발 아카이브

 

 

자유도에 대해서 배우게 되었다.

예제를 보며 상세하게 더 알아보자.

 


예제1

예제 두가지 중 어떤 코드가 더 좋은 코드일까?

 

예제 1-1

function solution(arr: number[], query: number[]): number[] {
    query.forEach((v, i) => {
        if (i % 2 === 0) {
            arr = arr.slice(0, v + 1);
        } else {
            arr = arr.slice(v);
        }
    })
    
    return arr;
}

 

 

예제 1-2

function solution(arr: number[], query: number[]): number[] {
    query.forEach((v, i) => {
        arr = arr.slice(...(i % 2 === 0 ? [0, v + 1] : [v]));
    })

    return arr;
}

 

물론 2번이 더 짧아서라는 이유도 있겠지만 더 중요한 사실은 바로 자유도의 차이다.

 

arr = arr.slice(...(i % 2 === 0 ? [0, v + 1] : [v]));

 

1-2 예제의 이 부분이 더 자유도가 낮기 때문에 좋다. 

읽는 순간 arr에 값을 넣는 계산임을 바로 예측할 수 있다.

 

극단적인 예시로 1번의 경우 다른 코드가 상단에 있다면?

if (i % 2 === 0) {
    // --------다른코드-----------------
    // ----다른코드---------------------
    // ------------------다른코드-------
    // -------------다른코드------------
    arr = arr.slice(0, v + 1);
    // ---다른코드----------------------
    // ------------------다른코드-------
} else {
    arr = arr.slice(v);
}

 

상단의 코드 또는 하단의 코드를 전부 읽고 나서야 arr에 계산된 값을 넣는 동작임을 파악할 수 있게 된다.

코드를 전부 읽어야 하는 이유는 다른 코드내에서 변경의 여지가 있을 수 있고, 그 사실을 확인해야 하기 때문이다.

 


예제2

다른 예제도 확인해보자.

 

예제 2-1

function solution2(number: string):number {
  return [...number].map(Number).reduce((acc, cur) => acc + cur, 0) % 9; 
}

 

reduce의 자유도는 매우 높다.

앞선 예제처럼 어떤 코드가 존재할지, 어떻게 쓰일 지 모른다. (for문도 동일한 이유로 자유도가 높음)

 

그렇다면 자유도를 어떻게 해결 할 수 있을까?

이런 경우에는 lodash를 이용해주면 해결할 수 있다.

 

 

예제 2-2

function solution2(number: string):number {
  return _.sum(number 
    .split('').map(Number)) % 9; 
}

 

성질이 보장된 lodash의 sum() 과 같은 함수를 써줌으로써 자유도를 줄이는 것이다.

 


결론

코드에서 자유도란 동작의 예측 범위이다.

 

자유도가 낮다면, 나머지 코드를 파악하지 않아도 코드의 동작 방식이나 성질을 파악할 수 있다.

자유도가 높다면, 그 반대의 경우를 마주할 수 있다.

'개발 > 개발 아카이브' 카테고리의 다른 글

URL 파라미터 정리하기: JavaScript와 React에서  (0) 2025.12.30
동기화 안 되는 main-develop, PR Cherry-pick 전략으로 배포 프로세스 개선해보기  (1) 2025.10.18
디바운스(debounce)와 쓰로틀(throtte) 그리고 디바운스 적용기  (4) 2025.08.08
JavaScript 소수점 시리즈 - ceil, round, floor, trunc  (1) 2025.08.07
웹 스토리지 (로컬 스토리지 / 세션 스토리지) 개념과 조작법 그리고 사용하기 좋은 상황에 대하여  (0) 2025.07.16
'개발/개발 아카이브' 카테고리의 다른 글
  • 동기화 안 되는 main-develop, PR Cherry-pick 전략으로 배포 프로세스 개선해보기
  • 디바운스(debounce)와 쓰로틀(throtte) 그리고 디바운스 적용기
  • JavaScript 소수점 시리즈 - ceil, round, floor, trunc
  • 웹 스토리지 (로컬 스토리지 / 세션 스토리지) 개념과 조작법 그리고 사용하기 좋은 상황에 대하여
dev-oil
dev-oil
개발 그리고 관련한 생각들
  • dev-oil
    dev-oil의 개발 블로그
    dev-oil
  • 전체
    오늘
    어제
    • 분류 전체보기 (14)
      • 개발 (13)
        • 개발 일지 (3)
        • 개발 아카이브 (6)
        • 키워드 (3)
        • 후기 (1)
      • 자유 (1)
        • 회고 (0)
        • 그냥 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    URL파라미터
    개발생각
    github
    JavaScript
    자유도
    error
    참석 후기
    TypeScript
    Programming
    키워드
    git
    react
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
dev-oil
간단하게 예제로 알아보는 코드의 자유도
상단으로

티스토리툴바