Front-end Developer

0%

변수, 기본 자료형

변수

  • 변할 수 있는 값
  • 숫자, 문자, 문자열 등을 사용할 수 있다.
  • 문자는 작은따옴표(‘’), 문자열은 큰따옴표(“”)를 사용해야 한다.
  • 어딘 가에 저장한 값을 다시 재사용하기 위해서 사용한다. (상태변화를 기억)
  • 변수명은 의미있게 지어야 한다.
    • 명사로 정확하게 어떤 정보를 담는지 알려주는 단어를 사용한다.
    • 여러 명사가 들어갈 경우 카멜케이스를 사용한다.

코딩 표준

변수 상수
단일 명사 이름 명사 소문자 명사 대문자
복수 명사 이름 카멜케이스 (e.g. mathScore) 대문자로 이루어진 스네이크 케이스(e.g. MATH_SCORE)

기본 자료형

자료형 이름 자료형 크기
byte 8bit 정수
char 16bit 문자
short 16bit 정수
int 32bit 정수
long 64bit 정수
float 32bit 실수
double 64bit 실수

컴퓨터가 이해할 수 있는 가장 자연스러운 형태의 데이터

  • int, float가 가장 많이 쓰이고, 필요에 따라 다른 자료형을 사용한다.
  • 숫자(컴퓨터는 0과 1을 사용해서 표현해야 이해할 수 있다.)
  • 10진수(0~9 10개의 수)
  • 2진수 (0~1 2개의 수)

비트(bit): 2진수의 최소단위. 1 또는 0을 하나만 담을 수 있다. 비트수에 따라 몇 가지 수를 표현할 수 있느냐를 알 수 있다. (bit가 한개면 두 가지 숫자, 두 개면 네 가지 숫자 표현 가능)

  • 8bit = 1byte
  • 1024 bit = 1KB
  • 1024KB = 1MB

정수형

  • 0,1,2와 같은 정수(자연수)를 담을 수 있는 자료형
  • C#에서 각 자료형의 크기(프로그래밍 언어마다 크기는 다름)
    | 자료형 이름 | 자료형 크기 |표현할 수 있는 숫자|
    | ———— | ————— |———|
    | byte | 8bit |28(256개)|
    | short | 16bit |216(65,536개)|
    |int|32bit|232(4,294,967,296개)|
    |long|64bit|264(18,446,744,073,709,551,616개)|

부동소수점형

  • 3.14와 같은 실수를 담을 수 있는 자료형
  • C#에서 각 자료형의 크기(프로그래밍 언어마다 크기는 다름)
    | 자료형 이름 | 자료형 크기 |
    | ———— | ————— |
    |float|32bit|
    |double|64bit|

실수인데 실수형이라고 부르지 않고 부동소수점형이라 부르는 이유는?
컴퓨터에서 숫자를 표현할 때 0.01을 1 * 10-2라고 표현하는데 지수의 숫자에 따라 0.01과 같은 숫자의 소수점이 움직이게 된다. 그래서 고정되지 않고 움직인다는 의미에서 부동소수점형이라 부른다.

문자형

  • 하나의 문자를 담는 자료형
  • 알파벳, 숫자, 특수문자 등
  • 문자는 작은 따옴표(‘)를 사용한다. e.g. ‘a’
  • 자료형 이름은 char이고, 16bit이다.
  • C#에서 char는 유니코드이고, C/C++은 ASCII코드(8bit)이다.

