프로그래밍 언어/C#

C# 연산자와 표현식 입문자를 위한 산술, 비교, 논리 및 람다 예제 - C# 4

eco7T 2024. 8. 27. 09:15
반응형

이번에는 C#의 연산자와 표현식에 대해 정리하도록 하겠습니다. 처음 입문한 사람도 쉽게 이해할 수 있도록 실제 적용 가능한 예시를 통해 설명하도록 하겠습니다.

C# 연산자와 표현식
C# 연산자와 표현식

 

C# 연산자와 표현식

  1. 연산자 (Operators)

연산자는 프로그래밍에서 특정한 작업을 수행하기 위해 사용되는 기호나 단어입니다. C#에서는 다양한 종류의 연산자를 제공하며, 이를 통해 계산, 비교, 논리 연산 등을 수행할 수 있습니다.

 

산술 연산자 (Arithmetic Operators)

산술 연산자는 수학적인 계산을 수행하는 데 사용됩니다.

  • 더하기 (+): 두 개의 값을 더합니다.
  • 빼기 (-): 왼쪽 값에서 오른쪽 값을 뺍니다.
  • 곱하기 (*): 두 개의 값을 곱합니다.
  • 나누기 (/): 왼쪽 값을 오른쪽 값으로 나눕니다.
  • 나머지 (%): 나눗셈의 나머지를 구합니다.
int a = 10; int b = 3; int sum = a + b; // 결과: 13 int difference = a - b; // 결과: 7 int product = a * b; // 결과: 30 int quotient = a / b; // 결과: 3 (정수 나눗셈이므로 소수점 이하는 버려집니다) int remainder = a % b; // 결과: 1 Console.WriteLine($"합: {sum}"); Console.WriteLine($"차: {difference}"); Console.WriteLine($"곱: {product}"); Console.WriteLine($"몫: {quotient}"); Console.WriteLine($"나머지: {remainder}");

이 예시에서 우리는 변수 a와 b를 선언하고 초기화한 후, 다양한 산술 연산을 수행했습니다.

각 연산의 결과는 새로운 변수에 저장되고, Console.WriteLine() 메서드를 사용하여 출력됩니다. $"..." 형식은 문자열 보간(String Interpolation)이라고 하며, 문자열 안에 변수의 값을 직접 삽입할 수 있게 해 줍니다.

 

증감 연산자 (Increment and Decrement Operators)

증감 연산자는 변수의 값을 1 증가시키거나 감소시킵니다.

  • 증가 (++): 변수의 값을 1 증가시킵니다.
  • 감소 (--): 변수의 값을 1 감소시킵니다.

이 연산자들은 변수의 앞(전위)이나 뒤(후위)에 위치할 수 있으며, 위치에 따라 동작이 약간 다릅니다. 

int x = 5; Console.WriteLine($"초기 x 값: {x}"); // 후위 증가 int y = x++; Console.WriteLine($"y = x++ 후 x: {x}, y: {y}"); // 전위 증가 x = 5; // x를 다시 5로 초기화 int z = ++x; Console.WriteLine($"z = ++x 후 x: {x}, z: {z}"); // 후위 감소 x = 5; // x를 다시 5로 초기화 int w = x--; Console.WriteLine($"w = x-- 후 x: {x}, w: {w}"); // 전위 감소 x = 5; // x를 다시 5로 초기화 int v = --x; Console.WriteLine($"v = --x 후 x: {x}, v: {v}");

이 예시에서 우리는 증감 연산자의 다양한 사용법을 보여줍니다.

  1. x++는 x의 현재 값을 y에 할당한 후 x를 증가시킵니다.
  2. ++x는 x를 증가시킨 후 그 값을 z에 할당합니다.
  3. x--는 x의 현재 값을 w에 할당한 후 x를 감소시킵니다.
  4. --x는 x를 감소시킨 후 그 값을 v에 할당합니다.

이러한 차이점을 이해하는 것은 매우 중요합니다. 특히 다른 연산과 함께 사용될 때 결과가 달라질 수 있기 때문입니다.

 

