티스토리 뷰

저번 시간에 살펴본 연산자에 이어 이번에도 연산자의 나머지를 설명드리려 합니다

주의깊게 살펴봐 주세요 ㅎㅎ


연산자는 저번에 살펴본 것처럼 java에서 계산을 하도록 표현해 주는 기호라 생각하시면 됩니다

이번 강좌까지 이항 연산자에 대한 설명을 모두 마칠수 있도록 노력하겠습니다 ㅎㅎ


그럼 본격적으로 글을 시작하겠습니다

이번에 살펴볼 연산자는 관계 연산자 입니다

표로 정리해 보겠습니다


연산자 

연산자 기능 

결합방향 

<

EX) M < N

M이 N보다 작다

>

EX) M > N

M이 N보다 크다

 <=

EX) M <= N

M이 N보다 작거나 같다

>=

EX) M >= N

M이 N보다 크거나 같다

 ==

EX) M == N

M이랑 N이 같다 

!=

EX) M != N

M이랑 N이 다르다


이렇게 구분할수가 있습니다

여기서 해깔리시면 안되는대요 <=와 >=는 복합 대입 연산자가 아닌가? 라고 생각하실수도 있는대

<=와 >=는 관계 연산자며 <<=와 >>=가 복합대입 연산자 입니다 주의하세요 ㅋ


부등호 다들 많이 보셨을 겁니다

기능을 딱히 말하지 않아도 다들 짐작 하실거라 생각되는대요

==가 자바에서 같다를 의미합니다 =은 대입을 의미하고요


나머지는 딱히 혼동되지 않을거라 생각됩니다 ㅋ


이 관계 연산자는 연산의 결과로 정수/실수를 반환하지 않습니다

다른 +, %등은 수를 반환하죠

관계 연산자는 참과 거짓, 즉 true와 false를 반환합니다


처음에 자료형 배울때 boolean을 배웠죠?

이렇게 참과 거짓만을 반환합니다


예를 들면


number1==number2


이런 구문이 있다면

number1과 number2가 같다면 true를, 다르다면 false를 반환하게 되지요


이렇게 T(true)와 F(false)를 반환해서 어따가 써먹을까 궁금하신 분들은 다음/다다음 강좌쯤에 if~else를 배우실때 아실수 있을겁니다 ㅋ


이렇게 true와 false는 자바 프로그램을 짜는대 매우 편리하며 매우 좋은 용도로 사용됩니다



또한 이렇게 T와 F를 반환하는 연산자가 더 있습니다

이름은 논리 연산자라 부르고 있습니다

이 연산자는 조금 특이해서 헷깔리기 아주 쉽습니다 저도 게속 헷깔리는군요 ㅠ

마찬가지로 표로 정리해 보겠습니다


 연산자

 연산자 기능

결합 방향 

&& 

 EX) A && B

A와 B모두 참이면 true를 반환한다

||

EX) A || B

A와 B둘중 하나라도 참이면 true를 반환한다

!

EX) !A

A가 참이면 false를, 거짓이면 true를 반환한다


이런 특징의 연산자도 존재합니다

&&은 양옆 모든 피 연산자가 참이어야 true를, 하나라도 거짓이면 false를 반환하며

||은 둘중 하나라도 참이면 true를, 모두 거짓이면 false를 반환합니다

마지막으로 !은 참이면 거짓을, 거짓이면 참을 반환하는 청개구리(?)연산자 입니다 ㅋ

(참고로 !연산자는 단항 연산자 입니다, 이항 연산자가 아닙니다)


그럼 소스파일을 보며 확인해 보도록 하겠습니다


class Source
{
  public static void main(String[] args)
  {
    int M1=50, M2=100;

    boolean MM1=(M1==50 && M2==100);
    boolean MM2=(M1<50 || M2>200);

    System.out.println("M1은 50이고 M2는 100이다 ="+MM1);
    System.out.println("M1<50이고 M2>200이다     ="+MM2);
  }
}


Source.java



이런 결과가 나타납니다

boolean자료형으로 참과 거짓을 저장한다음 표시하는 소스입니다


M1이 50이고 M2가 100이므로 둘다 진실이므로 &&연산에 의해 true가 나오며

M1<50, M2>200이 모두 거짓이므로 ||연산에 의해 false가 나타납니다



이제 이항 연산자에 대한 설명이 끝나가고 있습니다

마지막으로 Short-Circuit Evaluation (SCE)에 대해 알아보겠습니다

영어죠.. 한글로 바꾸고 싶어도 정해진 표현이 없는 현실입니다

그래서 제 나름대로 뜻을 풀어 봤는대요

"빠른 연산을 위해 태어난 계산 방식"


아무튼 이게 뭔지 살펴보겠습니다


class SCE
{
  public static void main(String[] args)
  {
    int M1=10, M2=10;
    boolean sce;

    sce=(M1+=20)<0 && (M2+=30)>50;
    System.out.println("M1의 값은 "+M1+", M2의 값은 "+M2+" 입니다");

    sce=(M1+=20)>0 || (M2+=30)>50;
    System.out.println("M1의 값은 "+M1+", M2의 값은 "+M2+" 입니다");
  }
}



SCE.java


출력 결과를 예상하자면 첫번째 println에서는 M1은 30, M2는 50이 되어야 합니다

두번째 println에선 M1은 50, M2는 80이 되어야 하고요


하지만 출력결과를 보면 값은 다르게 나타납니다



M1의 값은 모두 정상이지만 M2는 값이 변하지 않았습니다

이말은 &&와 ||의 오른쪽이 연산되지 않았다는 뜻입니다


이런 계산 방식이 SCE입니다

&&은 왼쪽 피 연산자가 false면 오른쪽이 참이든 거짓이든 무조건 출력결과가 false입니다

또한 ||도 왼쪽이 true면 오른쪽이 참이든, 거짓이든 무조건 true가 되는거지요


이렇게 오른쪽을 연산하든지 안하든지 값이 이미 나올수 있는 경우에는 연산 속도를 위해 java는 오른쪽 연산을 하지 않습니다

이렇게 빠른 연산을 위해서 오른쪽 값에 상관없이 연산의 결과가 나오는 경우에 연산을 하지 않는것이 SCE입니다


이것이SCE가 주는 단점입니다

그러므로 우리는 위 코드와 같은 문구를 사용해서는 안되는 거지요..



이렇게 이항 연산자에 대해 알아봤습니다

다음에는 단항 연산자와 비트 연산자에 대해 알아보겠습니다~

저작자 표시 비영리 변경 금지
신고
댓글
댓글쓰기 폼