반응형

2.4 연산자 우선순위 개념과 괄호를 통한 제어

이 표현식, 과연 어떤 결과가 나올까요? 자바 연산자 우선순위와 평가 순서를 이해하지 못하면 의도치 않은 결과가 나올 수도 있어요!

반응형

안녕하세요! 오늘은 자바 연산자의 우선순위와 평가 순서에 대해 알아보려 해요. 프로그래밍을 처음 배우는 분들이 가장 혼란스러워하는 부분 중 하나인데요. 예를 들어 `a + b * c`라는 표현식에서 어떤 연산이 먼저 실행될지 바로 알 수 있으신가요? 😅 이런 혼란을 방지하려면 연산자의 우선순위와 평가 방향을 정확히 이해하는 게 정말 중요해요. 그리고 괄호를 적절히 활용하는 습관도요! 이번 글에서는 자바에서 사용되는 다양한 연산자의 우선순위를 한눈에 살펴보고, 어떤 상황에서 괄호를 사용해야 할지 예제를 통해 배워볼 거예요. 실전 코딩을 하다 보면 연산 순서가 결과에 큰 영향을 미치는 경우가 정말 많거든요. 자, 그럼 함께 알아볼까요? ✨

1. 연산자 우선순위란 무엇인가요? 🤔

프로그래밍 언어에서는 다양한 연산자들이 존재하죠. 자바에서도 덧셈(+), 곱셈(*), 논리 연산자(&&), 비교 연산자(==) 등 여러 종류의 연산자를 사용할 수 있습니다. 그런데 이 연산자들이 한 줄의 코드에서 여러 개 등장하면 어떤 순서로 연산이 될까요? 바로 그때 필요한 개념이 연산자 우선순위입니다.

예를 들어, 다음과 같은 식을 생각해볼게요:

int result = 10 + 2 * 3;

이 코드에서 *+보다 우선순위가 높기 때문에 2 * 3이 먼저 계산되고 그 결과에 10이 더해져 최종적으로 result = 16이 됩니다. 만약 +를 먼저 계산하고 싶다면 어떻게 해야 할까요? 그렇죠. 괄호를 사용해서 (10 + 2) * 3처럼 바꾸면 됩니다.

✅ 왜 우선순위가 중요할까요?

  • 논리적 오류 방지: 연산 순서를 잘못 이해하면 전혀 다른 결과가 나올 수 있어요.
  • 가독성 향상: 괄호를 적절히 활용하면 코드의 의도를 명확히 표현할 수 있어요.
  • 디버깅 시간 절약: 우선순위를 제대로 이해하면 의도하지 않은 결과로 인한 디버깅 시간을 줄일 수 있어요.

🧠 실생활에 비유해 볼까요?

커피를 마시기 전에 물을 끓여야 하잖아요? 순서를 바꾸면 안 되죠! 자바에서도 마찬가지예요. 연산자의 순서를 잘못 지정하면 "끓이기 전에 마신" 것 같은 결과가 나옵니다. 😅

다음 섹션에서는 자바에서 제공하는 전체 연산자 우선순위를 표로 한눈에 정리해 드릴게요. 복잡한 것 같아도 금방 익숙해질 수 있어요!

2. 자바의 연산자 우선순위 표 📊

자바에서는 여러 연산자들이 미리 정해진 우선순위(priority)에 따라 평가됩니다. 아래는 자바 공식 문서 기준으로 정리한 연산자 우선순위 표입니다. 높은 우선순위를 가진 연산자가 먼저 실행됩니다.

우선순위 연산자 설명
1 (가장 높음) [], (), . 배열 인덱스, 괄호, 멤버 접근
2 ++, -- 단항 후위 연산자
3 ++, --, +, -, ~, ! 단항 전위 연산자
4 *, /, % 곱셈, 나눗셈, 나머지
5 +, - 덧셈, 뺄셈
6 <<, >>, >>> 비트 이동
7 <, <=, >, >=, instanceof 비교 연산자
8 ==, != 등가 비교
9 & 비트 AND
10 ^ 비트 XOR
11 | 비트 OR
12 && 논리 AND
13 || 논리 OR
14 ?: 삼항 연산자
15 =, +=, -= 등 대입 연산자

표가 길다고 너무 부담 갖지 마세요! 처음에는 외우기보다는 "곱셈/나눗셈이 덧셈/뺄셈보다 먼저다"와 같은 자주 쓰는 우선순위만 기억해도 충분합니다. 그리고 항상 괄호를 통해 연산 순서를 명확하게 지정해주는 습관을 들이면 실수를 줄일 수 있어요.

