Java - 3 (연산자)

hoegon kim·2022년 11월 30일
0

JAVA

목록 보기
3/26
post-thumbnail

연산자 목차 (operator)

자바에서는 여러 종류의 연산을 수행하기 위한 다양한 연산자(operator)를 제공하고 있습니다.

자바에서 제공하는 대표적인 연산자는 다음과 같습니다.

  1. 산술연산자(arithmetic operator)
  2. 대입연산자(assignment operator)
  3. 증감연산자(increment and decrement operators)
  4. 비교연산자(comparison operator)
  5. 논리연산자(logical operator)
  6. 비트연산자(bitwise operator)
  7. 삼항연산자(ternary operator)
  8. instanceof 연산자

12) 산술연산자


1. 산술연산자(arithmetic operator)

산술 연산자는 사칙연산을 다루는 연산자로, 가장 기본적이면서도 가장 많이 사용되는 연산자 중 하나입니다.

산술 연산자는 모두 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 왼쪽에서 오른쪽입니다.

항이란 해당 연산의 실행이 가능하기 위해 필요한 값이나 변수를 의미합니다.

따라서 이항 연산자란 해당 연산의 실행을 위해서 두 개의 값이나 변수가 필요한 연산자를 의미합니다.

<예제>

int num1 = 8, num2 = 4;

System.out.printIn("+ 연산자에 의한 결과 : " + (num1 + num2));

System.out.printIn("- 연산자에 의한 결과 : " + (num1 - num2));

System.out.printIn("* 연산자에 의한 결과 : " + (num1 *num2));

System.out.printIn("/ 연산자에 의한 결과 : " + (num1 / num2));

System.out.printIn("% 연산자에 의한 결과 : " + (num1 % num2));

실행결과

+ 연산자에 의한 결과 : 12
- 연산자에 의한 결과 : 4
* 연산자에 의한 결과 : 32
/ 연산자에 의한 결과 : 2
% 연산자에 의한 결과 : 0

연산자의 우선순위(operator precedence)와 결합 방향(associativity)

연산자의 우선순위는 수식 내에 여러 연산자가 함께 등장할 때, 어느 연산자가 먼저 처리될 것인가를 결정합니다.

다음 그림은 가장 높은 우선순위를 가지고 있는 괄호(()) 연산자를 사용하여 연산자의 처리 순서를 변경하는 것을 보여줍니다.

연산자의 결합 방향은 수식 내에 우선순위가 같은 연산자가 둘 이상 있을 때, 먼저 어느 연산을 수행할 것인가를 결정합니다.

위의 표에서 나온 순서대로 우선순위가 빠른 연산자가 가장 먼저 실행 됩니다.

또한, 같은 우선순위를 가지는 연산자가 둘 이상 있을 때에는 결합 순서에 따라 실행 순서가 결정됩니다.


13) 대입연산자


2. 대입연산자(assignment operator)

대입 연산자는 변수에 값을 대입할 때 사용하는 이항 연산자 이며, 피연산자들의 결합 방향은 오른쪽에서 왼쪽입니다.

또한, 자바에서 대입 연산자와 다른 연산자를 결합하여 만든 다양한 복합 대입 연산자를 제공합니다.

<예제>
int num1 = 7, num2 = 7, num3 = 7;

num1 = num1 -3;
num2 -= 3;
num3 =- 3;

System.out.printIn("-연산자에 의한 결과 : " + num1);

System.out.printIn("-=연산자에 의한 결과 :" + num2);

System.out.printIn("=-연산자에 의한 결과 :" + num3);

결과

-  연산자에 의한 결과 : 4
-= 연산자에 의한 결과 : 4
=- 연산자에 의한 결과 : -3

위의 예제에서 num3 =- 3; 연산은 단순히 -3를 변수 num3에 대입하는 연산이 되었습니다.
※이처럼 복합 대입 연산자에서 연산자의 순서는 매우 중요하므로 주의를 기울여야 합니다.


14) 증감연산자

3. 증감연산자(increment and decrement operators)

증감 연산자는 피연산자를 1씩 증가 혹은 감속시킬 때 사용하는 연산자입니다.

이 연산자는 피연산자가 단 하나뿐인 단항 연산자입니다.

증감 연산자는 해당 연산자가 피연산자의 어느 쪽에 위치하는가에 따라 연산의 순서 및 결과가 달라집니다.

<예제>

int num1 = 7, num2 = 7;
int result1, result2;

result1 = --num1 + 4;
result2 = num2-- + 4;

System.out.printIn("전위 감소 연산자에 의한 결과 : " + result1 + ",변수의 값 : " + num1);

System.out.printIn("후위 감소 연산자에 의한 결과 : " + result2 + ",변수의 값 : " + num2);

실행결과

전위 감소 연산자에 의한 결과 : 10, 변수의 값 : 6
후위 감소 연산자에 의한 결과 : 11, 변수의 값 : 6

위의 예제에서 첫 번째 연산은 변수 num1의 값을 먼저 1감소시킨 후에 나머지 연산을 수행합니다.

