프로그래밍 언어/자바

자바 6. 연산자-1

닉네임못짓는사람 2020. 8. 10. 09:00
반응형

이번 글에선 자바에서 사용하는 연산자에 대해서 알아보도록 하겠습니다.

 

연산자란?


연산자가 무엇인지는 다들 아실 거라고 생각합니다.

수식 3 + 2 * 6이 있다고 가정하면, 이때 +, *를 연산자, 3, 2, 6을 피연산자라고 합니다.

이 연산자들은 자바에서 매우 기본적이고 중요한 요소이기 때문에

각 연산자의 기능, 특징, 우선순위 등을 반드시 기억해야 합니다.

먼저 표를 통해 어떤 연산자가 있는지 간단히 확인해봅시다.

표를 보시면 연산방향이라는 것이 있습니다.

이것은 같은 우선순위를 가진 연산자들이 함께 있을 때,

식을 어느방향으로 계산하느냐를 표시해놓은 것입니다.

예를 들어 3 * 2 / 10같은 경우 연산방향이 왼쪽에서 오른쪽이기 때문에

(3 * 2) / 10과 같은 연산결과가 계산될 것입니다.

 

반대로 대입 연산자 같은 경우는 연산 방향이 오른쪽에서 왼쪽이기 때문에

x = y = 3과 같은 식이 있다고 가정했을 때, y에 3이 먼저 대입되고

그 후 x에 y의 값이 대입된다고 알고 계시면 됩니다.

이제 각 연산자에 대해서 좀 더 자세히 알아보도록 합시다.

단항 연산자


1. 증감 연산자 ++, - -

단항 연산자 중 증감 연산자에는 ++, --가 있습니다.

++의 경우 변수 i에 i++라는 연산을 실행했을 경우 i+1을 수행하는 것과 같은 결과를 얻을 수 있습니다.

--도 이와 마찬가지인데, 이 둘은 변수의 왼쪽과 오른쪽 어디에 붙이느냐에 따라 의미가 조금 달라집니다.

public class example{
    public static void main(String[] args){
        int a = 5;
        int b = 6;
        System.out.print(a++ + "\n");
        System.out.print(b++ + "\n");
        System.out.print(++a + "\n");
        System.out.print(++a + "\n");
    }
}

위와 같은 코드에서 연산자를 변수의 왼쪽에 위치시키는 경우를 전위형,

오른쪽에 위치시키는 경우를 후위형이라고 이야기합니다.

그런데 결과를 보면, 처음 후위 연산자를 사용한 경우 값이 증가하지 않았습니다.

반면, 전위형을 사용했을 경우엔 오히려 값이 2씩 증가했는데, 왜 그런 것일까요?

 

전위형의 경우엔 변수의 값을 먼저 읽어와서 출력한 뒤, 값을 증가시킨 것이고

후위형의 경우 연산자인++를 먼저 읽어 변수의 값을 증가시키고 출력했기 때문입니다.

2. 부호 연산자 +, -

부호 연산자의 경우 따로 설명할 필요는 없을 거라 생각됩니다.

+와 -를 변수 왼쪽에 위치시킴으로써 변수의 부호를 지정해주는 연산자입니다.

주의할 점은 +를 붙여준다고 해서 피연산자의 부호를 +로 바꿔주는 게 아닌,

피연산자에 +1, 또는 -1을 곱해주는 구조라고 생각하시면 됩니다.

public class example{
    public static void main(String[] args){
        int a = 5;
        System.out.print(-a);
    }
}

3. 비트전환 연산자 ~

'~'의 경우 정수형과 char형에만 사용될 수 있고, 피연산자의 비트값, 즉 2진수값에서

1은 0으로, 0은 1로 바꿔주는 연산자입니다. 이때 부호비트 또한 값이 바뀌기 때문에

피연산자의 부호가 반대가 됩니다.

public class example{
    public static void main(String[] args){
        int a = -5;
        System.out.print(~a);
    }
}

연산자의 동작을 확인해보면 양수인 피연산자에 사용할 경우 -(값+1)이 되고,