3. 평가 순서(Associativity)란? 🔄

연산자 우선순위는 어떤 연산이 먼저 실행되는지를 알려주죠. 그런데 우선순위가 같은 연산자들이 나열되면 어떤 방향으로 평가될까요? 이때 필요한 개념이 바로 평가 순서(Associativity)입니다.

🧭 좌측 결합과 우측 결합

대부분의 연산자는 왼쪽에서 오른쪽으로(Left-to-Right) 평가됩니다. 하지만 몇몇 연산자는 오른쪽에서 왼쪽으로(Right-to-Left) 평가돼요. 예제를 보며 확인해볼게요!

int a = 10, b = 20, c = 30;
int result = a + b + c;

위 식에서는 + 연산자의 우선순위는 같고, 좌측 결합이 적용되므로 (a + b) + c로 계산됩니다. 반면 아래와 같은 예제를 볼까요?

int x;
x = y = z = 100;

여기서 대입 연산자 =우측 결합을 따릅니다. 그래서 z = 100이 먼저 실행되고, 그 결과가 y에 대입되고, 마지막으로 x에 대입돼요. 즉 x = (y = (z = 100))과 같은 순서로 평가됩니다.

📝 주요 연산자의 결합 방향

연산자 결합 방향 예시
+, -, *, /, %, &, |, ^, &&, || Left-to-Right a + b + c → (a + b) + c
=, +=, -=, *=, /=, %= Right-to-Left x = y = z = 100 → x = (y = (z = 100))
?: (삼항 연산자) Right-to-Left result = condition ? a : b;

이렇게 평가 순서까지 이해하면 복잡한 식도 더욱 명확하게 읽을 수 있어요! 다음 장에서는 이 모든 우선순위와 평가 순서를 괄호를 이용해 어떻게 제어할 수 있는지 실전 예제로 알아볼게요. 💡

4. 괄호의 필요성과 사용법 🎯

연산자 우선순위나 평가 순서를 완벽하게 외우지 못해도 괜찮아요. 왜냐하면 괄호를 활용하면 어떤 연산을 먼저 처리할지 프로그래머가 직접 제어할 수 있기 때문이에요! 괄호는 우선순위를 강제로 바꾸는 가장 강력한 도구이자, 가독성을 높이는 최고의 방법이에요.

📌 괄호 사용의 예

int result1 = 10 + 2 * 3;        // 결과: 16
int result2 = (10 + 2) * 3;      // 결과: 36

위 코드에서 result1은 기본 우선순위에 따라 곱셈이 먼저 계산돼 2 * 3 = 6이 되고, 그 후에 10 + 6이 돼서 결과는 16이 나와요. 하지만 result2는 괄호로 덧셈이 먼저 실행되도록 했기 때문에 (10 + 2) * 3 = 36이라는 결과가 나옵니다. 바로 이런 차이를 의도적으로 만들기 위해 괄호를 사용하는 거예요.

🧼 괄호는 가독성 향상에도 효과적!

  • 팀원들이 코드를 볼 때, 괄호로 연산 순서가 명확히 드러나면 해석하기 훨씬 쉬워요.
  • 코드 리뷰 시 혼란을 줄이고, 예기치 않은 오류 가능성을 줄일 수 있어요.

💡 괄호 사용 꿀팁

  1. 복잡한 수식이거나 연산자가 여러 개 섞여 있을 때는 무조건 괄호로 명확히 하자!
  2. 조건문, 반복문 안의 조건식에서도 괄호를 적극 활용하자.
  3. 계산 결과가 다르게 나올 수 있는 경우에는 실험적으로 괄호를 써서 테스트해보자.

괄호 하나로 코드의 운명이 바뀐다는 말, 과장 같지만 사실이에요! 😉 다음 섹션에서는 실전에서 자주 마주치는 헷갈리기 쉬운 표현식들을 통해 우선순위의 실제 활용을 확인해볼게요.

5. 헷갈리기 쉬운 표현식 예제 ⚠️

실제로 코드를 작성하다 보면, 우선순위와 평가 순서를 제대로 이해하지 못해 의도와 다른 결과를 얻게 되는 경우가 많아요. 아래 예제들을 함께 보며 어떤 부분이 헷갈리는지, 그리고 어떻게 해결하면 좋은지 확인해봐요!

🔍 예제 1: 논리 연산자와 비교 연산자의 충돌

boolean result = 5 < 3 && 10 > 5;

