저번 시간에는 진법과 자료형들의 타입과 기본 문법의 일부를 배웠는데요, 오늘은 강의 진도가 많아서 글이 길어질 것 같습니다..
제일 먼저 Readline();이 자주 나오는데, 사용자의 키보드를 입력받아서 그 결과를 변수에 저장하는 코드입니다.
string n = ReadLine();
이 코드는 사용자의 키보드를 입력받고 그 결과를 n이라는 변수에 저장하는 것이죠.
이번엔 소수점을 다뤄보도록 하겠습니다.
위의 코드는 소수점이 있는 실수를 입력받았을 때 int형으로 출력했을 때 어떻게 출력되는지 확인하는 코드입니다.
오른쪽 실행창처럼 3.4를 입력받았지만 3으로 소수점을 버려서 출력하게 됩니다.
그렇다면 (int) 3.4를 (int) dNum인 실수형으로 바꾸면 어떻게 될까요?
실수를 넣어도 int형에서는 소수점을 버리는 것을 확인할 수 있었습니다.
위에 코드에서 봤던 것처럼 정수형 변수는 소수점은 버리고 출력되는데 3.5나 3.6을 넣었을 때 4로 반올림되게 코드를 짜면 어떻게 될까요?
위 코드처럼 짰을 때 3.1을 넣으면 3.6이 되지만 소수점을 버리므로 3을 출력하고, 3.6을 넣으면 4.1이 되어서 소수점을 버리면서 4가 출력됐습니다.
이때 Math.round나 ceiling 같은 코드를 인터넷이나 책에서 찾고 있었는데 이런 작은 생각 하나로 해결할 수 있는 사고를 생각해보라는 강사님의 말씀이 있었습니다. 문제를 다각도로 분석하여 어떻게 해결할지, 더 효율적으로 할 수 있게 생각하는 습관을 기억하며 코드를 짜야겠다는 생각이 들었습니다.
다음은 VS에서 나눗셈을 해보겠습니다.(위에서 설명했던 것처럼 컴퓨터는 연산할 때 소수점을 버립니다.)
컴퓨터는 소수점을 정수와 다른 형태로 저장하고 복잡하기 때문에 정수 계산만 하는 것이 좀 더 효율적입니다.
또, 컴퓨터의 나눗셈은 ' / '로 몫만 출력하거나 ' % '로 나머지만 출력할 수도 있습니다.
이를 통해 정수형은 나눗셈을 하더라도 소수점은 버리고 몫과 나머지를 출력하는 반면, 실수형 데이터는 소수점을 버리지 않고 그대로 출력하는 것을 알 수 있습니다. 그리고, 컴퓨터는 5칙연산을 한다는 것을 알 수 있습니다.( + , - , * , / , % )
다음은 제어 문법에 대해서 알아보겠습니다.
C#에서 제어 문법은 주로 if문을 사용합니다. if문은 참/거짓 조건식의 결과에 따라 { }로 묶어놓은 코드의 실행 여부가 결정되는 조건문입니다.
if(참이면) -> 거짓이면 실행하지 않습니다.
{
실행
}
참고로 컴퓨터는 디버그 할 때 한 줄씩 내려오다가 if문을 만나면 { } 창을 가기도 하고, if문을 무시하고 점프돼서 실행되기도 합니다.
위의 코드처럼 false는 보통 사용되지 않습니다. 이걸 사용하기 위해서는 조건문(비교 연산자)을 사용하며 구분을 할 수 있습니다.
실습 1. 조건문을 통해 입력한 수가 10의 배수인지 알아보는 코드를 짜보자.
이때 한 줄에 %와 ==로 동시에 2개의 연산자를 사용했었는데, 이때 iNum%10와 10==0의 우선순위에 따라 값이 변화될 것입니다. 그렇지만 C#에서 정해진 규칙으로는 % 연산의 우선순위가 더 높습니다.
보통 %의 우선순위가 더 높고 소괄호 '( )' 로 우선순위를 더 높여줄 수도 있습니다.
위의 코드에서 10의 배수이면서 3의 배수를 찾는 프로그램도 짜보겠습니다.
이처럼 사람마다 사용하는 연산자나 표현이 다르기 때문에 소스코드가 다를 수 있지만, 결과가 똑같으면 상관없으니 본인의 성향에 맞게 코드를 짜는 것이 중요합니다.
실습 2. 입력한 숫자가 짝수, 홀수인지 판별하는 프로그램
실습 1처럼 if문의 조건문이 참일 때만 실행되는 소스코드를 짰는데 거짓일 때 실행되는 소스코드도 짜보겠습니다.
입력받은 값이 홀수면 2를 나눠도 0이 되지 않으므로 거짓 조건문인 else 구문에 걸려서 입력한 정수를 출력하게 됩니다.
이처럼 if 조건문을 계속 쓸 때는 참이 될 때까지 조건을 수행할 수 있는지 봅니다. 하지만 조건이 여러 개일 때 계속 if문을 쓰면 뎁스가 깊어져서 더 복잡해질 수 있습니다. 예를 들어, 밑에 성적을 환산하는 프로그램을 짤 때
그래서 이런 조건이 중복으로 실행되지 않게 또 다른 조건을 걸어주는 else if 문이 필요합니다.
실습 3.
else if 문을 사용하여
90점 이상일 때 A
89~80점일 때 B
79~70점일 때 C
69~60점일 때 D
59점 이하일 때 F
를 출력하는 성적 환산 프로그램을 작성해보자.
실습 4. 년도를 입력하면 그게 윤년인지 확인해보는 프로그램
*조건
서력 기원 연수가 4로 나누어 떨어지는 해는 윤년으로 한다.
서력 기원 연수가 4, 100으로 나누어 떨어지는 해는 평년으로 한다.
서력 기원 연수가 4, 100, 400으로 나누어 떨어지는 해는 윤년으로 둔다.(윤년이 아닌 해는 평년임)
보통의 알고리즘으로
400으로 나누어 떨어지는 해 (윤년)
400으로 나누어 떨어지는 않는 해 : 평년과 윤년이 섞여 있음
4로 나누어 떨어지는 해는 윤년 후보(평년과 윤년이 섞여 있음)
{
100으로 나누어 떨어지지 않는 해는 윤년
100으로 나누어 떨어지는 해는 평년
}
을 생각하여 소스코드를 짜보자.
다음은 연산자에 대해서 알아보게 될 텐데,
증가 연산자 ++는 피연산자의 값 1 증가시키고, 감소 연산자 -- 는 피연산자의 값을 1 감소합니다.
++ ㅁ ;
↓
ㅁ = ㅁ+1;
보통 변수 선언하고 면수에 +1 을해 주는 코드를 짜지만, 증감 연산자로 간단하게 표현할 수 있어서 효율이 더 좋습니다.
다음은 switch문입니다.
if문은 조건문으로서 참 거짓을 판별하지만 switch의 케이스는 딱 한 가지만 적용됩니다.
위의 if문처럼 switch문으로 성적을 환산하는 프로그램을 만들어보겠습니다.
위 코드처럼 점수/10으로 몫만 추출해서 case에 걸리도록 소수점을 버리는 특성으로도 소스코드를 개발할 수 있습니다.
오늘 배웠던 것 중에 연산자도 있습니다.
문자열 결합 연산자
int result = 123 + 345 ; <- 두 가지 숫자의 덧셈이지만,
int result = ' 123 ' + '345' ; <- 두 가지 문자열의 결합을 의미합니다.
또 관계 연산자 3가지가 있는데
논리곱 연산자(&& : AND)
논리합 연산자(|| : OR 쉬프트 역슬래시 입력)
부정 연산자(! : NOT)가 존재합니다.
비트 연산자 : 비트단위로 데이터 라인을 가공해야 하는 경우에 사용합니다.
예를 들어,
byte bNum = 100;
byte에는 0110 0100의 수가 방에 모여있습니다.
이때 bNum<<2;의 명령을 주면 비트를 화살표 방향으로 2칸 이동해라는 명령입니다.
ㅁㅁㅁㅁ ㅁㅁㅁㅁ
0110 0100 => 100
ㅁㅁㅁㅁ ㅁㅁㅁㅁ ㅁㅁ
0100 0100 00 => 왼쪽으로 2칸이 이동되어서 144로 바뀝니다. 이를 소스코드를 통해 확인해보면,
왼쪽으로 n만큼 밀수록 2의 n제곱만큼 곱해지고, 오른쪽으로 n만큼 밀수록 2의 n제곱만큼 나눠집니다.
(3을 넣고 3칸 이동하면 2의 3 제곱을 곱해서 3*8이 돼서 결괏값이 24가 나온다.)
두 숫자를 논리 연산자(and, or)등으로 계산할 때는 어떻게 돌까?
1010 1101 && 0110 1001
$$는 둘 다 참이어야 하며 참으로 결과는 0010 1001이 된다.
이때 위의 코드처럼 2진법 기계어들을 16진수로 바꾼 다음에 계산하는 것이 더 편하고 효율적임. 참고로 숫자 앞에 'OX'이 받은 숫자를 16진법으로 인식하도록 캐스팅해주는 것입니다.
오늘은 if문, switch문, 나눗셈과 같이 기초문법에 대해서 배웠는데요, 요즘 학원에서 배우는 것들이 빠르고 어렵기 때문에 분량이 점점 많아질 것 같아서 걱정되네요... 내일은 For문으로 구구단을 출력하는 것을 포스팅해보겠습니다.
감사합니다.
'개발자과정준비 > C#' 카테고리의 다른 글
[C#] 5. C# 기초 (5) 구조체, 클래스, 배열 (0) | 2020.05.28 |
---|---|
[C#] 4. C# 기초 (4) 반복문, 메서드 (1) | 2020.05.26 |
[C#] 2. C# 기초 (2) 진법과 기본 문법 (0) | 2020.05.25 |
[C#] 1. C# 기초 (1) 기본 자료형 (0) | 2020.05.24 |
[C#] 0. C#을 시작해보자 (0) | 2020.05.20 |