음수인 피연산자에 사용하면 -(값-1)이 됩니다.

4. 논리부정 연산자 !

논리부정 연산자는 boolean형에만 사용할 수 있으며, 논리값을 반대로 바꿔주는 연산자입니다.

따라서 피연산자가 true일 경우 false로, false일 경우 true로 바꾸어줍니다.

public class example{
    public static void main(String[] args){
        boolean bool = true;
        System.out.print(!bool);
    }
}

산술 연산자


1. 사칙 연산자 +, -, *, /

사칙 연산자의 경우 여러분이 기존에 수학에서 사용하던 연산자와 동일한 작업을 수행합니다.

또한 우선순위도 기존 수학에서 사용하던 것과 동일하니 따로 헷갈릴 일은 없을 겁니다.

주의해야 할 점은 연산 수행 시 피연산자들의 크기가 맞지 않으면,

자동적으로 컴파일러가 가장 큰 자료형으로 형변환해서 계산을 수행합니다.

 

또한 나눗셈의 경우 정수형끼리 연산을 수행할 경우 구해지는 값은 나눗셈의 몫 중 정수값뿐이며,

이때 소수점 이하 값은 반올림하지 않고, 버려집니다, 또한 값을 0으로 나누는 것은 금지되어있습니다.

public class example{
    public static void main(String[] args){
        System.out.print(20 / 7);
    }
}

2. 나머지 연산자 %

나머지 연산의 경우 modular또는 mod연산이라고 이야기하는데,

연산자를 기준으로 왼쪽 피연산자를 오른쪽 피연산자로 나눈 뒤 나머지를 구해주는 연산자입니다.

사용되는 예로는 변수의 작수, 홀수를 판단하는 코드에서 많이 사용됩니다.

public class example{
    public static void main(String[] args){
        System.out.print(10 % 2);
    }
}

위와 같이 변수를 2로 나누어서 나머지가 0이면 짝수, 1이면 홀수라고 판단할 수 있습니다.

3. 쉬프트 연산자 <<, >>, >>>

쉬프트 연산자의 경우 정수형 연산자에만 사용할 수 있으며, 피연산자의 비트값의 각 자리를

오른쪽, 또는 왼쪽으로 이동시킨다고 하여서 쉬프트 연산자라고 이름 붙여졌습니다.

이때 오른쪽으로 n자리를 이동하면 피연산자를 2^n으로 나눈 것과 같은 결과를,

왼쪽으로 n자리를 이동하면 2^n을 곱한 결과를 얻을 수 있습니다.

 

알아두셔야 할 점은 비트를 이동시켰을 때 기존의 자리가 어떤 값으로 채워지느냐인데,

<<의 경우 왼쪽으로 쉬프트 하기 때문에 값을 0으로 채워주고,

>>의 경우 부호를 유지시켜야 하기 때문에 양수의 경우 0을, 음수의 경우 1을 채워줍니다.

>>>의 경우엔 부호에 상관없이 0으로 빈자리를 채웁니다. 따라서 사용 시 주의해주셔야 합니다.

public class example{
    public static void main(String[] args){
        int a = 1024;
        int tmp = a >> 4;
        System.out.print(tmp + "\n");
        tmp = a << 2;
        System.out.print(tmp + "\n");
        tmp = -a >>> 2;
        System.out.print(tmp + "\n");
    }
}

사용법은 연산자를 기준으로 왼쪽에 변수를, 오른쪽에 몇 칸 쉬프트 시킬지 입력하시면 됩니다.

 

이번 글은 이 정도로 마치고 다음 글에서 나머지 내용을 이어서 설명하겠습니다.

감사합니다.

 

반응형

'프로그래밍 언어 > 자바' 카테고리의 다른 글

자바 8. 조건문  (0) 2020.08.12
자바 7. 연산자-2  (0) 2020.08.11
자바 5. 형변환  (0) 2020.08.07
자바 4. 자료형-2  (0) 2020.08.06
자바 3. 자료형-1  (0) 2020.08.05