Skip to main content
Summary

개념 설명: 값에 이름 붙이기

프로그램은 값을 다룬다. 이름, 나이, 가격, 로그인 여부, 시험 점수처럼 프로그램 안에서 기억해야 할 값이 계속 생긴다. 변수는 이런 값에 붙이는 이름이다.

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
1

5 / 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);

실행 결과:

14

2 + 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로 실패 상황을 처리하는 습관이 좋다.

작은 연습 문제

  1. string name, int age, double height 변수를 만들고 문자열 보간으로 한 줄에 출력해 보자.

  2. 사과 17개를 5명에게 나누어 줄 때 한 사람당 몇 개를 받고 몇 개가 남는지 /와 %로 출력해 보자.

  3. 상품 가격과 수량을 변수로 만들고 decimal로 합계를 계산하자. 합계는 {total:N0} 형식으로 출력해 보자.

  4. 사용자에게 나이를 입력받고 int.TryParse로 숫자인지 확인하자. 숫자이면 성인 여부를 true 또는 false로 출력해 보자.

  5. 다음 식의 결과를 예측한 뒤 실행해 보자.

Console.WriteLine(2 + 3 * 4);
Console.WriteLine((2 + 3) * 4);
Console.WriteLine(10 / 3);
Console.WriteLine(10 / 3.0);

이번 장의 핵심은 "값에는 종류가 있다"는 사실이다. 자료형을 알면 변수에 무엇을 담을 수 있는지, 어떤 계산이 가능한지, 어떤 변환이 필요한지 판단할 수 있다. 다음 장에서는 이 값을 이용해 조건에 따라 다른 코드를 실행하고, 반복해서 작업하는 방법을 배운다.

참고

1Interpolated strings - C# language reference

2Type conversions, casting, and boxing - C#

3How to convert a string to a number - C# Programming Guide

책 목록

C# 학습: 기초 문법부터 작은 프로젝트까지

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기