사용자 입력, 연산자
20260928 사용자 입력, 연산자
사용자 입력
- Console.ReadLin()은 문자열을 반환하기 때문에 이를 상황에 따라 다른 데이터 형으로 바꿔야 할 필요가 있다. 이때 사용하는 것이 데이터형.Parse() 혹은 Convert.데이터형() 가 있다.
int.Parse와 Convert.ToInt32 의 차이
| 항목 | int.Parse | Convert.ToInt32 |
|---|---|---|
| 받는 것 | 문자열만 | 거의 모든 타입 |
| 값이 없을 때 | 오류 | 0을 반환 |
실수 문자열 "3.7"을 정수로 | 오류 | 오류 |
실수 값 3.7을 정수로 | 직접 받을 수 있음 | 반올림 하여 4 반환 |
TryParse
Parse의 경우 매개변수를 받은 후 형변환을 시도 했을 때 변경수 없는 문자열을 받으면 프로그램을 멈춘다. TryParse를 사용하면 변환을 시도하고 성공 여부를 bool로 알려주며 실패해도 프로그램이 멈추지 않는다.
out 멤버변수(출력용 매개변수)
TryParse에서도 사용하는데 성공 여부를 확인 하는 것은 별개로 결과를 받을 변수 옆에 적는다.
//예시
int output = 0;
string data = "123";
// 변환 성공여부를 result에 저장하고 변환에 대한 결과값을 output에 저장한다.
bool result = int.TryParse(data, out output);
Console.Read와 Console.ReadLine 차이점(버퍼 개념 - 입력버퍼)
- 입력버퍼에 데이터 보유 여부에 따라 사용자 입력을 기다리기도 하고 기다리지 않기도 한다.
ReadLine은 입력버퍼를 모두 읽어오지만Read는 실행할 때 마다 입력버퍼에서 한글자씩 가져온다.
GetType
값이 어떤 타입인지 확인 할 수 있다. 타입의 이름은 .NET 이름으로 나온다.
//예시
int number = 10;
Console.WriteLine($"10 → {number.GetType()}");
// 10 → System.Int32 이런식으로 출력된다.
연산자 설명
- 용어정리
- 연산자: 연산을 지시하는 기호
- 피연산자: 연산의 대상이 되는 값(리터럴, 변수 다 가능하다)
- 식: 계산해서 하나의 값이 되는 코드 단위. 리터럴 혹은 변수 하나만 있어도 식이다.
- 식과 문에 대한 설명(식 설명할 때 같이 나옴)
피연산자에 따라 나눈 갈래
| 갈래 | 피연산자 | 예 |
|---|---|---|
| 단항연산자 | 1개 | -x, !flag, x++ |
| 이항연산자 | 2개 | a + b, a > b, a && b |
| 삼항연산자(조건연산자) | 3개 | 조건 ? 값1 : 값2 |
산술연산자
| 연산자 | 의미 | 예 | 결과 |
|---|---|---|---|
+ | 덧셈 | 7 + 3 | 10 |
- | 뺄셈 | 7 - 3 | 4 |
* | 곱셈 | 7 * 3 | 21 |
/ | 나눗셈의 목 | 7 / 3 | 2 |
% | 나눗셈의 나머지 | 7 % 3 | 1 |
- 정수를 나눌경우 소수점이 버려지므로 정수를 나누어 %를 표현하고 싶다면
1 / 2 * 100가 아니라1 * 100 / 2로* 100의 순서를 앞으로 옮겨서 작성할것. - 정수를 0으로 나누면 프로그램이 오류를 내면서 멈춤. 실수를 0으로 나눌경우 무한대나 NaN이 나올 수 있으며 decimal의 나눗셈은 예외가 발생한다.
- 몫과 나머지로 자릿수 분해를 할 수 있다.
using System;
int number = 3749;
int thousands = number / 1000; // 3749 ÷ 1000 의 몫
int hundreds = number / 100 % 10; // 백의 자리
int tens = number / 10 % 10; // 십의 자리
int ones = number % 10; // 일의 자리
Console.WriteLine($"{number} 의 각 자리");
Console.WriteLine($"천: {thousands}");
Console.WriteLine($"백: {hundreds}");
Console.WriteLine($"십: {tens}");
Console.WriteLine($"일: {ones}");
Console.WriteLine($"자릿수 합: {thousands + hundreds + tens + ones}");
- 나머지로 값을 일정 범위 안에 가둘 수 있다.
using System;
int step = 0;
Console.WriteLine($"0 % 4 = {0 % 4}");
Console.WriteLine($"1 % 4 = {1 % 4}");
Console.WriteLine($"2 % 4 = {2 % 4}");
Console.WriteLine($"3 % 4 = {3 % 4}");
Console.WriteLine($"4 % 4 = {4 % 4}");
Console.WriteLine($"5 % 4 = {5 % 4}");
step = 11;
Console.WriteLine($"11 을 4로 나눈 나머지: {step % 4}");
- 피연산자가 숫자인지 문자열인지가 결과를 가름
할당 연산자
= 이 표시는 수학의 등호가 아니라 오른쪽에 있는 값을 왼쪽의 변수에 넣는다는 뜻이다.
순서는 오른쪽을 먼저, 그 다음 왼쪽 순으로 이어진다.
복합 연산자
count = count + 1처럼 자기 자신을 계산해 다시 할당하는 형태는 자주 필요하다. 이것을 짧게 쓸 수 있는 연산자가 복합 할당 연산자이다.
| 복합 할당 | 같은 뜻 |
|---|---|
x += y | x = x + y |
x -= y | x = x - y |
x *= y | x = x * y |
x /= y | x = x / y |
x %= y | x = x % y |
| 물론 복합 할당과 연산 후 할당이 완전이 같지는 않다. 복합 할당은 형 변환을 같이 진행하기 때문에 계산 결과를 왼쪽 변수의 타입으로 되돌리는 변환을 자동으로 진행한다. |
using System;
byte level = 250;
level += 5; // 실제로는 level = (byte)(level + 5)
Console.WriteLine(level);
// level = level + 5; // 컴파일 오류: 계산 결과가 int 라서 byte 에 못 들어감
- 주의사항 : 오른쪽 값이 왼쪽 타입으로 변환 될 수 있는 경우에만 가능하다. 이 경우는 명시적으로 변환을 해야 한다.
증감 연산자
++와 -- 값을 정확히 1만 늘리거나 줄일 때 사용한다.(char에도 사용할 수 있다. 사용시 코드값이 1 늘어나거나 줄어든다.)
-
전위와 후위 : 증감연산자는 변수의 앞에도, 뒤에도 붙일 수 있음. 앞에 붙이는 것을 전위, 뒤에 붙이는 것을 후위 라고 함. 이 둘의 차이는 반환하는 값이 다름.
표기 이름 식의 값 ++x전위 1 늘린 뒤의 값 x++전위 1 늘리기 전의 값
//전위 예시
int i = 3;
int j = ++i; // i를 4로 만든 뒤, 4를 j에 넣음
//후위 예시
int k = 3;
int l = ++k; // 현재 값 3을 남겨 두고 x를 4로 만든 뒤, 남겨 둔 3을 y에 넣음
예시의 두 경우 모두 i, k변수 모두 값은 4가 됨. 다른것은 다른변수(j, l)에 들어간 값임.
증감식을 하면서 값을 사용하는 일이 없으면 전위, 후위 결과가 동일함.
관계 연산자
두 값의 관계를 따져 참인지 거짓인지를 알려주는 연산자임. 결과는 언제나 bool타입임.
| 연산자 | 의미 | 예 | 결과 |
|---|---|---|---|
== | 같음 | 3 == 3 | true |
!= | 다름 | 3 != 5 | true |
> | 큼 | 5 > 3 | true |
>= | 크거나 같음 | 5 >= 5 | true |
< | 작음 | 3 < 5 | true |
<= | 작거나 같음 | 3 <= 3 | true |
- 문자열 비교: 문자열도
==,!=로 비교할 수 있다. 글자 하나하나 같은지를 확인하며 대소문자는 다른 글자로 취급함. - 실수 비교: 실수는
==로 비교하면 예상과 다른 결과가 나올 수 있다. 실수는 근사치로 담기 때문이다.- 실수비교는 두 값의 차이가 일정 이하로 나는지를 확인하는 식으로 진행한다.
(
0.3 - (0.1 + 0.2) < 0.01) 이런식으로..
- 실수비교는 두 값의 차이가 일정 이하로 나는지를 확인하는 식으로 진행한다.
(
논리 연산자
세가지 논리 연산자가 있다. bool값을 조합해 새로운 bool값을 만드는 연산자인다.
| 연산자 | 이름 | 참이 되는 조건 |
|---|---|---|
&& | AND | 양쪽이 모두 참 |
| ` | ` | |
! | NOT | 피연산자가 거짓, 피연산자가 1개인 단항연산자 |
단락 평가(뒤쪽 식이 누락되는 상황)
&&와 ||는 결과가 정해지면 남은 조건을 계산하지 않음. 이것을 단락 평가라고 함.
| 연산자 | 왼쪽이 | 오른쪽은 |
|---|---|---|
&& | false | 계산하지 않음(결과는 이미 false) |
|| | true | 계산하지 않음(결과는 이미 true) |
단락평가는 오른쪽 조건 계산이 위험할 때 왼쪽에서 걸러 내는 데 씀.
위험한 조건을 오른쪽에, 그것을 막는 조건을 왼쪽에 둠으로써 왼쪽 조건을 통과하지 못하면 오른쪽 조건계산을 실행하지 못하게 하는 것.
예시로 count가 0이면 count로 나누는 조건을 계산할 때 문제가 발생하므로 다음과 같이 왼쪽에 조건을 추가하는 식.count > 0 && total / count > 3
조건 연산자
조건 연산자? : 는 조건을 보고 두 값 중 하나를 골라 반환하는 연산자임. 피연산자가 3개라서 삼항 연산자라고도 부름.
조건 ? 조건이 참일 때의 값 : 조건이 거짓일 때의 값
- 주의사항
- 문자열 보간에서 사용시 괄호로 감싸야함. 감싸지 않으면
:뒤가 서식지정으로 해석되어 컴파일 오류가 발생함 ?뒤와:뒤의 값은 같은 타입이거나, 한쪽이 다른 쪽으로 변환될 수 있어야 함.- 조건 연산자는 값을 고르는 것만 함. 실행할 문장을 고를 수는 없음
- 예시:
hp > 0 ? Console.WriteLine("생존") : Console.WriteLine("사망");이 경우 컴파이 오류
- 문자열 보간에서 사용시 괄호로 감싸야함. 감싸지 않으면
연산자 우선순위
한 식에 연산자가 여럿이면 우선순위가 높은 것부터 계산한다.
| 우선 순위 | 연산자 | 갈래 |
|---|---|---|
| 1 | () | 괄호 |
| 2 | x++,x-- | 후위 증감 |
| 3 | ++x,--x,+x,-x,!x,(타입)x | 단항 |
| 4 | *``/``% | 곱셈류 |
| 5 | +``- | 덧셈류 |
| 6 | <``>``<=``>= | 크기 비교 |
| 7 | ==``!= | 같음, 다름 |
| 8 | &``| | 비단락 논리(&가|보다 높음) |
| 9 | && | 논리 AND |
| 10 | || | 논리 OR |
| 11 | ? : | 조건 |
| 12 | =``+=``-=``*=``/=``%= | 할당 |
우선순위가 같다면 결합 방향이 순서를 정함(일반적으로는 왼쪽부터, 할당연산자의 경우 오른쪽 부터 실행한다.)
| 갈래 | 방향 | 예 | 해석 |
|---|---|---|---|
| 산술, 비교, 논리 | 왼쪽 -> 오른쪽 | 10 - 2 - 3 | (10 - 2) - 3 |
| 할당 | 오른쪽 -> 왼쪽 | x = y = 5 | x = (y = 5) |
| 조건 | 오른쪽 -> 왼쪽 | a ? b : c ? d : e | a ? b : (c ? d : e) |
괄호를 넣으면 계산 순서가 코드에 그대로 드러나므로 우선순위를 따질 필요가 없어짐.



