1. 식 vs 명령문
C#에서 모든 명령은 두 가지로 나뉘어: 명령문 (Statement)이랑 식 (Expression). 명령문은 "실행된다"고 하고, 식은 "계산된다"고 해. 근데 이게 핵심은 아니야.
진짜 차이점: 식은 계산 결과가 있어. 이 결과에는 타입이 있고, 변수에 넣거나 다른 식에서 쓸 수 있어.
예시:
| 코드 | 비고 |
|---|---|
|
명령문 |
|
식, 타입은 bool |
|
식, 타입은 변수 i와 같음 |
|
식, 타입은 변수 x와 같음 |
이게 우리한테 뭐가 좋냐면?
많은 명령문이 사실 식이야(계산 결과가 있음). 예를 들어, 이런 코드도 돼:int x, y, z;
x = y = z = 1; // x = (y = (z = 1));
식의 결과가 필요 없으면 무시해도 돼:
Console.ReadLine(); // 입력 결과 무시
이건 식이 결과 외에도 뭔가 유용한 걸 할 때(예를 들어, 화면에 출력하거나 입력을 읽을 때) 편해.
2. 삼항 연산자
C#에는 특별한 삼항(세 개) 연산자가 있어. 이건 if–else를 짧게 쓴 거랑 비슷해:
조건 ? 식1 : 식2;
조건이 참이면 식1이 계산되고, 아니면 식2가 계산돼. 조건 뒤에 ? 쓰고, 두 식은 :로 나눠.
if-else와의 주요 차이점: 삼항 연산자는 식이야, 결과를 변수에 넣거나 다른 식에서 쓸 수 있어.
예를 들어, 두 수 중 최소값을 구해보자:
int a = 2;
int b = 3;
int min = a < b ? a : b;
아니면 조건에 따라 변수에 다른 값을 넣을 수도 있어:
int age = 25;
int money;
if (age > 30)
money = 100;
else
money = 50;
삼항 연산자로 똑같이 쓰면:
int age = 25;
int money = age > 30 ? 100 : 50;
뭐가 더 좋냐면: if-else랑 삼항 연산자 속도는 똑같아. 근데 삼항 연산자는 짧은 조건에 좋아. 한 줄에 안 들어가면 if-else가 더 읽기 편해.
3. 사용 시 주의점
값의 타입
삼항 연산자의 두 가지 경우(<참일 때 값>와 <거짓일 때 값>)는 타입이 같거나 호환돼야 해(예: 둘 다 string이나 둘 다 int).
잘 되는 예:
int a = 10, b = 20;
int max = (a > b) ? a : b; // 둘 다 int
컴파일 에러 예:
int a = 10, b = 20;
// string이랑 int는 호환 안 됨
string result = (a > b) ? "더 큼" : 0; // 컴파일 에러
올바른 예:
int a = 10, b = 20;
string result = (a > b) ? "더 큼" : "작거나 같음";
예시: 숫자 다루기
int number = -5;
int abs = (number >= 0) ? number : -number;
Console.WriteLine(abs); // 5
4. 삼항 연산자를 앱에 넣기
간단한 대화형 앱을 만들어보자: 인사도 하고, 내년에 몇 살 될지 알려주고, 성인인지도 말해주는 프로그램이야.
Console.Write("이름을 입력하세요: ");
string name = Console.ReadLine();
Console.Write("나이를 입력하세요: ");
string ageText = Console.ReadLine();
int age = int.Parse(ageText);
int nextYear = age + 1;
string status = (nextYear >= 18) ? "성인" : "미성년자";
Console.WriteLine($"안녕, {name}! 내년에 너는 {nextYear}살이야. 너는 {status}야.");
설명:
- status 변수는 삼항 연산자로 계산돼: 내년 나이가 18 이상이면 성인(아니면 미성년자).
- 삼항 연산자는 문자열 안(예: $"" 인터폴레이션)에도 쉽게 넣을 수 있어.
5. 중첩 삼항 연산자 — 조심!
삼항 연산자는 서로 안에 넣을 수 있어(각 경우에 또 삼항 연산자). 근데... 이러면 나중에 코드 읽는 사람이 머리 아플 수 있어(심지어 그게 2일 뒤의 너라도).
예시: 나이로 카테고리 정하기
string category = (age < 7) ? "유치원생" :
(age < 18) ? "학생" :
(age < 65) ? "성인" : "노인";
결정 표:
| 나이 | 조건 | 결과 |
|---|---|---|
| < 7 | age < 7 | 유치원생 |
| 7–17 | age < 18 | 학생 |
| 18–64 | age < 65 | 성인 |
| 65 이상 | 그 외 | 노인 |
이 정도 코드는 읽을 만한데, 더 복잡하면 if-else if-else를 쓰는 게 더 좋아.
6. 꿀팁: 삼항 연산자와 bool 타입
가끔 이런 코드가 보여:
bool adult = (age >= 18) ? true : false;
근데 이건 쓸데없어. (age >= 18) 자체가 이미 bool을 반환해. 그래서 그냥 이렇게 하면 돼:
bool adult = (age >= 18);
GO TO FULL VERSION