'INT'에 해당되는 글 2건

Programming/C C++
1. Data형

변수를 선언할때는 선언하고자 하는 변수가 어떤 Data를 얼마나 담을 수 있는지에 대한 형을 지정해 줘야 합니다. 이때 C에서 선언할 수 있는 정수와 실수의 Data형으로는 다음과 같은 종류가 있습니다.

 Data형  크기  실 표현 범위
 char  1  -128 ~ 127
 unsigned char  1  0 ~ 255
 int  4  -214783648 ~ 2147483647
 short int (16 bit)  2  -32768 ~ 32767
 long int (32 bit)  4  -214783648 ~ 2147483647
 unsigned int  4  0 ~ 4294967295
▶<1-1> 정수

 Data형  byte  실 표현 범위
 float  4  10-38 ~ 1038 (유효자리수 7자리)
 double  8  10-308 ~ 10308 (유효자리수 15자리)
 long double  -  10-4932 ~ 104932 (유효자리수 19자리)
▶ <1-2>실수

2. unsigned

unsigned는 특정 Data형에서 부호를 나타내는 bit를 수치로 나타내는 bit로 활용하는 것을 말합니다. 예를 들어 Char형 Data는 1byte크기로서 bit로 따지면 8bit가 됩니다.

00000000

그런데 맨앞의 1bit는 부호를 나타내는 bit이므로 실제 수치를 표현하는데 쓸 수 있는 bit는 뒤의 7bit뿐입니다. 이 7bit를 모두 1로 하고

01111111

10진수로 변환하면

127

이 됩니다. 결국 양수든 음수든 최대 127를 이상은 표현하지 못하는 것입니다.

여기서 맨앞의 1bit는 부호를 나타낸다고 하였는데 0일때는 양수, 1일때는 음수가 되므로 모두 1이 되었다고 가정한다면

11111111

-127 이 됩니다. 여기에서 상위 1bit를 부호가 아닌 unsigned를 통하여 수치로 환산하게 되면 255가 되므로 활용할 수 있는 Data형이 그 만큼 커지게 되는 것입니다.

참고:
부호를 나타내지 않을때는 unsigned를 쓴다고 하였는데 반대로 부호를 나타내고자 한다면 signed라고 써야합니다.(다만 생략이 가능한데 이 경우 기본값으로 signed가 사용됩니다.)

또한 unsigned는 Char형 뿐만 아니라 Int나 long형에도 동일하게 적용될 수 있습니다.

참고:
int는 long int와 같으므로 어떤걸 써도 차이는 없습니다. 다만 long int 라고 하기보다 줄여서 int로 하는 경우가 더 많습니다.

3. 수치자체에 Data형 지정하기

정수뒤에 u(U)를 붙이면 unsigned형을 l(L)을 붙이면 long형을 ul(UL)을 붙이면 unsigned long형 정수를 의미하게 됩니다.

12345u;
12345ul;

참고 :
위에서 처럼 u나 l르 반드시 붙여야만 되는 것은 아닙니다.(Compiler가 알아서 처리합니다.) 위 방식은 Program 작성시에 개발자가 눈으로 보기에 어떠한 성격의 Data형인지를 명확히 구분하기 위한 용도로 쓰입니다.

4. 단일 변수의 선언

보통 변수를 선언하는 방법은  'Data형 변수명'형식으로 하게 됩니다.

int a;

이때 같은 Data형일 경우 연속해서 선언할 수도 있습니다.

int a, b;

변수는 선언함과 동시에 초기화 하는 것도 가능합니다.

int a = 10;

정수가 아닌 문자는 문자상수 또는 수치상수를 이용하는 두가지 방법이 있습니다.

#include <stdio.h>

main()
{
  char c;

  c = 65; /* 수치 상수 */
 
  printf("%c\n", c);
 
  c = 'A'; /* 문자 상수 */
 
  printf("%c\n", c);
}



위와 같이 값을 대입하면 문자 'A'를 대입한 것과 같게 됩니다. 수치상수의 경우에는 ASCII값과 대응되어 값에 해당하는 문자가 표시되는 것입니다.

