서론
C# 프로그래밍에서 변수와 입력문은 중요한 개념으로, 변수는 데이터를 저장하고 처리하는 데 사용되며, 입력문은 프로그램 사용자로부터 데이터를 입력받는 데 도움이 된다. 변수와 입력문은 C# 프로그램을 작성하는 과정에서 핵심적인 부분을 차지하며, 이들을 효과적으로 다루는 것이 프로그램의 동작과 상호작용을 결정한다. 이제 변수와 입력문에 대해 자세히 알아보자.
변수
프로그램에서 값울 다루려면 데이터를 메모리에 잠시 보관해 놓고 사용할 수 있는 임시 저장 공간이 필요하다. 이때 변수를 사용한다. 변수를 사용하기 위해서 먼저 선언해야 한다. 선언할 때 "데이터 형식"과 "데이터 이름"(변수명) 그리고 ";"이 함께 있어야 한다.
int number;
데이터 형식 | 설명 |
int, long | 정수형 데이터 |
string | 문자형 데이터 |
bool | 참 값 또는 거짓 값(true와 false) |
double, float | 실수형 데이터를 저장 |
object | C#에서 사용하는 모든 데이터를 저장, 모든 데이터 형식 |
변수 명명 규칙
변수를 사용하려면 변수 이름이 필요한데, 변수 이름을 지을 때는 다음 규칙을 지킨다.
- 변수의 첫 글자는 반드시 문자로 지정한다. 숫자는 변수 이름의 처음에 올 수 없다.
- 길이은 255자 이하로 하고 공백을 포함할 수 없다.
- C#은 유니코드를 지원하므로 영어, 한글, 한자 등을 사용 가능하고, 영문자와 숫자, 언더바(_) 조합으로 사용하며, 기타 특수 기호는 사용할 수 없다.
- C#에서 사용하는 키워드(예약어, 메서드 등의 이름)는 사용할 수 없다. 단 키워드 앞에 @ 기호를 붙이면 키워드도 변수로 사용 가능하지만 권장하지는 않는다.
- 변수는 대소문자를 구분하고, 일반적으로 소문자로 시작한다.
변수 이름은 한글로 선언해도 상관없다. 한글 변수를 사용함으로써 프로그램 코드의 가독성을 높일 수 있지만 여러 개발자가 분석하고 사용하는 상황에서 공통 언어인 영어를 사용하기에 대체로 한글 변수 이름은 잘 사용하지 않는다.
위 설명한 규칙은 C#이 이해하는 규칙이다. C# 프로그래머들이 협업과 언어 특징을 고려하여 네이밍 컨벤션을 만들어 사용한다. C# 네이밍 컨벤션은 아래 참고 블로그를 보기를 바란다. C# 블로그는 아래 네이밍 컨벤션에 따라 파스칼, 카멜을 주로 사용할 것이다.
리터널(literal) 사용하기
변수에는 직접 정수형 또는 문자열 값을 저장할 수 있다. 이 값 자체를 리터럴이라고 한다. 변수에는 정수 리터널, 실수 리터널, 문자열 리터널 등을 저장하여 사용할 수 있다. 정수는 숫자 그대로 표현하고, 실수는 f(혹은 F)를 접미사로 붙여 표현한다. 반드시 문자는 작은따옴표로, 문자열은 큰 따옴표로 묶어야 한다.
using System;
class Literal
{
static void Main()
{
Console.WriteLine(23); // 정수 리터널
Console.WriteLine(9.26); // 실수 리터널
Console.WriteLine('S'); // 문자 리터널
Console.WriteLine("한글도 가능"); // 문자열 리터널
}
}
변수 초기화
변수는 등호(=)를 통해 값을 할당할 수 있다. 이 과정을 초기에 하는 과정을 변수 초기화라 한다. 일반적으로 변수 선언과 할당을 동시에 하는 것을 말한다. 또한, C#에서 "null"은 "아무것도 없는 값"을 의미한다.
using System;
class VariableDemo
{
static void Main()
{
int number = 7; // 변수 선언과 동시에 초기화
Console.WriteLine("{0}", number);
}
}
형식이 같은 변수
형식이 같은 변수 여러개를 한 번에 선언이 가능하다. 변수를 (,) 기호로 구분해서 여러 개 선언할 수 있다. 또한, 형식이 같은 여러 개를 동일한 값으로 초기화할 때는 등호(=) 기호를 사용하여 한번에 초기화할 수 있다.
using System;
class VariableDemo
{
static void Main()
{
int a, b, c; // 변수 여러 개 선언
a = b = c = 10; // 동일한 값으로 초기화
Console.WriteLine("{0}, {1}, {2}", a, b, c);
}
}
상수 사용하기
변수를 선언할 때 앞에 cons 키워드를 붙이면 변수는 상수(constant)가 된다. 한 번 상수로 선언된 변수는 다시 값을 바꿀 수 없고, 반드시 선언과 동시에 초기화해야 한다. 이러한 const 키워드를 붙인 변수를 상수 또는 지역(local) 상수라고 한다. 상수란 "변하지 않는 변수, 읽기 전용 변수"라고 할 수 있다. 다음은 상수를 여러 의미로 정리한 것이다.
- 변수와 마찬가지로 메모리상의 임시 데이터 저장소를 의미한다.
- 변수와 달리 선언 후 그 값이 변하지 않는 수를 의미한다.
- 읽기 전용 변수로 보아도 무관하다.
- 반드시 선언과 동시에 특정 값으로 초기화해야 한다.
using System;
class ConstantDemo
{
static void Main()
{
const int Max = 100; // 졍수 형식의 상수 선언과 동시에 초기화
Console.WriteLine("최대값: {0}", Max);
}
}
형식별 선언
숫자 데이터
정수형 키워드에는 s와 u 접두사가 붙는 데 이는 signed와 unsigned의 약자로, 부호를 붙이느냐 붙이지 않느냐 하는 차이가 있다.
- 부호 있는(signed): +, - 부호가 있는 정수형(양수, 음수 지원)
- 부호 없는(unsigned): 부호 없이 + 값만 다류는 정수형(양수만)
각 정수 데이터 형식의 키워드는 닷넷(.NET)형식을 제공한다.
종류 | 데이터 형식 | 비트 | 범위 | 닷넷 형식 |
signed | sbyte | 8 | -128~127 | System.SByte |
short | 16 | -32768~32767 | System.Int16 | |
int | 32 | -2147483648~ 2147483647 | System.Int32 | |
long | 64 | -9223372036854775808~ 9223372036854775807 | System.Int64 | |
unsigned | byte | 8 | 0~255 | System.Byte |
ushort | 16 | 0~65535 | System.UInt16 | |
uint | 32 | 0~4294967295 | System.UInt32 | |
ulong | 64 | 0~18446744073709551615 | System.UInt64 |
소수점 이하의 숫자를 다류는 실수 데이터 형식(부동소수점 데이터 형식)을 살펴보자. 실수 데이터는 부동소수점 방식과 10진 방식을 다루는 세 가지 데이터 형식 키워드인 double, float, decimal을 제공한다. double, float는 부동소수점 방식이며, decimal은 10진 방식이다.
데이터 형식 | 비트 | 범위 | 닷넷 형식 |
float | 32 | -3.402823E+38 ~ 3.402823E+38 | System.Single |
double | 64 | -1.79769313486232E+308 ~ 1.79769313486232E+308 | System.Double |
decimal | 128 | -79228162514264337593542950335~ 79228162514264337593542950335 | System.Decimal |
지수 표기법
아주 큰 수와 작은 수를 표현할 때는 지수 표기법(exponential notation)을 사용한다. 지수 표기법은 과학적 표기법이라고도 한다. 지수 표기법은 숫자를 '-d.dd..E+ddd' 또는 '-d.dd..e+ddd' 형태의 문자열로 변환한다. 여기에서 각 d는 숫자(0~9)를 나타낸다. 숫자가 음수이면 문자열 앞에 빼기 기호가 붙는다. 수소점 앞에는 항상 숫자만 하나만 있어야 한다.
숫자 형식의 리터럴 값에 접미사 붙이기
정수형 데이터를 표현하는 리터럴을 만들 때는 접미사를 붙인다. int형은 접미사를 따로 붙이지 않고, long 형은 대문자 L 혹은 소문자 l을 접미사로 붙인다. U와 u를 접미사로 붙이면 uint를, UL과 ul을 접미사에 붙이면 ulong형을 나타낸다. 실수형도 마찬가지로 F 또는 f를 붙이면 float형식, D 또는 d를 붙이면 double 형을, M 또는 m은 decimal형을 나타낸다. 이러한 접미사는 대문자로 사용하면 좀 더 보기 편하다.
float f = 3.12F;
double d = 3.14D;
decimal m = 3.14M;
문자 데이터
문자
문자형 변수는 2바이트 공간에 문자 하나를 저장한다. 문자형 변수는 char 키워드로 선언하고 값을 초기화할 때는 작은 따옴표 2개를 사용하여 문자 하나(단일 문자)를 묶어준다. char 키워드로 선언되는 변수는 단일 유니코드(unicode) 문자를 저장한다. 일반적인 영문 및 한글 등 모든 언어 문자를 표현할 수 있다. char 자료형에는 문자 여러 개를 저장할 수 없다.
using System;
class CharacterDemo
{
static void Main()
{
char grade = 'A';
char kor = '가';
Console.WriteLine("{0}, {1}", grade, kor);
}
}
문자열
일반적으로 가장 많이 사용하는 데이터 형식은 문자열을 나타내는 string이다. string 키워드를 사용하면 문자열 데이터 형식의 변수를 선언할 수 있다. 문자열은 반드시 큰따옴표(")로 묶는다. 만일 여러 줄 문자열을 저장하고 싶다면 문자열 앞에 @를 붙이면 된다. 그럼 문자열 자체를 그대로 문자열로 저장한다. 이스케이프 시퀀스도 함께 저장한다.
using System;
class StringDemo
{
static void Main()
{
string name = "jinger";
string multiLines = @"
hello,
world
"
Console.WirteLine(name);
Console.WirteLine(multiLines);
}
}
문자열 보간법(string interpolation)
문자열 보간법 또는 보간 된 문자열 기능은 문자열을 묶을 때 편리하게 사용할 수 있다. 이때 묶인 문자열을 문자열 템플릿(string template) 또는 템플릿 문자열(template string)이라고도 한다. 프`로그래밍을 하다 보면 문자열을 묶어서 결과를 출력할 일이 많다. 이때 문자열을 처리하기 위해 String.Format() 메서드 혹은 C# 6.0 버전 이후 템플릿 문자열이라는 문자열 보간법을 제공해서 $"{}"형태를 이용한다.
string message = "hello";
$"{message}"
int number = 3;
string result = "odd";
Console.WriteLine($"{number} is {result}");
이외에 문자열을 묶어서 출력하는 여러 가지 방법을 비교하여 살펴보자.
string message = "hello World";
Console.WriteLine("Message: {0}", message); // WriteLine() 메서드 기본 제공
Console.WriteLine($"Message: " + message); // 더하기 연산자
Console.WriteLine($"Message: {message}"); // 문자열 보간법
논리 데이터
논리 데이터 형식인 참(true) 또는 거짓(false) 값을 저장하려면 bool 키워드를 사용한다. 이를 사용하면 어떤 상태를 참과 거짓으로 구분하여 제어할 수 있다. bool 데이터 형식은 1 비트의 저장 공간을 차지한다.
using System;
class BooleanDemo
{
static void Main()
{
bool bTrue = true;
bool isFalse = false;
Console.WriteLine("{0}, {1}", bTrue, isFalse);
}
}
닷넷데이터
문자, 문자열, 논리 데이터를 표현할 때는 char, string, bool 키워드를 사용했다. 이와 동일한 표현인 닷넷 데이터 형식은 System.Char, System.String, System.Boolean 이다.
using System;
class CharStringBoolean
{
static void Main()
{
Char c = 'A';
String s = "안녕하세요.";
Boolean b = true;
Console.WriteLine("{0}\n{1}\n{2}", c, s, b);
}
}
래퍼 형식(wrapper)
데이터 형식을 지정할 때 사용되는 int, string 등 키워드는 닷넷 데이터 형식으로도 제공한다. 이러한 닷넷 데이터 형식을 다른 말로 래퍼 형식이라고 한다. 래퍼 형식은 int, string 같은 기본 형식을 클래스 또는 구조체로 감싼 닷넷 데이터 형식을 의미한다.
int number1 = 1234;
Int32 number2 = 1234;
$"{number1}, {number2}"
string str1 = "안녕"
string str2 = "하세요"
$"{str1}, {str2}"
날짜 형식
DateTime에서 날짜 관련 정보를 제공한다.
DateTime.Now // 날짜 전체
$"{DateTime.Now.Year}-{DateTime.Now.Month}-{DateTime.Now.Day}" // 항목 별 출력
$"{DateTime.Now.Hpur}-{DateTime.Now.Minute}-{DateTime.Now.Second}"
입력문
사용자에게 콘솔로 데이터를 입력받을 때는 다음 메서드를 주로 사용한다.
- Console.ReadLine(): 콘솔에서 한 줄을 입력받는다. 또 콘솔 앱 프로그램에는 현재 시점에서 잠시 멈추는 기능이 있어 "enter"키를 누를 때까지 대기한다.
- Console.Read(): 콘솔에서 한 문자를 정수로 입력 받는다.
- Console.ReadKey(): 콘솔에서 다음 문자나 사용자가 누른 기능 키를 가져온다.
using System;
classss ConsoleRead
{
static void Main()
{
Console.WriteLine(Console.ReadLine()); // 입력과 동시에 출력, enter 누를 때가지 대기
Console.Write("이름을 입력하세요: ");
string name = Console.ReadLine();
Console.WriteLine("안녕 {name}");
Console.Write("문자를 입력하세요: ");
int x = Console.ReadLine(); // 문자 하나 입력
Console.Write(x); // 해당 문자에 해당하는 숫자 출력
Console.Write(Convert.ToChar(x)); // x에 해당되는 유니코드 출력
}
}
형 변환
만약 입력된 데이터 형식을 수정하고 싶으면 형식 변환(type conversion)을 이용하면 된다. 같은 형식의 데이터끼리는 따로 형 변환을 하지 않아도 된다. 형 변환은 암시적 형 변환과 명시적 형 변환으로 구분할 수 있다. 암시적 형 변환은 변환 형식이 안전하게 유지되며 데이터가 손실되지 않아 특수한 구문이 필요 없다. 반대로 long 형식의 int 형식의 변수에 저장하려면 다음 샘플 코드처럼 명시적으로 (int)를 붙여 long을 int로 변경해야 한다. 명시적 형 변환을 캐스팅(casting)이라고도 한다.
// 암시적 형 변환
int num1 = 123;
long num2 = num1; // num1 값을 그보다 큰 long 형식 변수인 num2에 저장
// 명시적 형 변환
long num1 = 123;
int num2 = (int)num1; // long 형식의 변수를 int 형식의 변수로 변환해서 저장
Convert 클래스를 사용하여 형 변환
데이터 형 변환은 괄호 이외에 Convert 클래스의 주요 메서드도 사용할 수 있다. GetType() 메서드는 닷넷에서 제공하고, 이를 사용하면 모든 값의 데이터 형식을 알 수 있다.
메서드 | 설명 | 대체 메서드 |
Convert.ToString() | 숫자 데이터를 문자열로 변경 | string.Parse() |
Convert.ToInt32() | 숫자 데이터를 정수형으로 변경 | int.Parse() |
Convert.ToDouble() | 숫자 데이터를 실수형으로 변경 | double.Parse() |
Convert.ToSingle() | 숫자 데이터를 실수형으로 변경 | float.Parse() |
Convert.ToDecimal | 숫자 데이터를 실수형으로 변경 | decimal.Parse |
Convert.ToChar() | 숫자 혹은 문자열 하나를 문자로 변경 | char .Parse() |
Convert.ToDateTime |
다양한 형식의 데이터를 DateTime으로 변경 | DateTime.Parse |
Convert.ToBoolean |
다양한 형식의 데이터를 bool로 변경 | bool.Parse |
이진수
Convert.ToString()의 두 번째 인자로 '2'를 넣으면 십진수에서 이진수로 변한 가능하다. 변환 시 가장 앞에 있는 1까지 출력한다. 보통 비트 연산식은 이해하기 편하게 여덟 자리로 출력을 한다. 이때 PadLeft()를 사용한다. Convert.ToString()의 첫 번째 인자로 ""에 이진수를 넣고 두 번째 인자로 '2'를 넣으면 이진수를 십진수로 변환이 가능하다.
using System;
class BinaryString
{
static void Main()
{
int x = 5; // byte x = 5;로도 해보자.
Console.WriteLine(Convert.ToString(x, 2)); // 십진수를 이진수로 변환
Console.WriteLine(Convert.ToString(x, 2).PadLeft(8, '0'));
Console.WriteLine(Convert.ToString("1010", 2)); // 이진수를 십진수로 변환
}
}
이진수 리터럴
정수 앞에 숫자 0과 영문자 b를 붙이는 "0b" 혹은 "0B" 접두사를 붙여 특별한 과정 없이 바로 이진수로 표현할 수 있다. 2진법 외에 16진법은 "0x"와 "0X" 접두사를 붙여 표현한다.
byte a1 = 0b0010; // a1 == 2
byte a2 = 0B1100; // a2 == 12
byte b1 = 0xA0 // b1 == 160
byte b2 = 0X11 // b2 == 17
언더바 문자로 숫자 구분하기
현실 세계에서는 100만을 숫자 1,000,000 형태로 세 자리마다 콤마를 쉽게 구분한다. 프로그램 소스 코드에서는 콤마 기호를 사용할 수 없는 대신 언더스코어(_)를 이진수, 십진수, 16진수 등을 사용하여 구분할 수 있다. 긴 숫자를 표현할 때 숫자 구분자를 두면 가동성이 높아진다.
int bin = 0b0001_0001;
int dec = 1_000_000;
int hex = 0xA0_B0_C0;
var과 default
var
변수 선언할 때 int, string 등 기본 제공 키워드 대신 var 키워드를 사용하면 입력되는 값에 다라 자동으로 형식이 결정된다. C# 컴파일러는 var로 선언된 변수에 저장되는 값을 자동으로 추론해서 적당한 형식으로 변환하는 데, 이 기능을 형식 추론(type inference)이라 한다.
자바스크립트 같은 다른 프로그래밍 언어를 알고 있다면 var 키워드가 모든 값을 담고 있어 C#도 동일하다고 오해한다. 하지만 C#의 var 키워드는 프로그램 소스 코드 작성의 편의성을 위해 만든 키워드이지 모든 값을 다 담을 수 있는 키워드가 아니다. 자바스크립트의 var에 해당하는 C# 키워드는 dynamic이다.
using System;
class VarInput
{
static void Main()
{
var name = "C#";
var version = 8.0;
Console.WriteLine("{0}, {1}", name.GetType(), version.GetType());
}
}
default
변수를 선언하고 초기화할 때는 해당 변수의 데이터 형식으로 초기화하면 된다. C#에서 기본으로 제공하는 값으로 초기화하고 싶다면 default 키워드를 사용한다. 숫자 데이터 형식은 0을, char는 \0을, string은 null을, bool은 false를, 클래스는 null을 기본값으로 가진다.
int i = default;
double d = default;
char c = default;
string s = default;
bool b = default;
StringBuilder sb = default(StringBuilder);
연산자
데이터를 가공하는 데 사용하는 여러 연산자(대입, 산술, 관계, 논리, 증감, 조건, 비트, 시프트 등)에 대해 알아보자. 연산자의 형태에 따라 단항 연산자, 이항 연산자, 삼항 연산자로 나뉜다.
연산자 피연자산자 //단항 연산자
피연산자1 연산자 피연산자2 //이항 연산자
(식) ? 피연산자1 : 피연산자2 //삼항 연산자
값 하나 또는 연산을 진행하는 구문의 계산식을 식(expression) 또는 표현식이라고 한다.
e.g. 3+ 5
표현식을 사용하여 명령 하나를 진행하는 구문을 문(statement) 또는 문장이라고 한다.
e.g. x = 3 + 5;
단항 연산자
단항 연산자는 연산자 하나로 식을 처리한다.
- +연산자: 특정 정수형 변수 값을 그대로 출력한다.(실상 특정 기능이 없다.)
- -연산자: 특정 정수형 변수 값을 음수로 변경하여 출력한다. 음수값이 들어 있다면 양수로 변환한다.
int value = 0;
value = 8;
value = +value;
value // 8
value = -8;
value = +value;
value // -8
value = 8;
value = -value;
value // -8
value = -8;
value = -value;
value // 8
변환 연산자
() 기호를 사용하여 특정 값을 원하는 데이터 형식으로 변환할 수 있다.
int number = (int)3.14;
number // 3
증감 연산자
변수 값을 1 증가시키거나 1 감소시키는 일이 자주 있기에 이를 위한 연산자가 존재한다. 증가 또는 감소 연산자라고 하여 줄여서 증감 연산자(increment/decrement operator)라고 한다.
- ++연산자: 변수 값에 1을 더한다.
- --연산자: 변수 값에 1을 뺀다.
증감 연산자가 변수 앞에 위치하느냐, 뒤에 위치하느냐에 따라 연산 처리 우선순위가 결정된다. 증감 연산자가 변수 앞에 붙으면 전위 증감 연산자라 하고, 변수 뒤에 붙으면 후위 증감 연산자라 한다.
- 전위(prefix) 증감 연산자: 정수형 변수 앞에 연산자가 위치하여 변수 값을 미리 증감한 후 나머지 연산을 수행한다.
- 후위(postfix) 증감 연산자: 정수형 변수 뒤에 연산자가 위치하여 연산식(대입)을 먼저 실행한 후 나중에 변수 값을 증감한다.
// 전위
int i = 3;
int j = ++i;
j // 4
i // 4
// 후위
int x = 3;
int y = ++x; // y에 x값을 대입한 이후 x값에 1 더함
y // 3
x // 4
a = a + 1; == a += 1; == ++a;
이항 연산자
이항 연산자는 피연산자들 사이에 연산자 형태를 지니고 있다. 연산자를 사용살 때 기호는 띄어쓰기를 하면 안 되고, 연산자와 피연산자 사이에는 공백을 하나 두는 방식을 추천한다.
산술 연산자
사칙 연산을 위해 산술 연산자(arithmetic operator)를 제공한다.
산술 연산자 | 의미 | 예 | 설명 |
+ | 더하기 | A + B | A와 B를 더한 결과를 반환 |
- | 빼기 | A - B | A와 B를 뺀 결과를 반환 |
* | 곱하기 | A * B | A와 B를 곱한 결과를 반환 |
/ | 나누기 | A / B | A와 B를 나눈 결과(몫)를 반환 |
% | 나머지 | A % B | A와 B를 나눈 후 몫이 아닌 정수형 나머지 값을 반환 |
문자열 연결 연산자
+연산자는 경우에 따라 산술 연산 또는 문자열 연결 연산을 수행한다.
- +연산자: 두 항이 숫자일 때는 산술 연산 기능, 문자열일 때는 문자열 연결 기능
숫자 데이터 형식은 암시적으로 문자열과 더하기 연산이 가능하다. 단 암시적보다는 명시적으로 변환한 후 더하기 연산을 권장된다.
// 암시적 변환: 숫자 형식 -> 문자열 int days = 28; "2월달은 " + days + "일입니다." // 명시적 변환: 숫자 형식 -> 문자열 "2월달은 " + days.ToString() + "일입니다." // 명시적 변환: 숫자 형식 -> 문자열 "2월달은 " + Convert.ToString(days) + "일입니다."
할당 연산자
할당 연산자(assignment operator)는 변수에 데이터를 대입하는 데 사용한다. 할당 연산자를 대입 연산자라고도 한다.
할당 연산자 | 예 | 설명 |
= | A = B | A에 B 값을 대입 |
+= | A += B | A에 B를 더한 후 그 값을 다시 A에 대입 |
-= | A -= B | A에서 B를 뺀 후 그 값을 다시 A에 대입 |
*= | A *= B | A에 B를 곱한 후 그 값을 다시 A에 대입 |
/= | A /= B | A에 B를 나눈 후 몫을 다시 A에 대입 |
%= | A %= B | A에 B를 나눈 후 나머지 값을 다시 A에 대입 |
관계형 연산자
관계형 연산자(relational operator) 혹은 비교 연산자(comparative operator)는 두 항을 비교하는 데 사용한다. 관계형 연산자의 결괏값은 논리 데이터 형식인 참(True) 또는 거짓(False)으로 출력한다.
연산자 | 예 | 의미 | 설명 |
< | A < B | 작은가 | A가 B보다 작으면 True, 그렇지 않으면 False |
<= | A <= B | 작거나 같은가 | A가 B보다 작거나 같으면 True, 그렇지 않으면 False |
> | A > B | 큰가 | A가 B보다 크면 True, 그렇지 않으면 False |
>= | A >= B | 크거나 같은가 | A가 B보다 크거나 같으면 True, 그렇지 않으면 False |
== | A == B | 같은가 | A가 B보다 같으면 True, 그렇지 않으면 False |
!= | A != B | 다른가 | A가 B보다 다르면 True, 그렇지 않으면 False |
주의 문자열은 대소문자를 구분하기에 서로 다른 문자열로 인식한다.
논리 연산자
논리 연산자(logical operator)는 논리곱(AND), 논리합(OR), 논리부정(NOT)의 조건식에 대한 논리 연산을 수행한다. 연산의 결과 값은 참(True) 혹은 거짓(False)의 bool 형식으로 반환되어 Boolean(불리언) 연산자라고도 한다.
연산자 | 예 | 의미 | 설명 |
&& | A && B | 논리곱 AND |
A항과 B항 모두 참(True)일 때만 참, 그렇지 않으면 거짓(False) |
|| | A || B | 논리합 OR |
A항과 B항 둘 중 하나라도 참(True)일 때 참, 그렇지 않으면 거짓(False) |
! | !A | 논리 부정 NOT |
A항이 참(True)이면 거짓(False)을, 거짓이면 참을 반환 |
"|"은 엔터키 위에 있는 원화(₩) 혹은 역슬레시(\)의 shift를 누른 기호이다.
비트 연산자
비트 연산자(bit operator)는 정수형 데이터의 값을 이진수 비트 단위로 연산을 수행할 때 사용한다.
연산자 | 의미 | 설명 |
& | 논리곱 AND |
비트 값이 둘 다 1일 때만 1, 그렇지 않으면 0 |
| | 논리합 OR |
비트 값이 하나라도 1일 때 1, 그렇지 않으면 0 |
^ | 배타적 논리합 XOR |
비트 값이 서로 다를때만 1, 그렇지 않으면 0 |
~ | 논리 부정 NOT |
비트 값이 1이면 0, 0이면 1 |
시프트 연산자
시프트 연산자(shift operator)는 정수 데이터가 담겨 있는 메모리의 비트를 왼쪽(<<) 또는 오른쪽(>>)으로 지정한 비트만큼 이동시킨다.
연산자 | 의미 | 예 | 설명 |
<< | 왼쪽 시프트 | 변수 << 비트 값; | 비트 값만큼 왼쪽으로 비트 이동 변수 값 * 2의 비트 값 승 비트 당 2배 변수 값 곱하기 2의 거듭제곱 |
>> | 오른쪽 시프트 | 변수 >> 비트 값; | 비트 값만큼 오른쪽으로 비트 이동 변수 값 / 2의 비트 값 승 비트 당 1/2배 변수 값 나누기 2의 거듭제곱 |
시프트 연산자를 사용하면 비트의 자리를 이동할 수 있다. 예를 들어 정수형 데이터인 2를 이진수로 표현하면 0010이다. 왼쪽(<<) 시프트 연산자를 사용하여 한 칸 이동하면 0100이 된다. 반대로 오른쪽(>>) 시프트 연산자를 사용했다면 0001이 된다.
비트 연산자와 시프트 연사자는 대입 연산자와 함께 쓸 수 있다. &=, |=, ^=, >>=, <<=
삼항 연산자
조건 연산자
조건 연산자(conditional operator)는 조건에 따라서 참일 때와 거짓일 때 결과를 다르게 반환하며, ? : 형태의 연사자이다. 조건 연산자는 항이 3개여서 3항 연산자(ternary operator)라고도 한다. 3항 연산자는 if~else 문의 축약형이기도 하다.
조건식 ? 값1 : 값2; // 조건이 참이면 값1, 거짓이면 값2
조건식 ? 식1 : 식2; // 조건이 참이면 식1, 거짓이면 식2
기타 연산자
나열(콤마) 연산자
콤마를 구분자로 하여 한 문장에 변수 여러 개를 선언할 때 사용한다. 이를 나열(콤마) 연산자(comma operator)라 한다.
sizeof 연산자
sizeof 연산자는 단항 연산자로 데이터 형식 자체의 크기를 구하는 데 사용한다.
Console.WriteLine($"{sizeof(char) byte}") // 2 byte
Console.WriteLine($"{sizeof(int) byte}") // 4 byte
Console.WriteLine($"{sizeof(long) byte}") // 8 byte
Console.WriteLine($"{sizeof(float) byte}") // 4 byte
Console.WriteLine($"{sizeof(double) byte}") // 8 byte
연산자 우선순위
연산자 여러 개를 사용할 때는 연산자 우선순위(precedence)에 따라 계산된다.
항목 | 연산자 | 우선순위 |
괄호 연산자 | () | 높음 낮음 |
증감 연산자 | ++, -- | |
산술 연산자 | -(음수) | |
*, / | ||
% | ||
+. - | ||
연결 연산자 | + | |
관계 연산자 | ==, !=, <, >, <=, >= | |
논리 연산자 | ! | |
&& | ||
|| |
주섬주섬
- 직접 데이터 형식의 최댓값과 최솟값을 구하고 싶으면 "System.Decimal.Maxvalue"와 "System.Decimal.Minvalue"와 같은 형식으로 "float"와 "double" 등의 자료형을 출력해 보자.
참고
댓글