2014년 9월 2일 화요일

Java 연산자(증감연산자와 바호연산자)

1. 연산자(operator)

연산자는 프로그래밍언어에서 가장 기본적이면서도 중요한 요소이다. 각 연산자의 특징과 수행결과, 그리고 우선순위에 대해서 잘 알아야 합니다.

종 류
연산방향
연산자
우선순위
단항 연산자
++  -- + - ~ ! (타입)
높음
산술 연산자
X / %
 
+ -
 
<< >> >>>
 
비교 연산자
> < >= >==
 
== !=
 
논리 연산자
&
 
^
 
l
 
&&
 
ll
 
삼항 연산자
?:
 
대입 연산자
= *= /= %= += -= <<= >>= >>>= &= ^= l=


표에서의 (타입)은 형변환에 사용되는 캐스트 연산자 입니다.
위의 표에서 같은 줄에 있는 연산자들은 우선순위가 같습니다. 우선순위가 같은 연산자들 간에는 연산의 진행방향에 의해서 연산순서가 정해집니다.
 연산의 진행방향을 설명하기 위해 두 개의 식을 예로 보여드리 겠습니다.

                           3*4*5                                                   x=y=3
       연산방향이 왼쪽에서 오른쪽인 경우        연산방향이 왼쪽에서 오른쪽인 경우

연산방향이 왼쪽에서 오른족인 곱센연산자의 경우 3*4를 수행하여 12의 값을 얻고 그 다음 12*5를 수행합니다. 이와 반대로 연산방향이 오른쪽에서 왼쪽인 대입연산자의 경우 y=3을 먼저 수행하여 Y에 3이 저장이 된 후 x=y가 수행되어 y에 저장되어 있는 값이 x에 저장되어 x와 y는 같은 값을 갖게 된다. 이는 x=3, y=3을 한 문장으로 쓴 것이다.
 연산자의 우선순의는 보통 사람들이 다 알고 있는 내용이기에 한번 보고 우선순위를 보고 넘어가자. 

산술 > 비교 > 논리 > 대입. 대입은 제일 마지막에 수행된다.
단항(1) > 이항(2) > 삼항(3). 단항 연산자의 우선쉰위가 이항 연산자보다 높다.
단항 연산자와 대입 연사자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽이다.

2.단항 연산자

2.1 증감 연산자

일반적으로 단항 연산자는 피연산자의 왼쪽에 위치하지만, 증가 연산자 ++와 감소 연산자--는 양쪽 모두 가능합니다. 하지만 연산자의 위치의 따라 연산결과가 달라 질 수도 있습니다.

증가 연산자(++) : 피연사자의 값을 1 증가시킵니다.
감소 연산자(--) : 피연산자의 값을 1 감소시킵니다.

boolean형을 제외한 모든 기본형(Primitive type) 변수에 사용이 가능하며, 피연산자의 왼쪽에 사용하는 전위형과 오른쪽에 위치하는 후위형이 있습니다.

증가 연산자의 후위,전위형 예제

public class Operator1 {

public static void main(String[] args) {

int i = 5;
i++;
System.out.println(i);
i = 5;
++i;
System.out.println(i);
}

}

실행결과
6
6

i를 증가시켜 출력하는데 한번은 후위형(i++) 그리고 전위형(++i)을 이용했습니다. 결과는 모두 6으로 같습니다. 그 이유는 단독적으로 사용했기 때문에, 증가연산자(++)를 전,후에 상관없이 값이 같습니다.

증가 연산자의 후위,전위형의 또다른 예제

public class Operator2 {

public static void main(String[] args) {
int a=5;
int b=0;
b = a++;
System.out.println("b=a++;를 실행 후, a="+ a +", b ="+b);
a=5;
b=0;
b = ++a;
System.out.println("b=++a;를 실행 후, a="+ a +", b ="+b);
}

}

실행결과

b=a++;를 실행 후, a=6, b =5
b=++a;를 실행 후, a=6, b =6

b의 값은 1이 증가되어 6이 저장되는 것은 같지만, 실행 결과가 다르다는 것을 보여줍니다. 수식을 계산하기 위해서는 수식에 포함된 변수의 값을 가지고 오는데, 전위형은 변수의 값을 먼저 증가시킨 후에 변수의 값을 읽어오는데, 후위형은 변수의 값을 먼저 읽어온 후에 값을 증가시킵니다. 따라서 b=++a;(전위형)에서는 a의 값을 증가시킨 후에 값을 읽어오고, b=a++;(후위형)에서는 a의 값을 읽어오고 a의 값을 증가시키기 때문에 결과 값이 다르게 나옵니다.

전위형   b=++a;   ++a;,a=b;  값이 참조되기 전에 증가시킵니다.
후위형   b=a++;   a=b;,a++;  값이 참조된 후에 증가시킵니다.   

하지만 ++a;,와 a++; 같이 증감연산자를 단독으로 쓰는 경우에는 차이가 없습니다.

증감연산자가 함수의 매개변수에 사용된 예제

public class Operator3 {

public static void main(String[] args) {
int a=5, b=5;
System.out.println(a++);
System.out.println(++b);
System.out.println("a = "+a+", b = " +b);
}

}

실행결과

5
6
a = 6, b = 6

a의 값이 증가 되기전에 참조되므로 println메소드에 i에 저장된 값 5를 넘기고, a의 값을 증가시키기 때문에 5가 출력이되고, b는 b에 저장된 값을 증가 시킨 후에 값을 넘겨주므로 6이 출력된다. 하지만 결과적으로는 a,b둘다 6이 저장이 된다.
감소연산자(--)는 덧셈연산자(++)와 같은 원리로 작동되기 때문에 설명하지 않겠습니다.

System.out.println(a++);                    system.our.println(a);
System.out.println(++b);                    a++;                         
                                                       ++b;                         
                                                       System.out.println(b);

2.2 부호 연산자 -  +

부호 연산자는 피연산자의 부호를 변경하는데 사용이 되며, boolean형과 char형을 제외한 나머지 기본형에서 사용할 수 있습니다.
 부호 연산자 '+'는 피연산자에 양수 1을 곱한 것이고, '-'는 피연산자에 음수 1을 곱한 것이다.

부호연산자의 예제

public class Operator1 {

public static void main(String[] args) {
int i = -10;
i = +i;
System.out.println(i);
i= -10;
i= -i;
System.out.println(i);
}

}

실행결과

-10
10

댓글 없음:

댓글 쓰기