하지만 두 번쨰 연산에서는 먼저 모든 연산을 마친 후에 변수 num2의 값을 1감소 시킵니다.

따라서 변수 num2의 감소 연산자는 전체 연산에 어떠한 영향도 미치지 않습니다.


증감 연산자의 연산 순서

증감 연산자는 피연산자의 어느 쪽에 위치하는가에 따라 연산의 순서가 달라집니다.

다음 예제는 증감 연산자의 연산 순서를 살펴보기 위한 예제입니다.

<예제>

int x =10;
int y =x-- +5 + --x;


System.out.printIn("x:" + x + "y :" + y);

실행결과
x : 8, y : 23

다음 그림은 위의 예제에서 수행되는 연산의 순서를 보여줍니다.

① : 첫 번째 감소 연산자(decrement operator)는 피연산자의 뒤 쪽에 위치하므로, 덧셈 연산이 먼저 수행됩니다.

② : 덧셈 연산이 수행된 후에 감소 연산이 수행됩니다. (x의 값 : 9)

③ : 두 번째 감소 연산자는 피연산자의 앞쪽에 위치하므로, 덧셈 연산보다 먼저 수행됩니다. (x의 값 : 8)

④ : 감소 연산이 수행된 후에 덧셈 연산이 수행됩니다.

⑤ : 마지막으로 변수 y에 결괏값의 대입 연산이 수행됩니다. (y의 값 : 23)


15) 비교연산자


4. 비교연산자(comparison operator)

비교 연산자는 피연산자 사이의 상대적인 크기를 판단하는 연산자 입니다.

비교 연산자의 왼쪽의 피연산자와 오른쪽의 피연산자를 비교하여, 어느 쪽이 더 큰지, 작은지, 또는 서로 같은지를 판단합니다.

비교연산자는 모두 두 개의 피연산자를 가지는 이항 연산자 이며, 피연산자들의 결합 방향은 왼쪽에서 오른쪽입니다.

다음 예제는 소문자 'b' 와 대문자 'B'를 비교 연산자로 비교하는 예제입니다.

char ch1 = 'a', ch2 = 'A';

System.out.printIn("== 연산자에 의한 결과 : " + (ch1 == ch2));

System.out.printIn("> 연산자에 의한 결과 : " +(ch1 > ch2));

결과

== 연산자에 의한 결과 : false
> 연산자에 의한 결과 : true

일반적으로 영문자 'A'와 'a' 중에서 더 큰 문자는 'A'일 거라고 생각하기 쉽습니다.

하지만 아스키코드에서 'A'는 10진수 65로 나타내며, 'a'는 10진수 97로 나타냅니다.

따라서 두 문자를 비교하면 'a'가 더 크다는 결과가 나오게 되는 것입니다.

모든 영문 대문자의 아스키 코드 값은 모든 영문 소문자보다 작은 값을 가집니다.

아스키코드(ASCII)는 영문 대소문자를 사용하는 7비트의 문자 인코딩 방식입니다.

아스키코드는 문자를 7비트로 표현하므로, 총 128개의 문자를 표현할 수 있습니다.

16) 논리연산자

5. 논리연산자(logical operator)

논리 연산자는 주어진 논리식을 판단하여, 참(true)과 거짓(false)을 결정하는 연산자 입니다.

AND 연산과 OR연산은 두개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 왼쪽에서 오른쪽입니다.

NOT연산자는 피연산자가 단 하나뿐인 단항 연산자 이며, 피연산자의 결합 방향은 오른쪽에서 왼쪽입니다.

<예제>
char ch1 = 'b', ch2 = 'B';

boolean result1, result2;

 

result1 = (ch1 > 'a') && (ch1 < 'z') ;

result2 = (ch2 < 'A') || (ch2 < 'Z') ;

 

System.out.println("&& 연산자에 의한 결과 : "+ result1);

System.out.println("|| 연산자에 의한 결과 : "+ result2);

System.out.println("! 연산자에 의한 결과 : "+ !result2);

결과

&& 연산자에 의한 결과 : true

|| 연산자에 의한 결과 : true

!  연산자에 의한 결과 : false

위의 예제처럼 자바에서는 char형 문자끼리도 그 크기를 서로 비교할 수 있습니다.

17) 비트연산자

6. 비트연산자(bitwise operator)

비트 연산자는 논리 연산자와 비슷하지만, 비트(bit)단위로 논리연산을 할 때 사용하는 연산자입니다.

또한, 비트 단위로 왼쪽이나 오른쪽으로 전체 비트를 이동하거나, 1의 보수를 만들 때도 사용됩니다.

다음 그림은 비트 AND 연산(&)의 동작을 나타냅니다.

이처럼 비트 AND 연산자는 대응되는 두 비트가 모두 1일 때만 1을 반환하며, 다른 경우는 모두 0을 반환합니다.

다음 그림은 비트 OR 연산자(|)의 동작을 나타냅니다.
이처럼 비트 OR 연산자는 대응되는 두 비트 중 하나라도 1이면 1을 반환하며, 두 비트가 모두 0일때만 0을 반환합니다.