C에서 변수가 선언되면 특정 Memroy공간을 할당하게 되는데 이때 해당 변수에 대해서 초기화를 행하지 않으면 변수는 변수에 확보된 Memory의 Data값을 그대로 가지게 됩니다.

#include <stdio.h>

main()
{
  int i;
 
  printf("%d\n", i);
}


i변수를 선언한뒤 초기화 하지 않은채 i값을 출력하도록 하고 있습니다.


이때 출력되는 값은 i의 실제값이라기 보다는 변수 i가 위치하고 있는 Memroy의 값을 그대로 출력한 것입니다.(단, Static이나 전역변수는 0으로 자동 초기화 되며 배열 변수또한 초기화 하지 않으면 기본값은 0이 됩니다.)

#include <stdio.h>

int j;

main()
{
  static int i;
 
  printf("%d\n", i);
  printf("%d\n", j);
}


Static과 전역변수 확인


#include <stdio.h>

main()
{
  int i[2] = {1};
 
  printf("%d\n", i[0]);
  printf("%d\n", i[1]);
}


배열변수 i의 0번째 요소는 1로 초기화 하지만 1번째 요소는 초기화 하지 않습니다.


5. 배열 변수의 선언

배열은 []를 통해 나타냅니다. 이때 [와 ]사이에 배열의 크기를 지정하게 되는데 이때 배열의 순서는 0부터 시작하게 됩니다.

#include <stdio.h>

main()
{
  int i[2];
 
  i[0] = 123;
  i[1] = 456;
 
  printf("%d\n", i[0]);
  printf("%d\n", i[1]);
}


배열은 [2]라고 지정하여 총 2개 크기의 배열을 선언하였습니다. 두개의 배열이므로 배열의 순서는 0부터 1까지가 됩니다.(2까지가 아님을 주의하십시오. 0부터 2까지가 되려면 배열의 크기는 3이되야 합니다.)

배열의 선언 후 i[0] = 123; 등을 통해 각 요소에 값을 초기화 하고 printf()함수를 통해 배열의 값을 출력하도록 하고 있습니다.


위에서 배열은 i[0] = 123; 으로 i배열 [0]에 123이라는 정수값을 지정하였습니다. 이렇게 일일이 요소를 지정하여 값을 대입하는 대신 배열을 초기화 할 수 있는 별도의 방법을 이용하여 초기화 할 수도 있습니다.

int i[2] = {123, 456}; / * {} 괄호를 사용하여 배열을 초기화 합니다. */

즉 다음과 같이 하여도 결과는 같습니다.

#include <stdio.h>

main()
{
  int i[2] = {123, 456};

  printf("%d\n", i[0]);
  printf("%d\n", i[1]);
}


배열의 크기는 []괄호안에 나타내는데 만일 크기를 지정하기 힘든 경우라면 생략할 수도 있습니다.

int i[] = {123, 456};

이렇게 하게 되면 초기화 하는 값의 크기에 따라 자동으로 배열크기 2가 지정됩니다.

단, 이 생략의 경우 다차원 배열을 선언한 상태라면 가장 처음의 배열크기만 생략할 수 있습니다. 예를 들어

int i[][3] = {
    {1, 2, 3},
    {4, 5, 6}
  };

위와 같은 형태의 생략은 가능하지만

int i[2][] = {
    {1, 2, 3},
    {4, 5, 6}
  };

이렇게 생략하는건 불가능합니다.

지금까지 배열 선언시 1차원으로만 선언하였는데 배열은 필요하다면 다차원으로도 선언할 수도 있습니다.

int i[5][5];

[5][5]를 통하여 int형 변수 i배열을 2차원으로 선언하였습니다.

int i[5][5][5];

[5][5][5]를 통하여 int형 변수 i배열을 3차원으로 선언하였습니다.

이렇게 배열을 다차원으로 선언하면 그 만큼의 배열을 더 확보하게 됩니다. 예를 들어 int i[5][5];라고 했을때