할당 연산자 (Assignment Operators)

할당 연산자는 변수에 값을 할당하는 데 사용됩니다.

  • 기본 할당 (=): 오른쪽의 값을 왼쪽 변수에 할당합니다.
  • 복합 할당 (+=, -=, *=, /=, %=): 연산과 할당을 동시에 수행합니다.

 

int a = 10; Console.WriteLine($"초기 a 값: {a}"); a += 5; // a = a + 5와 동일 Console.WriteLine($"a += 5 후 a 값: {a}"); a -= 3; // a = a - 3와 동일 Console.WriteLine($"a -= 3 후 a 값: {a}"); a *= 2; // a = a * 2와 동일 Console.WriteLine($"a *= 2 후 a 값: {a}"); a /= 4; // a = a / 4와 동일 Console.WriteLine($"a /= 4 후 a 값: {a}"); a %= 3; // a = a % 3와 동일 Console.WriteLine($"a %= 3 후 a 값: {a}");

이 예시에서는 다양한 복합 할당 연산자를 사용하여 변수 a의 값을 변경합니다.

각 연산 후 Console.WriteLine()을 사용하여 a의 새로운 값을 출력합니다. 이러한 복합 할당 연산자는 코드를 더 간결하게 만들어주며, 자주 사용되는 패턴을 더 쉽게 표현할 수 있게 해 줍니다.

 

비교 연산자 (Comparison Operators)

비교 연산자는 두 값을 비교하여 그 결과를 불리언(boolean) 값으로 반환합니다. 불리언 값은 참(true) 또는 거짓(false) 두 가지 중 하나입니다.

  • 같음 (==): 두 값이 같으면 true, 다르면 false를 반환합니다.
  • 다름 (!=): 두 값이 다르면 true, 같으면 false를 반환합니다.
  • 큼 (>): 왼쪽 값이 오른쪽 값보다 크면 true, 그렇지 않으면 false를 반환합니다.
  • 작음 (<): 왼쪽 값이 오른쪽 값보다 작으면 true, 그렇지 않으면 false를 반환합니다.
  • 크거나 같음 (>=): 왼쪽 값이 오른쪽 값보다 크거나 같으면 true, 그렇지 않으면 false를 반환합니다.
  • 작거나 같음 (<=): 왼쪽 값이 오른쪽 값보다 작거나 같으면 true, 그렇지 않으면 false를 반환합니다. 
int x = 5; int y = 10; bool isEqual = (x == y); Console.WriteLine($"x == y: {isEqual}"); bool isNotEqual = (x != y); Console.WriteLine($"x != y: {isNotEqual}"); bool isGreater = (x > y); Console.WriteLine($"x > y: {isGreater}"); bool isLess = (x < y); Console.WriteLine($"x < y: {isLess}"); bool isGreaterOrEqual = (x >= y); Console.WriteLine($"x >= y: {isGreaterOrEqual}"); bool isLessOrEqual = (x <= y); Console.WriteLine($"x <= y: {isLessOrEqual}");

이 예시에서는 변수 x와 y를 비교하여 각 비교 연산자의 결과를 출력합니다. 비교 연산자는 조건문(if 문 등)에서 자주 사용되며, 프로그램의 흐름을 제어하는 데 중요한 역할을 합니다.

 

논리 연산자 (Logical Operators)

논리 연산자는 불리언 값들을 조합하거나 반전시키는 데 사용됩니다.

  • AND (&&): 두 조건이 모두 참일 때만 true를 반환합니다.
  • OR (||): 두 조건 중 하나라도 참이면 true를 반환합니다.
  • NOT (!): 조건의 결과를 반전시킵니다. true는 false로, false는 true로 바꿉니다.

 