다음 그림은 비트 XOR 연산자(^)의 동작을 나타냅니다.

이처럼 비트 XOR 연산자는 대응되는 두 비트가 서로 다르면 1을 반환하고, 서로 같으면 0을 반환합니다.

다음 그림은 비트 NOT 연산자(~)의 동작을 나타냅니다.

이처럼 비트 NOT 연산자는 해당 비트가 1이면 0을 반환하고, 0이면 1을 반환합니다.

<예제>
int num1 = 8, num2 = -8;

① System.out.println("~ 연산자에 의한 결과 : "+ ~num1);

② System.out.println("<< 연산자에 의한 결과 : "+ (num1 << 2));

③ System.out.println(">> 연산자에 의한 결과 : "+ (num2 >> 2));

④ System.out.println(">>> 연산자에 의한 결과 : "+ (num1 >>> 2));

⑤ System.out.println(">>> 연산자에 의한 결과 : "+ (num2 >>> 2));

위 예제의 ①번 라인에서 비트 반전 연산자(~)는 피연산자의 1의 보수를 반환하므로, 피연산자의 부호만 반대로 변경됩니다.

②번 라인의 왼쪽 시프트 연산자(<<)는 지정한 수만큼 피연산자의 모든 비트를 전부 왼쪽으로 이동시킵니다.

이때 비트의 이동으로 새로 생기는 오른쪽 비트들은 언제나 0으로 채워집니다.

실행 결과를 살펴보면, 모든 비트가 한 비트씩 왼쪽으로 이동할 때마다 그 값은 2배씩 증가한다는 사실을 알 수 있습니다.

또한, ③번 라인의 오른쪽 시프트 연산자(>>)는 지정한 수만큼 피연산자의 모든 비트를 전부 오른쪽으로 이동시킵니다.

이때 비트의 이동으로 새로 생기는 왼쪽 비트들은 양수일 경우에는 모두 0으로 채워지며, 음수일 경우에는 모두 1로 채워집니다.

따라서 부호는 변하지 않습니다.

실행 결과를 살펴보면, 모든 비트가 한 비트씩 오른쪽으로 이동할 때마다 그 값은 2배씩 감소한다는 사실을 알 수 있습니다.

④번 라인의 오른쪽 시프트 연산자(>>>)는 부호 비트까지 포함하여 모든 비트를 전부 오른쪽으로 이동시킵니다.

이때 비트의 이동으로 새로 생기는 왼쪽 비트들은 언제나 0으로 채워집니다.

따라서 피연산자가 양수인 경우에는 부호 비트를 이동하지 않는 오른쪽 시프트 연산자(>>)와 같은 결과를 반환합니다.

하지만 피연산자가 음수인 경우에는 부호 비트까지도 이동하므로, 전혀 다른 결과가 반환됩니다.

다음 그림은 1바이트의 경우일 때 연산 결과를 나타나며, 위의 예제에서는 총 4바이트일 경우의 연산 결과를 보여줍니다.

따라서 이 시프트 연산자는 10진수의 연산보다는 2진수의 연산에서만 주로 사용됩니다.

18) 기타 연산자

7. 삼항연산자(ternary operator)

삼항 연산자는 자바에서 유일하게 피연산자를 세 개나 가지는 조건 연산자 입니다.

삼항 연산자의 문법은 다음과 같습니다.

<문법>
조건식 ? 반환값1 : 반환값2

<예제>

int num1 = 5, num2 = 7;

int result;

 

result = (num1 - num2 > 0) ? num1 : num2;

System.out.println("두 정수 중 더 큰 수는 " + result + "입니다.");

결과 : 두 정수 중 더 큰 수는 7입니다.


8. instanceof 연산자

instanceof 연산자는 참조 변수가 참조하고 있는 인스턴스의 실제 타입을 반환해 줍니다.

즉, 해당 객체가 어떤 클래스나 인터페이스로부터 생성되었는지를 판별해 주는 역할을 합니다.

instanceof 연산자의 문법은 다음과 같습니다.

<문법>
인스턴스이름 instanceof 클래스또는인터페이스이름

instanceof 연산자는 왼쪽 피연산자인 인스턴스가 오른쪽 피연산자인 클래스나 인터페이스로부터 생성되었으면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

<예제>

class A {}

class B extends A {}

public static void main(String[] args) {

    A a = new A();

    B b = new B();

    System.out.println(a instanceof A); // true

    System.out.println(b instanceof A); // true

    System.out.println(a instanceof B); // false

    System.out.println(b instanceof B); // true

}

위의 예제를 이해하기 위해서는 클래스와 상속에 관한 기본적인 이해가 필요합니다.

따라서 현재 자세한 내용을 이해할 수 없다면, 나중에 필요할 때 다시 찾아보는 것도 좋은 방법입니다.

클래스에 대한 더 자세한 사항은 자바 클래스 수업에서 확인할 수 있습니다.

http://www.tcpschool.com/java/java_class_intro

상속에 대한 더 자세한 사항은 자바 상속 수업에서 확인할 수 있습니다.

http://www.tcpschool.com/java/java_inheritance_concept

0개의 댓글