본문 바로가기
JAVA BASE/operator(연산자)

08. [자바] 조건 연산자, 대입 연산자

by staticClass 2020. 12. 3.

조건 연산자 (? :)

조건 연산자는 조건식, 식1, 식2 모두 세 개의 피연산자를 필요로 하는 삼항 연산자이며,
삼항 연산자는 조건 연산자 하나뿐이다.
나는 항상 조건 연산자를 조건 연산자라 부르지 않고 삼항 연산자라고 불러왔다..😒

어떻게 보면 if문과 유사하다.

int x = 5, y = 3
  result = (x > y) ? x : y;
→result = (5 > 3) ? 5 : 3;
→result = (true)  ? 5 : 3;    // true면 5가 result로 대입, false면 3이 result에 대입.
→result = 5;    //조건이 true 였으므로 5가 대입

조건 연산자는 조건문 if문으로 바꿀 수 있고 if문 대신 조건 연산자를 사용하면 코드를
보다 간단히 할 수 있다.

int x = 5, y = 3
result = (x > y) ? x : y;
  ↓ if문으로 변경 ↓
if(x > y) {
    result = x;        // x > y가 true 일때.
} else {
    reuslt = y;     // x > y가 false 일때.
}

if문을 모르는 사람도 조건 연산자를 사용 것이 if문보다 간략하다는 것을 알 수 있다.

조건 연산자를 중첩해서 사용하면 셋 이상 중의 하나를 결과로 얻을 수 있다.

int x = 3
  result = x > 0 ? 1 : (x == 0 ? 0 : -1);
→result = x > 0 ? 1 : (3 == 0 ? 0 : -1);
→result = x > 0 ? 1 : (false  ? 0 : -1); // 조건식이 false : 연산결과는 식2인 -1이 된다.
→result = x > 0 ? 1 : -1;
→result = true ? 1 : -1;        //조건식이 true이므로, 연산결과는 식1인 1이 된다.
→result = 1;

조건 연산자는 여러 번 중첩하면 코드가 간략해지긴 하지만, 가독성이 떨어지므로 꼭 필요한 경우
한번 정도만 중첩 하는게 좋겠다. 평소 조건 연산자를 싫어하는 나는 위에 코드만 봐도 충분히 어지럽다.🤢

그리고 삼항 연산자도 마찬가지로 이항 연산자처럼 산술 변환이 발생한다.

x = x + (mod < 0.5 ?   0 : 0.5)  // 0과 0.5의 타입이 서로 다르다.
x = x + (mod < 0.5 ? 0.0 : 0.5)  // 0이 0.0으로 변환되었다.

위의 식에서 조건 연산자의 피연산자들이 서로 타입이 다르므로, 자동 형변환이 일어나
double타입으로 통일되고 연산결과 역시 double로 입력되게 된다.

 

대입 연산자 = op=

대입 연산자는 변수와 같은 저장 공간에 값 또는 수식의 연산결과를 저장하는데 사용된다.
사실 다들 일반 대입 연산자에 대해 모르지는 않을 것이다.
그러나 다양한 op= 가 있으니 표를 한번 보면서 알고 가자

op= 는 복합 대입 연산자라 불린다.

op= =
i += 3; i = i + 3;
i -= 3; i = i - 3;
i *= 3; i = i * 3;
i /= 3; i = i / 3;
i %= 3; i = i % 3;
i <<= 3; i = i << 3;
i >>= 3; i = i >> 3;
i &= 3; i = i & 3;
i ^= 3; i = i ^ 3;
i |= 3; i = i | 3;
i *= 10 + j; i = i * (10 + j);

위의 표를 보면 어렵지 않게 op=의 종류와 구조를 이해할수 있다

한 가지 주의할 점은 마지막줄 i *= 10 + j이다 해당 식을 i = i * 10 + j  라고 생각하지말자

 i = i * (10 + j)가 맞는 계산순서이다.

 


조건 연산자... 삼항 연산자.. 하아.. 현업에서 일을 할때 
프론트 개발을 넥사크로 라는 플랫폼으로 개발한 적이 있다..
국산 개발 플렛폼! 국뽕! 느낌이 아니었다. 개인적인 평가로는
타 언어와 결합이 매우 힘들며 기능은 넥사크로에서 제공하는 기능 외에는
사용하기 매우 어렵고 자유도가 떨어지는 개발 플랫폼이다.
다 좋다 사실 연속성이 좀 떨어진다 뿐이지 쓸만했다.
그런데 그리드를 만들고 세부 설정을 세팅할때 모든 조건을
삼항 연산자로만 부여할수 있게 되어있어서 부득이하게 
삼항 연산을 몇단계 씩이나 중첩해서 사용 했었고
내가 작성한 코드도 30분 뒤면 이게 뭔말이여 하고 한참 고생했었다 😫
if문보다 깔끔하게 한줄에 표현이 가능하지만 만능은 아니다.

나는 대입연산자가 +=, -=만 있는줄 알았다! 충격이 크다
모든 연산자가 다 사용 가능하다니🤣

댓글