일반적으로 C에서는 형변환을 할 때
앞에 (바꾸려는 자료형) 원래 변수
이렇게 했지만
이렇게 바꾸는 것은 C언어 스타일의 문법이다.
아무조건 없이 해당 변수를 그냥 변경하는 것이다.
변경할 수 없을 때에도 변경을 시도하니 문제가 생기기 일쑤다.
이러한 형변환은 우리가 무조건 형변환이 된다는 것을 알고 있을 때나 가능하다.
그래서 C++에서는 4가지 형변환 연산자를 제공해준다.
static_cast<>() //1
dynamic_cast<>() //2
const_cast<>() //3
reinterpret_cast<>() //4
1번은 가장 기본적인 캐스트 연산 방법이다.
2.번은 객체지향 언어의 다형성을 이용하여 모호한 타입 캐스팅 오류를 막아준다.
3번은 자료형이 가지고 있는 상수 속성을 제거한다.
4번은 어떠한 포인터 타입끼리도 변환이 가능하다.
하지만 1번이 제일 많이 쓰인다.
예를 들어 설명하자면
int x = 3;
double y = 9.9;
int a = static_cast<int> (y/x);
int b = (int) y/x;
double c = y/x;
차례대로 a,b,c 값을 출력하면
3
3
3.3
또한 명시적으로 형변환하는 것도 있다.
굳이 static_cast를 이용하지 않더라도 가능하다.
사실 이것이 가장 직관적으로 이해하기 쉽다.
int num1 = 65;
double num2 = 12.34;
int num3 = int(num2);
double num4 = double(num1/5);
char ascii = char(num1);
즉, 바꾸고 싶은 자료형 뒤에 괄호를 만들어 바꾸고 싶은 값을 집어넣으면 된다.
num3 ~5 의 출력 결과는 아래와 같다.
12
13
A
21.12.05 업데이트
하지만 변환함수라는 것이 존재한다.
어떠한 타입에 대한 변환함수가 존재한다면 일반적으로 변환될 것같지 않더라도 변환이 가능하다.
만약 12시 30분 15초를 정수형으로 바꾼다면 어떻게 될까?
그렇다면 원래 타입이 <Time>이라고 한다면 Time에 변환함수를 만들어보자
operator 키워드를 써서 만든다.
아래가 기본 형태다.
operator <바꾸길 원하는 타입>()
{
...
}
만약 시간을 정수로 바꾼다면 나는 모조리 초로 바꿔버리고 싶다.
만들어보자
물론 변환함수는 Time 클래스 안에있다.
operator int(){
return hour*3600 + min*60 + sec;
}
주의할 점이 있는데
int와 호환된다는 얘기는 곧 모든 수치형과 호환된다는 말이다.
즉, 암시적 변환이 가능해져 내가 의도하지 않게 작동할 수도 있다.
때문에 우리는 위처럼 변환함수를 쓰는 것보다는
timttoi처럼 명시적 함수를 쓰는 것이 훨씬 안전하다.
'프로그래밍 지식 > C++' 카테고리의 다른 글
C++문법 / Thread, 스레드 - 생성, join, detach (4) | 2021.12.02 |
---|---|
C++ 문법 / 기본 수학 연산 함수 (0) | 2021.12.02 |
C++문법/ 오버로딩, Overloading (0) | 2021.11.30 |
C++문법/ 함수 매개변수에서 * 과 &의 차이 ★★★★★ (0) | 2021.11.30 |
C 문법/ 소스파일부터 실행파일까지, From source To exe (0) | 2021.11.30 |