bool condition1 = true; bool condition2 = false; bool andResult = condition1 && condition2; Console.WriteLine($"condition1 && condition2: {andResult}"); bool orResult = condition1 || condition2; Console.WriteLine($"condition1 || condition2: {orResult}"); bool notResult = !condition1; Console.WriteLine($"!condition1: {notResult}"); // 복합 논리 연산 예시 int age = 25; bool hasLicense = true; bool canDrive = (age >= 18) && hasLicense; Console.WriteLine($"나이가 18세 이상이고 면허가 있는가? {canDrive}"); bool needsParentalConsent = (age < 18) || !hasLicense; Console.WriteLine($"나이가 18세 미만이거나 면허가 없는가? {needsParentalConsent}");

이 예시에서는 기본적인 논리 연산과 함께 실제 상황을 가정한 복합 논리 연산도 보여줍니다.

논리 연산자는 여러 조건을 조합하여 복잡한 조건식을 만드는 데 사용됩니다. 특히 if 문이나 while 루프 등의 제어 구조에서 자주 사용됩니다.

 

  2. 표현식 (Expressions)

표현식은 하나 이상의 연산자와 피연산자(operand)로 구성된 코드 단위로, 값을 생성합니다. 피연산자는 연산의 대상이 되는 값이나 변수를 말합니다.

 

단순 표현식

단순 표현식은 하나의 값이나 변수로 구성됩니다. 

int x = 5; // 여기서 5는 단순 표현식입니다. string name = "John"; // "John"도 단순 표현식입니다.

 

복합 표현식

복합 표현식은 여러 연산자와 피연산자로 구성됩니다.

int a = 5; int b = 3; int c = 2; int result = a * b + c; // a * b + c는 복합 표현식입니다. Console.WriteLine($"결과: {result}"); // 다른 복합 표현식 예시 bool isEven = (result % 2 == 0); // (result % 2 == 0)은 복합 표현식입니다. Console.WriteLine($"결과가 짝수인가? {isEven}");

이 예시에서 a * b + c는 복합 표현식입니다. 이 표현식은 먼저 a * b를 계산한 후 그 결과에 c를 더합니다. 연산자 우선순위에 따라 곱셈이 덧셈보다 먼저 수행됩니다.

(result % 2 == 0)도 복합 표현식입니다. 이 표현식은 result를 2로 나눈 나머지가 0인지 확인하여 결과가 짝수인지 판단합니다.

 

조건 표현식 (삼항 연산자)

조건 표현식은 조건에 따라 두 값 중 하나를 선택하는 특별한 형태의 표현식입니다. C#에서는 이를 위해 삼항 연산자 ?:를 사용합니다.

구문: 조건 ? 참일 때의 값 : 거짓일 때의 값 

int age = 20; string message = (age >= 18) ? "성인입니다." : "미성년자입니다."; Console.WriteLine(message); // 다른 예시 int number = 7; string parity = (number % 2 == 0) ? "짝수" : "홀수"; Console.WriteLine($"{number}은(는) {parity}입니다.");

이 예시에서 (age >= 18) ? "성인입니다." : "미성년자입니다."는 조건 표현식입니다.

 

형변환 표현식 (Type Casting Expressions)

형변환 표현식은 한 데이터 타입의 값을 다른 타입으로 변환하는 데 사용됩니다. C#에서는 두 가지 주요 형변환 방법이 있습니다.

1) 암시적 형변환 (Implicit Casting): 작은 크기의 타입에서 더 큰 크기의 타입으로 변환할 때 사용됩니다. 데이터 손실의 위험이 없기 때문에 C#이 자동으로 수행합니다. 

int intNumber = 100; long longNumber = intNumber; // int에서 long으로 암시적 형변환 Console.WriteLine($"int 값: {intNumber}, long 값: {longNumber}"); float floatNumber = 3.14f; double doubleNumber = floatNumber; // float에서 double로 암시적 형변환 Console.WriteLine($"float 값: {floatNumber}, double 값: {doubleNumber}");

 

2) 명시적 형변환 (Explicit Casting): 더 큰 크기의 타입에서 작은 크기의 타입으로 변환하거나, 호환되지 않는 타입 간의 변환에 사용됩니다. 데이터 손실의 가능성이 있기 때문에 프로그래머가 명시적으로 지정해야 합니다. 