i[0][0] 부터 i[0][4]까지 5개, i[1][0] 부터 i[1][4]까지 5개, i[2][0] 부터 i[2][4]까지 5개, i[31][0] 부터 i[3][4]까지 5개, i[4][0] 부터 i[4][4]까지 5개씩 총 25개의 배열를 확보하게 됩니다.

#include <stdio.h>

main()
{
  int i[5][5];
  i[3][2] = 100;
  i[4][1] = 200;

  printf("%d\n%d\n", i[3][2], i[4][1]);
}



다차원 배열의 초기화 방식도 1차원 배열의 초기화 방식과 크게 다르지 않습니다.

int i[2][3] = {1, 2, 3, 4, 5, 6};

다차원 배열을 초기화 하면 첫번째 첨자에 해당하는 배열부터 먼저 초기화 됩니다.(예를 들면 다음 순서처럼 [0][0]..[0][1]..[0][2]...[1][0]...[1][1]...)

다차원 배열을 초기화 할때는 아래경우 처럼 괄호({})를 중복하면

int i[2][3] = {
    {1, 2, 3},
    {4, 5, 6}
  };

배열초기화에 대한 구조를 좀더 알아보기 쉽도록 할 수 있을 것입니다.

주의:
만일 배열을 통한 Program개발시 배열의 범위를 넘어서는 경우가 있어도 Compiler는 Error를 발생하지 않습니다.

예를 들어

#include <stdio.h>

main()
{
  int i[2];
  i[5] = 100;

  printf("%d\n", i[5]);
}


이와 같은 Program의 경우 i배열크기로 2를 지정해놓고 100이라는 값을 i의 5번째배열에 저장하고 있습니다. 이 상태로 Program을 Compile하고 실행하면


잘 실행됨을 확인할 수 있습니다. 이런경우가 생기는 이유는 i[5]= 100;이라고 했을때 C는 배열의 크기를 고려하지 않은채 i배열의 5번째에 해당하는 Mmemory주소에 100이라는 값을 그대로 집어넣기 때문입니다.

하지만 이는 전혀 예상치 못한 Memory위치에 값을 써넣기 때문에 중대한 오류를 일으킬 수 있는 소지가 다분합니다. 따라서 반드시 배열을 사용할때는 그 크기를 잘 감안하도록 주의해야 합니다.

6. 배열을 이용한 문자열 다루기

문자열은 Char형 배열을 통해 다루게 됩니다. C에서는 문자열을 다루는 Data형은 존재하지 않기 때문에 Char형 Data를 배열화 하여 여러 문자를 결합함으로써 문자열을 표현합니다.

#include <stdio.h>

main()
{
  char s[6];
 
  s[0] = 'h';
  s[1] = 'e';
  s[2] = 'l';
  s[3] = 'l';
  s[4] = 'o';
  s[5] = 0;
 
  printf("%s\n", s);
}



여기서 맨 마지막 배열에 0을 추가한 이유는 C에서 '문자열의 끝은 0으로 표시한다.'라는 규칙이 존재하기 때문입니다. 문자열을 다룰때는 종종 문자열의 끝을 판단할 필요가 있는데 이런 경우 위와 같이 0으로 해당 문자열의 종료를 판단하곤 합니다.

따라서 실제 'hello'라는 문자열을 나타내는 경우 문자수는 5개이지만 문자열 끝을 나타내는 0이 필요하므로 실제 배열을 6개로 해야 합니다.

또한 문자열을 나타내는 문자배열도 일반 배열과 다를바 없으므로 다음과 같이 배열초기화 방법을 그대로 사용할 수 있습니다.

char s[6] = {'h', 'e', 'l', 'l', 'o', \0};

마지막 \0은 문자로서의 0이 아닌 문자열의 종료를 나타내기 위한 숫자 0임을 나타내기 위해서 입니다.

Char형 배열도 int형 배열처럼 다차원일 경우 {}를 통해 같은 방식으로 초기화 할 수 있습니다.

#include <stdio.h>

main()
{
  char s[2][6] = {
    {'h', 'e', 'l', 'l', 'o', '\0'},
    {'k', 'o', 'r', 'e', 'a', '\0'}
  };
 
  printf("%s\n", s[1]);
}



