POCU 강의

4. 형변환과 연산자

차나히 2024. 5. 17. 07:45

묵시적 변환 ( Implicit Conversion )

  • 기본 자료형 간의 변환을 컴파일러가 "알아서" 해줌
    • 모든 기본 자료형 간의 변환이 가능한것은 아니다!
  • 특별한 문법이 따로 필요하지는 않다.
  • 보통 비트수가 작은 변수들은 비트 수가 큰 변수로 묵시적 변환이 가능하다. 반대로, 비트수가 큰 변수는 작은 변수로 묵시적 변환은 불가능하다.
    • 단, int 와 float의 경우에는 좀 다르다. int 를 float 으로 묵시적 변환하게 되면 자료 손실이 일어나게 된다.
    • 이를 정밀도 손실이라고 하며, int/long 에서 float 으로, long 에서 double 로 변환할 때 발생한다.승격 ( Promotion )
  • 컴파일러가 자동으로 실수형이나 부동소수형 자료의 이진 표현을 확장
  • 산술 연산자나 논리 연산자가 제대로 동작하게 하거나 , ALU ( 산술논리장치 ) 가 좀 더 효율적으로 돌 수 있게 하려고 사용!

명시적 형변환

  • 작은 형에서 큰 형으로 변환
    • 예를 들어 32비트에서 64비트 형으로 변환하는것에 문제는 없다!
  • 큰 형에서 작은 형으로 변환
    • 값이 충분히 작으면 문제가 없다!
      • 단, 값이 크다면 당연하게 문제가 발생한다. 런타임 중에 값이 어떻게 될지 예상할 수 없으며 이러한 상황을 정보의 손실이라고 부른다.
    • 그러나 프로그래밍 언어마다 다를 수 있음.
      • C# 에서는 불가능하나, C++ 에서는 가능하다.
  • 해결방법은?
    • 명시적 형변환을 사용!
  • 두 double 형 수를 더하기
    • 소괄호를 이용하여 변하고자 하는 자료형을 보여줄 수 있다.
      • 단, 모든 자료형들이 변환되는것은 아님! ( ex. bool )
  • 명시적 형변환이 중요한 이유는 프로그래머의 의도를 보여주기때문!

연산자

  • 연산자의 종류
    • 하나 이상의 피연산자를 가지며, 연산자의 종류에는 산술연산자, 증감연산자, 대입연산자, 비트연산자, 비트 이동 연산자 로 구성된다.
  • 산술 연산자
    • + 연산자
      • 두 피연산자를 더하기
    • - 연산자
      • 두 피연산자를 빼기
      • 연산의 결과가 음수일 경우 언더플로우를 조심하자.
    • * 연산자
      • 두 피연산자를 곱하기
    • / 연산자
      • 두 피연산자를 나누기
      • 정수형의 피연산자의 경우 결과가 제대로 나오지 않을 수 있음을 주의
    • % 연산자
      • 나눗셈의 나머지를 구하는 연산자
  • 증가/감소 연산자
    • ++ 연산자
      • 피연산자 하나의 값을 1 증가
      • 피연산자 앞에 혹은 뒤에 붙일 수 있다.
    • -- 연산자
      • 피연산자 하나의 값을 1 감소
      • 피연산자 앞에 혹은 뒤에 붙일 수 있다.
    • 추가
      • 앞에 붙이는 연산자를 전위(prefix) , 뒤에 붙이는 연산자를 후위(postfix) 라고 한다.
      • 이러한 방식은 하드웨어의 동작과 관계가 깊은데, 하드웨어에서 사용하는 명령어중 정수형 숫자를 1만큼 증가시키는 명령이 있다. 이 명령과 1대1로 맵핑을 시키는 명령어라고 생각하면, 당연하게도 num = num + 1 의 명령보다 빠르다는 사실을 알 수 있다.