일상/TIL

07.24 학습내용

aihtnyc_h 2023. 7. 25. 23:27
728x90
반응형
SMALL

22일 23일은 내시경으로… 수면 마취가 안깨서 아무것도 할 수 없었다..!

계산기 프로그램을 나눗셈까지 하고 마무리 짓고 바로 새로온 책을 읽으면서 공부하려했지만… 생각보다.. 오래걸렸다…


3 나누기 0을 했더니 ∞무한이 나왔다..!

찾아보니 수학에서 나누기 연산을 수행할 때, 0으로 나눌 수 없는 이유가 명확하고 확실한 답이 없기 때문에 정의되지 않는 작업이라고 한다!!

DivNumbers_Click 함수에서 number2에 0을 입력하도록 허용하고 0으로 나누기를 방지하는 메커니즘이 없으면 프로그램에서 number1 / number2를 실행하려고 할 때 DivideByZeroException이 발생!

그래서 따로 나누기에 0에 대한 예외처리가 필요하다!

그럼 int로 제한하면 되지 않을까 싶었는데, 그것고 다시 고민해봐야할거같다!

if (float.TryParse(Div2.Text, out number2) == false || number2 == 0f)
   {
       MessageBox.Show("Div2에 잘못된 값이 들어왔습니다. 0이 아닌 숫자를 입력해주세요.");
       Div2.SelectAll();
       Div2.Focus();
       return;
    }

값이 float의 범위가 넘어가게 되면 잘못 들어왔다는 예외가 발생하길래

그럼 숫자의 범위를 지정해주자!

그런데 몇까지 제한을 하면 될까? 고민을 하던 중 검색을 해보았다

숫자를 제한하자~ 123456789012345678901234567890123456789/1000000000000000000000 몇까지 될려나?

float 보다 더큰 숫자의 범위를 가진 정수나 실수를 사용해야 float에 대한 최대 범위를 예외처리 할 수 있다..! 지금은 100까지만 하자..! (혼자 타협..하면 안되지… 어서 찾아!!)

float를 제한하고 싶으면 float 보다 더 큰 double을 이용해야한다!

if (float.TryParse(Div1.Text, out number1) == false || number1 < -100 || number1 > 100)
{
      MessageBox.Show("잘못된 값이 들어왔습니다. Div1 -100에서 100사이의 숫자를 입력해주세요.");
      Div1.SelectAll();
      Div1.Focus();
      return;
}
if (float.TryParse(Div2.Text, out number2) == false || number2 < -100 || number2 > 100)
{
      MessageBox.Show("잘못된 값이 들어왔습니다. Div2 -100에서 100사이의 숫자를 입력해주세요.");
      Div2.SelectAll();
      Div2.Focus();
      return;
}

오류 노트

오류 CS1503 1 인수: 'double'에서 'int'(으)로 변환할 수 없습니다. helloFrom C:\Users\feive\Desktop\study\codepractice\helloFrom\helloFrom\Calculator.cs 401 활성

// 나눗셈
        public int Div(int number1, int number2)
        {
            int div = number1 / number2;
            return div;
        }
        public float Div(float number1, float number2) 
        { 
            float div = number1 / number2;
            return div;
        }

// 이부분에서 따로 double을 만들어주지 않아 발생한 문제..!
				public double Div(double number1, double number2) 
        { 
            double div = number1 / number2;
            return div;        
        }
// 그런데 C#은 비슷한데 다른걸 추천해주었다..!
				public double Div(double number1, double number2) 
        { 
            double div = number1 / number2;
            return (doble)div;        
        }

오류 CS0161 'MulResult.Div(double, double)': 코드 경로 중 일부만 값을 반환합니다. helloFrom C:\Users\feive\Desktop\study\codepractice\helloFrom\helloFrom\Calculator.cs 457 활성

→ 제대로 완성하지 않아서 발생한 문제!


				public double Div(double number1, double number2) 
        { 
            double div = number1 / number2;
            return div;        
        }

				public double Div(double number1, double number2) 
        { 
            double div = number1 / number2;
            return (doble)div;        
        }

기능적으로 동일하게 동작에 차이가 없다. 둘 다 두 개의 double 부동 소수점 숫자에 대해 나눗셈 연산을 수행하고 결과를 double로 반환한다. 나눗셈 연산이 수행되고 결과가 div 변수에 저장되며, 이후에 그대로 반환 명시적 캐스팅에 대해 나오고 있는데, 명시적 캐스팅에 대해 알아보기! 명시적 캐스팅이 있을 경우 두 번째 방법을 사용하고, 없을 경우 첫 번째 방법을 사용한다. 왜 그런지 찾아보자!

명시적 캐스팅, 또는 타입 캐스팅

값을 한 데이터 타입에서 다른 데이터 타입으로 변환하는 방법이다. 컴파일러에게 특정 값을 원래의 타입과 다른 데이터 타입으로 취급하길 원하는 것을 명시적으로 알릴 수 있다. 이는 산술 연산을 수행하거나 서로 다른 타입의 변수에 값을 할당하는 경우에 데이터 타입의 호환성을 보장해야 할 때 유용하다.

컴파일과 컴파일러

프로그램 소스 코드를 컴퓨터 등 하드웨어가 실행할 수 있는 기계 코드로 변환하는 프로그램을 컴파일러라 하고, 변환하는 과정을 컴파일이라고 한다.

내일 명시적 캐스팅 또는 타입 캐스팅을 예로 들 수 있는 예시를 만들어보자!


사용해본 숫자 유형

  • int: -2,147,483,648 ~ 2,147,483,647(부호 있는 32비트 정수)
  • float: ±1.5 × 10^-45 ~ ±3.4 × 10^38, 약 7자리 정밀도(32비트)
  • double: ±5.0 × 10^-324 ~ ±1.7 × 10^308, 약 15 ~ 17자리 정밀도(64비트)

728x90
반응형
LIST