오늘의 복습
문자열 기초와 형 변환
- 프로그램이 다루는 값이 숫자만은 아니다.
글자 하나를 담는char
글자들의 묶음을 담는string
참과 거짓만 담는bool이 숫자 타입과 함께 C#의 기본 타입을 이룬다.
타입이 여럿이면 한 타입의 값을 다른 타입으로 옮겨야 할 때가 생긴다.
| 항목 | char | string |
|---|---|---|
| 담는 것 | 문자 하나 | 문자들의 묶음 |
| 따옴표 | 작은따옴표 'A' | 큰따옴표 "A" |
| 크기 | 항상 2바이트 | 글자 수에 따라 다름 |
| 글자 0개 | 불가능 | 가능 ("") |
bool 변수 이름
-
bool변수는 예/아니오로 답할 수 있는 질문처럼 이름을 짓는다.접두사 뜻 예 is~인 상태인가 isAlive,isVisible,isGameOverhas~를 가지고 있는가 hasKey,hasItem,hasErrorcan~할 수 있는가 canJump,canAttack,canSave -
특히 이 bool 변수 이름을 짓는 부분은 내가 수업을 들으며 놓쳤던 부분이다.
⚠️ 주의: flag, check, status 같은 이름은 true가 무엇을 뜻하는지 알 수 없어 피해야 함. isDeadFlag처럼 Flag 를 덧붙이는 것도 군더더기임
형변환
- 안전한 방향과 위험한 방향
각 타입은 담을 수 있는 범위가 정해져 있다. 그래서 값을 옮기는 방향에 따라 결과가 다르다. - 좁은 타입의 값을 넓은 타입에 옮기면 언제나 성공함 → 컴파일러가 자동으로 해 줌 (암시적 변환)
- 넓은 타입의 값을 좁은 타입에 옮기면 안 들어갈 수 있음 → 개발자가 직접 지시해야 함 (명시적 변환)
💡 팁: 컵에 물을 옮기는 것과 같음. 작은 컵의 물을 큰 컵에 부으면 항상 안전하지만, 큰 컵의 물을 작은 컵에 부으면 넘칠 수 있음. C#은 넘칠 수 있는 쪽만 “정말 부을 것인지” 개발자에게 확인받음
- 해당 부분 역시 처음에는 이해가 덜 되었지만 복습을 하다 보니 이해가 되었다.
| 출발 타입 | 자동으로 갈 수 있는 타입 |
|---|---|
byte | short, ushort, int, uint, long, ulong, float, double, decimal |
short | int, long, float, double, decimal |
int | long, float, double, decimal |
long | float, double, decimal |
float | double |
double | 없음 |
decimal | 없음 |
- 규칙은 하나 — 출발 타입의 범위가 도착 타입 안에 통째로 들어갈 때만 자동 변환이 허용된다.
byte(0255)는short(-32,76832,767) 안에 통째로 들어간다. → 자동int(약 ±21억)는byte(0~255) 안에 들어가지 못한다. → 자동 변환 없음uint(0~약 42억)와int(약 ±21억)는 서로를 덮지 못한다. → 양쪽 다 자동 변환 없음
암시적 변환도 정밀도를 보장하지 않는다. ( 중요하다. )
명시적 변환 - 캐스트
- 넓은 타입에서 좁은 타입으로 갈 때는 캐스트 연산자 `(타입)으로 직접 지시해줘야 한다.
- 소수에서 정수로 변환 할땐 소수점 이하를 버린다. 반 올림하는 것이 아니다.
- 음수도 0방향으로 버린다. 예를 들어
3.9->3이다. - 반 올림이 필요하다면
Math.Round를 먼저 적용을 한 뒤에 캐스트 한다.
문자와 숫자 사이
char도 숫자 타입과 변화 규칙을 공유한다.char은 0~65,535를 담으므로int로는 자동으로 간다.
하지만int에서chr로 이동하기 위해선 캐스트가 필요하다.
checked와 unchecked
checked- 넘치면 오류를 일으켜 프로그램을 멈춘다.unchecked- 넘쳐도 검사하지 않고 잘린 값을 그대로 쓴다. C#의 기본값
캐스트로 되지 않는 것
- 숫자타입끼리만 사용 가능하며 문자열이 끼면 캐스트로는 되지 않는다.
| 수단 | 무엇에서 무엇으로 |
|---|---|
캐스트 (타입)값 | 숫자 ↔︎ 숫자 |
int.Parse 등 | 문자열 → 숫자 |
입력값과 형 변환
- 정수 문자열 한 줄을 입력하며, 1을 더한 결과도 int범위에 드는 값을 사용한다.
using System;
string numberText = Console.ReadLine();
int number = int.Parse(numberText);
Console.WriteLine($"원문: {numberText}");
Console.WriteLine($"정수: {number}");
Console.WriteLine($"다음 값: {number + 1}");
입력값 : 007
원문: 007
정수: 7
다음 값: 8



