0. 강의 목표
- Data Type 간의 Conversion 및 Overflow에 대한 공부
- Parse / TryParse 함수를 통한 Data Type Conversion
- try - catch 문을 통한 Exception 처리
- Data Type

- C# Data Type의 종류
- 크게 Boolean / Number(Integer + Float) / String 3가지로 분류
- Overflow
- Data Type의 범위를 초과할 경우 발생하는 Error
1. 새 Project 생성 후 Control 추가


- 새 Project 생성 후 실제 숫자 값이나 Data Type의 입력을 위한 TextBox 입력
- 이후 옆에 Button 입력
1.1 Control Property 변경

- 이후 각 Data 표시 용 Label 및 동작용 Button 입력 후 각각의 Text 변경



- 각 Data 표시 Label들의 이름 변경
- 위처럼 해당 Control이 어떤 역할을 하는지 한눈에 알기 쉽게 작성하는 편이 좋음
- lbl(Label) + Short(Conversion 할 Data Type)



- 각 Button들도 마찬가지로 역할을 알기 쉽게 작성

- TextBox 이름 변경

- 값에 접근 불가능한 Label과 달리 TextBox는 값을 저장할 수 있음
2. 코드 작성
2.1 'Short Convert' Button을 눌렀을 때 TextBox 내의
입력값을 Short Type으로 변환해주는 Code 작성
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace DoriDori_Lecture2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button2_Click(object sender, EventArgs e)
{
short sNumber = short.Parse(tboxNumber.Text);
lblShort.Text = sNumber.ToString();
}
}
2.1.1 Data_Type.Parse(string s)
- String "s"의 숫자 표현을 해당하는 Data Type으로 변환
short sNumber = short.Parse(tboxNumber.Text);
- 위 코드의 경우 Short(16 bits Integer)로 변환
- 사용 이유

- 위처럼 TextBox에 키보드로 숫자를 입력해도 이 입력값은 숫자형이 아닌 String으로 입력됨

- 이 입력값을 숫자형 중 Short Type으로 변환하여 Label에 표시하기 위해 사용

- 이 때, short의 표현 범위는 위와 같으므로, 위 범위를 초과하는 값 입력시 아래와 같은 오류가 발생함


- 위의 'OverflowException'은 값이 허용 범위를 초과했을 때 발생하는 예외 값
... ...
... ...
private void button2_Click(object sender, EventArgs e)
{
// short sNumber = short.Parse(tboxNumber.Text);
ushort sNumber = ushort.Parse(tboxNumber.Text);
lblShort.Text = sNumber.ToString();
}
... ...
... ...

