Ch04. 연산자 - 05. 기타 연산자

2025. 3. 30. 17:53Programming Language/C++

반응형

지금까지 확인한 연산자 말고 자주 사용하는 연산자에 대해서 확인해보자.

일단 자바와 다른 점이 있는 연산자에 대해서만 확인해보려고 한다.

 

1. 삼항 연산자 - 조건문 ? true 코드 : false 코드

사실 삼항 연산자의 사용은 자바나 c++이나 동일한듯 보인다.

조건문 ? true일때 실행할 코드 : false일때 실행할 코드

이렇게 되는데 

이걸 사용할때의 주의점이라고 해야할까 

만약 cout을 사용해서 이 결과를 출력한다고 한다면

std::cout << (조건문 ? true일때 실행할 코드 : false일때 실행할 코드);

와 같이 사용하면서 3항 연산의 결과를 출력할 수 있게 되는데 

이런 방식 말고도 

조건문 ? (std::cout << true일때 실행할 코드) : (std::cout << false일때 실행할 코드);

와 같이도 사용할 수 있다.

 

그리고 여기서 추가로 유의 해야할 점은 

std::cout << (조건문 ? true일때 실행할 코드 : false일때 실행할 코드);

이 방식을 사용한다면 true일때 실행할 코드와 false일때 실행할 코드의 결과물의 타입이 동일해야만 한다

std::cout << (조건문 ? 정수 : 문자열);

과 같은 식으로 된다면 cout은 어떤 타입을 기점으로 사용해야 할지 모르기에 에러가 발생한다 

실 사용을 보여준다면

이렇게 피연산자의 형식이 int 와 const char* 타입이 호환되지 않기에 이렇게 사용이 불가능하다고 나온다.

그런데 

이 방식으로는 상관이 없다.

그 이유는 뭘까?

이는 std::cout << 1와 std::cout << "test"을 수행한 결과의 타입이 동일하기 때문이지 전체를 cout으로 받으나 아니냐의 차이 때문은 아니다.

 

2. sizeof 연산 - sizeof(타입) or sizeof 변수

sizeof연산은 타입이나 변수의 메모리 크기(바이트 단위)를 알 수 있게 해주는 컴파일 타임 연산자(컴파일 타임 연산자란, 프로그램이 실행되기 전에 (즉, 컴파일 중에) 결과가 계산되는 연산자 또는 표현식을 의미)이다.

 

sizeof(타입)

sizeof의 타입 연산의 경우 괄호는 필수이다.

이런식으로 사용하고

결과는 이렇게 바이트 값이 출력된다.

타입을 괄호 없이 사용하면 

이렇게 에러를 내니 타입의 경우는 무조건 괄호로 감싸서 사용해줘야 한다.

 

sizeof(변수)

sizeof에 변수를 사용할때는 괄호가 필수는 아니다.

물론 괄호를 사용해도 문제는 없다.

 

3. 범위연산자 - ::

범위 연산자는 특정 범위 내에 있는 무언가를 호출하기 위해서 사용된다.

보통 사용 방법은 

namespace명::식별자
class명::정적멤버

과 같은 방식으로 사용되고 이는 특정 namespace에 존재하는 식별자를 호출하거나 특정 class에 들어 있는 정적 멤버를 가져올때 사용한다 

 

우리가 기존에 

이런식으로 std에 들어 있는 cout을 가져와서 사용하겠다라고 하는것과 같이 사용이 가능하다.

추가로 기존에 

이렇게 사용하던 것도 

이렇게 ios_base라는 클래스에 있는 값을 사용하겠다는 것이라고 보면 된다.

 

추가로 ::는 앞에 어떠한 내용도 없이 단독적으로도 사용이 가능한데 이걸 사용하는 경우가 있는데 

만약 위와 같이 전역변수 n이 존재하고 main함수 내부에 지역변수 n이 존재한다면 출력하려는 n은 무엇을 지칭하는 것일까?

지역변수를 우선순위를 더 높게 보고 사용하게 된다.

이 때 만약 전역변수를 보고 싶다면 앞에 추가적인 내용 없는 :: 연산자를 붙여주면

이렇게 전역 변수를 바라볼 수 있도록 만들 수도 있다.

물론 지역변수가 없는 경우에는 그냥 사용하면 

전역변수를 바라보게 된다.

 

4. 형변환 연산자 

형변환 연산자 이전에 형변환에 대해서 확인해보자면 형 변환은 암시적 형변환과 명시적 형변환이 존재한다.

 

암시적 형변환(Implicit Conversion)의 경우는 컴파일러가 자동으로 해주는 형변환으로 따로 형변환을 명시하지 않아도 컴파일러가 변환해준다.

이렇게 해도 문제 없이 컴파일이 되긴한다 그런데 출력을 보면 

이런식으로 double형인 1.1을 float에 넣으면서 데이터가 소실 될 수 있다고 알리고 있다.

 

이 의미는 무엇일까

예를 들어 short 타입에 int를 넣는다고 생각해보자.

이렇게 short 변수에 int의 최대값을 넣는다고 했을때 int의 최대 값은 

// int의 최대값 
0111111 11111111 11111111 11111111

** unsigned int의 최대값이 
1111111 11111111 11111111 11111111
이니 헷갈리지 말자

이 될텐데 이걸 short에 넣는다면 앞에서 부터 잘라서 결국 short에 들어가는 값은 shot의 크기인

2바이트에 들어가게 되면서

11111111 11111111

가 된다.

 

근데 short는 부호가 있는 값이기 때문에 이 값은 결국

11111111 11111111
        ↓
00000000 00000000
        ↓
00000000 00000001

이니 -1이 됨을 알 수 있다.

이런 경우를 조심해야만 한다

 

명시적 형변환의 경우는 사용자가 의도를 가지고 직접 형변환을 하는 것을 의미한다.

명시적 형변환은 변환하고자 하는 값의 앞에 괄호 안에 타입정보를 넣어주는 것으로 사용이 가능하다

- (타입)변수
- (타입)값
- 타입(변수)
- 타입(값)

ex)
(int)pow(2, 1);

int('c');

우리가 명시적 형변환을 사용한 경우는 문자의 아스키 코드 값을 확인하고 싶을때

같은 경우에 사용을 했었다.

여기서 형변환의 방식은

이렇게 방식이 두가지가 있다.

 

그런데 c++에서는 이렇게 형변환하는 것은 위험하다고 판단하여 형변환을 하는 방식을 4가지를 제안했다.

static_cast<타입>(값)
const_cast<타입>(값)
dynamic_cast<타입>(값)
reinterpret_cast<타입>(값)

이에 대해서는 구체적으로 일단 설명하지 않고 넘어 갔기에 나도 그냥 존재한다는 것만 알고 넘어가도록 할것이다.

 

반응형