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

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!


자료형을 추론해주는 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 변수 a 에 대입하니
      • 12.3을 int인 12로 강제 형 변환해 a 에 쑤셔넣음

명시적 형변환

  • 개발자가 직접 형변환

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 범위에 없는 수이므로 !


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Cpp 카테고리 내 다른 글 보러가기

댓글 남기기