ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java 항해일지 - 3. 연산자
    공부일기/자바 스터디 2020. 11. 25. 17:54

     

    연산자란?

    계산을 하기 위해 사용하는 기호.

     

    • 단항 연산자

     

    연산자 사용법 기능 설명
    ++ v++ 후위 증가 v값 반환 후 v값 1 증가
    ++v 전위 증가 v값 1 증가 후 v값을 반환
    -- v-- 후위 감소 v값 반환 후 v값 1 감소
    --v 전위 감소 v값 1 감소 후 v값 반환
    + +a 1을 곱함 a값에 1 곱한 후 반환
    - -a -1을 곱함 a값에 -1 곱한 후 반환
    ~ ~a 비트를 전환(부호 바뀜) 제일 왼쪽 비트 0인 경우 1(음수)로 반환
    제일 왼쪽 비트 1인 경우 0(양수)으로 반환
    ! !boolean boolean 타입을 바꿈 true -> false
    false -> true

    예시

    public class Main {
    
        public static void main(String[] args) {
    
            int a = 3;
    		
            a++;
            System.out.println(a); // 4
            ++a;
            System.out.println(a); // 5
            
            System.out.println(a++); // 5
            System.out.println(++a); // 7
            System.out.println(a--); // 7
            System.out.println(--a); // 5
        }
    }

    실행 결과

    4
    5
    5
    7
    7
    5

    a가 3일 때, a++ 후 a를 출력하면 4가 출력되고, ++a 후 a를 출력하면 5가 출력된다.

    그 후 

    a++를 출력할 경우 현재 a 값인 5를 출력하고 +1을 해주게 되고, a는 6인 상태가 된다.

    여기서 ++a를 출력하면 현재 a에 1을 더한 후 a를 반환하므로 7(6+1)을 반환하게 된다.

     

    단항 연산자 +,-의 예시는 아래와 같다.

    예시

    public class Main {
    
        public static void main(String[] args) {
        
        	int a = -3;
    		
            a = +a;
            System.out.println(a);
            
            a = -a;
            System.out.println(a);
        }
    }

    실행 결과

    -3
    3

    음수에 양수를 곱해도 음수이므로 첫 번째 연산인 +a는 그대로 -3으로 출력된다. 

     

     

    • 산술 연산자

     

    연산자 사용법 기능 설명
    + a + b 더하기 a와 b를 더한다
    - a - b 빼기 a와 b를 뺀다
    * a * b 곱하기 a와 b를 곱한다
    / a / b 나누기 a와 b를 나눈다
    % a % b 나머지 a를 b로 나눈 나머지를 구한다

    사용 예시

    public class Main {
    
        public static void main(String[] args) {
        
        	result = 5 + 1; // result의 값은 6
            System.out.println(result);
            
            result = result - 2; // result의 값은 4
            System.out.println(result);
            
            result = result * 3; // result의 값은 12
            System.out.println(result);
            
            result = result / 4; // result의 값은 3
            System.out.println(result);
            
            result = result %  5; // result의 값은 3
            System.out.println(result);
        }
    }
    6
    4
    12
    3
    3

     

    '+' 연산자의 경우 문자열과 문자열을 결합할 때도 사용할 수 있다. 

    public class Main {
    
        public static void main(String[] args) {
        
        	String hello = "Hello";
            String world = "World";
            String greeting = hello + world;
            
            System.out.println(greeting);
        }
    }
    Hello World

     

     

    피연산자가 byte, char, short 등의 4byte보다 작다면 두 개의 피연산자를 int형(4byte)으로 변환하고 연산을 수행한다.

    public class Main {
    
        public static void main(String[] args) {
        
        	byte a = 1;
            byte b = 2;
            
            
        	byte c = a + b;
        }
    }

    위의 코드를 실행하게 되면 error : Type mismatch: cannot convert from int to byte 오류가 발생한다. byte형은 1byte이므로 + 연산자가 int형으로 변환 후 연산을 수행한다. 따라서 a+b는 int형으로 변하고, int형을 byte에 담을 수 없기 때문에 에러가 나는 것이다.

    큰 크기의 자료형을 작은 크기 자료형에 넣기 위해선 캐스팅 연산이 필요하다.

     

    public class Main {
    
        public static void main(String[] args) {
        
        	byte a = 1;
            byte b = 2;
            
            
        	byte c = (byte)(a + b);
        }
    }
    30

    () 연산은 방향이 <---- 이므로 (a+b) > (byte) 순으로 연산하게 되어 30이 출력된다.

     

    타입별로 나누면 어떻게 될까?

    public class Main {
    
        public static void main(String[] args) {
        
            int a = 10;
            int b = 3;
              
            float c = 10.0F;
            float d = 3.0F;
              
            System.out.println(a/b); // 정수/정수
            System.out.println(c/d); // 실수/실수
            System.out.println(a/d); // 정수/실수
            System.out.println(c/a); // 실수/정수
        }
    }
    3
    3.3333333
    3.3333333
    1.0

    위에서부터 정수와 정수를 나눈 경우 몫만 출력되고 나머지는 버려진다. 그러나 세 번째, 네 번째의 경우 암시적인 형 변환이 일어나기 때문에 정수가 실수가 되어 출력된다.

     

    • 비트 연산자

     

    비트 연산자는 이진 비트연산을 한다.

     

    1) 비트 논리 연산자

    연산자 사용법 기능 설명
    & a & b AND 두 비트 모두 1일 경우에만 1
    | a | b OR 두 비트 중 하나만 1일 경우 1
    ^ a ^ b XOR 두 비트가 서로 다를 경우 1
    ~ ~a  NOT 0은 1로, 1은 0으로

    예시)

    public class Main {
    
        public static void main(String[] args) {
        
            int a = 10;
            int b = 3;
            
            System.out.println(a & b);
            System.out.println(a | b);
            System.out.println(a ^ b);
            System.out.println(~a);
        }
    }
    2
    11
    9
    -11

    a와 b를 이진수로 나타내보면 아래와 같다.

    a 0 0 0 0 1 0 1 0
    b 0 0 0 0 0 0 1 1

     

    각 연산에 대해 계산한 결과:

    & (AND 연산) : 2

    0 0 0 0 0 0 1 0

    | (OR 연산) : 11

    0 0 0 0 1 0 1 1

    ^ (XOR 연산) : 9

    0 0 0 0 1 0 0 1

    ~ (NOT 연산) : -11

    1 1 1 1 0 1 0 1


    2) 비트 이동 연산자

    연산자 사용법 설명
    x<<y a << b 정수 x의 각 비트를 y만큼 왼쪽으로 이동
    빈자리는 0으로 채움
    x>>y a >> b 정수 x의 각 비트를 y만큼 오른쪽으로 이동
    빈자리는 최상위 부호비트와 같은 값으로 채움
    x>>>y a >>> b 정수 x의 각 비트를 y만큼 오른쪽으로 이동
    빈자리는 0으로 채워짐

    예시

    public class Main {
    
        public static void main(String[] args) {
            
            System.out.println(2 << 3);
            System.out.println(16 >> 3);
            System.out.println(-16 >> 3);
            System.out.println(-16 >>> 3);
        }
    }

    결과

    출처: https://coding-factory.tistory.com/521

    물음표 부분을 0으로 채운다. 결과 값은 16

     

    출처: https://coding-factory.tistory.com/521

    각각 최상위 부호비트인 0과 1을 채워주며 오른쪽으로 민다.

    결과 값은 2와 -2

     

    출처: https://coding-factory.tistory.com/521

    오른쪽으로 3칸 밀지만 최상위 부호비트가 아닌 0을 채워준다

    결과 값은 536870910

     

     

    • 관계 연산자

     

    관계 연산자는 쉽게 말해 부등호를 생각하면 된다. 결과는 boolean 타입으로 반환된다.

    연산자 사용법 설명
    >  a > b a가 b보다 크면 true, 아니면 false 반환
    < a < b a가 b보다 작으면 true, 아니면 false 반환
    >= a >= b a가 b보다 크거나 같으면 true, 아니면 false 반환
    <= a <= b a가 b보다 작거나 같으면 true, 아니면 false 반환
    == a == b a가 b와 같으면 true, 아니면 false 반환
    != a != b a가 b와 다르면 true, 아니면 false 반환

    예시

    public class Main {
    
        public static void main(String[] args) {
        
            int a = 10;
            int b = 3;
            
            System.out.println(a > b);
            System.out.println(a < b);
            System.out.println(a >= b);
            System.out.println(a <= b);
            System.out.println(a == b);
            System.out.println(a != b);
        }
    }
    true
    false
    true
    false
    false
    true

     

     

    • 논리 연산자

     

    논리 연산자 역시 결과가 true 혹은 false로 반환된다.

    연산자 사용법 설명
    && a && b a, b 모두 참인 경우 true, 그렇지 않으면 false
    || a || b a, b 둘 중에 하나만 참이면 true, 두 항 모두 거짓이면 false
    ! !a 참인 경우 false, 거짓인 경우 true 반환

    예시

    public class Main {
    
        public static void main(String[] args) {
        
            int a = 10;
            int b = 3;
            
            System.out.println((a>2) && (b>2));
            System.out.println((a>5) < (b>5));
            System.out.println(!(a==10));
        }
    }
    true
    true
    false

    첫 번째로 (a>2) && (b>2) 피연산자 두 개가 모두 참이므로 true가 반환된다.

    두 번째는 a>5는 참이지만, b>5는 거짓이다. 그러나 || 연산자는 두 항 중 하나만 참이면 true를 반환하므로 true가 반환된다.

    세 번째로 a==10 참이지만, ! 연산자는 true->false로 반환하므로 false가 반환됐다.

     

    • instanceof

     

    instanceof 연산자란?

    객체타입을 알아보기 위해 사용한다. 주로 조건문에 사용되며, instanceof를 기준으로 왼쪽에는 참조 변수, 오른쪽에는 타입(클래스명)이 피연산자로 위치한다. 주로 상속 관계에서 부모객체인지 자식객체인지 확인하는 데 사용한다.

    연산의 결과는 boolean타입으로 반환된다.

     

    예시

    public class Main {
    
        public static void main(String[] args) {
        
            A a = new a();
            B b = new b();
            
            System.out.println(a instanceof A);
            System.out.println(b instanceof A);
            System.out.println(a instanceof B);
            System.out.println(b instanceof B);
        }
    }
    
    class A {
    
    }
    
    class B extends A{
    
    }

    결과

    true
    true
    false
    true

    세 번재가 false인 이유는 a는 b의 부모객체이므로 형변환이 불가능하기 때문이다.

     

     

    • assignment(=) operator


    대입 연산자.

    변수에 값을 대입할 때 사용되며, 결합 방향은 <---.

     

    대입 연산자 사용법 설명
    = a = b 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에 대입
    &= a &= b a를 b와 비트 AND 연산 후 a에 대입
    |= a |= b a를 b와 비트OR 연산 후 a에 대입
    ^= a ^= b a를 b와 비트XOR 연산 후 a에 대입
    <<= a <<= b a를 b만큼 시프트연산 후 a에 대입
    >>= a >>= b a를 b만큼 시프트연산 후 a에 대입
    >>>= a >>>= b a를 b만큼 시프트연산 후 a에 대입

     

    예시

    public class Main {
    
        public static void main(String[] args) {
        
            int a = 8;
            int b = 4;
            
            System.out.println(a = b);
            System.out.println(a += b);
            System.out.println(a -= b);
            System.out.println(a *= b);
            System.out.println(a /= b);
            System.out.println(a %= b);
        }
    }

    결과

    4 // a에 4를 대입 후 반환 a=4
    8 // a에 a+b를 대입 후 반환 a=8
    4 // a에 a-b를 대입 후 반환 a=4
    16 // a에 a*b를 대입 후 반환 a=16
    4 // a에 a/b를 대입 후 반환 a=4
    0 // a에 a를 b로 나눈 나머지를 대입 후 반환 a= 0

     

    • 화살표(->) 연산자

    구글에 자바 화살표 연산자를 검색해보면 람다 표현식에 관한 정보가 나오기에 람다 표현식에 대해 공부했다.

    람다식은 함수를 따로 만들지 않고 코드 한줄에 함수를 쓰고 호출하는 방식이다.

    쉽게 말해 메소드를 하나의 식으로 표현한 것.

     

    기본적인 문법은

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

    예시

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

     

     

     


    3항 연산자

    if else문의 코드를 간결하게 사용할 수 있는 방식.

    public class Main {
    
        public static void main(String[] args) {
            int a = 8;
            int b = 4;
            
            // if else 방식
            if(a<b){
            	a = 100
            }else {
            	a = 0
            }
            
            System.out.println(a);
            
            // 삼항 연산자
            int c = (a < b) ? 100 : 0;
            System.out.println(c);
        }
    }

    결과

    0
    0

    노란색은 조건문. 초록색은 참인 경우, 빨간색은 거짓인 경우의 값을 반환.

     

     

    • 연산자 우선순위

     

    연산자들을 다양하게 사용하게 될 때 연산자에 우선순위를 둠으로써 에러를 발생시키지 않고 처리할 수 있다.

     

    우선순위 연산자 결합방향
    1 [ ]
    ( )
    .
    2 ++
    --
    +(양수), -(음수)
    ~
    !
    (type)
    new
    3 *,  /,  %
    4 +(더하기), -(빼기)
    +(문자 결합)
    5 <<
    >>
    >>>
    6 <, <=
    >, >=
    instanceof
    7 ==
    !=
    8 &
    &
    9 ^
    ^
    10 !
    !
    11 &&
    12 ||
    13 ?, :
    14 =
    *=, /=, +=, -=, %=
    <<=, >>=, >>>=
    &=, ^=, !=

     

    • (optional) Java 13. switch 연산자

     

    switch를 사용해 조건문을 제어할 수 있다.

    JDK ver7.0부터는 ( )에 인자 값으로 문자열도 전달할 수 있게 됐다.

     

    예시

    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
    
            java.util.Scanner input = new java.util.Scanner(System.in);
    
            int a=0, b=0, result=0;
            String op;
    
            // a 입력
            System.out.print("첫번째 숫자 입력: ");
            a = input.nextInt();
    
            // b 입력
            System.out.print("두번째 숫자 입력: ");
            b = input.nextInt();
    
    		// op 입력
            System.out.print("수행할 연산자는? ( + - * / % )");
            op = input.next();
    
            switch(op){
            case "+":{
            result = a + b;                
            break;
            }
            case "-":{
            result = a - b;                
            break;
            }
            case "*":{
            result = a * b;                
            break;
            }
            case "/":{
            result = a / b;                
            break;
            }
            case "%":{
            result = a % b;                
            break;
            }
            default:{
            System.out.print("잘못된 연산자를 입력하였습니다. 프로그램을 종료합니다.");                    
            System.exit(0);
            }
            }
    
            System.out.println();//한줄 줄 바꿈
            System.out.print(a + op + b + " = " + result);
    
            }
    }

     

    ( ) 안에 있는 입력받은 변수의 값이 case 옆에 있는 값과 일치하는 경우 해당 case의 실행문이 동작한다.

    모든 case 마무리에는 break를 통해 밖으로 나오게 되는데, 만약 break가 "%" case에만 걸려있고, op 값을 +로 줬다면 어떻게 동작할까?

     

    "+" case에서 result 값을 a+b로 받고 내려와 "-" case의 값으로 가서 result 값을 다시 받는다.

    그렇게 계속 내려오다 a%b를 result 값으로 가지고 break를 통해 빠져나와 마지막 출력문을 실행한다.

     

    모든 case에 break가 없다면 defalut case의 경우만 실행되기 때문에 안내문을 출력하고 프로그램은 종료된다.

    default는 필수요소가 아니기 때문에 default가 없는 경우 초기값이 출력된다.

    따라서 switch를 사용하게 되는 경우 break를 사용해 종료 시점을 반드시 정해야 한다.

     

     

    switch는 범위의 값을 변수로 줄 수 없는 단점이 있다.

    예를 들어 90~100 사이의 변수를 입력받았을 때, "A"를 출력하는 함수를 만들 경우 if 문의 경우 범위를 정할 수 있지만 switch는 그럴 수 없다.

    코드의 가독성 면에서는 switch 사용이 if문보다는 나은 것 같고, switch가 if에 비해 유용하게 쓰일 수 있는 경우에 대해서는 좀 더 생각해 봐야겠다.

     

     

     

     

     

     

    참고.

     

    tcpschool.com/java/java_operator_assignment3

    arabiannight.tistory.com/313

    coding-factory.tistory.com/266

    coding-factory.tistory.com/entry/Java-%EB%9E%8C%EB%8B%A4%EC%8B%9DLambda-Expressions-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%98%88%EC%A0%9C

    velog.io/@foeverna/Java-%EC%97%B0%EC%82%B0%EC%9E%90-%EA%B4%80%EA%B3%84-%EB%85%BC%EB%A6%AC-%EC%A1%B0%EA%B1%B4-%EB%B9%84%ED%8A%B8-%EC%97%B0%EC%82%B0%EC%9E%90

    www.devkuma.com/books/pages/11

    opentutorials.org/course/1223/5331

    rank01.tistory.com/3?category=487063

    coding-factory.tistory.com/521

Designed by Tistory.