- short -> ushort로 변경 시 65000 변환 가능
- ushort는 short의 음수 표현 범위를 양수로 옮겨옴
2.1.2 예외 처리 코드 작성
... ...
... ...
private void button2_Click(object sender, EventArgs e)
{
try
{
short sNumber = short.Parse(tboxNumber.Text);
lblShort.Text = sNumber.ToString();
}
catch (Exception ex)
{
lblException.Text = ex.ToString();
}
}
... ...
... ...
- 위와 같은 Exception(예외)를 처리하기 위한 코드 작성
- 발생한 Exception 의 내용을 Exception 관련 Label의 Text에 표시
- 이 경우 Exception 발생 시 프로그램이 죽지 않고 발생한 Exception의 내용과 해당 위치를 알 수 있다
2.1.2.1 try - catch 문
- C#에서의 Exception 처리문 중 하나
- 일반적으로 코드 실행 중 Exception 상황이 발생하면, 그에 해당하는 Error 메세지를 출력한 후 Program이 종료된다
- 이러한 상황을 방지하기 위해 사용하는 구문으로, try - catch - finally 문으로 구성된다
try
{
// 예외가 발생할 수 있는 부분
}
catch (에외1 ex)
{
// 예외1 처리
}
catch (예외2 ex)
{
// 예외2 처리
}
finally
{
// 예외 발생 여부와 상관 없이 실행
}
- try 문
- Exception의 영향을 받을 수 있는 코드를 작성
- try 문 내의 코드를 실행하다 Exception이 발생할 경우 그 아래 코드를 실행하지 않고 catch 문으로 이동도
- catch 문
- try 문에서 Exception이 발생할 경우 그를 처리하는 코드를 작성
- 즉 try문에는 Exception가 발생하지 않았을 경우 실행되는 코드, catch문에는 Exception가 발생했을 경우 실행되는 코드 작성
- 아래처럼 catch 문을 여러개 사용하여 각 Exception 유형에 따른 처리를 할 수 있다
try{
... ...
... ...
}
catch(ArgumentNullException ex){
// Method에 전달되는 Argument가 Null인 예외에 대한 처리
}
catch(OverflowException ex){
// Overflow 예외에 대한 처리
}
- Exception 상황에는 많은 종류가 있으나, C#의 모든 Exception Class는 System.Exception로부터 파생된다
- 위 예제의 Exception은 'OverFlowException'에 해당
try
{
short sNumber = short.Parse(tboxNumber.Text);
lblShort.Text = sNumber.ToString();
}
catch (Exception ex)
{
lblException.Text = ex.ToString();
}
- 따라서 위처럼 System.Exception 형식의 Exception을 받게 하면 모든 Exception에 대한 처리가 가능하다
- 단 이 경우 사용자가 예상한 Exception 외의 다른 Exception 또한 받아낼 수 있음
- 따라서 무조건적으로 이를 사용해선 안된다
- 본 예제의 catch 문을 Overflow에 대한 Exception 처리문으로 변경하고자 한다면, OverflowException을 사용하면 된다
try
{
short sNumber = short.Parse(tboxNumber.Text);
lblShort.Text = sNumber.ToString();
}
catch (OverflowException ex)
{
lblException.Text = ex.ToString();
}
- finally 문 : Exception 상황이 발생 여부와 관계 없이 마지막에 실행되는 Block
- switch 문의 default 느낌
- throw
- try 문에서 발생한 예외를 catch 문에서 처리한 경우, 해당 예외는 처리된 것으로 간주된다
- 이 때, 처리된 예외를 다시 상위 호출자로 보낼 때 throw를 사용
- throw 문은 크게 아래의 2가지로 구분된다
1. throw문 다음에 아무것도 없는 경우
- 뒤에 어떠한 Exception Object 없이 throw를 사용하는 경우
- 이는 catch문에서 잡은 Exception을 상위 호출 함수에게 그대로 전달한다
2. throw문 다음에 새 Exception Object를 생성해서 전달하는 경우
- 'new' keyword를 사용하여 새로운 Exception Object를 만든 후, 해당 Object를 Throw
- catch에 들어온 Exception을 Wrapping하여 새로운 Exception을 만들 때 사용
- 단 잘못 사용하면(InnerException을 포함하지 않으면) 기존 Exception 정보를 잃을 수 있다
try
{
Process1();
Process2();
}
catch(Exception1 ex)
{
// catch에서 잡은 Exception을 그대로 전달
throw;
}
catch(Exception2 ex)
{
// 새로운 Exception Object를 생성하여 전달
throw new newException("Exception Occured", ex);
}
- 위 try - catch문을 통해 Exception 처리를 수행

- 단, 아래처럼 범위에 맞는 값을 입력해도 아래 문구가 남아있게 됨

... ...
... ...
private void button2_Click(object sender, EventArgs e)
{
try
{
short sNumber = short.Parse(tboxNumber.Text);
lblShort.Text = sNumber.ToString();
lblException.Text = "-";
}
catch (Exception ex)
{
lblException.Text = ex.ToString();
}
}
... ...
... ...
- 예외가 발생하지 않을 경우 Excepction 표시 Label에 원래의 "-"를 표시하는 코드 추가


- Integer, Double 변환 코드 추가
namespace DoriDori_Lecture2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
... ...
... ...
// Convert Input to Short Type
private void button2_Click(object sender, EventArgs e)
{
try
{
short sNumber = short.Parse(tboxNumber.Text);
lblShort.Text = sNumber.ToString();
lblException.Text = "-";
}
catch (Exception ex)
{
lblException.Text = ex.ToString();
}
}
// Convert Input to Integer Type
private void button3_Click(object sender, EventArgs e)
{
try
{
int sNumber = int.Parse(tboxNumber.Text);
lblInt.Text = sNumber.ToString();
lblException.Text = "-";
}
catch (Exception ex)
{
lblException.Text = ex.ToString();
}
}
// Convert Input to Double Type
private void btnDouble_Click(object sender, EventArgs e)
{
try
{
double sNumber = double.Parse(tboxNumber.Text);
lblDouble.Text = sNumber.ToString();
lblException.Text = "-";
}
catch (Exception ex)
{
lblException.Text = ex.ToString();
}
}
}
}

