맨위로가기

Char

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

char는 프로그래밍 언어에서 문자를 표현하는 데 사용되는 데이터 형식이다. 주로 ASCII 코드를 기반으로 하며, 8비트 크기를 가진다. char 변수는 문자열을 저장하는 데 사용되는 char 배열의 형태로 사용될 수 있으며, 정수형으로 처리되어 숫자 연산에도 활용될 수 있다. char는 부호 있는(signed char) 또는 부호 없는(unsigned char) 형태로 사용될 수 있으며, 각 형식에 따라 표현할 수 있는 숫자 범위가 다르다. char 변수에 대한 비트 단위의 쉬프트 연산도 가능하다. char 배열은 문자열 처리에 사용되며, C 문자열은 널(NULL) 문자로 문자열의 끝을 표시한다. char 포인터는 char 변수의 주소를 저장하고, 이를 통해 데이터에 접근할 수 있게 해준다.

더 읽어볼만한 페이지

  • C 프로그래밍 언어 - C (프로그래밍 언어)
    C는 하드웨어 제어와 이식성이 뛰어난 고급 절차적 프로그래밍 언어로서, 다양한 분야에서 사용되며 후속 언어에 영향을 주었고, 성능과 효율성이 높지만 안전성 문제 개선이 필요한 언어이다.
  • C 프로그래밍 언어 - 헤더 파일
    헤더 파일은 프로그래밍 언어에서 코드 재사용성, 모듈화, 컴파일 시간 단축에 기여하며 함수 프로토타입, 변수 선언 등을 포함하고 `#include` 지시어로 소스 코드에 포함되어 사용되는 파일이다.
  • 자료형 - 참조
    참조는 프로그래밍에서 메모리 주소나 다른 데이터를 가리키는 값으로, 데이터의 효율적인 전달과 공유를 위해 사용되며, 포인터, 파일 핸들, URL 등이 그 예시이다.
  • 자료형 - 익명 함수
    익명 함수는 이름이 없는 함수로, 람다 추상, 람다 함수, 람다 표현식, 화살표 함수 등으로 불리며, 함수형 프로그래밍 언어에서 람다식 형태로 많이 사용되고 고차 함수의 인수, 클로저, 커링 등에 활용되지만, 재귀 호출의 어려움이나 기능 제한과 같은 단점도 존재한다.
  • 빈 문단이 포함된 문서 - 광주고등법원
    광주고등법원은 1952년에 설치되어 광주광역시, 전라남도, 전북특별자치도, 제주특별자치도를 관할하며, 제주와 전주에 원외재판부를 두고 있다.
  • 빈 문단이 포함된 문서 - 1502년
    1502년은 율리우스력으로 수요일에 시작하는 평년으로, 이사벨 1세의 이슬람교 금지 칙령 발표, 콜럼버스의 중앙아메리카 해안 탐험, 바스쿠 다 가마의 인도 상관 설립, 크리미아 칸국의 킵차크 칸국 멸망, 비텐베르크 대학교 설립, 최초의 아프리카 노예들의 신대륙 도착 등의 주요 사건이 있었다.
Char
'문자 (자료형)'
용량1 바이트 (8 비트)
표현 가능 값-128 ~ 127 또는 0 ~ 255 (부호 없는 경우)
사용 예시영문자, 숫자, 특수 문자 등 ASCII 문자
설명C 언어에서 작은따옴표('')로 묶인 단일 문자를 나타내는 자료형.
정수형으로 취급될 수 있으며, 문자에 해당하는 ASCII 코드 값을 저장.
주의사항문자열 (문자의 배열) 과는 다름. 문자열은 큰따옴표("")로 묶어 표현.
유니코드 문자를 표현하기 위해서는 `wchar_t` 와 같은 다른 자료형을 사용해야 함.

2. 선언

`char` 변수는 문자와 숫자를 저장할 수 있다. ASCII 문자는 8비트이므로 `char` 변수에 저장할 수 있으며, 문자열(string)은 `char` 배열로 표현한다.

