형식 변환(type conversion)

킴스코딩클럽·2022년 9월 20일
1

CS기초 시리즈

목록 보기
9/71

타입 변환


타입 변환에는 narrow conversionwide conversion이 존재함

narrow conversion : 8byte에서 4byte타입으로 변환
wide conversion : 4byte에서 8byte타입으로 변환

예를들어,
float 타입에서 int 타입으로 또는
int 타입에서 float 타입으로 변환 시
어떤 방향이 문제일까?
flaot 1.6f 에서 int 1로 변환되는 방향이 문제
값의 손실이 생기는 narrow 타입 변환 에러의 주범

	int conversionInteger = 1;
	std::string conversionString = conversionInteger; 
	// 컴파일 되지 않음 정수형에 문자열형을 배정하려 하는 것은 허용되지 않음
    
    int conversionInteger = 1;
	long long conversionLong = conversionInteger;
	// int형을 long형에 대입 정상적인 컴파일 에러 없음 >> 이것이 형식 변환 
	// int형 (4byte)에서 long형(8byte)로 wide conversion이 일어났음으로 안전하게 변환
  
  	int conversionInteger = 11;
	long long conversionCharacter = conversionInteger;
	// int에서 char형으로 4바이트 에서 1바이트로 큰 곳에서 작은 곳으로 변환 시 값이 잘리게 됨
	// 이러한 변환을 narrow conversion이고 에러의 주범이 되기도 함 
	int x = 1.6; // 1로 저장
    int a = 10;
    int b = 3;
    int c = a/b; //3으로 저장

정수와 실수를 변환할 때 주의 필요. 변환 시 소수점 아래가 모두 잘려 나감
이같은 축소 변환에 의한 에러 발생을 방지하기 위한 방법으로 유니폼 초기화(uniform initialization)을 평소에도 사용해 보자

유니폼 초기화 
int x{}; // 자료형 변수명 {};
초기화 리스트를 사용한 축소 변환 컴파일 타임 에러 방지 예시
int conversionInteger =11;
char conversionCharacter{conversionInteger};  
유니폼 초기화식
int y{1};
int y{1.6}; 
// 에러 double타입은 int로 줄일 수 없습니다 라고 나오며 에러

안전한 코딩을 위해서 유니폼 초기화식을 사용해보자
char{10}; >> 들어감
char{1025}; >> 컴파일 에러 발생 
char{255}; 
//에러 왜? 양수와 음수 부호 >> 127까지

유니폼 초기화 식은 실수를 방지해줌
unsigned char {255} >> 가능 (부호가 없기 때문에)

int value{10/3}; 
// 연산자가 들어있는 익스프레션은 계산 결과로 인식
value{결과}; 
//에러가 나지 않고 실행됨 0.3인데 왜 실행되는가? 원래는 3.3은 들어가지 않음
//가능한 이유는? 타입은 해당 오브젝트가 사용가능한 값 + 적용할 수 있는 연산이라는 조건 때문
//정수/정수 의 사칙연산은 모두 정수로 나옴 그래서 형태가 변환할 필요가 없음
//형태 변환이 필요없는 이유는 연산은 타입에 의해서 정해지기 때문
profile
공부 기록용

0개의 댓글