- 이 때, 위처럼 각 Type에서 변환 불가능한 범위의 입력이 들어올 경우 이전 변환 결과가 남아있는 문제가 생김
- 추후 초기화 부분 추가 가능
- 자동 변환 코드 추가
private void btnExe_Click(object sender, EventArgs e)
{
short sNumber = 0;
int iNumber = 0;
double dNumber = 0;
// Convert tboxNumber`s text to short type and store the result to sNumber if conversion is able
if (short.TryParse(tboxNumber.Text, out sNumber))
{
lblShort.Text = sNumber.ToString();
}
}
- Data_Type.TryParse(string s, out Data_Type result) : String "s"의 숫자 표현을 해당 Type으로 변환하고, 변환 성공 여부를 Return
- 'out' keyword를 통해 변환 결과를 받아옴
- out : 함수 Parameter 앞에 붙는 Parameter 한정자의 일종으로, Parameter를 참조 형태로 전달하게 함
- out keyword를 사용한 parameter는 함수 종료 전 내부에서 반드시 값을 할당해줘야 함
- Parameter 값을 전달 받기 전에는 값이 할당되어있지 않아도 괜찮음
- 즉 호출 전 전달되는 Parameter의 정확한 값을 몰라도 사용 가능
- 함수 내에서 전달하는 변수를 초기화할 때 적합
class Program
{
static void Main(string[] args)
{
int var;
Outfnc(out var);
Console.WriteLine("var : ", var);
}
public static void Outfnc(out int i)
{
i = 10; // 내부에서 반드시 할당되어야한다.
}
}
- 위 Outfnc 함수의 return 값 i = 10을 reference 형태로 argument var에 전달

- 자세한 Debugging을 위한 BreakPoint 추가
- 코드 실행 도중 BreakPoint 지점을 만나면 멈추게 됨

- 500 입력

- 코드 실행 후 값 입력 후 Convert Detect 버튼을 누르면 위의 btnExe_Click 함수를 한 줄씩 실행하다 BreakPoint를 만나 멈춤
- 이후 F10을 눌러 단계별로 넘어가며 확인

- short.TryParse 함수를 통해 입력 값(tboxNumber.Text)을 short type으로 변환할 수 있는지를 확인

- 변환이 가능할 경우 if 문으로 진입

- 변환 값 500을 lblShort.Text에 대입

- 대입 결과


- 변환이 불가능한 값을 입력할 경우 if문을 들어가지 않고 바로 지나감
private void btnExe_Click(object sender, EventArgs e)
{
short sNumber = 0;
int iNumber = 0;
double dNumber = 0;
lblException.Text = "-";
// Convert tboxNumber`s text to short type and store the result to sNumber if conversion is able
if (short.TryParse(tboxNumber.Text, out sNumber))
{
lblShort.Text = sNumber.ToString();
}
else if (int.TryParse(tboxNumber.Text, out iNumber))
{
lblInt.Text = iNumber.ToString();
}
else if (double.TryParse(tboxNumber.Text, out dNumber))
{
lblDouble.Text = dNumber.ToString();
}
else
{
lblException.Text = "Can`t Convert";
}
}
- integer, double 변환 부분 및 예외 처리에 대한 부분 추가
- 전체 코드 실행 결과

- "40"을 Short Type으로 변환

- "40000"을 Integer Type으로 변환

- "400..." 을 Double Type으로 변환

- 4E+228을 Double Type으로 변환

- "Test Input" string은 숫자가 아니므로 Short / Int / Double 의 숫자형으로 변환 불가
본 강의의 모든 저작권은 아래 원작자에게 있습니다.
강의 출처 :
Doridori C# 강의) 2.DataType과 Overflow
======================================================안녕하세요 Doridori 입니다. 이번강의는 지난강의와 형태는 같습니다. UI를 먼저 만드는 연습을 하고 DataType과 Overflow를 확인 해보는 예제를 진행 하겠습니
cwkcw.tistory.com
참고 자료 :
https://blog.naver.com/coding-abc/222388017000
(C#) Exception 종류 모음
#예외 #예외처리 #Exeption #try #catch #finally 예외(exception)처리란 프로그램 실행중에 예기치 않은 ...
blog.naver.com
https://www.csharpstudy.com/CSharp/CSharp-exception.aspx
C# 예외 처리 - C# 프로그래밍 배우기 (Learn C# Programming)
C# Exception 예외 처리 C#을 포함한 모든 .NET 프로그래밍 언어는 .NET Framework의 Exception 메카니즘에 따라 Exception을 처리한다. .NET의 System.Exception은 모든 Exception의 Base 클래스이며, 예외 처리는 이 Except
www.csharpstudy.com
C# tryparse 숫자 체크 (number check)
C# tryparse 숫자 체크 (number check) C#에서 특정 string값의 숫자 체크(number check)가 필요할 경우 TryParse라는 함수를 활용해 간단하게 숫자 체크가 가능합니다. 특징 : 체크해야될 string값이 숫자인 경우,
vmpo.tistory.com
'Study_C#' 카테고리의 다른 글
[C#] Invoke, InvokeRequired, Delegate (0) | 2024.07.30 |
---|---|
[C#] Using의 2가지 사용법 (0) | 2024.07.30 |
[C#] 비동기 관련 (0) | 2024.07.06 |
[C#] 자료형 정리 (0) | 2024.07.06 |
Doridori C# 강의 정리 1. String (4) | 2024.05.20 |