본문 바로가기
공부/C#

C# 공부(2) 11~20

by 라이티아 2024. 8. 21.

 

12. 실수를 표현하는 float, double, decimal

using System;

namespace A012
{
    class Program
    {
        static void Main(string[] args)
        {
            float flt = 1F / 3;
            double dbl = 1D / 3;
            decimal dcm = 1M / 3;

            Console.WriteLine("float : {0}\ndouble : {1}\ndecimal : {2}", flt, dbl, dcm);
            Console.WriteLine($"float : {sizeof(float)}\ndouble : {sizeof(double)}\ndecimal : {sizeof(decimal)}");
            Console.WriteLine($"float : {float.MinValue} ~ {float.MaxValue}\ndouble : {double.MinValue} ~ {double.MaxValue}\ndecimal : {decimal.MinValue} ~ {decimal.MaxValue}");
        }
    }
}

 

결과

float : 0.33333334
double : 0.3333333333333333
decimal : 0.3333333333333333333333333333
float : 4
double : 8
decimal : 16
float : -3.4028235E+38 ~ 3.4028235E+38
double : -1.7976931348623157E+308 ~ 1.7976931348623157E+308
decimal : -79228162514264337593543950335 ~ 79228162514264337593543950335

 

코드 공부를 하면 항상 나오는 자료형의 크기 표시이다

처음안 사실인데 C#은 숫자 뒤에 표기를 안해주면 기본적으로 double로 인식하는 것 같다

즉, 1.234도 float가 아니라 double 로 인식하는 것 같다

decimal의 경우 M을 붙여야 한다.

 

13. 캐스팅과 자료형 변환

using System;

namespace A013
{
    class Program
    {
        static void Main(string[] args)
        {
            int num = 2134124214;
            long bigNum = num;
            Console.WriteLine(bigNum);

            double x = 1234.5;
            int a;
            a = (int)x;
            Console.WriteLine(a);
        }
    }
}

 

결과

2134124214
1234

 

흔히 보이는 자료형 변경에 대한 이야기이다

암시작 형변환과 명시적 형변환((자료형)변수, 값)에 대한 코드이다

 

14. 문자열과 숫자의 변환

using System;

namespace A014
{
    class Program
    {
        static void Main(string[] args)
        {
            string input;
            int value;

            Console.Write("1. int로 변환할 문자열을 입력하세요: ");
            input = Console.ReadLine();
            bool result = Int32.TryParse(input, out value);

            if (!result)
            {
                Console.WriteLine($"{input}은 int로 변환될 수 없습니다.\n");
            }
            else
            {
                Console.WriteLine($"int {value}로 변환되었습니다.");
            }

            Console.Write("2. double로 변환할 문자열을 입력하세요: ");
            input= Console.ReadLine();
            try
            {
                double m = Double.Parse(input);
                Console.WriteLine($"double {m}으로 변환되었습니다.\n");
            }
            catch(FormatException e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }
}

 

1. int로 변환할 문자열을 입력하세요: 123
int 123로 변환되었습니다.
2. double로 변환할 문자열을 입력하세요: 12.3
double 12.3으로 변환되었습니다.

 

string으로 가져온 값을 int 혹은 double로 바꾸는 방법에 대한 코드이다.

이 코드에서는 parse를 주로 사용했지만, Convert라는 클래스 매소드도 있다고 한다

 

15. Convert 클래스와 2진수, 8진수, 16진수 출력

using System;

namespace A015
{
    class Program
    {
        static void Main(string[] args)
        {
            int x, y;

            Console.Write("첫 번째 숫자를 입력하세요: ");
            x = Convert.ToInt32(Console.ReadLine());

            Console.Write("두 번째 숫자를 입력하세요: ");
            y = Convert.ToInt32(Console.ReadLine());

            Console.WriteLine($"{x} + {y} = {x + y}");

            short value = short.MaxValue;
            Console.WriteLine("\n2진수, 8진수, 10진수, 16진수로 출력하기");


            /*
            int baseNum = 2;
            string s = Convert.ToString(value, baseNum);
            int i = Convert.ToInt32(s, baseNum);
            //Console.WriteLine("i = {0}, {1,2}진수 = {2,16}", i, baseNum, s);
            
            Console.WriteLine($"i = {i}, {baseNum,2}진수 = {s,16}");

            baseNum = 8;
            s = Convert.ToString(value, baseNum);
            i = Convert.ToInt32(s, baseNum);
            Console.WriteLine($"i = {i}, {baseNum,2}진수 = {s,16}");

            baseNum = 10;
            s = Convert.ToString(value, baseNum);
            i = Convert.ToInt32(s, baseNum);
            Console.WriteLine($"i = {i}, {baseNum,2}진수 = {s,16}");

            baseNum = 16;
            s = Convert.ToString(value, baseNum);
            i = Convert.ToInt32(s, baseNum);
            Console.WriteLine($"i = {i}, {baseNum,2}진수 = {s,16}");
            */

            Calculator(2);
            Calculator(8);
            Calculator(10);
            Calculator(16);
        }