double largeNumber = 1234.56; int smallNumber = (int)largeNumber; // double에서 int로 명시적 형변환 Console.WriteLine($"원래 double 값: {largeNumber}, 변환된 int 값: {smallNumber}"); // 문자열을 숫자로 변환 string numberString = "42"; int parsedNumber = int.Parse(numberString); Console.WriteLine($"문자열 \"{numberString}\"을 정수로 변환: {parsedNumber}"); // TryParse 메서드를 사용한 안전한 형변환 string invalidNumber = "not a number"; if (int.TryParse(invalidNumber, out int result)) { Console.WriteLine($"변환 성공: {result}"); } else { Console.WriteLine("변환 실패: 유효하지 않은 숫자 문자열"); }

이 예시에서 (int)largeNumber는 명시적 형변환입니다. double 타입의 값을 int 타입으로 강제 변환하며, 소수점 이하는 버려집니다.

int.Parse() 메서드는 문자열을 정수로 변환합니다. 하지만 변환할 수 없는 문자열이 주어지면 예외를 발생시킵니다.

int.TryParse() 메서드는 더 안전한 방법으로, 변환에 실패해도 예외를 발생시키지 않고 대신 boolean 값을 반환하여 변환 성공 여부를 알려줍니다.

 

복합 할당 표현식 (Compound Assignment Expressions)

복합 할당 표현식은 연산과 할당을 동시에 수행합니다. 이는 코드를 더 간결하게 만들어 줍니다.

int x = 10; Console.WriteLine($"초기 x 값: {x}"); x += 5; // x = x + 5와 동일 Console.WriteLine($"x += 5 후 x 값: {x}"); x *= 2; // x = x * 2와 동일 Console.WriteLine($"x *= 2 후 x 값: {x}"); string str = "Hello"; str += " World"; // str = str + " World"와 동일 Console.WriteLine($"문자열 연결 결과: {str}");

이 예시에서 x += 5x *= 2는 복합 할당 표현식입니다. 이들은 각각 덧셈과 곱셈을 수행한 후 그 결과를 다시 x에 할당합니다.

문자열에 대해서도 += 연산자를 사용할 수 있으며, 이는 문자열 연결 연산을 수행합니다.

 

람다 표현식 (Lambda Expressions)

람다 표현식은 익명 함수를 생성하는 간결한 방법을 제공합니다. 주로 LINQ(Language Integrated Query) 쿼리나 이벤트 핸들러에서 사용됩니다.

 

기본 구문: (매개변수) => 표현식 또는 명령문 블록 

// 간단한 람다 표현식 Func<int, int> square = x => x * x; Console.WriteLine($"3의 제곱: {square(3)}"); // 매개변수가 여러 개인 람다 표현식 Func<int, int, int> add = (x, y) => x + y; Console.WriteLine($"5 + 3 = {add(5, 3)}"); // 명령문 블록을 포함하는 람다 표현식 Func<int, string> evenOdd = x => { if (x % 2 == 0) return "짝수"; else return "홀수"; }; Console.WriteLine($"7은 {evenOdd(7)}입니다."); // LINQ와 함께 사용하는 람다 표현식 int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; var evenNumbers = numbers.Where(n => n % 2 == 0); Console.WriteLine("짝수 목록: " + string.Join(", ", evenNumbers));

이 예시에서,

  • x => x * x는 입력을 제곱하는 간단한 람다 표현식입니다.
  • (x, y) => x + y는 두 개의 매개변수를 받아 더하는 람다 표현식입니다.
  • x => { ... }는 여러 명령문을 포함하는 더 복잡한 람다 표현식입니다.
  • n => n % 2 == 0는 LINQ의 Where 메서드와 함께 사용되어 짝수만 필터링하는 람다 표현식입니다.

람다 표현식은 코드를 더 간결하고 읽기 쉽게 만들어주며, 함수형 프로그래밍 스타일을 C#에서 구현할 수 있게 해 줍니다.

반응형