ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JAVA의 연산자
    자바 2016. 7. 5. 04:55

    1. 연산자

    연산자operator란 연산을 수행하는 기호를 말한다

    연산의 대상으로 삽입된 변수, 리터럴들은 피연산자operand라고 한다.

    2. 연산자의 종류

    종류

    연산자

    설명

    산술 연산자

    + - * / % << >>

    사칙연산, 나머지연산, 비트이동연산

    비교 연산자

    > < >= <= == !=

    크고 작음, 같음과 다름

    논리 연산자

    && || ! & | ^ ~

    AND OR로 피연산자를 계산

    대입 연산자

    =

    우변의 값을 좌변에 저장

    피연산자의 갯수로 단항, 이항, 삼항 연산자로 나눌수 도 있다.

    3. 단항 연산자

    ++, -- 증감 연산자로 해당 변수의 숫자를 1 증가시키거나 감소시킨다.

    변수의 앞에 쓰나 뒤에 쓰나 해서 순서를 변화시킬 수 있다.

    위와 같은 코드는 num2에 3을 대입하고 해당 줄의 시행이 다 끝난뒤에 num을 4로 증가시킨다.

    num이 3일경우에 해당 코드는 시행되기 전에 num을 4로 증가시킨후에 num2에 4를 넣는다.

    +, - 부호 연산자로 해당 변수 앞에다가 - 를 쓸경우 음수로 본다.

    4. 이항 연산자

    +, -, *, / 사칙 연산자로 사칙 연산을 수행한다. 곱셈과 나눗셈의 연산이 먼저 실행된다.

    피연산자가 int와 같은 정수형일경우 소숫점 이하는 버려진다.

    byte 타입이나 short 타입으로 선언된 변수에 값을 더하는것도 조심하여야 할 것이다. 정수 리터럴의 기본은 int형이고 또한 JVM은 피연산자의 크기를 int형으로 조정한 뒤 계산하기 때문에 형변환을 명시적으로 해야지만 오류가 없을 것이다.

    % 나머지 연산자는 나머지를 구한다. 피연산자로 정수만 허용한다.

    <, >, <=, >=, ==, != 비교 연산자이다. 두 피연산자의 크기가 어디가 큰지 작은지, 크거나 같은지, 같은지 다른지 비교하는 연산 후 true혹은 false를 리턴한다.

    주의해야 할 점은 실수형의 대소비교는 원하는 결과가 나오지 않을 수 도 있다는것이다. 실수형은 0과 얼마나 가까운 값을 나타낼 수 있는가인 정밀도가 있고 이것은 어느 실수가 정확한 값이 나오지 않을 수 도 있다는 것이다. 특히 double타입과 float타입의 대소비교는 주의해야한다.

    &&, ||, ! 논리연산자이다. 비교 결과로 나온 true 혹은 false의 값을 AND, OR로 연결해준다.

    x

    y

    x || y

    x && y

    true

    true

    true

    true

    true

    false

    true

    false

    false

    true

    true

    false

    false

    false

    false

    false

    논리 연산의 중요한 부분은 앞의 값으로 이미 결과가 나오면 즉, AND 연산의 경우 앞의 변수가 false인 경우 결과는 무조건 false, OR 연산의 경우 앞의 변수가 true인 경우 결과는 무조건 true이다 이 경우 뒤에 변수를 실행하지 않는다는 점이다.

    위와 같은 코드는 a가 5이기 때문에 a > 4 는 true가 되고 OR로 연결되어 있기 때문에 앞의 식이 true가 나온 이상 뒤의 식은 true든 false든 결과는 같기 떄문에 뒤의 식을 수행하지 않는다 결국 a++ 문장은 실행되지 않고 생략된다. 이를 쇼트 서킷(short circuit)이라 한다.

    !는 논리 부정 연산자로 true를 false로 false를 true로 바꿔준다.

    &, |, ^, ~, <<, >> 비트연산자로 비트간의 계산을 수행한다. 

    x

    y

    x | y

    x & y

    x ^ y

    1

    1

    1

    1

    0

    1

    0

    1

    0

    1

    0

    1

    1

    0

    1

    0

    0

    0

    0

    0

    예를 들어 4 | 2 를 할 경우

    처음엔 2진수로 풀어서 생각을 해야한다. 4 = 0100, 2 = 0010

       0100

     | 0010 = 0110 결과는 6이 나온다. 두 수의 같은 자리수의 비트마다 해당하는 연산을 수행해서 계산결과가 나온다.

    그리고 피 연산자는 마찬가지로 int형으로 바뀌게 되고 자릿수 또한 32자릿수로 계산을 수행한다.

    ~ 는 비트 전환 연산자로 0은 1로 1은 0으로 바뀐다. 논리 부정 연산자 ! 와 비슷한다. 해당 연산을 수행하면 원래 값의 1의 보수값을 얻을 수 있다.

    <<, >>은 비트 이동 연산자로 비트들의 자릿수를 이동시킨다.

    3 << 2를 할 경우 0011을 왼쪽으로 2자리 이동시켜 1100, 즉 12가 된다. 이는 3 * 4와 마찬가지로 비트 이동 연산자는 2의 n승을 곱한것과 마찬가지의 결과가 나온다.

    마찬가지로 >> 연산자는 2의 n승을 나눈것과 마찬가지의 결과가 나온다

    참고로 3 >> 32의 경우는 int형의 경우 원래대로 돌아오기 때문에 값에 변화가 없다.

    5. 삼항 연산자

    ? : 조건연산자는 if else문을 한줄로 줄인거라 보면 된다.

    조건식 ? 식1 : 식2 의 형태로 조건식이 true면 식1이 false면 식2가 수행된다.

    코드가 줄어든다는 장점이 있지만 가독성이 떨어지므로 남발하면 안될것이다.

    6. 산술 변환

    연산자에 다른 타입의 리터럴 혹은 변수가 사용되면 둘의 타입을 일치시킨다. 보통 작은 타입을 큰 타입으로 자동으로 형변환을 하여 계산된다. 자동 형변환(auto casting)이라 불리기도 한다.

    int + double => double + double

    int + long => long + long

    이런 산술 변환은 이항 뿐만 아니라 단항과 삼항 연산자에서도 일어난다. 그리고 int 타입보다 작은 정수 타입도 int 타입으로 바뀌어 계산된다.

    7. 연산자 우선순위

    연산자가 한 줄에 여러개가 사용되면 먼저 개산되는 연산자가 있다.

    단항 - 이항 - 삼항 - 대입 연산자 순으로 처리되며 산술연산자는 곱셈, 나눗셈 연산자부터 처리된다. 이것만 인지하면 코드를 짜는데 무리가 없으며 헷갈리는것이 있으면 여러 줄로 분할해서 짜거나 인터넷에서 검색해서 활용하면 될 것이다.

    8. rvalue와 lvalue

    대입 연산자의 왼쪽 피연산자를 lvalue(left value) 라고 하고 오른쪽 피연산자를 rvalue(right value)라고 한다.

    lvalue -> x = (x + 3) <- rvalue

    lvalue는 리터럴이나 상수가 들어갈 수 없다.


    본 포스팅은 자바의 정석(남궁성)을 보고 정리하였습니다.

Designed by Tistory.