Char형으로 문자를 나타내기 위해서는 수치정수를 사용할 수 있으므로 다음과 같이 하여도 같은 결과를 나타내게 됩니다.

char s[5] = {104, 101, 108, 108, 111, 0};

배열 변수에 문자열을 대입하는 경우라면 문자열자체를 초기화 할 수 있는 방법이 별도로 존재합니다.

char s[6] = "hello";

위와 같이 하면 배열 s에 'hello'라는 문자열과 함께 문자열 종료를 의미하는 0도 같이 초기화 됩니다. 물론 이때에도 배열의 크기는 생략이 가능합니다.

char s[] = "hello";

문자배열도 다른 정수형태의 배열과 Data형만 틀릴뿐 별 차이가 없습니다. 따라서 초기화 할때도 배열의 크기에 맞지 않으면 나머지 부분은 0으로 자동초기화 됩니다.

#include <stdio.h>
main()
{
  char s[6] = "hell";
 
  printf("%s\n", s);
}


앞서 문자열의 끝은 0으로 판단한다고 하였습니다. 결국 s[4]에 0이 초기화 되어서 hell 문자열이 정상적으로 출력되고 있는 것입니다.

다차원 배열의 문자열 초기화 방식도 요소하나하나를 초기화 하는 것과 별반 차이가 없습니다.(단, 1차원 배열에서 문자열 초기화의 경우 {}를 사용하지 않은 것처럼 다차원도 {}를 사용하지 않고 ,만 사용됩니다.)

#include <stdio.h>
main()
{
  char s[2][6] = {
    "hello",
    "korea"
  };
 
  printf("%s\n", s[0]);
}


7. 변수의 이름 지정

변수의 이름은 비교적 자유롭게 작성할 수 있으나 꼭 지켜야할 몇몇 규칙이 존재합니다.

(1) 변수명은 영문대문자, 소문자, 밑줄, 숫자만 사용가능합니다.

(2) 변수명은 반드시 영문자나 밑줄로만 시작해야 합니다. 이때 숫자를 포함하는 변수명은 사용가능하지만 숫자로 변수명을 시작해서는 안됩니다.(숫자로 시작하는 경우 수치를 나타내는 정수로 인식될 수 있기 때문입니다.)

(3) 이름의 길이에는 제한이 없지만 처음부터 31문자 까지만 인식합니다. 즉, 31자를 넘어도 되지만 인식되는 이름은 31자 까지입니다.

(4) 변수명에서 대문자와 소문자는 구분됩니다.

(5) 예약어라는 것이 있습니다. C에서 쓰는 정해진 구문인데 이 예약어는 변수명으로 사용이 불가능 합니다.

auto, break, case, char, const, continue, default, do, double, else, enum, extern, float, for, goto, if, int, long, register, return, short, signed, sizeof, static, struct, switch, typedef, union, unsigned, void, volatile, while

다만 예약어를 포함하고 있는 전혀 새로운 문장의 경우에는 사용이 가능합니다. 예를 들어

autobicycle, doit

등 예약어를 포함한 전혀 다른 문장은 예약어와 충돌하지 않습니다.

8. Data형의 재정의

integer형의 변수선언은 int나 long int로 선언합니다.

int a;
long int a;

하지만 선언하고자 하는 Data형이 너무 길어서 쓰기 불편하거나 나만이 쓰는 다른 이름으로 대체하여 사용하고자 할때는 typedef를 통해 Data형의 이름을 다음과 같이 재정의 할 수 있습니다.

typedef long int l_int;

위와 같이 하면 l_int라고 했을때 long int를 사용한것과 같게 됩니다.

#include <stdio.h>

main()
{
  typedef long int l_int;
 
  l_int i;
 
  i = 100;
 
  printf("%d\n", i);
}



참고:
typedef는 얼핏 치환한다는 개념에서 #define와 비슷합니다만 #define는 전처리과정에서 해당 문자열을 치환할 뿐입니다. 반면 typedef는 Compiler에 의해 치환된다는 차이가 있습니다.

