C# 식

Tip

이 문서는 이미 하나 이상의 프로그래밍 언어를 알고 있으며 C#을 학습하는 개발자를 위한 기본 사항 섹션의 일부입니다. 프로그래밍을 처음 접하는 경우 먼저 시작 자습서로 시작 하세요.

다른 언어에서 오시겠습니까? C#의 식은 Java, C++, JavaScript의 식과 거의 동일하게 동작합니다. 주목할 만한 한 가지 차이점: 복합 할당 연산자와 같은 += 증분 연산 ++ 자는 C#의 식이므로 더 큰 식에 나타날 수 있습니다.

은 컴파일러가 값(숫자, 문자열, 참조 또는 )을 생성하기 위해 평가하는 코드 조각입니다bool. 예를 들어, 3 + 4 * 2는 정수 11로 계산되는 식이고, total > 10true 또는 false로 계산되는 식입니다.

가장 간단한 식은 리터럴 (예: 42 또는 "hello")과 변수 이름 (예: total)입니다. 더 간단한 식과 연산자를 결합하여 더 복잡한 식을 작성합니다.

표현식과 명령문

식은 값을 생성합니다. 은 프로그램이 실행되는 전체 명령입니다. 많은 문에는 식이 포함되어 있습니다. 예를 들어 int total = 3 + 4 * 2; 변수 선언문입니다. 컴파일러는 생성되는 11이니셜라이저 식을 3 + 4 * 2평가하고 해당 값을 새 변수total에 할당합니다.

표현식은 구처럼, C# 문은 완전한 문장처럼 생각할 수 있습니다. 이러한 작업 정의는 C#에 대해 자세히 알아볼 때 발생하는 공식적인 용어와 설명을 이해하는 데 도움이 되지만, 일반적인 코딩에서는 구분을 의식적으로 기억할 필요가 거의 없습니다.

식 결합하기

표현식은 결합할 수 있습니다. 3 + 4 * 2을 가정해보세요. 이 단일 식에는 실제로 곱하기 식과 더하기 식이라는 두 개의 작은 4 * 23 + <result>이 포함됩니다. 식들이 결합되면 C#은 어느 식을 먼저 평가할지 결정하는 규칙이 필요합니다. 해당 규칙은 연산자 우선 순위입니다.

전체 우선 순위 계층을 기억할 필요가 없습니다. 다음 섹션에서는 일상적인 그룹을 요약하고, 괄호를 사용하면 확실하지 않을 때 항상 주문을 명시적으로 지정할 수 있습니다.

연산자 우선 순위

연산자 우선 순위 는 결합된 식이 하위 식으로 그룹 화되는 방법을 결정합니다. 이 개념은 수학 클래스의 연산 순서 규칙과 유사합니다. 우선순위가 높은 연산자는 피연산자에 더 밀접하게 결합됩니다. 식은 이러한 피연산자를 함께 괄호로 묶은 것처럼 구조화됩니다. 3 + 4 * 2에서는 *의 우선순위가 +보다 높으므로 식은 (3 + 4) * 2가 아니라 3 + (4 * 2)로 묶입니다.

C#은 여기에 요약된 4개보다 우선 순위 그룹이 더 높습니다. 이러한 추가 그룹은 친숙한 규칙(예: 추가 전 곱하기)을 적용하고 전체 연산자 집합을 다룹니다. 다음 그룹은 일상적인 코드에서 가장 자주 발생하는 항목을 다룹니다.

  1. 기본, 단항 및 범위 는 산술보다 더 긴밀하게 바인딩되는 세 가지 고유 우선 순위 그룹입니다. 이 요약은 실용적인 목적을 위해 모두 산술 전에 적용되기 때문에 이를 한 단계로 결합합니다.
    • 멤버 액세스(), 메서드 호출(x.y), 인덱싱(f()a[i]) 및 null 조건부 액세스(?., ?[]) 등 기본 연산자는 가장 긴밀하게 바인딩됩니다.
    • 단항 연산자는 부정(), 논리 NOT(-x), 접두사 증가(!flag) 및 후위 증가(++ii++)와 같은 단일 피연산자에 대해 작동합니다.
    • range 연산자(..)는 조각 식에 대한 인덱스 범위를 빌드합니다(예: array[1..4].).
  2. 산술*, /, %+-보다 더 강하게 결합됩니다. 곱하기 및 나누기 추가 및 빼기 전에 발생합니다.
  3. 비교<, >, <=, >=, ==, != 산술보다 덜 단단히 바인딩되므로 비교 전에 산술이 완료됩니다.
  4. 논리&&||는 일반적인 연산자들 중 결합 우선순위가 가장 낮으므로, 논리 결합이 이루어지기 전에 비교가 완료됩니다.

이 우선순위는 식 score + bonus > threshold && attempts < maxAttempts이 읽는 그대로 정확히 평가된다는 뜻입니다. 즉, scorebonus를 더하고, 그 합을 threshold와 비교하고, attemptsmaxAttempts와 비교한 다음, 두 bool 결과를 &&로 결합합니다. 모든 그룹화가 명시적으로 표시되도록 괄호를 추가하면 동일한 구조 ((score + bonus) > threshold) && (attempts < maxAttempts)가 표시됩니다.

모든 연산자를 포함하는 전체 우선 순위 계층 구조는 C# 연산자 및 식을 참조하세요.

괄호를 사용하여 의도 명확하게 만들기

괄호는 우선 순위를 재정의하고 의도를 동시에 문서화합니다. 위의 그룹에서 순서가 명확하지 않은 경우 괄호를 추가합니다.

int score = 80;
int bonus = 15;
int threshold = 90;
bool eligible = true;

