자바-3(연산자)

dragonappear·2021년 3월 8일
0

Java

목록 보기
3/22

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


학습할 것

산술 연산자
비트 연산자
관계 연산자
논리 연산자
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){
    	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){
		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 {}

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));
}

사용함에 있어서 특별한 조건이 필요하지만, 지금은 화살표 연산자 왼쪽엔 매개변수들이, 오른쪽에는 그 매개 값을 사용하는 로직이 작성된다고 알고 넘어가자.
15주차 람다식에 대해 정리할때 자세히 다뤄보자.


3항 연산자:

  • 사용법: (조건) ? (조건이 참일때 실행):(조건이 거짓일때 실행)
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

0개의 댓글