오늘의 복습

공재원
∙∙조회 4

문자열 기초와 형 변환

  • 프로그램이 다루는 값이 숫자만은 아니다.
    글자 하나를 담는 char
    글자들의 묶음을 담는 string
    참과 거짓만 담는 bool이 숫자 타입과 함께 C#의 기본 타입을 이룬다.
    타입이 여럿이면 한 타입의 값을 다른 타입으로 옮겨야 할 때가 생긴다.
항목charstring
담는 것문자 하나문자들의 묶음
따옴표작은따옴표 'A'큰따옴표 "A"
크기항상 2바이트글자 수에 따라 다름
글자 0개불가능가능 ("")

bool 변수 이름

  • bool변수는 예/아니오로 답할 수 있는 질문처럼 이름을 짓는다.

    접두사뜻예
    is~인 상태인가isAlive, isVisible, isGameOver
    has~를 가지고 있는가hasKey, hasItem, hasError
    can~할 수 있는가canJump, canAttack, canSave
  • 특히 이 bool 변수 이름을 짓는 부분은 내가 수업을 들으며 놓쳤던 부분이다.

⚠️ 주의: flag, check, status 같은 이름은 true가 무엇을 뜻하는지 알 수 없어 피해야 함. isDeadFlag처럼 Flag 를 덧붙이는 것도 군더더기임

형변환

  • 안전한 방향과 위험한 방향
    각 타입은 담을 수 있는 범위가 정해져 있다. 그래서 값을 옮기는 방향에 따라 결과가 다르다.
  • 좁은 타입의 값을 넓은 타입에 옮기면 언제나 성공함 → 컴파일러가 자동으로 해 줌 (암시적 변환)
  • 넓은 타입의 값을 좁은 타입에 옮기면 안 들어갈 수 있음 → 개발자가 직접 지시해야 함 (명시적 변환)

💡 팁: 컵에 물을 옮기는 것과 같음. 작은 컵의 물을 큰 컵에 부으면 항상 안전하지만, 큰 컵의 물을 작은 컵에 부으면 넘칠 수 있음. C#은 넘칠 수 있는 쪽만 “정말 부을 것인지” 개발자에게 확인받음

  • 해당 부분 역시 처음에는 이해가 덜 되었지만 복습을 하다 보니 이해가 되었다.
출발 타입자동으로 갈 수 있는 타입
byteshort, ushort, int, uint, long, ulong, float, double, decimal
shortint, long, float, double, decimal
intlong, float, double, decimal
longfloat, double, decimal
floatdouble
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범위에 드는 값을 사용한다.
csharp
using System;

string numberText = Console.ReadLine();
int number = int.Parse(numberText);
Console.WriteLine($"원문: {numberText}");
Console.WriteLine($"정수: {number}");
Console.WriteLine($"다음 값: {number + 1}");
makefile
입력값 : 007

원문: 007
정수: 7
다음 값: 8