// Without parentheses: || binds less tightly than &&, so this reads as:
//   eligible && (score + bonus > threshold) || bonus > 20
bool result1 = eligible && score + bonus > threshold || bonus > 20;

// With parentheses: forces the || to combine two complete conditions
bool result2 = (eligible && score + bonus > threshold) || bonus > 20;

Console.WriteLine(result1); // => True
Console.WriteLine(result2); // => True

// Parentheses can also change the result:
bool isAdmin = false;
bool isOwner = true;

// Without: && binds tighter, so: (isAdmin && isOwner) || true
bool access1 = isAdmin && isOwner || true;
// With: forces the || to run first
bool access2 = isAdmin && (isOwner || true);

Console.WriteLine(access1); // => True   (false && true is false; false || true is true)
Console.WriteLine(access2); // => False  (false && anything is false)

마지막 두 줄은 괄호가 스타일뿐만 아니라 결과를 변경할 수 있음을 보여 줍니다. ||&&가 함께 나타날 때는 어느 조건이 먼저 결합되는지 명확히 표시할 수 있도록 괄호를 추가합니다. 보는 (isAdmin && isOwner) || isSuperUser 독자는 의도를 즉시 알고 있습니다.

표현식이 평가되는 방법

C#이 결합된 식을 평가하는 방법을 이해하는 것은 비유를 통해 더 쉽습니다. 연필과 종이의 복잡한 수학 문제를 생각해 보십시오. 가장 안쪽 또는 가장 높은 우선 순위 하위 식을 식별하고, 중간 값을 계산하고, 결과를 적어 둔 다음, 다음 하위 식으로 반복합니다. 최종 답변에 도달할 때까지 계속됩니다.

C#은 두 가지 규칙에 따라 동일한 프로세스를 따릅니다.

규칙 1: 피연산자는 좌에서 우로 평가된다. 이진 식의 경우 연산자를 적용하기 전에 두 피연산자를 모두 완전히 평가해야 합니다. C#은 먼저 왼쪽 피연산자를 계산한 다음 오른쪽 피연산자를 계산한 다음 작업을 수행합니다.

규칙 2: 일부 연산자가 단락합니다. 특정 연산자는 결과가 결정되는 즉시 평가를 중지하고 나머지 피연산자를 건너뜁니다.

  • && (조건부 AND): 왼쪽 피연산자가 false가 되는 즉시 false를 반환합니다. 오른쪽은 평가되지 않습니다.
  • || (조건부 OR): 왼쪽이 true가 되는 즉시 true을 반환합니다. 오른쪽은 평가되지 않습니다.
  • ?: (조건부/삼항): 조건과 일치하는 분기만 평가합니다. 다른 분기는 평가되지 않습니다.
  • ?. (null 조건부 멤버 액세스) 및 ?[] (null 조건부 요소 액세스): 왼쪽이 null이면 멤버 액세스 또는 인덱싱을 건너뛰고 null를 즉시 반환합니다.
  • ??= (null 병합 할당): 왼쪽이 null일 때만 오른쪽 값을 할당합니다.

종이 및 연필 평가

식을 3 + 6 / 2고려합니다. 읽는 순서 / 에서 더하기가 먼저 나타나더라도 우선 순위 +가 더 높으므로 먼저 계산되는 하위 식도 마찬가지 6 / 2 입니다. 문서와 똑같이 단계별로 작업합니다.

3 + 6 / 2
      ↓   (evaluate 6 / 2 → 3)
3 +   3
  ↓   (evaluate 3 + 3 → 6)
  6
// 3 + 6 / 2
// Step 1: 6 / 2 has higher precedence → interim value 3
// Step 2: 3 + 3 → final result 6
int result = 3 + 6 / 2;
Console.WriteLine(result); // => 6

3에 의해 생성된 중간 값 6 / 2+의 오른쪽 피연산자가 되며, 최종 결과는 6입니다. 각 하위 식은 중간 값을 생성합니다. 이러한 중간 값은 하나의 값만 남을 때까지 다음 하위 식을 공급합니다.

결합성은 관련된 개념입니다. 두 연산자의 우선 순위가 같을 때 결합성은 어느 연산자가 먼저 가는지 결정합니다. 대부분의 C# 연산자는 왼쪽 연결 연산자이므로 왼쪽에서 오른쪽으로 그룹화됩니다. a - b - c(a - b) - c이 아니라 a - (b - c)와 같습니다.

실전에서의 단락 평가

단락 평가는 null 검사에 특히 유용합니다.

string? text = null;

// Safe: second condition runs only when text is not null
bool hasContent = text != null && text.Length > 0;
Console.WriteLine(hasContent); // => False  (short-circuits after null check; no NullReferenceException)

text = "hello";
hasContent = text != null && text.Length > 0;
Console.WriteLine(hasContent); // => True

// || short-circuits on true: right side is never evaluated when left side is true
string word = "hello";
bool anyMatch = word.StartsWith("h") || word.StartsWith("x");
Console.WriteLine(anyMatch); // => True  (right side never evaluated)

// ?. short-circuits on null: returns null without accessing .Length
string? maybeNull = null;
int? length = maybeNull?.Length;   // length is null; no NullReferenceException
Console.WriteLine(length.HasValue); // => False

text != null && text.Length > 0 는 두 번째 조건이 아닌 경우에만 textnull실행되므로 안전합니다. 마찬가지로, nullif 참조를 만나면 평가를 중지하여, 명시적인 ?. 검사 없이 NullReferenceException를 방지합니다.

null 안전 연산자에 대한 자세한 내용은 C# null 연산자를 참조하세요.

참고하십시오