이 표현식은 5 < 3이 먼저 계산돼서 false가 되고, 이후 false && true가 되죠. 결과는 false입니다. 괄호 없이도 잘 작동하긴 하지만, 다음처럼 명시적으로 괄호를 써주는 게 좋아요:

boolean result = (5 < 3) && (10 > 5);

🔍 예제 2: 문자열 연결과 덧셈의 혼동

System.out.println("합계: " + 10 + 5);

이 코드는 "합계: 10"5가 문자열로 붙어서 "합계: 105"가 출력됩니다. 예상했던 "합계: 15"가 아니죠. 이를 해결하려면 괄호를 사용해서 덧셈이 먼저 되도록 해야 해요.

System.out.println("합계: " + (10 + 5)); // 출력: 합계: 15

🔍 예제 3: 삼항 연산자 중첩 사용

int a = 5;
String result = (a > 0) ? (a < 10 ? "0~9" : "10이상") : "0이하";

삼항 연산자는 우측 결합이기 때문에 위와 같이 중첩해서 쓸 수 있어요. 하지만 조건이 복잡해질수록 괄호로 각 조건을 명확히 구분하지 않으면 가독성이 떨어지고 버그가 발생할 위험이 커져요.

📌 실수 줄이는 팁 요약

  • 문자열 연산과 숫자 연산이 섞일 때는 꼭 괄호로 연산 순서를 분명히 하기
  • 조건문 안에서 삼항 연산자 중첩 사용은 최대한 피하고, 꼭 필요하다면 괄호로 구분
  • 애매한 표현식은 변수로 나눠서 중간 계산값을 확인하는 것도 좋은 습관

실제 개발자들도 종종 겪는 실수들, 미리 알고 있으면 훨씬 수월하게 피할 수 있겠죠? 😊 이제 마지막으로, 우리가 배운 개념들을 실전 문제로 풀어보면서 연산자 우선순위에 익숙해져 볼까요?

6. 연산자 우선순위 실전 문제와 해설 🧩

자, 이제까지 배운 연산자 우선순위평가 순서, 괄호 사용 등을 종합해서 실전 문제로 연습해볼 시간입니다! 직접 코드를 예측해보며 실력을 점검해보세요 💪

🔧 실전 문제 1

int result = 4 + 3 * 2;
System.out.println(result);
  • 예상 결과: 10
  • 해설: 3 * 2가 먼저 계산돼서 6, 그 다음 4 + 6 = 10

🔧 실전 문제 2

int result = (4 + 3) * 2;
System.out.println(result);
  • 예상 결과: 14
  • 해설: 괄호로 4 + 3를 먼저 계산하므로 7 * 2 = 14

🔧 실전 문제 3

int x = 10;
int y = 5;
int result = x > y && y < 3 ? 100 : 200;
System.out.println(result);
  • 예상 결과: 200
  • 해설: x > ytrue, y < 3false, 전체 true && false = false. 삼항 조건식의 결과는 200

📚 정리 요약

  • 자바 연산자는 우선순위에 따라 순서가 정해지며, 같은 순위일 경우 평가 방향(결합 순서)에 따라 결정됩니다.
  • 복잡하거나 혼동되는 식은 괄호를 사용해 명확히 제어하세요!
  • 우선순위를 외우기보다, 자주 쓰이는 연산의 순서를 기억하고 실습을 통해 익히는 것이 효과적입니다.

이제 자바의 연산자 우선순위에 대해 훨씬 더 자신이 생기셨을 거예요. 🙌 다음 시간에는 연산자 외에 또 다른 핵심 개념인 제어문으로 넘어가볼게요! 😊

마무리하며 🧠

연산자 우선순위와 평가 순서, 그리고 괄호의 사용법은 자바를 비롯한 모든 프로그래밍 언어에서 핵심적인 개념이에요. 우리가 생각하는 연산 순서와 컴파일러가 실제로 계산하는 순서가 다르면, 전혀 의도하지 않은 결과가 나올 수 있어요. 그래서 항상 명확한 괄호 사용기본 원칙의 이해가 중요하답니다.

 

지금 당장은 모든 연산자의 우선순위를 외우기 어렵더라도, 자주 사용하는 것부터 하나씩 익혀가면서 연습을 하다 보면 자연스럽게 익숙해질 거예요. 그리고 괄호는 언제나 여러분의 친구라는 사실! 😉 복잡한 코드일수록 괄호로 감싸주는 습관을 들이면 실수도 줄고, 협업 시에도 훨씬 가독성 좋은 코드를 만들 수 있답니다.

 

 끝까지 함께 해주셔서 고맙습니다 🙏

반응형

+ Recent posts