자바

1. 이항 연산자

 

우리가 배울 이항 연산자(binary operator)란 말 그대로 두개의 피연산자와 한개의 연산자를 가지는 연산을 말합니다. 앞으로도 배울 연산자의 종류는 산술 연산자, 등가 연산자, 부호 연산자, 대입 연산자, 관계 연산자, 증감 연산자, 비트 연산자, 조건 연산자, 논리 연산자를 배울 것인데, 그 중에서 대입 연산자와 산술 연산자, 그리고 관계 연산자, 논리 연산자를 우선적으로 공부하려고 합니다.

 

자바의 연산자는 매우 다양합니다. 다음은 연산자들을 표를 통해 정리한 것입니다.

여기서 '우선순위'란 연산식 내에 여러가지 연산자가 사용됬을 경우 무엇을 먼저 처리할것인지, 무엇을 나중에 처리할 것인지에 대한 기준입니다. 예를 들어, 다음의 식의 결과를 유추해봅시다.

 

124 + 62 * 43 - 22

 

예상하시듯 답은 2768 입니다. 그 이유는 곱셈이 덧셈, 뺄셈 보다 우선순위가 높기 때문입니다.

그래서, 62 * 43을 우선 계산한 뒤 124를 더하고 22를 뺀 결과가 나온 것입니다. 이해가시나요?

 

그리고 '연산방향' 이란, 우선순위가 같은 연산자가 있을때 연산을 수행하는 방향을 말하는 것입니다. 아까의 식에서, 62 * 43이 계산된 후에, 124 + 2666 - 12란 식이 만들어지는데, 산술 연산자의 연산방향은 왼쪽에서 오른쪽으로 이동하므로, 왼쪽에 있는 연산자가 먼저 계산되는걸 의미합니다. 

 

2. 대입 연산자, 산술 연산자

 

다음의 표는 대입 연산자(assignment operators)와 산술 연산자(arithmetic operators)를 정리한 것입니다.

 

 

아래는 대입 연산자와 산술 연산자를 활용한 예제입니다.

 

class AsarOperators

{

public static void main(String[] args)

{

int num1;

int num2;



num1 = 714;

num2 = 500;



System.out.println(num1 + " + " + num2 + " = " + (num1 + num2));

System.out.println(num1 + " - " + num2 + " = " + (num1 - num2));

System.out.println(num1 + " * " + num2 + " = " + num1 * num2);

System.out.println(num1 + " / " + num2 + " = " + num1 / num2);

System.out.println(num1 + " % " + num2 + " = " + num1 % num2);

}

}

 

결과는 아래와 같습니다.

 

 

714 + 500 = 1214

714 - 500 = 214

714 * 500 = 357000

714 / 500 = 1

714 % 500 = 214

 

다시 코드로 돌아가, 4행과 5행에서 10진수 정수형 변수 num1, num2를 컴파일러에게 선언하고 7행과 8행에 714와 500이란 값을 각각의 변수에 대입 연산자를 통해 대입했습니다. 그리고 10~14행에서 덧셈, 뺄셈, 곱셈, 나눗셈, 나머지를 구하는 연산자를 사용해 그 결과를 출력하도록 했습니다. 그런데 10행과 11행을 보시면 소괄호가 쓰이신게 보이시나요? 이해를 돕기 위해, 소괄호를 삭제하고 다시 컴파일을 해봅시다. 이상하게도 컴파일러는 오류를 출력할 것입니다.

 

생각해보면 당연한 것입니다. "714 + 500 = "이란 문자열과 10진수 정수형 변수 num1이 + 연산자로 인해 자동 형변환이 일어나게 됩니다(+ 연산을 진행할때 문자열과 정수형이 같이 쓰이면 자동 형변환이 일어남). 그러므로 "714 + 500 = 714"라는 문자열이 형성됩니다. 그런데, 여기서 '문자열 "714 + 500 = 714"에서 10진수 정수형 변수 num2의 값 500을 빼라!'란 말은 컴파일러가 연산자가 잘못 쓰인것으로 이해하고 다음과 같은 에러를 출력합니다.

 

AsarOperators.java:12: error: bad operand types for binary operator '-'

 

                System.out.println(num1 + " - " + num2 + " = " + num1 - num2);

  first type:  String

  second type: int

1 error

 

 

이 에러를 해결하려면 소괄호를 통해, 특별한 우선순위를 부여시켜야 합니다. 소괄호로 num1 + num2을 묶어주면 num1 + num2이 우선시되어 계산됩니다. 이러한 소괄호를 '구분자'라고 합니다.

 

 

 

3. 복합 대입 연산자

 

복합 대입 연산자란 대입 연산자와 다른 연산자들과 묶여서 쓰이는 형태의 연산자를 말하는 것입니다. 다음의 표를 보시면 쉽게 이해하실 수 있습니다.

 

 

 연산자

기능 

사용 예 

의미 

 +=

 좌변에 우변을 더함

a += 2

a = a + 2 

 -=

 좌변에 우변을 뺌

a -= 3  

 a = a - 3

 *=

 좌변에 우변을 곱함

 a *= 4

a = a * 4 

 /=

좌변에 우변을 나눔 

 a /= 5

a = a / 5 

 %=

좌변에 우변을 나눈 나머지 

a %= 6 

a = a % 6 

 

<산술 연산자와 대입 연산자가 묶인 형태>

 

여기서 굳이 산술 연산자가 아니더라도, 산술 연산자를 제외한 다른 연산자와 대입 연산자를 묶을 수 있습니다.

 

