인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

luki님의 프로필 이미지

작성한 질문수

홍정모의 따라하며 배우는 C언어

7.2강 char int && getchar putchar 질문

해결된 질문

작성

·

36

1

안녕하세요 교수님. 질문이 있는데,

 

char의 값은 그대로 int로 표현하면 에러없이 정상 작동하는데 char가 int보다 크기가 작은 자료형이고 같은 정수형이라서 자동으로 형변환이 되는거라 제대로 출력이 되는것이고,

 

int값을 char로 표현하면 에러가 뜨는 이유는 같은 정수타입이지만, char의 크기가 작아서 int를 표현하지 못해서 그러는걸까요?

 

그래서 getchar랑 putchar는 int로 받지만, EOF를 사용안할떄 char로 해도 정상작동되는걸까요?

그리고, EOF는 char타입일떈 못쓴다던데 그렇다면 보통 getchar와 putchar는 int변수로 주로 받는건가요? 근데 이러면 1바이트인 char를 못쓰니 손해를 보는편일까요?

답변 2

1

durams님의 프로필 이미지

안녕하세요, 질문&답변 도우미 durams입니다.

char과 int 사이의 변환

charint는 동일한 정수형 타입이라는 범주에 속하지만, 정보를 나타내기 위한 비트의 수가 다르기 때문에 표현 가능한 값의 범위가 다르다는 걸 알고계실겁니다.

  • char -> int : 승격(promotion)으로, 값이 온전히 보전됩니다.

  • int -> char : 값의 범위가 작아지기 때문에, truncation(잘림)이 발생할 수 있습니다.

단순히 int값을 char에 할당한다고 해서 에러가 발생하지는 않습니다만, 질문글만으로는 제가 정확한 상황을 알기에는 어렵네요.


char로 받아도 작동하나요?

네. 단순히 문자 하나를 입력받는 것이 목적이라면 char로 받아도 무방합니다. 하지만 EOF 검사가 필요하다면 반환 타입을 int로 지정하셔야 합니다.

필요에 따라 char 또는 int 중 선택하여 사용하시면 될 것 같습니다.


int로 받는게 char에 비해 손해인가요?

getchar의 경우 단일 문자를 입력받을 목적으로 사용합니다. 이때 int 대신 char를 사용한다고 해도 실제 성능이나 메모리 사용량에 거의 영향을 주지 않습니다. 현대적인 컴퓨터에서는 매우 미미한 차이이며, 실제 속도/공간 면에서의 최적화는 사용하는 알고리듬 등에 따라 좌우되는 경우가 많습니다.

수많은 문자를 입력받는 경우에는 1바이트와 4바이트의 격차가 커지지 않을까 싶을수도 있지만, 문자열을 입력받는 경우에는 getchar가 아닌 fgets 등의 함수를 사용해서 char 포인터를 반환하기 때문에, 크게 신경쓰지 않으셔도 될 것 같습니다.

 

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. luki님.

질문 주신 내용에 대해 답변 드리겠습니다.

  1. char와 int의 호환성: charint보다 크기가 작고, int는 일반적으로 4바이트, char는 1바이트입니다. 따라서 charint로 변환할 때는 데이터가 작아서 문제없이 자동 형변환이 이루어져 정상적으로 작동합니다. 반대로, intchar로 변환하려 하면, char가 1바이트 크기라서 int의 모든 값을 표현할 수 없기 때문에 데이터 손실이 발생할 수 있으며, 이런 경우 종종 예상치 못한 결과가 나옵니다.

  2. getchar와 putchar의 자료형: getchar()putchar()EOF(End of File)를 처리하기 위해 int 타입을 사용합니다. EOF는 일반적으로 -1로 정의되며, 이 값은 char로 표현할 수 없기 때문에 int를 사용합니다. char 변수가 EOF 같은 특수한 값을 표현할 수 없기 때문에, EOF를 처리할 때는 반드시 int로 리턴 값을 받아야 합니다.

  3. char 사용의 손실: getchar()putchar()에서 int를 사용하지만, (1바이트의) 실제 문자 데이터를 처리하는 데는 큰 문제가 없습니다. 기본적으로 문자열이나 문자들을 처리하는 데 있어서는 char 타입을 계속 사용할 수 있으며, EOF 체크 등과 같은 경우에만 int 타입으로 다루면 됩니다. 따라서 성능 손실은 미미하고, 안전한 데이터 처리를 위해 필요한 조치입니다.

관련 내용을 다룬 기존의 질문과 답변을 확인하고 싶으시다면:
- 자료형 확인질문입니다

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

luki님의 프로필 이미지

작성한 질문수

질문하기