본문 바로가기
C │ C++ │ C#/C++

C++ Chapter 4.4 : auto와 자료형 추론, 형변환

by Pokaa 2023. 8. 19.
728x90
728x90
SMALL
자료형을 추론해주는 auto
auto a = 123;
auto a; // 오류 ! ! !

auto add (int x, int y)
{
	return x + y;
}



auto result = add(1, 2);
  •  auto a = 123; 
    ο 초기화되는 값 123으로 인해 a가 int라는 것을 추론할 수 있다.
    ο a는 int가 됨
  •  auto a; 
    ο 오류 ! ! a 가 어떤 데이터 타입인지 추론할 수 없다.
  •  auto add $($int x, int y$)$ 
    ο 함수 리턴타입에도 auto를 쓸 수 있다.
    ο return x + y; 에서 리턴 값의 데이터 타입이 int라는 것을 추론할 수 있기 때문에
    ο 파라미터는 auto로 불가능! 컴파일 타임시 자료형 추론이 불가능하니까.
  •  auto result = add$($1, 2$)$; 
    ο add의 리턴 타입은 int이므로 result는 int가 됨

 


리턴 타입이 auto인 함수에 템플릿 사용해보기

auto add(int x, int y) -> int;
auto add(int x, int y) -> double;
  • 템플릿을 사용하여 앞에는 auto로 쓰고 뒤에  -> int;  -> double; 
    ο 가독성 떄문에 이렇게 쓰는 것 ! 입력(파라미터), 출력(리턴타입) 이 한 눈에 들어오게 !

 

 

형 변환


암시적 형변환

  • 컴파일러가 알아서 형 변환
    ο int a = 12. 3
        ■ double인 12.3 을 int 변수  에 대입하니
        ■ 12.3을 int인 12로 강제 형 변환해  에 쑤셔넣음


명시적 형변환

  • 개발자가 직접 형변환


C스타일 형변환

(int)4.0
  • 괄호를 데이터타입에 감싼다


C++ 스타일

int(4.0)
static_cast<int>(4.0)
  • 괄호를 형변환할 값에 감쌈
  • 혹은  static_cast<데이터타입>  사용


형 변환시 주의사항

  • 작은 것을 큰 것에 넣으려는건 문제가 없지만 큰 것을 작은 것에 넣을 때는 데이터 손실이 발생해서 엉뚱한 값이 나올 수도 있다.
float f = 0.123456789 // float에 더 큰 double을 넣으니 잘못된 값이 나온다.

 

      ο float은 4byte, double은 8byte.
          ■ double이 정밀도가 더 높다.
      ο 0.123456879는 double 타입으로 float이 표현할 수 있는 정밀도를 넘어섰다.
          ■ 이 때문에 f 를 출력하면 0.123456789 가 아닌 0.123456791043 이 나옴

cout << 5 - 10 //  -5 로 잘 제대로 출력된다.
cout << 5u - 10 // 엉둥한 숫자가 출력된다.

      ο  5u - 10 
          ■ u 는 unsigned int
              ■ 5u는 unsigned int 로서의 5를 뜻한다.
          ■ -5가 아닌 엉뚱한 값이 되는 이유
              ■ 형 변환도 우선순위가 있기 때문에.
                  ■ unsigned int 가 그냥 int 보다 우선순위가 높다 !
                  ■ int < unsigned int < long < unsinge long < … < float < double
              ■ 따라서 형변환을 10에 맞추는 것이 아닌 5u에 맞추게 된다.
                  ■ unsinged int 가 int 보다 형변환 우선순위가 높으므로 !
                  ■ 떄문에 signed int 로서 -5 가 되는 것이 아닌
                  ■ 형변환이 unsigned int 로 되기 떄문에 이상한 값이 나오는 것이다.
                      ■ -5 는 음수라서 unsigned int 범위에 없는 수이므로 !

 

728x90
300x250
LIST