[오늘의 실수] 연산자 우선순위를 복습해요

배성규·2025년 4월 12일
2

실수로그

목록 보기
1/1
post-thumbnail

사내 통계 페이지 작업 중 발생한 실수 로그입니다😂

0. 인트로

예시) totalScore의 값을 화면에 뿌려주기 위한 계산 예시 코드

const surveyData = {
  design: 5,
  usability: null,
  accessibility: 4
};

const totalScore = surveyData.design ?? 0 + surveyData.usability ?? 0 + surveyData.accessibility ?? 0;
console.log('총점:', totalScore); 

예시 코드에서 9가 출력되는 값을 기대하고 있는데, 의도하지 않은 값인 5가 출력되는 문제가 있습니다.

Q : 왜 5가 나왔을까요?

A : 연산자의 우선순위를 신경쓰지 않았습니다.
널 병합 연산자는 덧셈 연산자보다 우선순위가 낮아서 a ?? b + c의 형태는 a ?? (b+c) 형태로 연산됩니다.

1. 연산자 우선순위

연산자 우선순위는 여러 연산자가 함께 있는 경우, 어떤 연산을 먼저 수행할지 결정하는 규칙입니다.
우선순위가 높은 연산자가 먼저 실행되며 우선 순위가 같으면 결합 순서에 따라 좌 -> 우 또는 우 -> 좌 방향으로 실행됩니다.

우선순위
기본적으로 많이 사용하는 연산자의 상대적 우선순위 중심으로 설명합니다. 더 자세한 우선 순위를 확인하고 싶으시면 mdn 우선순위를 확인해주세요!

  1. 그룹화 연산자

    • 괄호 ( )
  2. 멤버 접근 및 호출

    • 객체 프로퍼티 접근: obj.prop, obj['prop']
    • 함수 호출: func()
    • new 연산자: new Constructor()
  3. 단항 연산자

    • 전위 증감: ++x, --x
    • 단항 부정/긍정: !x, +x, -x
    • typeof, void, delete
  4. 산술 연산자 (내부 우선순위 있음)

    • 지수: **
    • 곱셈/나눗셈/나머지: *, /, %
    • 덧셈/뺄셈: +, -
  5. 비교 연산자

    • 크기 비교: <, >, <=, >=
    • 동등 비교: ==, !=, ===, !==
  6. 논리 연산자 (내부 우선순위 있음)

    • 논리 AND: &&
    • 논리 OR: ||
    • 널 병합: ??
  7. 조건 연산자

    • 삼항 연산자: condition ? expr1 : expr2
  8. 할당 연산자

    • 단순 할당: =
    • 복합 할당: +=, -=, *=, /=

2. 연습

Q1) const check = true && false || true;

답 : true
&&가 ||보다 우선입니다.

Q2) const result = 2 ** 3 ** 2

답 : 512
2 ** (3 ** 2) -> 2 ** 9 -> 512
**는 우측 결합입니다

Q3) const a = (1,2,3);

답 : 3
쉼표 연산자는 여러 표현식을 나열하고, 맨 마지막 표현식의 결과값만 반환하는 연산자입니다.

Q4)

const a = null; 
const b = 5; 
const result = a ?? 0 + b ?? 10; 

답 : 5
+ 연산자가 ??보다 먼저 평가되므로 0 + b가 먼저 계산됩니다.
즉, 전체 식은 (a ?? (0 + b)) ?? 10처럼 평가됩니다.
1. 0 + b -> 0 + 5 => 5
2. a ?? 5 -> null ?? 5 => 5
3. 5 ?? 10 -> 5 (null값이 아니므로)

Q5)

let x = 1;
x = x += 2 * 3;

답 : 7
총 3개의 연산자 =, +=, *가 나오는 데, 이 연산자들의 연산은
* += = 순서로 진행됩니다.
1. 2 * 3 -> 6
2. x = x + 6 -> 1 + 6 -> 7

3. 결론

인트로에서 제공했던 예시 코드에서 예상 값인 9가 제대로 나오려면 어떻게 해야할까요?

const surveyData = {
  design: 5,
  usability: null,
  accessibility: 4
};

const totalScore = (surveyData.design ?? 0) + (surveyData.usability ?? 0) + (surveyData.accessibility ?? 0);
console.log('총점:', totalScore); // 총점: 9

바로 괄호를 적절하게 사용하여 연산자 우선순위를 명확히하면 연산자 우선순위를 외우지 않아도 원래 의도대로 9를 출력할 수 있습니다
괄호는 연산자 우선순위가 헷갈릴 때 가장 확실한 해결책입니다👍 👍


참고
mdn 연산자 우선순위

profile
FE 유망주🧑‍💻

11개의 댓글

comment-user-thumbnail
2025년 4월 13일

연산자에 대해 복습하는 시간을 가지게 되었군여!!
재밌게 잘 봤습니다~
** 이거 틀렸습니다 흑흑

1개의 답글
comment-user-thumbnail
2025년 4월 26일

상상했던거 이상으로 연산 우선순위가 굉장히 복잡하네요... 별일 없으면 괄호를 열심히 써야겠어요:) 지식 +1 하고 갑니다!

답글 달기
comment-user-thumbnail
2025년 4월 28일

학부때 시험공부로 외우고 잊어버린 연산자의 우선순위내용이 불현듯 떠올랐어요.
중요하지만 잊고있던 개념,다시 채우고 갑니다!

답글 달기
comment-user-thumbnail
2025년 4월 28일

와 생각보다 연산 하기 어렵네요 덕분에 잘 알고 갑니다.

답글 달기
comment-user-thumbnail
2025년 4월 30일

많은 개발자들이 자주 실수하는 부분에 대한 정리 같습니다!! 사실 생각하고 코드를 작성한다기보다는 출력값을 보면서 연산을 맞추는 경우가 더 많았던것같아요, 조금은 반성하고 갑니다. 잘 읽었습니다 :)

답글 달기
comment-user-thumbnail
2025년 4월 30일

오늘의 실수라는 시리즈가 너무 좋네요 ㅎㅎ 실수를 번복하지 않을 수 있고 또 하더라도 금방 해답을 찾을 수 있을 것 같아요🙌

답글 달기
comment-user-thumbnail
2025년 4월 30일

이해하고 있는 것 같지만 갑자기 문제를 낸다면 헷갈릴 것 같네요.. 글 덕분에 다시 복기하는 시간 가지게 됐습니다 좋은 글 감사합니다!

답글 달기
comment-user-thumbnail
2025년 4월 30일

연산자가 이렇게 어려울 줄이야.. 퀴즈도 같이 있어서 재밌게 읽었습니다.
감사해요!!

답글 달기
comment-user-thumbnail
2025년 4월 30일

?? 보다 + 가 우선이군요..! 괄호를 생활화합시다 😂😂

답글 달기
comment-user-thumbnail
2025년 5월 1일

연산자 우선순위가 이렇게 까다로운 줄은 몰랐네요…
실제 겪은 사례를 바탕으로 설명해주셔서 더 와닿았고, 괄호 하나의 중요성을 다시 느끼게 됐습니다.
좋은 정리 감사합니다!

답글 달기