본문 바로가기

JAVA/온라인 스터디

[3주차] 연산자

목표

자바가 제공하는 다양한 연산자를 학습하세요.

 

학습할 것

1. 산술 연산자

2. 비트 연산자

3. 관계 연산자

4. 논리 연산자

5. instanceof

6. 대입 연산자 assignment(=) operator

7. 화살표 (->) 연산자

8. 3항 연산자

9. 연산자 우선 순위

10. (선택) Java 13. switch 연산자


1. 산술 연산자 (Arithmetic Operator)

연산자란 기본적인 작업을 위해 사용하는 기호를 일컫는다. 쓰이는 기호에 따라 각기 다른 작업을 수행하게 된다. 산술 연산자의 경우 사칙연산을 위해 사용하는 기호들을 말한다. 다음 표는 산술 연산자의 기호들이다. 

 

+ 더하기
- 빼기
* 곱하기
/ 나누기
% 나머지

각 산술연산자의 기호들은 예시를 활용하면 보다 더 쉽게 이해를 할 수 있다. 

 

산술연산자 각 예제

 

실행 결과

왜 0일까?

해당 사칙연산은 기본적인건 이해가 되나, 네 번째 사칙연산인 "x/y"의 값이 소수점이 나오지 않고, 0으로 나온 점을 주목해야 한다. 이는 x에 int형만 들어갈 수 있기 때문이다. 만약 소수점을 보고 싶다면, x와 이를 함께 연산하는 y의 자료형을 double로 지정하는 등 형변환이 일어나야 한다. 상세한 예시는 다음과 같다. 

 

double 형으로 연산
형 변환 결과

double형으로 변환한 a와 b의 값은 소수점까지 제대로 출력되는 것을 확인할 수 있다. 

 

참고자료

1. opentutorials.org/course/1223/5331

2. 인프런 - 자바 프로그래밍 입문


2. 비트 연산자 (Bit Operator)

비트 연산자는 데이터를 비트(bit) 단위로 환산하여, 연산을 하는 것을 말한다. 이는 다른 연산자보다 더 빠르게 연산을 하기 위함이다. 비트 연산자는 다음과 같다. 

& AND 연산 a&b a 와 b가 모두 1이면 1
| OR 연산 a|b a 와 b 둘중에 하나라도 1이면 1
^ XOR 연산 a^b a 와 b가 같지 않으면 1

비트 연산자의 경우 데이터를 비트 단위로 환산하여 연산하기 때문에 2진법으로 숫자를 환산하여 진행이 된다. 다음 예시는 이진법을 이해하면 보다 더 이해가 쉽다. 

비트연산자 소스 코드
 실행 결과

x와 y의 값은 2와 3인데 어떻게 실행 결과도 2와 3이 되는걸까?

이는 모든 숫자를 이진법으로 변환하여 생각하면 쉽다. 우선, 숫자 2와 3을 이진법으로 변환하면 다음과 같다. 

& 연산

위의 그림처럼 &연산자는 둘다 1일 경우에만 1이된다. 즉 0이 하나라도 존재하면 0으로 출력된다. 그 결과 노란색으로 표시된 부분에 집중하면 된다. & 연산 결과는 10인것으로 볼 수 있다. 이를 10진법으로 변환하면 숫자 2이므로, 실행결과가 2로 나오게 된다. 

 

연산

위의 그림처럼 |연산자는 둘중 하나라도 1일 경우에는 1이된다. 이말은 0이 있더라도 1이 한 개만 있으면 1이 된다. | 실행 결과는 11이다. 이를 10진법으로 변환하면 숫자 3이므로, 실행결과가 3으로 나오게 된다. 

^ 연산

이 연산의 경우 둘이 같은지 판별하는 연산이다. 즉 같을경우에는 0, 다를 경우에는 1이 출력된다. 그래서 ^ 실행결과는 01이다. 이를 10진법으로 변환하면 숫자 1이되므로, 실행결과가 1이된다. 

 

참고자료

1. 인프런 - 자바 프로그래밍 입문


3. 관계 연산자 (Relational Operator)

관계 연산자는 두개의 피연산자를 비교해서 참과 거짓을 도출할 경우에 사용한다. 피연산자란 연산자가 아닌 것. 즉 연산이 되는 대상을 일컫으며, 예제에서 사용하던 x와 y가 이에 해당된다. 관계 연산자는 다음의 기호들이 사용된다. 

> a>b a가 b보다 크면 참
< a<b a가 b보다 작으면 참
>= a>=b a가 b보다 크거나 같으면 참
<= a<=b a가 b보다 작거나 같으면 참
== a==b a가 b와 같으면 참
!= a!=b a와 b가 같지 않으면 참

관계 연산자는 다음 예시를 통해 보면 이해가 쉽다. 

 

관계 연산자 소스 코드 예시
실행 결과

실행 결과와 함꼐 보면, 이해가 가므로, 확인하면 된다. 

 

 

참고자료

1. 인프런 - 자바 프로그래밍 입문


4. 논리 연산자 (Logical Operator)

