1. 소개
일상적인 비유로 시작해보자. 레시피를 상상해봐:
밀가루를 섞고, 계란과 설탕을 넣고 휘저어, 버터를 넣고 다시 휘저어.
좀 이상하지? 이제 "휘저어"랑 "넣고" 사이에 쉼표나 괄호가 있다고 생각해봐. 순서가 훨씬 명확해지지.
프로그래밍에서도 비슷한 상황이 생겨. 복잡한 식을 쓸 때 말이야:
bool result = a > 0 && b < 10 || c == 3;
순서가 어떻게 될까? 뭐가 먼저 계산될까: a > 0 && b < 10이 먼저고, 그 다음에 || c == 3이야? 아니면 반대일까? 계산 순서가 명확하지 않으면 컴퓨터가 "재료를 섞는 순서"를 헷갈릴 수 있고, 결과가 예상 밖이 될 수도 있어.
2. C#에서 연산자 우선순위
C# (그리고 대부분의 프로그래밍 언어)은 정해진 연산자 우선순위 표를 사용해.
우선순위가 높은 연산자가 낮은 연산자보다 먼저 실행돼.
이 표에서 조건문에 중요한 부분만 뽑아봤어:
| 연산자 | 설명 | 우선순위 |
|---|---|---|
| () | 괄호 | 가장 높음 |
| ! | 논리 "NOT" | 높음 |
| ==, != | 같다 / 다르다 | 중간 |
| <, >, <=, >= | 비교 | 중간 |
| && | 논리 "AND" | 낮음 |
| || | 논리 "OR" | 더 낮음 |
(산술 연산자도 있는데, 걔네는 논리 연산자보다 우선순위가 더 높아.)
핵심 규칙
"AND" (&&) 연산자가 "OR" (||)보다 우선순위가 높아,
즉, 먼저 "AND"가 계산되고, 그 다음에 "OR"이야.
조건 우선순위 계산 흐름도
실제로는: a > 0 && b < 10 || c == 3 — 먼저 a > 0 && b < 10이 계산되고, 그 결과가 c == 3이랑 ||로 비교돼.
3. 연산자 방향: 왼쪽에서 오른쪽, 그리고 반대
우선순위 말고도, 결합법칙(associativity)이라는 것도 있어.
이건 같은 우선순위의 연산자가 "나란히" 있을 때 어느 방향으로 계산되는지 정하는 규칙이야.
예시:
bool a = true, b = false, c = true;
bool result = a && b && c;
질문: 어떻게 계산될까?
답: &&의 결합법칙은 왼쪽에서 오른쪽이야.
그러니까 먼저 a && b를 계산하고, 그 결과를 c랑 계산해.
조건문에서 적용:
| 연산자 | 결합법칙 |
|---|---|
| &&, || | 왼쪽에서 오른쪽 |
| ! | 오른쪽에서 왼쪽 |
4. 괄호 — 복잡한 조건에서 최고의 친구
여기서 진짜 마법(그리고 구원)이 시작돼. 식을 쓸 때 괄호는 우선순위를 바꿔주고 네 코드를 더 명확하고 안전하게 만들어줘.
예시 1 (괄호 없음):
// 우리가 원하는 것: "사용자가 성인이고 시민이거나, 아니면 특수패스가 있으면"
bool isAdult = age >= 18;
bool isCitizen = country == "벨라루스";
bool hasPermit = hasSpecialPass == true;
if (isAdult && isCitizen || hasPermit)
{
Console.WriteLine("접근 허용됨!");
}
C#이 계산하는 방식:
먼저 isAdult && isCitizen을 계산하고, 그 결과를 ||로 hasPermit이랑 비교해.
- 예를 들어, isAdult = true, isCitizen = false, hasPermit = true
isAdult && isCitizen→true && false→falsefalse || true→true
즉, 특수패스가 있으면 무조건 통과.
특수패스가 없어도 성인 시민이면 통과.
예시 2 (괄호 있음):
if (isAdult && (isCitizen || hasPermit))
{
Console.WriteLine("접근 허용됨!");
}
이제 프로그램은 먼저:
isCitizen || hasPermit을 계산하고, 그 결과를 isAdult랑 같이 봐.
즉, 성인이면서 그리고 (시민이거나 특수패스가 있어야) 돼.
괄호 하나 차이인데, 로직은 완전 달라지는 거지!
GO TO FULL VERSION