자바에서는 여러 종류의 연산을 수행하기 위한 다양한 연산자를 제공하고 있습니다. 연산자는 영어로 operator라고 하며 특정한 작업을 하기 위해 사용하는 기호라고 할 수 있습니다. 그래서 이 기호를 통해 컴퓨터에 어떠한 작업을 지시할 수 있습니다.
자바에서 제공하는 대표적인 연산자는 다음과 같습니다.
- 산술 연산자
- 대입 연산자
- 증감 연산자
- 비교 연산자
- 논리 연산자
- 비트 연산자
- 삼항 연산자
- instanceof 연산자
연산자의 우선순위
연산자의 우선순위는 수식 내에 여러 연산자가 함께 등장할 때, 어느 연산자가 먼저 처리될 것인가를 결정합니다.
기본적으로 연산자에는 우선순위가 있으며, 괄호의 우선순위가 제일 높고, 산술 > 비교 > 논리 > 대입의 순서이며, 단항 > 이항 > 삼항의 순서입니다.
연산자의 연산 진행방향은 왼쪽에서 오른쪽으로 수행되며, 단항 연산자와 대입 연산자의 경우에는 오른쪽에서 왼쪽으로 수행됩니다.
다음 그림은 가장 높은 우선순위를 가지고 있는 괄호(()) 연산자를 사용하여 연산자의 처리 순서를 변경하는 것을 보여줍니다.
- 연산자(operator) : 어떠한 기능을 수행하는 기호 (ex +, -, *, / 등)
- 피연산자(operand) : 연산자의 작업 대상 (ex 변수, 상수, 수식 등)
연산자의 결합 방향은 수식 내에 우선순위가 같은 연산자가 둘 이상 있을 때, 먼저 어느 연산을 수행할 것인가를 결정합니다.
산술 연산자
산술 연산자는 사칙연산을 다루는 연산자로, 덧셈(+), 뺄셈(-), 곱셈(*), 나눗셈(/), 나머지(%)입니다.
가장 기본적이면서도 가장 많이 사용되는 연산자 중 하나입니다.
학교 다닐 때 배운 기초적인 수학적 소양인 더하기, 빼기, 곱하기, 나누기, 나머지와 같은 것을 자바에서 산술 연산자로 표기합니다.
산술 연산자는 모두 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 왼쪽에서 오른쪽입니다.
<산술 연산자 예제>
1
2
3
4
5
6
7
|
int num1 = 8, num2 = 4;
System.out.println("+ 연산자에 의한 결과 : "+ (num1 + num2));
System.out.println("- 연산자에 의한 결과 : "+ (num1 - num2));
System.out.println("* 연산자에 의한 결과 : "+ (num1 * num2));
System.out.println("/ 연산자에 의한 결과 : "+ (num1 / num2));
System.out.println("% 연산자에 의한 결과 : "+ (num1 % num2));
|
cs |
<실행 결과>
+ 연산자에 의한 결과 : 12
- 연산자에 의한 결과 : 4
* 연산자에 의한 결과 : 32
/ 연산자에 의한 결과 : 2
% 연산자에 의한 결과 : 0
+연산자는 특별한 면이 있는데 문자와 문자를 결합할 때도 +연산자를 사용합니다
1
2
3
4
|
String a="Eclipse";
String b="Workspace";
String c="Eclipse"+"Workspace";
System.out.println(c);
|
cs |
위 예제는 a라는 문자열에 "Eclipse"를, b라는 문자열에 "Workspace"라는 값을 담았습니다.
c라는 변수에는 a와 b를 +연산자를 이용해 결합한 결과를 담았습니다.
따라서 프로그램을 실행하면 Eclipse Workspace가 출력됩니다.
대입 연산자
말 그대로 값을 변수에 대입하는 대입 연산자입니다.
int a = 10은 10의 값을 int형 변수 a에 대입한다는 의미입니다.
대입 연산자는 변수에 값을 대입할 때 사용하는 이항 연산자이며, 피연산자들의 결합 방향은 오른쪽에서 왼쪽입니다.
또한, 자바에서는 대입 연산자와 다른 연산자를 결합하여 만든 다양한 복합 대입 연산자를 제공합니다.
<대입연산자를 참고하여 계산하였을 경우 식과 값에 대한 예시>
<대입 연산자 예제>
1
2
3
4
5
6
7
8
9
|
int num1 = 7, num2 = 7, num3 = 7;
num1 = num1 - 3;
num2 -= 3;
num3 =- 3;
System.out.println("- 연산자에 의한 결과 : "+ num1);
System.out.println("-= 연산자에 의한 결과 : "+ num2);
System.out.println("=- 연산자에 의한 결과 : "+ num3);
|
cs |
<실행결과>
- 연산자에 의한 결과 : 4
-= 연산자에 의한 결과 : 4
=- 연산자에 의한 결과 : -3
증감 연산자
증감 연산자는 피연산자를 1씩 증가 혹은 감소시킬 때 사용하는 연산자입니다.
이 연산자는 피연산자가 단 하나뿐인 단항 연산자입니다.
증감 연산자는 해당 연산자가 피연산자의 어느 쪽에 위치하는가에 따라 연산의 순서 및 결과가 달라집니다.
증가 연산자는 ++로, 감소 연산자는 --로 나타냅니다.
i++와 같이 +기호를 연속으로 두 개 쓰면 이는 i+1과 가은 뜻입니다.
즉 i의 값에 1을 더하는 것이 바로 ++입니다.
이 기호 역시 좌항이나 우항에 값을 둘 수 있으므로 단항 연산자이며 --는 ++와 반대입니다.
<증감 연산자 예제>
1
2
3
4
5
6
7
8
9
|
int i=3;
i++;
System.out.println(i);// 4출력
++i;
System.out.println(i);
System.out.println(++i);
System.out.println(i++);
System.out.println(i);
|
cs |
<실행결과>
4
5
6
6
7
비교 연산자
비교 연산자는 피연산자 사이의 상대적인 크기를 판단하는 연산자입니다.
비교 연산자는 왼쪽의 피연산자와 오른쪽의 피연산자를 비교하여, 어느 쪽이 더 큰지, 작은지, 또는 서로 같은지를 판단합니다.
즉, 좌항과 우항 사이에 비교 연산자가 위치해서 왼쪽과 오른쪽의 크기가 같은지, 혹은 누가 큰지, 누가 작은지 크기를 비교해서 그 결과를 true나 false 값으로 돌려주는 연산자입니다.
비교 연산자는 false와 true, 이 두 가지 값만 반환하니 참고하시기 바랍니다.
비교 연산자는 모두 두 개의 피연산자를 가지는 이항 연산자이며, 기본적으로 =은 <, >보다 앞에 나올 수 없습니다.
ES6에서 추가된 “화살표 함수”로 표현돼 하기 위한 예약어로써 존재하기 때문에 크거나 같은, 작거나 같은 연산자를 사용할 때는 항상 <,>가 앞에 나오는 것으로 기억하면 됩니다.
다시 말해 비교 연산자는 좌항과 우항을 비교하여 boolean 값으로 반환하는 연산자라고 정의할 수 있겠습니다.
아래의 예제를 봐주세요.
1
2
3
|
system.out.println(2 < 10); //true;
system.out.println(2 >= 10); //false;
system.out.println(2 == 10); //false;
|
cs |
각각 좌항이 우항보다 크다면 true, 그렇지 않다면 false,
좌항이 우항보다 크거나 같으면 true, 그렇지 않다면 false,
좌항과 우항의 `값`만을 비교하여 boolean의 출력하는 결과입니다.
비교 연산자에는 꼭 숫자만 써야 하는 것은 아닙니다.
1
2
|
system.out.println("one"=="two"); //false;
system.out.println("two"=="two"); //true;
|
cs |
첫 번째 println의 좌항에 있는"one"이 우항에 있는"two"과는 서로 다르므로 false가 되므로 결괏값은 false,
두 번째 println의 좌항과 우항의 "two"는 true가 됩니다
문자열을 비교할 때 반드시 참고해야 하는 것이 있습니다.
문자열을 비교할 때는 동등 비교 연산자(==)로 비교하는 것이 아닌 equals()라는 메소드를 사용해야 합니다.
1
2
3
4
|
String a="Hello World";
String b=new String("Hello World");
system.out.println(a==b); //문자열은 ==로 비교하는것이 아니다. false
system.out.println(a.equals(b)); //true;
|
cs |
a==b의 경우 둘 다 "Hello World"라는 값을 만들었기 때문에 true가 되어야 할 것 같지만 문자열을 비교할 때는. equals()를 쓴다는 것을 꼭 기억해야 합니다. 따라서 첫 번째 값은 false가 되는 것입니다.
<비교 연산자 예제>
1
2
3
4
5
6
7
8
|
int i = 10;
int j = 3;
int h = 5;
System.out.println("i == j >> " + (i == j));
System.out.println("i != j >> " + (i != j));
System.out.println("i > j >> " + (i > j));
System.out.println("i < j >> " + (i < j));
|
cs |
<실행 결과>
i == j >> false
i!= j >> true
i > j >> true
i < j >> false
논리 연산자
논리 연산자는 주어진 논리식을 판단하여, 참(true)과 거짓(false)을 결정하는 연산자입니다.
AND 연산과 OR 연산은 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 왼쪽에서 오른쪽입니다.
- AND는 &&기호로 나타냅니다. &는 앰퍼샌드라고 하며 숫자 7번 키 위에 있는 기호입니다. &&는 좌항과 우항이 모두 참일 때 참이 됩니다.
- OR연산자는 좌항과 우항 중 하나라도 참이면 전체가 참이 됩니다. 즉 ||는 하나라도 참이라면 전체가 참이 되는 논리인 것입니다. OR연산자의 기호는 ||입니다. Enter와 Delete키 사이에 있는 \기호입니다. Shift 키를 누른 상태로 입력합니다.
- ! 는 불륜의 값을 역전하는 역할을 하는데! true처럼 true앞에! 가 오면 false가 되고! false처럼 false 앞에! 가 오면 true가 됩니다.
<논리 연산자 예제>
1
2
3
4
5
6
7
8
|
int i = 10;
int j = 3;
int h = 5;
System.out.println("&&(AND) >> " + (i > j && i > h));
System.out.println("&&(AND) >> " + (i > j && i < h));
System.out.println("||(OR) >> " + (i > j || i < h));
System.out.println("||(OR) >> " + (i > j || i > h));
|
cs |
<실행결과>
&&(AND) >> true
&&(AND) >> false
||(OR) >> true
||(OR) >> true
다음은 논리 연산자의 모든 동작의 결과를 보여주는 진리표(truth table)입니다.
이때 a&&b -> (수식 1)&&(수식 2) 일 경우 수식 2가 실행이 될 수도, 안 될 수도 있습니다.
이유는 앞이 false면 뒤에 수식을 확인할 필요가 없어지기 때문입니다.
a||b 역시 앞이 t면 뒷부분은 수식 동작이 안 되는 점 참고하세요.
a |
b |
a&&b |
a||b |
! a |
C |
a||b||c |
a&&b&&c |
a||b&&c |
true |
True |
true |
true |
False |
false |
True |
False |
True |
true |
false |
false |
true |
False |
false |
True |
False |
Ture |
false |
true |
false |
true |
True |
false |
True |
False |
False |
false |
false |
false |
true |
Ture |
false |
False |
false |
false |
논리곱(&&, AND) 연산의 경우에는 양쪽이 둘 다 참이어야 결괏값이 참이 되고, 논리합(||,OR) 연산의 경우에는 양쪽 중 하나만 참이어도 결과값이 참이 된다는 걸 알 수 있습니다.
비트 연산자
비트 연산자는 논리 연산자와 비슷하지만, 비트(bit) 단위로 논리 연산을 할 때 사용하는 연산자입니다.
비트 연산은 정수나 정수로 변환 가능한 타입만 가능하며, 실수나 포인터 등은 비트 연산을 할 수 없습니다.
또한, 비트 단위로 왼쪽이나 오른쪽으로 전체 비트를 이동하거나, 1의 보수를 만들 때도 사용됩니다.
비트는 바이트 단위보다 더 작은 단위이며, 2진수를 저장합니다.
즉 컴퓨터에서 사용할 수 있는 최소 단위이며 0과 1을 나타냅니다.
'개발자였던 것 > JAVA 기초' 카테고리의 다른 글
반복문 (0) | 2020.03.05 |
---|---|
순서도 (0) | 2020.03.03 |
자바의 자료형 정리 (상수/변수/자료형) (2) | 2020.03.02 |
아스키코드와 유니코드 (0) | 2020.03.02 |
개발자 기초 용어 (0) | 2020.03.02 |