다음의 예를 봅시다.

class CompoundOpers

{

public static void main(String[] args)

{

int num1=5;

int num2=4;



num1 += num2; // num1 = num1 + num2

System.out.println("num1의 값: " + num1);



num2 *= num1; // num2 = num2 * num1

System.out.println("num2의 값: " + num2);

}

}

결과는,

 

 

num1의 값: 9

num2의 값: 36

 

코드로 돌아가서, 5~6행에서 10진수 정수형 변수 num1, num2를 선언하여 5와 4라는 값을 각각 대입했습니다. 그런 뒤에 8행과 11행을 보시면 복합 대입 연산자가 쓰였는데, 이것은 num1 = num1 + num2, num2 = num2 * num1 으로 해석이 됩니다. 정리하면 num1 = 5 + 4;가 되어 9가 num1에 대입되었고, num2 = 4 * 9; 가 되어 36이란 값이 num2에 대입된 것입니다.

 

 

 

4. 관계 연산자

 

관계 연산자란 수식의 결과가 참이면 true를, 거짓이면 false를 반환하는 연산자입니다.

 

 

다음 예제를 통해 관계 연산자를 쉽게 이해하실 수 있습니다.

 

class RelationalOpers

{

public static void main(String[] args)

{

int num1=10;

int num2=20;



System.out.println(num1 + " > " + num2 + " = " + (num1 > num2));

System.out.println(num1 + " < " + num2 + " = " + (num1 < num2));

System.out.println(num1 + " >= " + num2 + " = " + (num1 >= num2));

System.out.println(num1 + " <= " + num2 + " = " + (num1 <= num2));

System.out.println(num1 + " == " + num2 + " = " + (num1 == num2));

System.out.println(num1 + " != " + num2 + " = " + (num1 != num2));

}

}

결과는,

 

 

 

 

10 > 20 = false

10 < 20 = true

10 >= 20 = false

10 <= 20 = true

10 == 20 = false

10 != 20 = true

 

결과를 살펴보면, 10 > 20에서 당연히 10은 20보다 작으므로 거짓(false)를 반환합니다. 10 < 20은 맞는 수식이므로 참(true)을 반환합니다. 10 >= 20은 거짓(false), 10 <= 20은 참(true), 그리고 10과 20은 같지 않으므로 거짓(false), 10과 20은 서로 다르므로 참(true)을 반환합니다.

 

* 이 관계 연산자는 나중에 조건문(if~else)을 배울때 많이 사용됩니다. 

 

 

 

5. 논리 연산자

 

논리 연산자는 관계 연산자와 같이 true, false를 반환하는 연산자입니다. 논리 연산자의 종류엔 논리곱(AND, &&), 논리합(OR, ||), 논리부정(NOT, !)가 있습니다.

 

 

이 논리 연산자의 연산결과를 모아둔 표를 진리표(Truth table)이라고 합니다.

 

 

<진리표(Truth table)>

 

여기서 T란 참(True)를, F란 거짓(False)를 나타냅니다. A, B는 들어가는 값(Input)을 의미하고 Z는 나가는 값(Output)을 의미합니다.

 

● AND 연산의 경우 1번과 같이 A와 B가 둘다 참일 경우엔 결과값도 참이지만 2, 3, 4번과 같이 둘다 참이 아닐 경우에는 거짓이 출력됩니다. 

● OR 연산의 경우 1, 2, 3번과 같이 A나 B중 하나라도 참일 경우에 결과값이 참이됩니다. 4번 같은 경우는 A와 B가 모두 거짓이기에 결과값은 거짓이 됩니다.

 

위의 진리표에는 NOT 연산이 없으므로 글로 설명하겠습니다.

 

● NOT 연산은 말그대로 논리 부정이므로 A가 True일때 NOT 연산을 사용하면 A가 False로 바뀌고, B가 False일때  NOT 연산을 사용하면 A가 True로 바뀝니다. 표로 정리하면 아래와 같습니다.

 

 

 NOT

1) 

2) 

 

 

다음의 예제는 이해를 돕기 위해 관계 연산자와 논리 연산자가 같이 쓰인 예제입니다.

 


class LogicalOpers

{

public static void main(String[] args)

{

int num1=10;

int num2=20;



// AND

System.out.println(num1 < num2 && num1 != num2);

System.out.println(num1 > num2 && num1 != num2);



// OR

System.out.println(num1 < num2 || num1 != num2);

System.out.println(num1 > num2 || num1 != num2);

System.out.println(num1 > num2 || num1 == num2);



// NOT

System.out.println(!(num1 < num2));

System.out.println(!(num1 > num2));

}

}

결과는,

 

true // 10 < 20 && 10 != 20, true && true = true

false // 10 > 20 && 10 != 20, false && true = false

true // 10 < 20 || 10 != 20, true || true = true

true // 10 > 20 || 10 != 20, false || true = true

false // 10 > 20 || 10 == 20, false || false = false

false // !(10 < 20), !true = false

true // !(10 > 20), !false = true

 

 

 

 

위의 결과를 통해 true, false로 결과값이 출력되는 것을 알 수 있고, AND, OR, NOT 연산을 사용하고 결과 옆에 어떻게 해서 true와 false가 나오는지 과정을 달았습니다. 

 

 

 

about author

PHRASE

Level 60  머나먼나라

아무리 거룩한 말들을 많이 읽어도, 아무리 좋은 말을 많이 해도, 몸으로 실천하지 않으면 무슨 소용이 있는가? -법구경-

댓글 ( 4)

댓글 남기기

작성

자바 목록    more