본문 바로가기

Study_C#

Doridori C# 강의 정리 2. Data Type과 Overflow

728x90
반응형

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 변경

Label의 Design Name 변경

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

 

Button의 Design Name 변경

  • 각 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의 표현 범위는 위와 같으므로, 위 범위를 초과하는 값 입력시 아래와 같은 오류가 발생함

short의 범위를 초과하는 65000을 입력할 경우
OverflowException이 발생한다

  • 위의 '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 처리를 수행

 

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

범위에 맞는 300을 입력해줘도 경고문구가 남아있음

 

	... ...
	... ...
 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 의 숫자형으로 변환 불가

 

 

 

 

 

 

 

 


본 강의의 모든 저작권은 아래 원작자에게 있습니다.

 

강의 출처 :

https://www.youtube.com/watch?v=kGQ38vOeI9Q&embeds_referring_euri=https%3A%2F%2Fcwkcw.tistory.com%2F64&source_ve_path=OTY3MTQ&feature=emb_imp_woyt

 

https://cwkcw.tistory.com/64

 

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

 

https://vmpo.tistory.com/11

 

C# tryparse 숫자 체크 (number check)

C# tryparse 숫자 체크 (number check) C#에서 특정 string값의 숫자 체크(number check)가 필요할 경우 TryParse라는 함수를 활용해 간단하게 숫자 체크가 가능합니다. 특징 : 체크해야될 string값이 숫자인 경우,

vmpo.tistory.com

 

728x90
반응형

'Study_C#' 카테고리의 다른 글