자바-3(연산자)
# 목표
자바가 제공하는 다양한 연산자를 학습하세요.
학습할 것
산술 연산자
비트 연산자
관계 연산자
논리 연산자
instanceof
assignment(=) operator
화살표(->) 연산자
3항 연산자
연산자 우선 순위
(optional) Java 13. switch 연산자
출처:링크텍스트
산술 연산자:
- 자바에서 산술연산은 사칙연산과 나머지연산을 포함하여 총 5가지 연산이다.
- 산술연산에서는 타입 캐스팅(명시적 형변환)과 타입 프로모션(묵시적 형변환)이 빈번히 발생할수있기 때문에,데이터 타입에 따른 값의 변화에 주의해야한다.
- 또한 산술연산 결과로 데이터의 범위를 벗어나서 원하는 결과를 얻지 못할수있다.
public class example{
public static void main(String[] args){
int v1= 10;
int v2= 3;
system.out.println(v1+v2); // 13
system.out.println(v1-v2); // 7
system.out.println(v1*v2); // 30
system.out.println(v1/v2); // 3
system.out.println(v1%v2); // 1
// ex :
// int start = 20억;
// int end = 21억;
// int mid = (start+end)/2 는 오버플로우가 살생한다.
// 아래의 방식은 오버플로우를 피할수있다.
int mid = start + (end-start) / 2;
// or
int mid = (start+end) >>> 1;
}
}
public class example{
public static void main(String[] args){
int v1= 10;
int v2= 3;
system.out.println(v1+v2); // 13
system.out.println(v1-v2); // 7
system.out.println(v1*v2); // 30
system.out.println(v1/v2); // 3
system.out.println(v1%v2); // 1
// ex :
// int start = 20억;
// int end = 21억;
// int mid = (start+end)/2 는 오버플로우가 살생한다.
// 아래의 방식은 오버플로우를 피할수있다.
int mid = start + (end-start) / 2;
// or
int mid = (start+end) >>> 1;
}
}
예시로 작성한 코드에서는 정수형 자료형을 사용하여 연산을 해서 정수 표현 범위 내에서만 결과가 만들어졌다.
public class example{
public static void main(String[] args){
double v1= 10;
double v2= 3;
system.out.println(v1+v2); // 13.0
system.out.println(v1-v2); // 7.0
system.out.println(v1*v2); // 30.0
system.out.println(v1/v2); // 3.3333333333333335
system.out.println(v1%v2); // 1.0
}
}
실수 표현 범위를 가질수 있기 때문에 소수점 아래 값도 계산되어 결과가 나오는 것을 볼수있다.
비트 연산자:
- 비트 연산은 1(true)과 0(거짓)을 가지고 수행한다.
- ~ : 단항연산자로써 not을 의미하고 1은 0으로, 0은 1로 변환한다.
- & : 이항연산자로써 and를 의미하고 양쪽 항의 값이 모두 1인경우에만 1을 반환한다.
- | : 이항연산자로써 or을 의미하고 양쪽 항의 값이 모두 0인경우에만 0을 반환한다.
- ^ : 이항연산자로써 exclusive or을 의미하고 양쪽 항의 값이 서로 다를때만 1을 반환한다.
public class example{
public static void main(String[] args){
int v1=10; // 00000000 00000000 00000000 00001010
int v2=15; // 00000000 00000000 00000000 00001111
system.out.println(~v1) // 11111111 11111111 11111111 11110101= -11
system.out.println(v1&v2) // 00000000 00000000 00000000 00001010 = 10
system.out.println(v1|v2) // 00000000 00000000 00000000 00001111 = 15
system.out.println(v1^v2) // 00000000 00000000 00000000 00000101 = 5
}
}
관계 연산자:
public class example{
public static void main(String[] args){
int v1=10; // 00000000 00000000 00000000 00001010
int v2=15; // 00000000 00000000 00000000 00001111
system.out.println(~v1) // 11111111 11111111 11111111 11110101= -11
system.out.println(v1&v2) // 00000000 00000000 00000000 00001010 = 10
system.out.println(v1|v2) // 00000000 00000000 00000000 00001111 = 15
system.out.println(v1^v2) // 00000000 00000000 00000000 00000101 = 5
}
}
출처:링크텍스트
public class example{
public static void main(String[] args){
system.out.println(10==10) // true
system.out.println(10==20) // false
system.out.println(10!=10) // false
system.out.println(10!=20) // true
system.out.println(10>20) // false
system.out.println(10<20) // true
system.out.println(10>=10) // true
system.out.println(10>=20) // false
}
}
논리 연산자
- 비트연산과 비슷하지만, 논리 연산자의 피연산자는 boolean 타입의 논리 값이다.
- ! = 논리적인 부정을 뜻하며, true는 false로 false는 true로 반환한다.
- && = 두항 모두 참일때만 참을 반환한다.
- || = 두항 모두 거짓일때만 거짓을 반환한다.
public class example{
public static void main(String[] args){
bool b1= true;
bool b2= false;
if (b1 & b2) //
if (b1 | b2) //
if (b1 && b2) //
if (b1 || b2) //
}
}
- &와 &&의 차이점: &는 첫번째 조건이 참이 아니어도 두번째 조건을 확인한다. &&는 첫번째 조건이 참이 아니면 두번째 조건은 확인하지 않는다.
- | 와 ||의 차이점: |는 첫번째 조건이 참이어도 두번째 조건을 확인한다. ||는 첫번째 조건이 참이면 두번째 조건은 확인하지 않는다.
instanceof:
- 사용하는 방법: "(레퍼런스 타입변수) instanceof (레퍼런스 데이터 타입)"
- 레퍼런스 타입 변수가 레퍼런스 타입의 데이터인지 확인하는 연산이다.
- 다양한곳에서 사용할수있지만, 보통 레퍼런스 타입 변수가 레퍼런스 데이터 타입으로 타입 변환이 가능한지 확인하기 위해서 사용한다.
public class example{
public static void main(String[] args){
MyParents_0 myParents_0 = new MyParents_0();
MyParents_1 myParents_1 = new MyParents_1();
MyParents_2 myParents_2 = new MyParents_2();
System.out.println(myParents_0 instanceof MyInterface); // false
System.out.println(myParents_1 instanceof MyInterface); // true
System.out.println(myParents_2 instanceof MyInterface); // true
System.out.println(myParents_1 instanceof MyParents_2); // true
if (myParents_1 instanceof MyInterface){
MyInterface myInterface = new MyParents_1(); // 자신의 상위 타입의 변수에 값을 할당할수있다.
System.out.println(myInterface!=null); // 자신의 상위 타입의 변수에 값을 할당할수 있다.
}
//
}
}
class MyParents_0 {}
class MyParents_1 extends MyParents_2 {}
class MyParents_2 implements MyInterface {}
interface MyInterface {}
public class example{
public static void main(String[] args){
bool b1= true;
bool b2= false;
if (b1 & b2) //
if (b1 | b2) //
if (b1 && b2) //
if (b1 || b2) //
}
}
- 사용하는 방법: "(레퍼런스 타입변수) instanceof (레퍼런스 데이터 타입)"
- 레퍼런스 타입 변수가 레퍼런스 타입의 데이터인지 확인하는 연산이다.
- 다양한곳에서 사용할수있지만, 보통 레퍼런스 타입 변수가 레퍼런스 데이터 타입으로 타입 변환이 가능한지 확인하기 위해서 사용한다.
public class example{
public static void main(String[] args){
MyParents_0 myParents_0 = new MyParents_0();
MyParents_1 myParents_1 = new MyParents_1();
MyParents_2 myParents_2 = new MyParents_2();
System.out.println(myParents_0 instanceof MyInterface); // false
System.out.println(myParents_1 instanceof MyInterface); // true
System.out.println(myParents_2 instanceof MyInterface); // true
System.out.println(myParents_1 instanceof MyParents_2); // true
if (myParents_1 instanceof MyInterface){
MyInterface myInterface = new MyParents_1(); // 자신의 상위 타입의 변수에 값을 할당할수있다.
System.out.println(myInterface!=null); // 자신의 상위 타입의 변수에 값을 할당할수 있다.
}
//
}
}
class MyParents_0 {}
class MyParents_1 extends MyParents_2 {}
class MyParents_2 implements MyInterface {}
interface MyInterface {}
instanceof 연산 결과가 true일 경우 해당 타입의 변수에 값을 할당할수있다.
assignment(=) operator:
- 오른쪽의 피연산자를 왼쪽의 피연산자의 값으로 할당한다.
- 왼쪽에는 변수가 오른쪽엔 리터럴 또는 리터럴이 담긴 변수가 온다.
- 등호(=)만 사용하는 경우도 있지만, 다른 연산자를 함꼐 사용하여 문장의 길이를 줄이기도 한다. +=,-= 등등
public class example{
public static void main(String[] args){
int v1= 10;
System.out.println(v1+=20); // 30
System.out.println(v1); // 30
}
}
비트 연산자:
public class example{
public static void main(String[] args){
int v1,v2;
v1= 17; // 00000000 00000000 00000000 00010001 = 17
v2 = v1 << 3; // 00000000 00000000 00000000 10001000 = 136
v1= 17; // 00000000 00000000 00000000 00010001 = 17
v2 = v1 >> 3; // 00000000 00000000 00000000 00000010 = 2
v1= -17; // 11111111 11111111 11111111 11101111 = -17
v2 = v1 >> 3; // 11111111 11111111 11111111 11111101 = -3
v1= 17; // 00000000 00000000 00000000 00010001 = 17
v2 = v1 >>> 3; // 00000000 00000000 00000000 00000010 = 2
v1= -17; // 11111111 11111111 11111111 11101111 = -17
v2 = v1 >>> 3; // 00011111 11111111 11111111 11111101 = 536870909
}
}
- '>>' 와 '>>>' 차이: >>는 오른쪽으로 비트이동할떄 MSB값으로 채우고, >>>는 0을 채운다.
화살표(->) 연산자:
- 자바8 에서 람다가 도입 되면서 등장한 연산자이다.
- 사용법 : (매개변수)->{함수몸체}, ()->{함수몸체}, (매개변수)->함수몸체, (매개변수)-{return 0;}
public void example(){
IntFunction intSum = (x) -> x+1;
System.out.println(intSum.apply(1));
}
public class example{
public static void main(String[] args){
int v1= 10;
System.out.println(v1+=20); // 30
System.out.println(v1); // 30
}
}
public class example{
public static void main(String[] args){
int v1,v2;
v1= 17; // 00000000 00000000 00000000 00010001 = 17
v2 = v1 << 3; // 00000000 00000000 00000000 10001000 = 136
v1= 17; // 00000000 00000000 00000000 00010001 = 17
v2 = v1 >> 3; // 00000000 00000000 00000000 00000010 = 2
v1= -17; // 11111111 11111111 11111111 11101111 = -17
v2 = v1 >> 3; // 11111111 11111111 11111111 11111101 = -3
v1= 17; // 00000000 00000000 00000000 00010001 = 17
v2 = v1 >>> 3; // 00000000 00000000 00000000 00000010 = 2
v1= -17; // 11111111 11111111 11111111 11101111 = -17
v2 = v1 >>> 3; // 00011111 11111111 11111111 11111101 = 536870909
}
}
- '>>' 와 '>>>' 차이: >>는 오른쪽으로 비트이동할떄 MSB값으로 채우고, >>>는 0을 채운다.
화살표(->) 연산자:
- 자바8 에서 람다가 도입 되면서 등장한 연산자이다.
- 사용법 : (매개변수)->{함수몸체}, ()->{함수몸체}, (매개변수)->함수몸체, (매개변수)-{return 0;}
public void example(){
IntFunction intSum = (x) -> x+1;
System.out.println(intSum.apply(1));
}
public void example(){
IntFunction intSum = (x) -> x+1;
System.out.println(intSum.apply(1));
}
사용함에 있어서 특별한 조건이 필요하지만, 지금은 화살표 연산자 왼쪽엔 매개변수들이, 오른쪽에는 그 매개 값을 사용하는 로직이 작성된다고 알고 넘어가자.
15주차 람다식에 대해 정리할때 자세히 다뤄보자.
3항 연산자:
- 사용법: (조건) ? (조건이 참일때 실행):(조건이 거짓일때 실행)
public class example{
public static void main(String[] args){
int v1= 10;
System.out.println((v1>10)?(v1=5):(v1=50)); // 50
}
}
연산자 우선 순위:
public class example{
public static void main(String[] args){
int v1= 10;
System.out.println((v1>10)?(v1=5):(v1=50)); // 50
}
}
출처:링크텍스트
(optional) Java 13. switch 연산자:
- java 13에서 switch는 statement가 아니고 operator(또는 expression)이다.
- break를 사용하지 않아도 되고, yield가 존재하며, return값이 존재해도 된다.
- 즉, 처리한 결과가 존재한다는 것이다.
- 그래서 이전의 switch와 비교했을때, switch 자체가 연산자로 작동하여 하나의 값으로 취급될 수 있따는 것을 의미한다.
public class example {
public static void main(String[] args) {
//Java 12 이전
int num = 1;
int returnNum = 0;
switch(num){
case 1:
returnNum = 1;
System.out.println("1들어옴");
break;
case 2:
returnNum = 2;
System.out.println("2들어옴");
break;
case 3:
returnNum = 3;
System.out.println("3들어옴");
break;
}
System.out.println("returnNum : [ " + returnNum + " ]"); // returnNum : [ 1 ]
//Java 12
returnNum = switch(num){
case 1 -> 1; // ->(화살표) 표현이 가능하고 data만 존재할 경우 return이 가능하다.+ break를 적지않아도 다음 case 구문으로 넘어가지 않는다.
case 2 -> 2; // ->표현 오른쪽은 꼭 단일 수행일 필요는 없다. 블록 {}안에서도 작업도 가능하다.
default -> throw new IllegalStateException("Unexpected value: " + num);
};
System.out.println("returnNum : [ " + returnNum + " ]"); // returnNum : [ 1 ]
//Java13
returnNum = switch(num){
case 1 : yield 3; // 3이 리턴된다.
default : throw new IllegalStateException("unexpected value : " + num);
};
System.out.println("returnNum : [ " + returnNum + " ]"); // returnNum : [ 3 ]
}
}
Quiz:
- Numbers라는 int형 배열이 있다
해당 배열에 들어있는 숫자들은 오직 한 숫자를 제외하고는 모두 두번씩 들어있다.
오직 한번만 등장하는 숫자를 찾는 코드를 작성하라.
package week3;
public class Quiz {
public static void main(String[] args) {
Quiz q = new Quiz();
int result = q.solution(new int[]{4,3,2,1,2,3,4});
System.out.println(result);
}
private int solution(int[] numbers) {
int result=0;
for (int number : numbers) {
result ^= number;
}
return result;
}
}
- 5 ^ 0 =5
- 5 ^ 5 =5
- 5 ^ 1 ^ 5 = (5 ^ 5)^1 = 0 ^ 1 = 1
Author And Source
이 문제에 관하여(자바-3(연산자)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@yyong3519/자바-3연산자
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
public class example {
public static void main(String[] args) {
//Java 12 이전
int num = 1;
int returnNum = 0;
switch(num){
case 1:
returnNum = 1;
System.out.println("1들어옴");
break;
case 2:
returnNum = 2;
System.out.println("2들어옴");
break;
case 3:
returnNum = 3;
System.out.println("3들어옴");
break;
}
System.out.println("returnNum : [ " + returnNum + " ]"); // returnNum : [ 1 ]
//Java 12
returnNum = switch(num){
case 1 -> 1; // ->(화살표) 표현이 가능하고 data만 존재할 경우 return이 가능하다.+ break를 적지않아도 다음 case 구문으로 넘어가지 않는다.
case 2 -> 2; // ->표현 오른쪽은 꼭 단일 수행일 필요는 없다. 블록 {}안에서도 작업도 가능하다.
default -> throw new IllegalStateException("Unexpected value: " + num);
};
System.out.println("returnNum : [ " + returnNum + " ]"); // returnNum : [ 1 ]
//Java13
returnNum = switch(num){
case 1 : yield 3; // 3이 리턴된다.
default : throw new IllegalStateException("unexpected value : " + num);
};
System.out.println("returnNum : [ " + returnNum + " ]"); // returnNum : [ 3 ]
}
}
- Numbers라는 int형 배열이 있다
해당 배열에 들어있는 숫자들은 오직 한 숫자를 제외하고는 모두 두번씩 들어있다.
오직 한번만 등장하는 숫자를 찾는 코드를 작성하라.
package week3;
public class Quiz {
public static void main(String[] args) {
Quiz q = new Quiz();
int result = q.solution(new int[]{4,3,2,1,2,3,4});
System.out.println(result);
}
private int solution(int[] numbers) {
int result=0;
for (int number : numbers) {
result ^= number;
}
return result;
}
}
- 5 ^ 0 =5
- 5 ^ 5 =5
- 5 ^ 1 ^ 5 = (5 ^ 5)^1 = 0 ^ 1 = 1
Author And Source
이 문제에 관하여(자바-3(연산자)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@yyong3519/자바-3연산자저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)