또한 typedef는 변수이외에 구조체등에도 사용할 수 있습니다. 자세한 설명은 다음 글를 참조하기 바랍니다.

[Develop/C, C++] - [C, C++] 구조체

9. const 상수


변수는 값이 변할수 있기 때문에 변수라고 합니다. 하지만 변수선언도 const를 동반하면 변수에 처음 값을 지정한 이후부터는 해당 변수값을 바꿀 수 없도록 할 수 있습니다.

#include <stdio.h>
main()
{
  const int i = 100;
 
  i = 200;
 
  printf("%d\n", i);
}


const를 사용하면 해당 변수의 값은 바꿀 수 없게 되며 만일 값을 바꾸려고 하는 시도가 있을 경우 Compil과정에서 오류를 발생하게 됩니다.


10. size_t

size_t는 가상Data형이라고 부르며 다른Data형과 구분되는 별도의 Data형이 아닌 typedef를 통해 unsigned int형으로 정의되어 있는 Data형입니다.

개인적인 견해로는 크게 쓸일이 없는 형입니다. size_t의 원래 목적은 C가 작동되는 여러 System안에서 같은 int형이라도 Data의 크기에 따라 Program이 틀어지는 문제를 해결하고자 호환성을 유지할 수 있도록 만들어진 것입니다.

하지만 현재에 와서는 큰 의미가 없습니다. 대부분의 Computer가 32bit이고(64bit로 발전해 가고 있는 추세) 또한 범위가 크다/작다를 따질만큼 빈약환 환경이 아니므로 빈번히 사용할 일은 없는듯 합니다.

#include <stdio.h>