논리 연산자는 피연산자들의 논리곱, 논리합, 논리부정을 수행한다. 이에 해당하는 기호는 다음과 같다. 

&& 논리곱 (AND) a && b a와 b가 모두 참이면 참
|| 논리합 (OR) a || b a 또는 b가 참이면 참
! 논리부정 (NOT) !a a의 상태 부정

이 연산자들은 다음 예시를 보면 이해가 쉽다. 

논리 연산자 소스 코드
실행 결과

! 연산자의 상태 부정이라 함은, b1의 값이 false가 대입되었을때, !b1을 실행하면 true가 된다. b2 값이 true가 대입되었을 때 !b2를 실행하면 false가 되는 것을 일컫는다. 

 

참고자료

1. 인프런 - 자바 프로그래밍 입문


5. instanceof

instanceof 연산자는 참조 변수가 참조하고 있는 인스턴스의 실제 타입을 반환한다. 즉, 해당 객체가 어떤 클래스나 인터페이스로부터 생성되었는지를 판별해주는 역할을 한다. 

instanceof 를 사용하기 위해선 다음과 같이 작성한다. 

인스턴스이름 instanceof 클래스 또는 인터페이스 이름

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

 

다음 예시를 통해 이해하면 쉽다. 

instanceof 예시

위와 같이 실행했을때는 2번째만 false가 나오고 나머지는 true가 나오는 것을 확인할 수 있다. 이는 B 클래스가 자식 클래스로서 A 클래스내에 들어가 있는 구성요소는 포함하지만, B 클래스에 들어가 있는 것은 A에는 없기 때문에 나타난 결과이다. 

 

 

 

참고자료

1. www.tcpschool.com/java/java_operator_etc


6. 대입 연산자 (assignment(=) operator)

대입 연산자란 오른쪽의 결과를 왼쪽에 대입 / 할당하는 것을 의미한다. 대입 연산자에 사용되는 기호들은 다음과 같다. 

연산자 예시 같은 의미
= a = b a = b
+= a += b a = a + b
-= a -= b a = a - b
*= a *= b a = a * b
/= a /= b a = a / b
%= a %= b a = a % b

 

위의 표에 나온것처럼 연산자를 기준으로 오른쪽에 있는 값을 왼쪽에 넣는것을 의미한다. 예를들어 += 연산자의 경우 다음과 같다. a + b 를 한 뒤, 그 값을 a 에 넣으라는 뜻이다. 다음 예시를 보면 이해가 편한다. 

 

대입 연산자 예시

 

실행결과

순차적으로 설명하면 다음과 같다.

 

1) b에 우선 a의 값을 대입했다. 

2) b = 10인 상태에서 a의 값 10을 더한후 출력하기 때문에 20이 되었다. 

3) b = 20인 상태에서 a의 값 10을 뺀 후 출력하기 때문에 10이 되었다. 

4) b = 10인 상태에서 a의 값 10을 곱한 후 출력하기 때문에 100이 되었다. 

5) b = 100인 상태에서 a의 값 10을 나눈 후 출력하기 때문에 10이 되었다. 

 

이렇게 편리하게 값을 계산 할 수 있다. 

 

참고자료

1. 인프런 - 자바 프로그래밍 입문

2. www.programiz.com/java-programming/operators


7. 화살표 (->) 연산자

화살표(->) 연산자는 람다 표현식에서 사용하는 연산자이다. 람다표현식(lambda expression)이란 간단히 말해 메소드를 하나의 식으로 표현한 것이다. 예를 들면 다음과 같다. 

 

메소드
int min(int x, int y){
     return x < y ? x:y;
}
람다표현식
(x, y) -> x <y ? x: y;

위와 같이 람다 표현식으로 작성을 하게 되면, 클래스를 작성하고 객체를 생성하지 않아도 메소드를 사용할 수 있다. 이는 Java SE 8 부터 사용할 수 있게 되었다. 그렇다면, 람다 표현식은 어떻게 작성할 수 있을까? 

 

(매개변수목록) -> {함수몸체}

람다 표현식은 위와 같이 작성을 하면 된다. 단, 이때 작성시 유의사항이 존재한다. 이는 다음과 같다. 

 

1) 매개변수의 타입을 추론할 수 있는 경우에는 타입을 생략할 수 있다. 

2) 매개변수가 하나인 경우에는 괄호 ((()))를 생략할 수 있다. 

3) 함수의 몸체가 하나의 명령문만으로 이루어진 경우에는 중괄호 ({})를 생략할 수 있다. (이때, 세미콜론 (;)을 붙이지 않는다.)

4) 함수의 몸체가 하나의 return문으로만 이루어진 경우에는 중괄호 ({})를 생략할 수 없다. 

5) return 문 대신 표현식을 사용할 수 있으며, 이때 반환값은 결과값이 된다. (이때, 세미콜론 (;)을 붙이지 않는다.)

 

람다 표현식 예제

위의 예제를 실행하면 출력하고자 하는 문장 두개가 출력된다. 

 

전통적인 방식의 일회용 스레드 생성

람다 표현식을 사용한 일회용 스레드 생성

 