불리언형

  • 정수형이라고 볼 수도 있다.(C++과 같은 일부 언어는 false를 0, ture를 0이 아닌 값으로 표현할 수 있다. 하지만 C#에서는 불가능하다.)
  • 참(ture)/거짓(false)을 표현한다.
  • bool

기본 자료형으로 선언한 변수

1
2
3
4
5
6
7
8
int int1 = 1;

//(뒤에 붙는 f는 float형의 값을 대입할 때 사용. 3.14를 의미)
float float1 = 3.14f;
//(뒤에 f 안붙음.)
double double1 = 5.245;

char char1 = 'a';

각 자료형마다 비트 수가 다른 이유는? byte와 int는 어떤 차이가 있을까?

컴퓨터처럼 생각해본다. 컴퓨터는 2진수로 생각한다. 10진수는 0~9까지 담을 수 있다. 9 다음 오는 숫자인 10의 일의 자리 숫자는 무엇인가? 0이다. 받아올림되었기 때문이다. 2진수도 마찬가지다. 2진수는 더 이상 올라갈 수 없을 때 10진수처럼 옆으로 한자리씩 올라간다. 이 자릿수 하나하나가 비트다.

2비트수

한 개의 비트로는 2개의 수(0,1)을 표현할 수 있고, 두 개의 비트로는 4개(0~3), 세개의 비트로는 8개(0~7)개가 표현 가능하다


음수 표현법

7 0
최상위 비트 최하위 비트

1byte는 8bit. byte는 총 256개의 숫자를 표현할 수 있다. 음수, 양수를 반반으로 배분하면 좋은데 0 때문에 값이 정확하게 반반이 될 수 없다. 그래서 범위를 정한다. 0을 기준으로 양수는 [1, 127], 음수는 [-128, -1]로 정해서 적용한다. 그런데 비트가 하나씩 증가할 때마다 표현 가능한 수는 두 배씩 증가한다. 여기서는 반으로 나누겠다고 했고 반은 두배의 반대개념이다. 그리고 127을 이진수로 나타내면 아래와 같다.

7 0
최상위 비트 최하위 비트
양수 0 1 1 1 1 1 1 1
음수 1 0 0 0 0 0 0 0

이미 7비트를 양수가 다 가져갔기 때문에 그 다음 음수를 쓰려면 bit 첫 글자를 1로 쓸 수 밖에 없다. 최상위 비트를 이용하여 이 값이 0이면 양수, 1이면 음수

  • 양수: 0000 0001 ~ 0111 1111
  • 0: 0000 0000
  • 음수: 1000 0000 ~ 1111 1111

  • 부호 있는 자료형: 음수, 양수를 모두 표현(sbyte, short, int, long)
  • 부호 없는 자료형: 양수만 표현, 보통 부호 없는 자료형 이름 앞에 u를 붙인다.(byte, ushort, uint, ulong)
    • 문자를 담는 8bit 문자형은 기본적으로 unsigned가 말이 된다. 따라서 C#에서 byte는 unsigned, sbyte는 음수, 양수를 모두 담는 signed를 의미한다.
부호 있는 자료형 부호 없는 자료형
음수, 양수를 모두 표현 양수만 표현 (보통 u가 자료형 앞에 붙음)
자료형 sbyte (-128 ~ 127) byte (0 ~ 255)
short (-32,768 ~ 23,767) ushort (0 ~ 65,535)
int (-2,147,483,648 ~ 2,147,483,647 ) uint (0 ~ 4,294,967,295)
long (-9,223,372,036,854,775,808 ~ 9,233,372,036,854,775,807) ulong (0 ~ 18,446,744,073,709,551,615)

부호 있는, 또는 부호 없는 변수는 언제쓰는가?

프로그래머의 명백한 의도를 보여줄 때

예를 들어 int age = 17;과 같은 변수가 있을 때, 부호 있는 자료형 int를 썼다. 프로그램상 int를 사용해서 나이를 처리하는 코드를 만들었는데, 상식적으로 나이는 음수가 될 수 없지만 프로그램 상 처리과정에서 음수가 들어온다면 버그가 발생하는 등 문제가 있을 수 있다. 이럴 때 음수값이 들어오지 않도록 예외처리를 해줄 수 있지만 uint age = 17;과 같이 음수를 받을 수 없는 자료형을 사용하면 음수가 들어올 수 없도록 처리할 수 있다.

uint(0 ~ 4,294,967,295)의 범위를 넘어서는 코드는 어떤 값을 출력할까?

1
2
3
4
5
uint num1 = 4294967295;
uint num2 = 1;
unit result = num1 + num2;

Console.WriteLiner(result);

위의 코드에서 result는 0이 나오게 된다. num1의 숫자 4294967295는 부호없는 정수의 최대값이므로 이를 2진수로 나타내면 1111이 연속된 형태의 숫자이고, 여기에 1을 더하는 것이므로 결과는 10000000...과 같은 형태가 나오게 된다. 그런데 unit는 32bit이고, 이미 num1이 32bit의 최대값이었으므로 여기에 1을 더하면 33bit가 된다. 하지만 unit의 최대 저장공간이 32bit였기 때문에 33bit가 되는 최상위비트 1은 버려지게 된다. 그래서 0만 남게 되어서 결과값이 0이 출력되는 것이다. 이와 같은 현상을 오버플로우라 한다.

오버플로우

  • 위의 예시처럼 연산의 결과로 자료형보다 큰 수가 나온다.
  • 자료형의 크기는 변하지 않기 때문에 자료형의 범위를 넘어간 비트는 버리게 된다.
  • 오버플로우가 발생하면 위의 예시에서 0이라는 결과가 출력된 것처럼 원치않는 값을 얻을 수 있다.
  • 언더플로우: 오버플로우와 반대개념이다. 예를 들어 최소값(최하위비트) 0에서 -1로 가면 uint일 경우 표현할 수 없으니까 최대값으로 표현되는 현상이 발생한다.

변수의 역할에 알맞은 자료형을 선택해야 한다.
오버플로우를 고려해서 내가 쓰고 있는 자료형이 데이터를 충분히 담을 수 있는지 고려해야 한다.

상수의 접두사와 접미사

상수의 앞이나 뒤에 상수를 꾸미는 기호

상수 접두사

상수 앞에 붙는 기호로 진법을 나타낸다.

  • 2진수: 0b- e.g. int num1 = 0b10;
  • 16진수: 0x- e.g. int num2 = 0x10;

상수 접미사

상수 뒤에 붙는 기호로 상수의 형을 나타낸다. 대문자로 써도 되지만 거의 안쓰고, 소문자형으로 나타낸다.

  • 부호 여부: -u e.g. int num1 = 10; uint num2 = 10u; uint num3 = 0x10u;
  • long: -l e.g. int num1 = 1l;(컴파일 오류), long num2 = 10l; long num3 = 10lu;(컴파일 오류), ulong num4 = 10lu;
  • float: -f e.g. float num1 = 10.0f; float num2 = 10.0(컴파일 오류)
  • double: -d. 거의 쓰지않음. e.g. double num1 = 10.0; double num2 = 10.0d;

References
실무 프로그래밍 입문(C#)