main()
{
  printf("%d\n", sizeof(size_t));
  printf("%d\n", sizeof(int));



0 0
Programming/Microsoft SQL Server
1. 숫자(정수)

 데이터형  크기  범위
 Begint  8byte  -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
 Int  4byte  -2,147,483,648 ~ -2,147,483,647
 Tinyint  2byte  0 ~ 255
 Bit  1byte  1, 0, Null
 Smallint  4byte  -32,768 ~ 32,767

2. 실수

(1) 고정형(Decimal, Numeric)
크기및 범위 : Numeric(전체크기, 소수점이하크기)

만일 Numeric(12, 2)라고 한다면 전체가 12자리이고 그 중에서 소수점이 2자리임을 의미합니다. 이때 전체크기가 1~9라면 5 byte, 10~19라면 9 byte, 20~28이라면 13 byte의 크기를 갖게 됩니다. 즉, 전체자리가 위와같이 증가한다면 크기는 4byte씩 늘어나는 것입니다.

또한 사용상 Decimal과 Numeric은 차이가 없습니다.

(2) 부동형실수(Float, Real)
크기및 범위 : Float(숫자)

Float에는 얼마만큼의 숫자가 들어가느냐에 따라 표현가능한 자리수가 달라집니다. 일반적으로 1~24까지 7자리(4 byte), 25~53까지 15자리(8 byte)표현이 가능합니다.

Real은 Float(24)와 같으며 7자리까지만 표현이 가능합니다.

Float과 Real은 상당히 큰 숫자를 다룰 수 있지만 근사치 데이터를 저장하는데, 실수를 다르는 경우 되도록 Decimal을 사용하는 것이 좋습니다.

3. 통화(통화형식은 소수점 이하 4자리수까지로 제한합니다.)

 데이터형  크기  범위
 Money  8byte  -922,337,203,685,477.5808 ~ 922,337,203,685,477.5807
 Smallmoney  4byte  -214,748.3648 ~ 214,748.3647

4. 문자(문자열)

 데이터형  크기  범위
 Char(n) / NChar(n)  입력된 n byte / 입력된 n * 2 byte  8000자 이하 / 4000자 이하
 Varchar(n) / NVarchar(n)  n에 입력된 크기와 상관없이 실제 사용된 만큼  8000자 이하 / 4000자 이하, MAX지정시 2기가 / 1,073,741,823자(단 MAX는 MS SQL 2008버전부터는 사용되지 않습니다.)
 Text / NText  231-1 byte / 230-1 byte  2,147,483,647자 / 1,073,741,823자

Text 나 NText 그리고 Image는 더이상 MS SQL Server에서 지원하지 않을 예정이니 사용하지 말고 대신 VarChar(Max), nVarChar(Max), Varbinary(Max)를 사용하는 것이 좋습니다.

Char는 고정형입니다. 예를 들어 Char(100)이라고 하면 100바이트 크기를 나타냅니다. 'abc'문자열을 저장하는 경우 3바이트만을 필요로 하지만 100중 3만 차지하고 나머지 97바이트는 버려집니다. 반면 VarChar는 가변형식으로서 VarChar(100)을 하더라도 'abc'를 저장할때는 3바이트만을 차지하기 때문에 공간효휼성은 더 좋습니다. 다만 성능은 Char형이 더 우위에 있습니다.

참고:
n으로 시작되는 형식은 유니코드문자용입니다.(대부분의 경우 크기는 n이 없는 형의 * 2 가 되며 저장할 수 있는 크기는 n이 없는 형의 절반입니다.)

5. 날짜형식

 데이터형  크기  범위
 Datetime  8byte  1753-01-01 ~ 9999-12-31(ms단위까지)
 SmallDateTime  4byte  1990-01-01 ~ 2079-06-09(분까지)

참고 :
년도를 4자리로 하지 않고 두자리만 지정시 년도는 다음과 같이 인식됩니다.
00 ~ 49 까지 : 2000년대
50 ~ 99 까지 : 1900년대

6. 이진형식

 데이터형  범위
 Binary(n) / VarBinary(n)  1~8000까지의 이진데이터(n을 생략시 1, cast에서 지정하지 않으면 30을 기본)
 Image  232-1byte(2,147,483,647 byte까지)

7. 시스템 형식

 데이터형  설명
 Cursor  커서
 Sql_Variant  IMAGE, NTEXT, NVARCHAR(MAX), TEXT, TIMESTAMP, VARCHAR(MAX), XML를 제외한 모든 자료형 대체가능
 Table  Table
 TimeStamp  TABLE의 행이 바뀔때마다 바뀌는 고유한 숫자(8 byte)
 Uniqueidentifier  Newid()를 통해 발생되는 고유값으로 16진수로 구성된 각 자리수가 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx형태로 구성되며 IS NULL이나 IS NOT NULL, =, <=, >=, <>, >, < 의 연산자만 허용합니다.
 Xml  Xml

8. 사용자 형식

(1) sp_addtype

sp_addtype 이름, '데이터형', null 여부, '소유자' 의 형태로 씁니다. null여부와 소유자는 생략할 수 있는데 이경우 null허용하게 되며 해당 데이터형은 현재사용자가 소유자가 되는것이 기본입니다.

sp_addtype postal, 'Char(07)';
Go

Declare @ipostal As postal;
Set @ipostal = '780-080';
Select @ipostal;


지정한 사용자 형식을 삭제하는 방법은 다음과 같습니다.

sp_droptype postal;

(2) Create Type

Create Type은 sp_addtype에 비해 소유자를 지정할 수 없을뿐 sp_addtype과 같습니다.
사용형식은 'Create Type 이름 From 데이터형, null 여부'로 구현됩니다.

Create Type postal From Char(07) Not Null;
Go

Declare @ipostal As postal;
Set @ipostal = '780-080'
Select @ipostal;


지정한 사용자 형식을 삭제하는 방법은 다음과 같습니다.

Drop Type postal;


9. ISO 표준 형식


MS SQL Server는 ISO와의 호환을 위해 다음 단어를 해당 형식으로 일치시켰습니다. 따라서 Char대신 Character를 사용할 수 있습니다.


 본래형식

 ISO형식

 Char

 Character

 VarChar

 Character Varying

 Varbinary

 Binary Varying

 Decimal

 Dec

 Float

 Double Precision

 Int

 Integer

 nChar

 National Character

 nVarChar

 National Character Varying

 RowVersion

 Timestamp


2 0
1
블로그 이미지

클리엘