```c

char chr;

chr = '2';

char ch = 'A';

2. 1. 한글 처리

한글은 KS X 1001, 유니코드 등 16비트 코드로 표현되므로 `char` 변수에 직접 저장할 수 없다.

```c

char name = '홍'; // compile error

```

위와 같은 경우 컴파일러에서 오류를 발생시켜 실행 파일을 만들 수 없다. 따라서 한글은 한 글자라도 다음과 같은 배열 형태로 사용해야 한다.

```c

char chan[] = "홍";

```

이 경우 한글 한 글자 '홍'은 2바이트이고, 문자열의 마지막을 알리는 0을 포함하여 3바이트 이상의 배열이 필요하다.

2. 2. 정수형 처리

`char`는 숫자를 치환하거나 계산하는 데 사용할 수 있다. 정수형에는 부호가 있는 경우와 없는 경우가 있으므로, `unsigned` 키워드를 함께 사용하여 구분할 수 있다.



char cnum;

cnum = 10;

unsigned char unum = 255;

unum -= 3;


2. 3. 예제

c

#include

#include

// 영문자 중 대문자를 소문자로 변환하는 함수

char convLowerAplha(char ech)

{

if (ech >= 'A' && ech <= 'Z') {

ech -= 'A';

ech += 'a';

}

return ech;

}

char gStr[256];

int main(int argc, char**argv)

{

char *pstr;

pstr = gStr;

strcpy(pstr, "Hello");

while (*pstr) {

  • pstr = convLowerAplha(*pstr);

pstr++;

}

printf("%s\n", gStr);

return 0;

}

```

위 코드는 영문 대문자를 소문자로 변환하는 예제이다. `convLowerAplha` 함수는 입력된 문자 `ech`가 'A'와 'Z' 사이의 대문자인 경우, 'A'를 빼고 'a'를 더하여 소문자로 변환한다. `main` 함수에서는 "Hello" 문자열을 `gStr`에 복사한 후, `convLowerAplha` 함수를 사용하여 각 문자를 소문자로 변환하고 결과를 출력한다.

```c

#include

int main(int argc, char**argv)

{

char temp = -3;

if (temp < 0)

printf("지금 온도는 영하 %d도 입니다.\n", temp);

else

printf("지금 온도는 영상 %d도 입니다.\n", temp);

return 0;

}

```

위 코드는 `char`형 변수를 사용하여 정수형 숫자를 처리하는 예제이다. `temp` 변수에 -3을 저장하고, `if`문을 사용하여 `temp`가 0보다 작은지(영하인지) 확인하여 결과를 출력한다.

```c

#include

#include

#include

#define SZ_RANDNUM 100

unsigned char gRandNum[SZ_RANDNUM];

int main(int argc, char**argv)

{

int cnt;

int sum;

srand( (unsigned int) time(NULL));

for (cnt = 0;cnt < SZ_RANDNUM;cnt++)

gRandNum[cnt] = (unsigned char) (rand() % 100);

for (cnt = 0, sum = 0;cnt < SZ_RANDNUM;cnt++)

sum += (int) gRandNum[cnt];

printf("랜덤의 평균값은 %d 입니다.\n", sum / SZ_RANDNUM);

return 0;

}

```

위 코드는 `unsigned char`형 변수를 사용하여 부호 없는 숫자를 처리하는 예제이다. 0부터 99 사이의 난수 100개를 생성하여 `gRandNum` 배열에 저장하고, 이 값들의 평균을 계산하여 출력한다. C 표준 라이브러리의 `rand()` 함수는 난수를 생성하며, `srand()` 함수는 난수 발생기의 초기값을 설정한다.

3. 숫자 범위

`char` 변수는 8비트 정수형으로, 부호 여부에 따라 표현할 수 있는 숫자의 범위가 달라진다. 기본적으로 `char`는 부호 있는(signed) 형태로, 2의 보수 체계를 사용하여 -128부터 127까지의 값을 표현한다. 음수가 필요 없는 경우에는 `unsigned char`를 사용하여 0부터 255까지의 값을 표현할 수 있다.