        static void Calculator(int baseNum)
        {
            string s = Convert.ToString(short.MaxValue, baseNum);
            int i = Convert.ToInt32(s, baseNum);
            Console.WriteLine($"i = {i}, {baseNum,2}진수 = {s,16}");
        }
    }
}

 

결과

첫 번째 숫자를 입력하세요: 121
두 번째 숫자를 입력하세요: 456
121 + 456 = 577

2진수, 8진수, 10진수, 16진수로 출력하기
i = 32767,  2진수 =  111111111111111
i = 32767,  8진수 =            77777
i = 32767, 10진수 =            32767
i = 32767, 16진수 =             7fff

 

//Console.WriteLine("i = {0}, {1,2}진수 = {2,16}", i, baseNum, s);
Console.WriteLine($"i = {i}, {baseNum,2}진수 = {s,16}");
코드중 {}의 의미를 잘 이해하지 못했었는데, {A, B}의 A부분은 value가 들어가고 B의 부분에는 최소 자리를 결정한다

 

14번의 Parse를 Convert로 표현하는 방법에 대한 코드이다.

원래 코드는 주석처리된 코드인데, 함수로 간단히 표현해 보았다.

 

16. C#의 연산자와 식

using System;

namespace A016
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(3 + 4 * 5);
            Console.WriteLine((3 + 4) * 5);
            Console.WriteLine(3 * 4 / 5);
            Console.WriteLine(4 / 5 * 3);

            int a = 10, b = 20, c;
            Console.WriteLine(c = a + b);
        }
    }
}

 

결과

23
35
2
0
30

 

기본 연산자에 대해서 알아가는 코드이다. ()의 역할에 대해서, =의 순서에 대해서 알 수 있다.

 

17. 산술연산

using System;

namespace A017
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("정수의 계산");
            Console.WriteLine(123 + 45);
            Console.WriteLine(123 - 45);
            Console.WriteLine(123 * 45);
            Console.WriteLine(123 / 45);
            Console.WriteLine(123 % 45);

            Console.WriteLine("\n실수의 계산");
            Console.WriteLine(123.45 + 67.89);
            Console.WriteLine(123.45 - 67.89);
            Console.WriteLine(123.45 * 67.89);
            Console.WriteLine(123.45 / 67.89);
            Console.WriteLine(123.45 % 67.89);
        }
    }
}

 

결과

정수의 계산
168
78
5535
2
33

실수의 계산
191.34
55.56
8381.0205
1.8183826778612462
55.56

 

간단한 사칙연산을 정수 실수값으로 해보는 코드이다.

타 언어와 달리 C#은 실수도 %연산이 된다고 한다. c cpp는 안되는걸 처음 알았다. 쓸일이 없으니...

 

18. DivideByZeroException과 try ~ catch문

using System;

namespace A018
{
    class Program
    {
        static void Main(string[] args)
        {
            int x = 10, y = 0;
            Console.WriteLine(10.0 / y);
            Console.WriteLine(x / y);
        }
    }
}

 

결과


Unhandled exception. System.DivideByZeroException: Attempted to divide by zero.

 

C#에서는 에러를 예외라고 하는 것 같다.

이 코드는 의도적으로 예외를 일으켜보는 코드이다.

 

이때 try  - catch문을 사용하여 예외를 처리할 수 있다

using System;

namespace A018
{
    class Program
    {
        static void Main(string[] args)
        {
            int x = 10, y = 0;
            try
            {
                Console.WriteLine(x / y);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }
}

 

결과

Attempted to divide by zero.

 

19. OverflowException과 checked키워드

using System;

namespace A019
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine($"int.MaxValue = {int.MaxValue}");
            int x = int.MaxValue, y = 0;
            y = x + 10;
            Console.WriteLine($"int.MaxValue + 10 = {y}");
        }
    }
}

 

결과

int.MaxValue = 2147483647
int.MaxValue + 10 = -2147483639

 

int의 최대값에 10을 더한 결과, 오버플로가 일어나 음수로 값이 변경된다.

 

이때 오류를 출력하기 위해서 checked 키워드를 사용한다고 한다

using System;

namespace A019
{
    class Program
    {
        static void Main(string[] args)
        {
            int x = int.MaxValue, y = 0;

            checked
            {
                try
                {
                    y = x + 10;
                }
                catch(Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            }
            Console.WriteLine($"int.MaxValue + 10 = {y}");
        }
    }
}

 

결과

Arithmetic operation resulted in an overflow.
int.MaxValue + 10 = 0

 

이때 checked 키워드는 어떤 역할을 하는가?
try문은 오버플로우를 감지하지 못한다고 한다....

???????

그래서 checked키워드 안에 묻어두면 감지한다고 한다

????????????????

 

진짜 뭐임?

 

20. 관계연산자

using System;

namespace A020
{
    class Program
    {
        static void Main(string[] args)
        {
            bool result;
            int first = 10, second = 20;

            result = (first == second);
            Console.WriteLine($"{first} == {second} : {result}");

            result = (first > second);
            Console.WriteLine($"{first} > {second} : {result}");

            result = (first < second);
            Console.WriteLine($"{first} < {second} : {result}");

            result = (first >= second);
            Console.WriteLine($"{first} >= {second} : {result}");

            result = (first <= second);
            Console.WriteLine($"{first} <= {second} : {result}");

            result = (first != second);
            Console.WriteLine($"{first} != {second} : {result}");
        }
    }
}

 

결과

10 == 20 : False
10 > 20 : False
10 < 20 : True
10 >= 20 : False
10 <= 20 : True
10 != 20 : True

 

간단한 관계 연산자의 연산 결과 bool값을 알아보는 코드이다.

'공부 > C#' 카테고리의 다른 글

C# 공부(5) 51~56 (Part 1 End)  (0) 2024.08.24
C# 공부(4) 41~50  (0) 2024.08.24
C# 공부(3) 31~40  (0) 2024.08.23
C# 공부(2) 21~30  (0) 2024.08.22
C# 공부(1) 1~10  (1) 2024.08.21