일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- #csharp #double #decimal #실수형 #정밀도 #부동소수점 #고정소수점 #금융계산 #과학계산 #csharp세미나 #닷넷기초
- #csharp #매개변수 #ref #out #params #명명된인수 #선택적매개변수 #메서드전달 #csharp세미나
- #csharp #산술연산자 #arithmeticoperators #기초프로그래밍 #csharp기초 #연산자우선순위 #정수연산 #실수연산 #math클래스 #나눗셈예외 #csharp세미나 #닷넷개발 #프로그래밍입문
- 무노동수입
- #csharp #수치형식 #numerictypes #리터럴 #형식추론 #접미사 #decimal #float #double #프로그래미링기조 #그래피포뷰
- 자동매매
- #csharp #비트연산자 #bitwiseoperators #flagsenum #masking #시프트연산 #비트연산 #성능최적화 #csharp세미나 #하드웨어제어
- 빛썸
- #csharp #조건연산자 #삼항연산자 #논리연산자 #단락평가 #ifelse축약 #조건문 #프로그래밍기초 #csharp세미나
- #csharp #표현식 #배정표현식 #void표현식 #연산자 #산술연산자 #조건연산자 #표현식기초 #csharp세미나
- #csharp #연산자우선순위 #결합성 #operatorprecedence #연산자결합 #오른쪽결합 #왼쪽결합 #csharp세미나
- #csharp #관계연산자 #상등연산자 #equals #비교연산 #null비교 #float비교 #csharp기초 #csharp세미나 #문자열비교
- #csharp #bool #boolean #논리연산자 #부울연산자 #단락평가 #조건문 #csharp기초 #삼항연산자 #csharp세미나
- #csharp #부동소수점 #반올림오차 #실수계산 #float #double #decimal #mathround #정확도비교 #csharp세미나
- #csharp #배열 #다차원배열 #가변배열 #배열초기화 #indexrange #span #배열비교 #csharp기초 #배열세미나
- 테더
- #csharp #var키워드 #타입추론 #암묵적형식지정 #익명형식 #linq #지역변수 #csharp세미나
- c#string
- USDT
- #csharp #수치변환 #형식변환 #자동변환 #명시변환 #convert #parse #tryparse #csharp세미나
- c#bool
- #csharp #스택과힙 #메모리구조 #값형식 #참조형식 #박싱 #가비지컬렉션 #힙메모리 #메서드스택 #csharp세미나
- #csharp #부동소수점 #nan #infinity #특수값 #ieee754 #수치계산 #double #float #decimal #csharp세미나
- 빗썸api
- #csharp #산술오버플로우 #checked #unchecked #overflowexception #정수연산 #오버플로우처리 #csharp세미나 #디버깅 #성능최적화
- #csharp #문자열 #문자 #string #char #문자열보간 #문자열연결 #문자열비교 #형식지정자 #문자변환 #csharp세미나
- 파이썬
- c#
- #csharp #널연산자 #nulloperator #널조건부연산자 #널접합연산자 #nullcheck #csharp세미나 #nullsafe #코드안정성
- #csharp #기본값 #definiteassignment #default키워드 #초기화규칙 #구조체초기화 #null값 #csharp세미나
- Today
- Total
맛있는 개발노트 (맛과 개발을 함께)
C# 세미나 자료: 정수 산술 넘침 점검 연산자 (checked / unchecked) 본문
1. 개요
C#에서 정수 산술 연산은 메모리 크기에 따라 표현 가능한 수의 범위가 정해져 있습니다. 이 범위를 초과할 경우 **산술 오버플로우(Overflow)**가 발생할 수 있으며, 의도하지 않은 값이 저장되거나 예외가 발생할 수 있습니다.
이를 제어하기 위해 C#은 checked와 unchecked 키워드를 제공하며, 이 연산자는 오버플로우 발생 시 행동을 제어할 수 있도록 합니다. 본 세미나에서는 이를 초급부터 고급까지 단계별로 설명합니다.
2. 기본 이론
2.1 산술 오버플로우란?
정수형 자료형은 고정된 크기의 비트를 사용하여 수를 표현합니다. 예를 들어 int는 -2,147,483,648 ~ 2,147,483,647의 값을 가질 수 있습니다. 이 범위를 초과하면 예상치 못한 값으로 순환(wrap around) 되어 저장됩니다.
int max = int.MaxValue;
int result = max + 1;
Console.WriteLine(result); // -2147483648
2.2 checked 연산자
checked는 산술 연산 중 오버플로우가 발생했을 때 **예외(OverflowException)**를 발생시켜 개발자가 이를 인지하고 처리할 수 있게 합니다.
checked
{
int x = int.MaxValue;
int y = x + 1; // OverflowException 발생
}
또는 한 줄에 적용:
int y = checked(x + 1);
2.3 unchecked 연산자
unchecked는 오버플로우가 발생하더라도 예외를 발생시키지 않고 기본적인 wrap-around 동작을 허용합니다.
unchecked
{
int x = int.MaxValue;
int y = x + 1; // 결과는 -2147483648
}
이는 성능이 중요한 경우 또는 오버플로우가 무시되어도 되는 경우 사용됩니다.
3. 단계별 설명
3.1 초급: 오버플로우 이해하기
int a = int.MaxValue;
int b = a + 1;
Console.WriteLine(b); // -2147483648
3.2 중급: checked / unchecked 블록 사용하기
checked
{
int a = 1_000_000;
int b = 3_000;
int result = a * b; // OverflowException 발생 가능
}
unchecked
{
int a = 1_000_000;
int b = 3_000;
int result = a * b; // wrap-around 결과
Console.WriteLine(result);
}
3.3 고급: 메서드 단위, 컴파일러 옵션 활용
int SafeAdd(int x, int y)
{
return checked(x + y);
}
int FastAdd(int x, int y)
{
return unchecked(x + y);
}
- 컴파일러 옵션 /checked+, /checked-로 전체 프로젝트 기본 동작 설정 가능
- 예외를 try-catch로 핸들링 가능:
try
{
checked
{
int val = int.MaxValue + 1;
}
}
catch (OverflowException e)
{
Console.WriteLine("오버플로우 발생: " + e.Message);
}
4. 주의사항 및 팁
- 기본적으로 C#은 unchecked 모드입니다 (릴리즈 빌드 기준)
- checked는 int, long 등의 정수형 타입에만 적용됩니다
- float, double, decimal과 같은 부동소수점 타입에는 적용되지 않음 (NaN 또는 Infinity 처리됨)
- 디버깅 중에는 checked를 통해 오류를 조기에 포착하고, 성능이 중요한 릴리즈 빌드에서는 unchecked 활용을 고려합니다
5. 결론
- 산술 오버플로우는 예기치 않은 버그로 이어질 수 있는 중요한 이슈입니다
- checked 연산자를 사용하여 디버깅 시 예외를 발생시켜 문제를 조기에 확인할 수 있습니다
- unchecked는 성능을 중시하거나 wrap-around 동작이 허용될 때 사용합니다
- 프로젝트 상황에 따라 checked와 unchecked를 적절히 조합하는 것이 중요합니다
6. Q&A
Q1. float나 double에도 checked를 사용할 수 있나요?
A1. 아니요. checked는 정수형 타입에만 적용됩니다. 실수형은 오버플로우 시 예외가 아닌 Infinity나 NaN을 반환합니다.
Q2. checked 사용 시 성능 저하가 큰가요?
A2. 약간의 연산 비용이 있지만, 안전한 코드 작성을 위해 디버깅 또는 테스트 환경에서는 사용하는 것이 좋습니다.
Q3. 전체 프로젝트에 checked를 적용하려면?
A3. Visual Studio에서는 프로젝트 설정 > Build 탭 > "Check for arithmetic overflow/underflow" 옵션을 체크하거나, 컴파일러 옵션 /checked+를 사용합니다.
Q4. unchecked 블록은 꼭 써야 하나요?
A4. 기본적으로 unchecked이므로 명시적으로 쓸 필요는 없지만, 명확한 의도 표현을 위해 사용하는 것이 좋습니다.
'C# 학습 > C# 언어의 기초' 카테고리의 다른 글
C# 세미나 자료: 특별한 부동소수점 값 (NaN, Infinity, -Infinity, -0) (0) | 2025.04.07 |
---|---|
C# 세미나 자료: 비트별 연산자 (Bitwise Operators) (0) | 2025.04.07 |
C# 세미나 자료: 산술 연산자 (Arithmetic Operators) (0) | 2025.04.07 |
C# 세미나 자료: 수치 변환 (Numeric Conversion) (0) | 2025.04.07 |
C# 세미나 자료: 수치 형식 (Numeric Types) (0) | 2025.04.07 |