3. 1. signed char

부호 있는 `char`는 2의 보수 체계를 사용하여 -128부터 127까지의 값을 표현한다. `char` 변수는 이진수로 다음과 같이 나타낼 수 있다.

10진수2진수
1270111 1111
1260111 1110
1250111 1101
......
10000 0001
00000 0000
-11111 1111
......
-1271000 0001
-1281000 0000



+127의 2의 보수는 -127이 된다. 반대로 -127의 2의 보수는 +127이 된다. 그러나 -128의 2의 보수는 +128이 되어야 하는데 `char` 변수의 범위를 벗어나므로 취급할 수 없다.

3. 2. unsigned char

음수가 필요 없을 경우 `unsigned`를 사용한다.

```c

unsigned char cnum;

```

위와 같이 선언된 변수는 8비트 2진수 체계를 사용한다. 따라서 0부터 255까지의 십진수를 이진수로 나타낼 수 있다.

10진수2진수
2551111 1111
2541111 1110
2531111 1101
......
10000 0001
00000 0000


4. 쉬프트 연산자

`char` 자료형 변수에 대한 쉬프트 연산은 비트 단위로 값을 이동시킨다.


  • 왼쪽 쉬프트(`<<`): 부호를 고려하지 않고 최하위 비트(LSB)에 0을 채운다. 이 과정에서 양수가 음수가 될 수도 있다.
  • 오른쪽 쉬프트(`>>`):
  • `signed char`: 부호 비트(MSB)가 유지된다.
  • `unsigned char`: 최상위 비트(MSB)에 0을 채워넣는다.


다음은 `char` 자료형에 대한 쉬프트 연산 예시이다.

```cpp

char c = -128;

printf("c = %d [0x%02x]\n", c, c&0xFF );

c >>= 1;

printf("c >>= 1: %d [0x%02x]\n", c, c&0xFF );

c = -128;

c <<= 1;

printf("-128 <<= 1: %d [0x%02x]\n", c, c&0xFF );

c = 32;

c <<= 2;

printf("32 <<= 2: %d [0x%02x]\n", c, c&0xFF );

unsigned char d = -128;

unsigned char e = d << 1;

printf("unsigned [%d, 0x%x] <<= 1 ==> %d [0x%02x]\n", d, d, e, e );

e = d >> 1;

printf("unsigned [%d, 0x%x] >>= 1 ==> %d [0x%02x]\n", d, d, e, e );

```
실행 결과:```text

c = -128 [0x80]

c >>= 1: -64 [0xc0]

  • 128 <<= 1: 0 [0x00]

32 <<= 2: -128 [0x80]

unsigned [128, 0x80] <<= 1 ==> 0 [0x00]

unsigned [128, 0x80] >>= 1 ==> 64 [0x40]

5. char 배열

`char` 배열은 메모리에 연속적으로 나열된 구조이며, 문자열 처리에 사용된다.

8비트 정수형 배열의 예는 다음과 같다.

```c

char temp[100];

char cnt;

for (cnt = 0; cnt < 100; cnt++)

temp[cnt] = cnt+1;

```

C 언어|C영어에서 `char` 배열은 문자열을 저장하는 데 사용될 수 있다. C 문자열은 ASCII 코드와 같은 문자 코드로 구성되며, 문자열의 끝을 표시하기 위해 마지막에 0(NULL)을 추가한다. 예를 들어 "kim"은 ASCII 문자 3개와 끝을 알리는 0을 합쳐 4바이트로 구성된다. 따라서 문자열을 배열에 저장하려면 4바이트 이상의 공간이 필요하다.

배열의 정해진 공간보다 큰 영역에 액세스할 수는 있지만, 이는 변수 배치에 따라 다른 변수에 접근하는 결과를 낳을 수 있다. 따라서 개발자는 범위를 넘지 않도록 주의하여 프로그래밍해야 한다.

5. 1. 초기화

배열의 초기치는 일반적인 배열의 규칙을 따른다.

```c

