개념 설명: 값에 이름 붙이기
프로그램은 값을 다룬다. 이름, 나이, 가격, 로그인 여부, 시험 점수처럼 프로그램 안에서 기억해야 할 값이 계속 생긴다. 변수는 이런 값에 붙이는 이름이다.
C#에서 변수는 보통 다음 모양으로 만든다.
자료형 변수이름 = 값;예를 들어 나이를 저장하려면 다음처럼 쓴다.
int age = 20;여기서 int는 정수를 뜻하는 자료형이고, age는 변수 이름이며, 20은 저장한 값이다. C#은 변수를 만들 때 "이 변수에 어떤 종류의 값을 넣을 수 있는지"를 먼저 정한다. 그래서 숫자 변수에 아무 문자열이나 넣을 수 없다. 처음에는 조금 엄격해 보이지만, 이 규칙 덕분에 많은 실수를 실행 전에 찾을 수 있다.
AI 생성 이미지
자주 쓰는 기본 자료형
처음에는 아래 여섯 가지를 확실히 구분하면 충분하다.
| 자료형 | 저장하는 값 | 예시 | 주로 쓰는 상황 |
|---|---|---|---|
int | 정수 | 10, -3 | 개수, 나이, 순번 |
double | 실수 | 3.14, 172.5 | 측정값, 평균, 과학 계산 |
decimal | 정밀한 10진수 | 12900.50m | 돈, 금액, 세율 계산 |
bool | 참 또는 거짓 | true, false | 조건 판단 |
char | 문자 1개 | 'A', '가' | 등급, 한 글자 코드 |
string | 문자열 | "Hello", "홍길동" | 이름, 문장, 입력값 |
char는 작은따옴표를 사용하고, string은 큰따옴표를 사용한다.
char grade = 'A';
string name = "지민";decimal 값 뒤에는 보통 m을 붙인다.
decimal price = 12900.50m;12900.50만 쓰면 C#은 기본적으로 double로 해석한다. 돈처럼 소수점 계산의 오차를 줄이고 싶은 값은 decimal을 사용하는 편이 좋다.
코드 작성: 학생 정보 출력하기
간단한 변수를 만들어 출력해 보자.
string name = "민수";
int age = 17;
double height = 172.5;
decimal lunchPrice = 8500m;
bool isStudent = true;
char grade = 'B';
Console.WriteLine($"이름: {name}");
Console.WriteLine($"나이: {age}");
Console.WriteLine($"키: {height}cm");
Console.WriteLine($"점심값: {lunchPrice}원");
Console.WriteLine($"학생 여부: {isStudent}");
Console.WriteLine($"등급: {grade}");실행 결과는 다음과 비슷하다.
이름: 민수
나이: 17
키: 172.5cm
점심값: 8500원
학생 여부: True
등급: B출력에서 true가 True로 보이는 것은 .NET이 bool 값을 문자열로 바꿀 때 사용하는 기본 표현이다.
var: 타입을 생략하는 것이 아니라 추론하는 것
C#에서는 자료형 자리에 var를 쓸 수 있다.
var score = 100;
var average = 87.5;
var name = "서연";
var passed = true;이 코드는 C#이 오른쪽 값을 보고 자료형을 추론한다.
var score = 100; // int로 추론
var average = 87.5; // double로 추론
var name = "서연"; // string으로 추론
var passed = true; // bool로 추론중요한 점은 var가 "아무 값이나 담는 변수"가 아니라는 것이다. 컴파일 시점에 타입이 정해지고, 그 뒤에는 바뀌지 않는다.
var score = 100;
// score = "백점"; // 오류: int 변수에 string을 넣을 수 없음또한 var는 오른쪽 값이 있어야 사용할 수 있다.
// var count; // 오류: 무엇으로 추론해야 할지 알 수 없음
int count;초보 단계에서는 자료형을 직접 쓰는 편이 더 명확할 때가 많다. var는 오른쪽 값만 봐도 타입이 분명할 때 사용하면 좋다.
산술 연산자: 계산하기
산술 연산자는 숫자를 계산할 때 사용한다.
| 연산자 | 뜻 | 예시 |
|---|---|---|
+ | 더하기 | a + b |
- | 빼기 | a - b |
* | 곱하기 | a * b |
/ | 나누기 | a / b |
% | 나머지 | a % b |
int apples = 5;
int people = 2;
Console.WriteLine(apples + people);
Console.WriteLine(apples / people);
Console.WriteLine(apples % people);실행 결과:
7
2
15 / 2가 2.5가 아니라 2인 이유는 양쪽이 모두 int이기 때문이다. 정수끼리 나누면 결과도 정수로 계산되고, 소수점 아래는 버려진다.
소수 결과가 필요하면 한쪽을 double로 바꾸면 된다.
int apples = 5;
int people = 2;
double result = (double)apples / people;
Console.WriteLine(result);실행 결과:
2.5(double)apples는 apples 값을 double로 바꾸라는 뜻이다.
비교, 논리, 대입 연산자
비교 연산자는 두 값을 비교하고 결과로 bool을 만든다.
| 연산자 | 뜻 |
|---|---|
== | 같다 |
!= | 같지 않다 |
> | 크다 |
>= | 크거나 같다 |
< | 작다 |
<= | 작거나 같다 |
int age = 20;
Console.WriteLine(age >= 19);
Console.WriteLine(age == 18);실행 결과:
True
False논리 연산자는 여러 조건을 연결한다.
| 연산자 | 뜻 | 예시 |
|---|---|---|
&& | 그리고 | 둘 다 참이면 참 |
| ` | ` | |
! | 반대 | 참을 거짓으로, 거짓을 참으로 |
int age = 20;
bool hasTicket = true;
bool canEnter = age >= 19 && hasTicket;
Console.WriteLine(canEnter);실행 결과:
True대입 연산자는 변수에 값을 넣는다.
int count = 10;
count = count + 1;
count += 1;
count -= 3;count += 1은 count = count + 1과 같은 뜻이다. 값을 하나 증가시키는 코드는 count++로도 쓸 수 있다.
연산자 우선순위는 괄호로 분명히 하기
C#도 수학처럼 곱하기와 나누기를 더하기보다 먼저 계산한다.
int result = 2 + 3 * 4;
Console.WriteLine(result);실행 결과:
142 + 3을 먼저 계산하고 싶다면 괄호를 사용한다.
int result = (2 + 3) * 4;
Console.WriteLine(result);실행 결과:
20연산자 우선순위를 모두 외우려고 하기보다, 의도가 조금이라도 헷갈리면 괄호를 쓰는 습관이 좋다.
bool canBuy = (age >= 19) && (hasTicket || isMember);괄호는 컴퓨터보다 사람을 위해 쓰는 경우가 많다. 코드를 다시 읽는 사람이 조건의 의미를 빠르게 이해할 수 있다.
문자열 보간과 형식 지정
이전 장에서 문자열 보간을 잠깐 사용했다. 문자열 앞에 $를 붙이면 중괄호 {} 안에 변수나 식을 넣을 수 있다. C#의 문자열 보간은 값뿐 아니라 정렬 폭과 형식 문자열도 함께 지정할 수 있다.1
string item = "키보드";
int count = 3;
decimal unitPrice = 45000m;
decimal total = count * unitPrice;
Console.WriteLine($"상품: {item}");
Console.WriteLine($"수량: {count}개");
Console.WriteLine($"합계: {total:N0}원");실행 결과:
상품: 키보드
수량: 3개
합계: 135,000원{total:N0}에서 N0은 숫자를 천 단위 구분 기호가 있는 형태로 표시하고, 소수 자릿수는 0자리로 보여 달라는 뜻이다.
자주 쓰는 형식은 다음과 같다.
| 형식 | 의미 | 예시 |
|---|---|---|
N0 | 천 단위 구분, 소수 0자리 | 135,000 |
N2 | 천 단위 구분, 소수 2자리 | 135,000.00 |
F2 | 소수 2자리 고정 | 3.50 |
P1 | 백분율, 소수 1자리 | 12.3% |
숫자 표시 방식은 실행 환경의 문화권 설정에 따라 조금 달라질 수 있다. 예를 들어 구분 기호나 소수점 기호가 다르게 보일 수 있다.
형 변환: 값의 종류 바꾸기
형 변환은 한 자료형의 값을 다른 자료형으로 바꾸는 일이다. C#에는 자동으로 되는 변환과 직접 표시해야 하는 변환이 있다.
작은 범위의 정수를 더 넓은 범위의 실수로 옮기는 것처럼 안전한 변환은 자동으로 된다. 이를 암시적 형 변환이라고 한다.
int count = 10;
double countAsDouble = count;
Console.WriteLine(countAsDouble);실행 결과:
10반대로 double을 int로 바꾸면 소수점 아래 정보가 사라질 수 있다. 이런 변환은 코드에 직접 표시해야 한다. 이를 명시적 형 변환이라고 한다.2
double average = 19.75;
int truncated = (int)average;
Console.WriteLine(truncated);실행 결과:
19(int)는 반올림이 아니다. 소수점 아래를 버린다. 반올림이 필요하면 나중에 배울 Math.Round 같은 기능을 사용해야 한다.
입력값을 숫자로 바꾸기: Parse와 TryParse
Console.ReadLine()으로 받은 값은 문자열이다. 사용자가 25를 입력해도 프로그램 입장에서는 먼저 "25"라는 문자열로 들어온다. 계산하려면 숫자로 바꿔야 한다.
Parse는 문자열을 숫자로 바꾼다.
string input = "25";
int age = int.Parse(input);
Console.WriteLine(age + 1);실행 결과:
26하지만 사용자가 abc를 입력하면 int.Parse는 변환할 수 없어 오류를 낸다. 사용자의 입력, 파일, 네트워크 데이터처럼 값이 항상 올바르다고 보장할 수 없는 곳에서는 TryParse가 더 안전하다. TryParse는 변환에 성공하면 true, 실패하면 false를 돌려준다.3
Console.Write("나이를 입력하세요: ");
string input = Console.ReadLine() ?? "";
if (int.TryParse(input, out int age))
{
Console.WriteLine($"내년 나이: {age + 1}");
}
else
{
Console.WriteLine("숫자를 입력해야 합니다.");
}실행 예:
나이를 입력하세요: 25
내년 나이: 26다른 실행 예:
나이를 입력하세요: 스물다섯
숫자를 입력해야 합니다.out int age는 변환에 성공했을 때 결과를 age 변수에 담겠다는 뜻이다. out은 뒤에서 메서드를 배울 때 더 자세히 다룬다. 지금은 TryParse를 쓸 때 결과를 받을 변수 앞에 붙이는 키워드라고 이해하면 된다.
흔한 실수
=와 ==를 헷갈리기
=는 값을 넣는 연산자이고, ==는 같은지 비교하는 연산자다.
int age = 20;
Console.WriteLine(age == 20); // 비교조건문을 배울 때 이 차이가 더 중요해진다.
정수 나눗셈 결과를 실수로 기대하기
Console.WriteLine(10 / 4); // 2
Console.WriteLine(10 / 4.0); // 2.5양쪽이 정수면 결과도 정수다. 소수 결과가 필요하면 한쪽을 double로 만들거나 명시적으로 변환한다.
돈 계산에 double을 무심코 사용하기
// 권장하지 않음: 돈 계산에 double 사용
// double price = 0.1;
decimal price = 0.1m;금액은 보통 decimal을 사용한다. 단, decimal 값에는 m을 붙이는 것을 잊지 말자.
char와 string 따옴표를 바꿔 쓰기
char grade = 'A';
string message = "A";'A'는 문자 하나이고, "A"는 길이가 1인 문자열이다. 비슷해 보여도 자료형이 다르다.
사용자 입력에 바로 Parse 쓰기
// 사용자가 잘못 입력하면 프로그램이 중단될 수 있음
// int age = int.Parse(Console.ReadLine());학습용으로는 괜찮을 때도 있지만, 실제 프로그램에서는 TryParse로 실패 상황을 처리하는 습관이 좋다.
작은 연습 문제
string name,int age,double height변수를 만들고 문자열 보간으로 한 줄에 출력해 보자.사과 17개를 5명에게 나누어 줄 때 한 사람당 몇 개를 받고 몇 개가 남는지
/와%로 출력해 보자.상품 가격과 수량을 변수로 만들고
decimal로 합계를 계산하자. 합계는{total:N0}형식으로 출력해 보자.사용자에게 나이를 입력받고
int.TryParse로 숫자인지 확인하자. 숫자이면 성인 여부를true또는false로 출력해 보자.다음 식의 결과를 예측한 뒤 실행해 보자.
Console.WriteLine(2 + 3 * 4);
Console.WriteLine((2 + 3) * 4);
Console.WriteLine(10 / 3);
Console.WriteLine(10 / 3.0);이번 장의 핵심은 "값에는 종류가 있다"는 사실이다. 자료형을 알면 변수에 무엇을 담을 수 있는지, 어떤 계산이 가능한지, 어떤 변환이 필요한지 판단할 수 있다. 다음 장에서는 이 값을 이용해 조건에 따라 다른 코드를 실행하고, 반복해서 작업하는 방법을 배운다.
참고
1Interpolated strings - C# language reference
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.