이처럼 람다 표현식을 사용하면 불필요한 코드를 줄이고, 코드의 가독성을 높일 수 있다고 한다. 

참고자료

1. www.tcpschool.com/java/java_lambda_concept


8. 3항 연산자

3항 연산자는 피연산자가 3개가 되는 경우를 일컫는다. 3항 연산자를 설명하기에 앞서, 단항 연산자 이항 연산자 부터 설명하겠다. 다음 표를 참고하면 이해가 편하다. 

단항 연산자 피연산자가 하나만 존재 ex) +11, -14, !a
이항 연산자 피연산자가 두 개 존재 ex) a = 11, a= b, a <b, a !=b
삼항 연산자 피 연산자가 세 개 존재 ex)  a = b : true ? false

다음은 단항 연산자, 이항 연산자, 삼항 연산자 별로 연산자와 피 연산자를 구분한 그림이다. 이름 참고하면 이해가 쉽다. 

 

단항연산자 예시
이항연산자 예시
삼항연산자 예시

각 그림들을 보면 피연산자의 숫자에 따라 불리는 호칭이 다른 것을 확인할 수 있다. 단항연산자와 이항연산자의 경우 위에서 살펴봤으니, 이번에는 삼항연산자에 대해 자세히 설명하겠다. 

 

삼항연산자는 두개의 피연산자로 이루어진 조건식의 결과에 따라 나머지 피연자가 결정되는 방식으로 위의 그림 예시로 이해를 하면, a = b 라는 조건식이 참일 경우에는 물음표 앞의 true 피연산자가 출력되고, 거짓일 경우에는 false 피연산자가 출력이 된다. 이를 이해하기 위해선 다음의 예시를 살펴보면 된다. 

 

삼항연산자 예시
실행 결과

1) z에 x가 y를 비교한 값을 대입한다. 이때, x가 y보다 클 경우 (=참이면) 100을 출력, 거짓이면 200을 출력하는 연산자이다. 첫 번째의 경우 거짓이기 때문에 200이 출력되었다. x = 2,  y = 3이다. 

2) z에 x가 y를 비교한 값을 대입한다. 이때, x 가 y보다 작을 경우 (=참이면) 100을 출력, 거짓이면 200을 출력하는 연산자이다. 두 번째의 경우 참이기 때문에 100이 출력되었다. x = 2,  y = 3이다. 

3) z에 x가 y를 비교한 값을 대입한다. 이때, x와 y가 같을 경우 (=참이면) 100을 출력, 다를 경우 (=거짓이면) 200을 출력하는 연산자이다. 세 번째의 경우 거짓이기 때문에 200이 출력되었다. x = 2,  y = 3이다.

 

 

참고자료

1. 인프런 - 자바 프로그래밍 입문


9. 연산자 우선 순위

이처럼 다양한 연산자를 활용하여, 여러 방면으로 활용 할 수 있다. 그렇다면, 특정 연산을 다른 것보다 먼저 하고 싶을 경우에는 어떻게 해야할까? 이럴때를 위해 연산자에는 우선 순위가 지정되어 있다. 다음 표를 참고하면 이해가 쉽다. 

 

출처: 생활 코딩https://opentutorials.org/course/1223/5331

이와 같은 우선순위는 예시를 이용하면 이해가 더 쉽다. 

연산자 우선순위 예시

a 에 대입되는 연산자를 만약 보이는 식으로 계산을 하면, 

 

1) 5-2 = 3

2) 3 *3 = 9 

 

라는 실행 결과가 나와야 한다. 하지만 실제로 실행 결과를 보면, 

 

실행 결과

이 나온것을 알 수 있다. 이는 위의 우선순위 표를 참고하면 이해가 더 쉽다. 현재 연산에서는 = , - , * 연산자들이 사용된다. 이를 우선순위 대로 나열하면 *, - , = 이 된다. 그래서 해당 방법대로 연산을 하면 다음과 같다. 

 

1) 2*3 = 6

2) 5-6 = -1

 

이렇게 -1이 되는 것을 알 수 있다. 만약 첫번째 처럼 연산을 하고 싶다면, 간단하게 연산자의 가장 높은 우선순위인 ()를 사용하면 된다. 

 

() 사용

이렇게 ()를 사용하여 가장 먼저 연산했으면 하는 부분에 표시를 한다. 이렇게 될경우 

1) 5-2 = 3

2) 3*3 = 9

 

와 방식으로 연산이 되어 다음과 같은 결과가 출력된다. 

 

실행 결과

우선 순위의 경우 표를 이용하여 참고하면 쉽게 이해할 수 있다. 

 

참고자료

1. 생활코딩 opentutorials.org/course/1223/5331


10. (선택) Java 13. switch 연산자

(추후 보강 예정)

 

 

 

참고자료

1. 

'JAVA > 온라인 스터디' 카테고리의 다른 글

[5주차] 클래스  (0) 2020.12.14
[4주차] 제어문 #4  (0) 2020.12.10
2주차 라이브 방송 정리  (0) 2020.11.22
2주차 자바 데이터 타입, 변수 그리고 배열  (0) 2020.11.21
1회차 피드백 정리  (0) 2020.11.17