char temp[100] = { -10, 2, 'k', 20, 0 }; // 배열의 크기와 초기치의 크기가 다른 경우

char temp[] = { 'k', 'i', 'm', 0 }; // 배열의 크기를 초기치로부터 규정하는 경우

char temp[] = "kim";

char temp[] = { "홍", 'k',0 }; // 이런경우 배열이 1차원이기 때문에 불가능

char temp[][10] = { "홍", { 'k',0 }, { 'h',0 }, {'p', 0 } };

```

C 언어|C영어에서, `char` 배열은 문자열을 저장하는 데 사용될 수 있다. `char` 배열은 일반적인 배열 초기화 규칙을 따르며, 문자열 리터럴을 사용하여 초기화할 수도 있다. 위 코드는 다양한 `char` 배열 초기화 방법을 보여준다.

5. 2. C 문자열 (String)

C 문자열은 문자를 표기하는 ASCII 코드와 같은 문자 코드로 구성되며, 문자열의 끝을 표시하기 위해 마지막에 0(NULL)을 추가한다. 예를 들어 "kim"은 ASCII 문자 3개와 끝을 알리는 0을 합쳐 4바이트로 구성된다. 따라서 문자열을 배열에 저장하려면 4바이트 이상의 공간이 필요하다.

배열의 정해진 공간보다 큰 영역에 액세스할 수는 있지만, 이는 변수 배치에 따라 다른 변수에 접근하는 결과를 낳을 수 있다. 따라서 개발자는 범위를 넘지 않도록 주의하여 프로그래밍해야 한다.

6. 포인터

`char` 포인터 변수는 `char` 변수 처리 단위로 동작하며, 처리 대상 데이터의 위치인 주소값을 먼저 설정해야 한다. 포인터 변수는 데이터를 처리하기 전에 우선 주소값을 먼저 설정해야 한다.

```c

char buffer[256];

char *pstr; // 변수의 주소값이 없으므로 초기에 어떤 값이 들어 있을 지 알 수 없다.

pstr = buffer; // 포인터 변수에 처리 대상의 다른 변수 주소를 저장한다.


  • pstr++ = 'a'; // 한 바이트 단위로 문자를 처리한다.
  • pstr++ = 0x30;
  • pstr = 0;

printf("%s\n", buffer);

```

포인터 변수의 주소값을 `NULL`값으로 설정하면 설정된 주소값이 없음을 나타낸다. 컴퓨터 CPU의 메모리 주소 0번지는 응용 프로그램에서는 사용하지 않기 때문이다. 즉, 응용 프로그램에서 프로세서가 동작할 때, 변수 영역의 시작 주소가 0이 아닌 영역으로 정해진다. 주소 영역은 개발 도구나 CPU 환경에 따라 다르다.

```c

#include

#include

char *search_list(char *pname);

char *names[] = { "Kim", "Park", NULL };

int main()

{

char *pstr = NULL; // 처리 대상의 변수 주소값이 없음.

char buff[256];

printf("이름 > "); scanf("%s", buff);

pstr = search_list(buff);

if (pstr == NULL)

printf("%s - 리스트에 없음.\n", "Kim");

else

printf("%s\n", pstr);

return 0;

}

char *search_list(char *pname)

{

int c;

for (c = 0;names[c];c++) {

if (! strcmp(pname, names[c]))

return names[c];

}

return NULL;

}

7. struct에서의 사용

C/C++에서 `char`는 일반적으로 8비트 정수형으로 사용되며, 주로 ASCII 문자를 표현하는 데 사용된다. `struct` 내에서 `char`는 문자열 또는 문자 데이터를 저장하는 멤버로 활용될 수 있다.

예시:

```cpp

struct Person {

char name[50]; // 이름을 저장하는 문자 배열

char gender; // 성별을 나타내는 문자 (M/F)

int age; // 나이를 저장하는 정수

};

```

위 예시에서 `name` 멤버는 최대 49자의 문자열을 저장할 수 있는 `char` 배열이고, `gender` 멤버는 한 문자를 저장하는 `char` 변수이다.



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com