SturdyCobble's Study Note

[프로그래밍] 4.3 연산자(3) - 연산자들과 우선순위 본문

휴지통/['19.06-'20.07]프로그래밍101

[프로그래밍] 4.3 연산자(3) - 연산자들과 우선순위

StudyingCobble 2019. 8. 16. 00:19

NOTICE : 독학인 만큼, 잘못된 내용이 있을 수 있습니다. 내용 지적은 언제나 환영합니다.

더 이상 이 블로그에는 글을 올리지는 않을 예정입니다. 그렇지만 댓글을 달아주시면 최대한 답변드리고자 노력하겠습니다.


※이 글은 프로그래밍 언어에 대한 기초적인 이해를 가정하고 있습니다. 최소 프로그래밍 언어 하나 정도를 약간이라도 접해보시는 것을 추천합니다. 또한, 이 글은 심화 내용은 되도록 피하여 서술했습니다.

 

이번 글에서는 다음과 같은 연산자들을 소개합니다.

 

  Java C/C++ Python
삼항 조건 연산자 O O
캐스트 연산자 O O O
그외 몇가지 특수한 연산자를 다룹니다

 

 먼저 다른 연산자에 앞서 쉼표와 괄호에 대해서 짚고 넘어가겠습니다. 쉼표는 Python의 경우 다음과 같이 사용되는 것이 가능합니다.

var1, var2 = 10, 11

다른 언어에서는 불가능한 내용입니다. 다만, C/C++과 Java에서는 다음과 같은 식이 가능합니다.

int a = 10, b = 31;

 

또한, C/C++에서는 하나의 연산자이기 때문에 C/C++에서는 다음과 같은 식도 가능합니다.

int a = 3, b = 3, c = 3;
cout << (a = 3, b = 10, c = 31) << endl;

 

값은 왼쪽에서 오른쪽으로 대입되다가 마지막 대입연산자의 반환값을 출력합니다. (비슷한 식은 Python과 Java에서 오류를 표시합니다.) 이때 이 쉼표는 함수 인자를 전달하는 쉼표와는 다른 의미입니다. f(x,y,z)할 때 쉼표는 x,y,z사이에 연산을 진행하지 않기 때문입니다.(단순한 구분 기호로 생각하시면 됩니다.)

 

다음 식은 오류를 내는 데, 이는 괄호가 가장 우선순위가 높고, 대입보다 <<연산자의 우선순위가 더 높기 때문입니다.

int a = 3, b = 3, c = 3;
cout << a = 3, b = 10, c = 31 << endl; //Error!!

 

 

 

이제 삼항 조건 연산자에 대해서 알아보겠습니다. 이는 아래와 같이 사용됩니다. 

조건 ? 참일때 값 : 거짓일때 값

단항이나 이항이 아닌 세개의 항을 필요하는 특징이 있습니다. Python에서는 다음과 같이 사용됩니다.

 

참일때 값 if 조건 else 거짓일때 값

 

아래 예제는 삼항 조건 연산자의 사용법을 보여줍니다.

 

int i,j;
i = 10;
j = 20;
cout << (i>j ? "True" : "False") << endl;

(우선순위 때문에 괄호가 필수입니다.)

 

캐스트(cast) 연산자는 강제적으로(명시적으로) 자료형을 바꿉니다. 각 언어에는 다음과 같은 캐스트 연산자들이 있습니다.

  어떤 주어진 변수 varName를 특정 자료형으로 변환시킬 때(X는 변환시 오류가 나지 않는 자료형이라고 가정)
  C언어 C++ Java
(자료형) varName O O
자료형(varName) X
(숫자나 Boolean 형태에 한정함. 문자열에 대해서는 추후 문자열에 대해 다룬 글에서 다시 설명하겠습니다.)

Python은 캐스트 연산자라기 보단 함수 형태로 다음과 같이 형 변환을 지원합니다.

 

a = str(1234) // str로 변환
b = int("1234") // int로 변환
c = float("1234.2") // float로 변환
d = complex("1+3j") // complex로 변환
e = bool(1) // bool로 변환. 0이 아니면 True. 즉 bool("false")도 True

 

마지막으로 C/C++의 sizeof연산자를 다시 짚어보겠습니다. 이 연산자는 배열이나 자료형의 크기를 구합니다.

 

int arr2d[2][3];
int arr1d[10];
int var1;
printf("%d %d %d %d",sizeof(int),sizeof(arr2d),sizeof(var1),sizeof(arr1d[0]));
printf("Length of arr1d is %d",sizeof(arr1d)/sizeof(arr1d[0]);

----------------실행 결과----------------------------
4 24 4 4
Length of arr1d is 10

(C++ iostream 헤더파일로도 printf가 가능하니 실행 불가능한 코드는 아닙니다)

 

위와 같이 배열의 길이를 구할때 유용합니다.

 

 

 

 이러한 다양한 연산자 사이에 우선순위가 존재합니다.(또는 표현식이 연산자와 섞여서 우선 순위가 나타나있는 표도 있습니다.(Python)) 이는 다음과 같이 정리해볼 수 있습니다. 괄호를 통해 묶어주지 않는다면, 우선순위는 아래의 순서입니다. 모르는 연산자나 표현식이 많겠지만, 차근차근 알아간다면 모두 익힐 수 있을 것입니다.

 

먼저 C++입니다. Microsoft C++ Document를 참고했습니다.(https://docs.microsoft.com/ko-kr/cpp/cpp/cpp-built-in-operators-precedence-and-associativity?view=vs-2019)

단순히 외우기보다 차근차근 익히시거나 명시적으로 괄호를 통해 우선 순위를 지정하는 것을 추천드립니다.

 

그 다음은 Python입니다. 역시 공식 문서를 참고했습니다.(https://docs.python.org/3.6/reference/expressions.html#id15)

결합순서는 지수 표현을 빼곤 왼쪽에서 오른쪽입니다.(3.6.x 기준이므로 3.5버전에 추가된 @ 연산자도 보입니다.)

Python 3.8부터 := 문법이 추가된다고 합니다.

 

Java에 대해서는 표로 정리된 내용을 찾지는 못했으나, 관련 문서는 발견하였습니다. 내용을 정리하는 데로 표로 정리해보겠습니다.(https://docs.oracle.com/javase/specs/jls/se6/html/expressions.html#251881) 다만 일반적인 연산자들의 우선순위는 C++과 같습니다.

 

Comments