R Academy · 강의

연산자 우선순위와 복잡한 표현식

평가 순서를 이해하고 복잡한 표현식을 안전하게 작성합니다.

레슨 4/413개 단계

연산자 우선순위와 복잡한 표현식은(는) CoddyKit의 무료 R Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 R Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

연산자 우선순위란 무엇입니까?

연산자 우선순위는 표현식에서 연산이 계산되는 순서를 결정합니다. 수학에서와 마찬가지로 곱셈은 덧셈보다 먼저 계산됩니다. R은 명확하게 정의된 우선순위 표를 따릅니다.

# Precedence in action
result1 <- 2 + 3 * 4    # * before +
result2 <- (2 + 3) * 4  # parentheses override
cat('2 + 3 * 4 =', result1, '
')   # 14
cat('(2+3) * 4 =', result2, '
')   # 20

R 우선순위 표(높은 순서부터 낮은 순서)

R은 다음 순서로 연산자를 계산합니다(우선순위가 가장 높은 것부터):

  1. ^ — 거듭제곱
  2. -(단항) — 부호 반전
  3. : — 수열
  4. %%, %/%, %*%, %in% — 특수 중위 연산자
  5. *, / — 곱셈, 나눗셈
  6. +, -(이항) — 덧셈, 뺄셈
  7. <, >, <=, >=, ==, != — 비교
  8. ! — NOT
  9. &, && — AND
  10. |, || — OR
  11. <-, = — 할당
# Exponentiation before multiplication
cat('2 * 3 ^ 2 =', 2 * 3 ^ 2, '
')   # 2 * 9 = 18
cat('(2*3)^2 =', (2 * 3) ^ 2, '
')   # 6^2 = 36

# Unary minus applied after exponentiation
cat('-2 ^ 2 =', -2 ^ 2, '
')    # -(2^2) = -4
cat('(-2)^2 =', (-2) ^ 2, '
')  # 4

콜론 연산자의 우선순위

: 수열 연산자는 +와 -보다 우선순위가 높습니다. 따라서 초보자가 흔히 하는 실수처럼 1:n+1은 1:(n+1)이 아니라 (1:n)+1로 해석됩니다.

n <- 5

# Common mistake: colon before addition
cat('1:n+1 =', 1:n + 1, '
')   # (1:5)+1 = 2 3 4 5 6
cat('1:(n+1) =', 1:(n + 1), '
') # 1:6 = 1 2 3 4 5 6

# These are DIFFERENT results!
# Always use parentheses when the upper bound involves arithmetic

특수 연산자의 우선순위

%%, %/%, %in% 같은 특수 연산자는 +와 -보다 우선순위가 높지만 ^보다는 낮습니다. 이를 잘못 이해하면 발견하기 어려운 오류가 발생합니다.

# %% has higher precedence than +
cat('10 + 7 %% 3 =', 10 + 7 %% 3, '
')   # 10 + (7%%3) = 10+1 = 11
cat('(10+7) %% 3 =', (10 + 7) %% 3, '
') # 17 %% 3 = 2

# %in% precedence
nums <- 1:5
cat('1 + 1 %in% nums =', 1 + 1 %in% nums, '
')  # (1+1) %in% nums? No! 1 + (1 %in% nums) = 2

논리 연산자보다 먼저 계산되는 비교

비교 연산자(<, >, == 등)는 논리 연산자(!, &, |)보다 먼저 계산됩니다. 따라서 x > 0 & y < 10은 추가 괄호 없이도 예상대로 작동합니다.

x <- 5
y <- 8

# This works as intended: comparisons first, then &
cat('x > 0 & y < 10:', x > 0 & y < 10, '
')  # TRUE & TRUE = TRUE

# ! NOT has higher precedence than &
vec <- c(TRUE, FALSE, TRUE)
cat('!vec & TRUE:', !vec & TRUE, '
')  # (!vec) & TRUE, not !(vec & TRUE)
cat('!(vec & TRUE):', !(vec & TRUE), '
')

까다로운 우선순위 오류 1

흔히 발생하는 오류는 !의 우선순위가 비교 연산자보다 낮다는 사실을 잊는 것입니다. 따라서 !x == y는 !(x == y)가 아니라 (!x) == y로 해석됩니다.

x <- 5
y <- 5

# BUG: meant to check 'x is not equal to y'
bug_result <- !x == y      # reads as (!x) == y
cat('!x == y (bug):', bug_result, '
')   # !5 means FALSE, FALSE==5 is FALSE

# CORRECT: use != or !(x == y)
cat('x != y:', x != y, '
')             # FALSE (correct)
cat('!(x == y):', !(x == y), '
')       # FALSE (correct)

까다로운 우선순위 오류 2

또 다른 미묘한 오류가 있습니다. -1:5는 -1, 0, 1, 2, 3, 4, 5 수열을 만듭니다. 단항 뺄셈은 전체 범위가 아니라 1에만 적용되기 때문입니다. 음수에서 시작하는 범위를 만들려면 괄호를 사용하십시오.

# Misleading: looks like range from -1 to 5 starting at negative
seq1 <- -1:5
cat('-1:5 =', seq1, '
')  # -1 0 1 2 3 4 5 (correct here)

# But -2^2 is a trap:
cat('-2^2 =', -2 ^ 2, '
')    # -4 (not 4)
cat('(-2)^2 =', (-2) ^ 2, '
') # 4

# Always parenthesise to be safe
cat('(-1):5 =', (-1):5, '
')   # same as -1:5 but explicit

명확성을 위한 괄호 사용

괄호가 반드시 필요하지 않은 경우에도 괄호를 사용하면 코드를 읽기 쉽고 오류가 발생할 가능성도 줄어듭니다. 전체 우선순위 표를 외우려 하지 말고, 괄호로 의도를 명확하게 표현하십시오.

# Hard to read — requires knowing precedence
result_unclear <- 2 + 3 * 4 ^ 2 / 8 - 1

# Clear intent with parentheses
result_clear <- 2 + ((3 * (4 ^ 2)) / 8) - 1

cat('Unclear:', result_unclear, '
')
cat('Clear:  ', result_clear, '
')
cat('Same result?', result_unclear == result_clear, '
')

표현식에서의 할당

할당(<-)의 우선순위는 대부분의 연산자보다 낮습니다. 따라서 복잡한 표현식의 결과를 한 줄에서 할당할 수 있지만, 표현식 내부의 할당이 예상과 다르게 동작할 수도 있습니다.

# <- has very low precedence
# This assigns (3 + 4) to x, then evaluates (TRUE)
result <- x <- 3 + 4   # x gets 7, result gets 7
cat('x:', x, 'result:', result, '
')

# Be careful with == vs <- 
# x <- 5 is assignment
# x == 5 is comparison (always use == for testing)

실습: 우선순위 오류 피하기

복잡한 표현식을 올바르게 작성하는 실용적인 전략은 긴 표현식을 이름이 있는 중간 단계로 나누는 것입니다. 각 단계를 확인할 수 있으므로 디버깅도 쉬워집니다.

# Complex formula: compound interest
principal <- 1000
rate <- 0.05
years <- 10

# Hard to verify in one line
bad <- principal * (1 + rate) ^ years

# Easier to verify step by step
growth_factor <- (1 + rate) ^ years
final_amount <- principal * growth_factor
cat('Growth factor:', round(growth_factor, 4), '
')
cat('Final amount: $', round(final_amount, 2), '
')

논리 AND/OR의 우선순위

&(AND)는 |(OR)보다 우선순위가 높습니다. 따라서 A | B & C는 A | (B & C)로 계산됩니다. 미묘한 논리 오류를 피하려면 AND와 OR를 함께 사용할 때 항상 괄호를 사용하십시오.

A <- TRUE
B <- FALSE
C <- TRUE

# & before | — may surprise you
cat('A | B & C:', A | B & C, '
')     # A | (B & C) = TRUE | FALSE = TRUE
cat('(A|B) & C:', (A | B) & C, '
')   # TRUE & TRUE = TRUE

# Different with:
A2 <- FALSE
cat('A2 | B & C:', A2 | B & C, '
')   # FALSE | (FALSE & TRUE) = FALSE
cat('(A2|B) & C:', (A2 | B) & C, '
') # (FALSE|FALSE) & TRUE = FALSE

빠른 확인

R에서 -3 ^ 2는 어떤 값으로 계산됩니까?

복습: 연산자 우선순위

훌륭합니다! 이 수업의 핵심 내용은 다음과 같습니다:

  • 우선순위(높은 순서 → 낮은 순서): ^, 단항 -, :, %%/%/%*%%in%, */, +-, 비교, !, &, |, 할당
  • -2^2 = -4인 이유는 ^가 단항 뺄셈보다 우선하기 때문입니다. 4를 얻으려면 (-2)^2를 사용하십시오.
  • 1:n+1은 (1:n)+1을 의미합니다. 더 긴 범위를 원하면 1:(n+1)을 사용하십시오.
  • &는 |보다 우선합니다. AND/OR를 섞은 논리식에는 괄호를 사용하십시오.
  • 확실하지 않을 때는 괄호를 사용하여 의도를 명확히 하고 오류를 피하십시오.
# Golden rule: parentheses for clarity
n <- 4
# Intended: sequence 1 to n+1
cat('Wrong : 1:n+1  =', 1:n + 1, '
')
cat('Correct: 1:(n+1)=', 1:(n + 1), '
')

# Intended: -(2^2)
cat('Correct: -2^2 = -(2^2) =', -2 ^ 2, '
')
무료로 시작

AI 튜터와 함께 R을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
43
레슨
159

자주 묻는 질문

“연산자 우선순위와 복잡한 표현식” 강의는 무료인가요?

네 — “연산자 우선순위와 복잡한 표현식” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 R Academy 강의 전체를 잠금 해제할 수 있습니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“연산자 우선순위와 복잡한 표현식”에서 뭘 배우나요?

평가 순서를 이해하고 복잡한 표현식을 안전하게 작성합니다. 브라우저에서 직접 실행하는 실습 코드로 R Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

R Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 R Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“연산자 우선순위와 복잡한 표현식” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 R Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 R Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 산술 및 비교 연산자
  2. 논리 연산자와 불리언 논리
  3. 할당 및 특수 연산자
  4. 연산자 우선순위와 복잡한 표현식
← R Academy(으)로 돌아가기