C#에서는 산술,논리,비교 등의 다양한 연산을 할 수 있다. 연산자를 Operator 라 하고 연산의 대상이 되는 피연산자를 Operand 라고 한다.

 

연산을 수학의 개념으로만 알고 있다면 C#의 연산자는 낯설게 느껴질 수 있다. 컴퓨터 안에서의 연산은 수학적 연산과는 다른 부분이 있다.

 

수학은 연산의 결과에 주목되지만 컴퓨터의 연산은 CPU가 하는 모든 행위가 포함된다. 두 변수를 더하는 행위도 연산, 결과값을 변수에 할당하는 것도 연산, 변수의 타입을 변환해도 연산이다. 넓게 정의하면 컴퓨터가 0과 1을 가지고 하는 행위들은 모두 연산이라 볼 수 있다.

 

연산을 기계의 관점에서 바라 본다면 C#의 연산을 더 잘 이해할 수 있을 것이다.

 

이 포스트에서는 간단한 숫자 연산을 한다.

 

이전 포스트의 내용에서 숫자를 다루기 위한 변수를 작성할 때의 자료형에 대하여 알아봤다. 자료형에 따라 취급할 수 있는 숫자가 다르다. 그러므로 숫자의 범위를 알아야 한다.

int 자료형

 

아래 코드와 같이 각 자료형에는 MinValue와 MaxValue가 상수로 정의되어 있다. 출력해보자.

using System;

namespace TypeRange
{
    class Program
    {
        static void Main(string[] args)
        {
            int minInt = int.MinValue;
            int maxInt = int.MaxValue;

            char minChar = char.MinValue;
            char maxChar = char.MaxValue;

            double minDouble = double.MinValue;
            double maxDouble = double.MaxValue;

            decimal minDecimal = decimal.MinValue;
            decimal maxDecimal = decimal.MaxValue;

            short minShort = short.MinValue;
            short maxShort = short.MaxValue;

            byte minByte = byte.MinValue;
            byte maxByte = byte.MaxValue;

            Console.WriteLine($"int type range {minInt} to {maxInt}");
            Console.WriteLine($"char type range {(int)minChar} to {(int)maxChar}");
            Console.WriteLine($"double type range {minDouble} to {maxDouble}");
            Console.WriteLine($"decimal type range {minDecimal} to {maxDecimal}");
            Console.WriteLine($"short type range {minShort} to {maxShort}");          
            Console.WriteLine($"short type range {minByte} to {maxByte}");          
        }
    }
}

각각의 자료형에는 큰 차이가 있다. 보통 정수를 다룰때는 int형을 사용한다.

 

char 형은 WriteLine메소드에서 int 형으로 변환하지 않으면 아스키코드로 출력된다. (아무것도 안나옴)

 

 int형의 경우 System.int32 구조체에 정의되어 있다. int 타입은 아래와 같이 여러가지 방법으로 정의할 수 있다.

using System;

namespace TypeRange
{
    class Program
    {
        static void Main(string[] args)
        {
            int n1 = 1;
            Int32 n2 = 3;
            System.Int32 n3 = 5;
            int n4 = new int();
            n4 = 7;

            Console.WriteLine(n1 + " type : " + n1.GetType());
            Console.WriteLine(n2 + " type : " + n2.GetType());
            Console.WriteLine(n3 + " type : " + n3.GetType());
            Console.WriteLine(n4 + " type : " + n4.GetType());
        }
    }
}

 

결과값

결과값을 보면 모두 System.Int32 타입이다. (부호 있는 정수형) C#은 동일한 과정과 결과를 다르게 표현하는 것을 알 수 있다. C#에서 한가지 결과를 얻기 위해서 다양한 방법이 있다는 것이다.

 

1. 리터럴 사칙연산

 

컴퓨터 언어에서 리터럴이란 그 자체의 본래 뜻을 말한다. 영어의 literally (말 그대로)와 같다. 1,2,3,4,5 ... 이런 숫자값과 "Apple" 같은 문자열은 변하지 않는 그 자체의 속성을 가지고 있다. 변하지 않는 숫자 상수, 문자열 상수이다.

 

쉽게 말해 변수가 아니라 숫자로 연산하면 리터럴 연산이 된다.

 

아래의 코드는 숫자 리터럴의 사칙연산이다. 덧셈 + 뺄셈 - 곱하기 * 나누기 / 연산자가 수학과 다르다는 점에 주의한다.

using System;

namespace Operators
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine($" 3 + 2 = {3 + 2}");
            Console.WriteLine($" 7 - 3 = {7 - 3}");
            Console.WriteLine($" 4 * 9 = {4 * 9}");
            Console.WriteLine($" 8 / 2 = {8 / 2}");
        }
    }
}

리터럴 사칙연산

산수를 하는 것과 같으므로 쉽다. 이번에는 int 형 변수를 만들어서 사칙연산을 해본다.

 

2. 정수형 (int 형) 사칙연산

 

using System;

namespace Operators
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 9;
            int b = 5;

            Console.WriteLine($" a + b = {a + b}");
            Console.WriteLine($" a - b = {a - b}");
            Console.WriteLine($" a * b = {a * b}");
            Console.WriteLine($" a / b = {a / b}");
        }
    }
}

 int 형 사칙연산

숫자가 있던 부분을 int 변수 a와 b로 바꿨을 뿐이다. 이제 두 숫자만 바꾸면 나머지 연산들은 자동으로 된다. 프로그램에서 리터럴 대신 변수를 사용하는 이유이다. 일을 줄여준다.

 

그런데 / 나누기에서 9/5 를 했는데 결과가 1이다. 왜일까? 이것은 정수형 int 의 나누기이기 때문이다. 소수점이나 분수의 값은 정수형에서 표현할 수 없다. 9에서 5를 나눈 몫 1만 저장되고 나머지 4는 버려진다. 때문에 나머지 연산자가 있다. 

 

        static void Main(string[] args)
        {
            int a = 9;
            int b = 5;

            Console.WriteLine($" a + b = {a + b}");
            Console.WriteLine($" a - b = {a - b}");
            Console.WriteLine($" a * b = {a * b}");
            Console.WriteLine($" a / b = {a / b}");
            Console.WriteLine($" a % b = {a % b}");
        }

나머지 연산자는 % 이다. 9 나누기 5의 나머지 4를 표시한다.

 

위의 연산은 다른 정수 자료형인 byte, short, long 등의 변수들에게도 똑같이 적용할 수 있다. 당연히 연산은 정수의 범위안에서 이루어져야 한다. C#을 확인해 보니 byte 등 몇 자료형에서는 overflow 시 컴파일 자체가 안됬다. 단 int 형은 오버플로우를 허용한다.

공유하기

facebook twitter kakaoTalk kakaostory naver band