ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 3주차 과제: 연산자
    프로그래밍 언어/Java 2021. 1. 15. 00:00

     

     

    백기선님의 온라인 자바스터디 (https://youtu.be/peEXNN-oob4)

     

    1.산술 연산자

    출처 : https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op1.html

    위 표에서 보다시피 자바는 기본적으로 우리가 모두 알고 있는 사칙연산을 모두 제공하고 있다. 걔중 못 보던게 있다면 '%' 기호일텐데

    각 연산자에 대한 설명을 차례대로 하자면,

     

    더하기(+)

    public class LiveStudy {
        public static void main(String[] args) {
            int result1 = 1 + 2;             // result1 is now 3
            System.out.println("1 + 2 = " + result1);  // 1 + 2 = 3
            double result2 = result1 + 0.2;  // result2 is now 3.2
            System.out.println("3 + 0.2 = " + result2);// 3 + 0.2 = 3.2
            
            // 더하기 연산자의 다른 사용법
            String a = "Live Study";
            String b = " is ";
            String c = "Good!";
            String d = a + b + c;
            System.out.println(d); // Live Study is Good!
        }
    }

    더하기 연산자는 흔히 알 수 있는 정수, 실수의 값을 합하는 연산자다. 또한 문자열과 문자열을 합쳐주는 역할을 하기도 한다.

     

    뺴기(-) 곱하기(*) 나누기(/)

    public class LiveStudy {
        public static void main(String[] args) {
            int a = 10 - 2;
            System.out.println("10 - 2 = " + a); // 10 - 2 = 8
            int b = a * 2;
            System.out.println("8 * 2 = " + b);  // 8 * 2 = 16
            int c = b / 8;
            System.out.println("16 / 8 = " + c); // 16 / 8 = 2
            int d = b / 9;
            System.out.println("16 / 1 = " + d); // 16 / 9 = 1
        }
    }
    

    다른 연산자의 경우 일반적으로 우리가 알고 있는 사칙연산의 기능과 동일하게 작동하고 있는데, 코드의 가장 밑의 나누기 연산자의 경우 나머지는

    반환하지 않고 몫만 반환하는 것을 알 수 있다. 그렇다면 나머지는 어떻게 구할 수 있을까? 

     

    나머지(%)

    public class LiveStudy {
        public boolean evenNumber(int a){
            if (a % 2 == 0){      // 매개변수를 2로 나눴을 때 나머지가 0 일경우 짝수
                return true;  // true 반환
            }
            return false;     // false 반환
        }
        public static void main(String[] args) {
            LiveStudy s = new LiveStudy();
            System.out.println(s.evenNumber(2)); // true
        }
    }
    

    나머지 연산자는 나누기 연산자와 동일하게 양 쪽의 값을 나누되 나머지만을 반환한다. 이를 활용하여 짝수와 홀수를 판별하는 코드를 작성해봤다.

     

    2.비트 연산자

     

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

    위 비트연산자를 사용하면 정수의 값을 비트로 바꿔 논리연산을 할 수 있다. 또, '>>', '<<', '>>>' 비트 쉬프트 연산을 하여 비트 자리수를

    이동시킨다.

    public class LiveStudy {
        public static void main(String[] args) {
            System.out.println(5 ^ 1); //0b0101 ^ 0b0001  = 0b0100 (4)
            System.out.println(2 & 3); //0b0010 & 0b0011  = 0b0010 (2)
            System.out.println(5 | 7); //0b0101 & 0b0111  = 0b0111 (7)
            System.out.println(5 >> 1);  //0b0101 = 0b0010 (2)
            System.out.println(5 << 1);  //0b0101 = 0b1010 (10)
            System.out.println(~15);   //0b01111 = 0b10000 (-16)
        }
    }
    

    학교에서 논리회로를 들어봤으면 쉽게 이해되는 부분이라고 생각된다. 재밋는건 이번 포스팅은 거의 Java Tutorial을 보면서 작성하고 있는데

    튜토리얼에서 조차 일반적으로 잘 사용하지 않는다고 명시되어있다..?? 튜토리얼인데 이렇게 말해도 되는건가 아무튼, 익혀두면 나쁠건 없는 것 같다.

    19년도 카카오 코딩테스트에 비트연산 문제가 나왔었다.

     

    3.관계 연산자

    Java Tutorial의 내용을 표로 만들어봤다.

    관계 연산자는 양 쪽의 값을 비교할 때 사용하며 boolean 으로 반환을 한다.

     

    4.논리 연산자

    논리 연산자는 위에서 다룬 비트 연산자와 거의 동일하게 AND, OR 논리비교를 하는데 비트연산자의 경우 각 정수, 비트의 값을

    연산하는 것과 달리 True, False 값의 Boolean Type의 값을 비교하는 연산자다. 유의해야할 것으론 '&&', '&' 의 차이 '||' , '|' 의

    차이를 알고 사용해야한 다는 것이다. 우선 쉽게 설명하자면 하나의 기호만 있을 경우 앞의 조건이 거짓이여도 뒤의 조건까지 비교하는 것,

    반대로 두 개의 기호가 있을 경우 앞의 값이 거짓이라면 뒤의 조건은 비교조차 하지 않는다.

     

    5.instanceof

     

    class LiveStudy {
        public static void main(String[] args) {
    
            Parent obj1 = new Parent();
            Parent obj2 = new Child();
    
            System.out.println("obj1 instanceof Parent: "
                    + (obj1 instanceof Parent)); //True
            System.out.println("obj1 instanceof Child: "
                    + (obj1 instanceof Child));  //False
            System.out.println("obj1 instanceof MyInterface: "
                    + (obj1 instanceof MyInterface)); //False
            System.out.println("obj2 instanceof Parent: "
                    + (obj2 instanceof Parent)); //True
            System.out.println("obj2 instanceof Child: "
                    + (obj2 instanceof Child)); //True
            System.out.println("obj2 instanceof MyInterface: "
                    + (obj2 instanceof MyInterface)); //True
        }
    }

    처음 자바를 배웠을 때 굉장히 많이 사용했던 연산자로 한 객체가 어느 Class에 속하는지 또는 상속받는지를 Boolean Type 으로 반환해준다.

     

    6.assignment(=) operator

    assignment operator(대입연산자)란 단순 할당 연산자로 우항의 값을 좌항에 대입한다. 

    class LiveStudy {
        public static void main(String[] args) {
    
            int live = 0;         //live의 값은 0
            int study = live + 2; //study의 값은 2
        }
    }

     

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

     

    보통 람다 표현식, 람다라고 하며 Java 8부터 도입된 기능으로 기존의 메소드를 좀더 짧고 간략하게 표현할 수 있는 장점이 있다.

    메소드명을 생략할 수 있고, 매개변수의 타입을 생략할 수 있다. 또한 괄호와 return 문을 생략할 수 있다. 아래에서 예를 들어봤다.

    @FunctionalInterface      // 함수형 인터페이스 선언
    interface foo{
        int operator(int a, int b);
    }
    class LiveStudy{
        public static void main(String[] args) {
            int a = 8;
            int b = 10;
            foo f = new foo() {    
                public int operator(int a, int b) {
                    return a+b;
                }
            };
            int operator = f.operator(a, b);
            System.out.println(operator);   //18
    
            foo foo = (x, y)-> x+y;
            int operator1 = foo.operator(a, b);
            System.out.println(operator1);  //18
        }
    }
    

    익명클래스를 선언하는 부분과 실제 내부 구현을 한 줄로 처리할 수 있다. 이는 @FunctionalInterface 라는 어노테이션을 인터페이스에 달아줬기에

    함수형 인터페이스로 작동한다.

     

    8.3항 연산자

     

    3항 연산자란 (조건문) ? 참 : 거짓 과 같은 형태의 연산자로 조건문을 대체할 수 있다. 

    class LiveStudy {
        public static void main(String[] args) {
            boolean result1 = false;
            boolean result2 = false;
          if(10 > 8){
              result1 = true;
          }else {
              result1 = false;
          }
    
            result2 = 10 > 8 ? true : false;
          
            System.out.println(result1);  // true
            System.out.println(result2);  // true
        }
    }
    

    result1 과 result2의 처리과정은 동일하다. 여러 줄의 if문을 한줄로 만들 수 있는 장점이 있지만, 삼항 연산자를 연속으로 사용하면 오히려 가독성이

    떨어질 수 있으니 유의해서 사용해야 한다.

     

    9.연산자 우선 순위

    모든 연산자에는 우선순위가 있고 그 순서대로 처리가 된다.

    출처 : 자바의 정석

    우선순위가 정리된 표를 가져왔다. 표를 보면 모든 이항연산자왼쪽에서 오른쪽으로 연산되며, 단항 연산자와 삼항 연산자는 반대로 오른쪽부터

    연산한다. 또 우선순위로는 단항, 이항, 삼항 순으로 항이 많아질수록 연산순위가 낮아진다.

     

    10.(optional) Java 13. switch 연산자

     

    다음은 switch문으로 처음 자바를 배울 때말곤 쓴적이 없어 기억을 더듬으며 코드를 작성해봤다.

    class LiveStudy{
        public static void main(String[] args) {
            String studyName = "";
            int study = 3;
            switch (study){
                case 1: studyName = "JVM이란?";
                        break;
                case 2: studyName = "자바 데이터 타입";
                        break;
                case 3: studyName = "연산자";
                        break;
            }
            System.out.println(studyName);  // 연산자
        }
    }
    

    위와 같이 변수의 값에 따라 분기를 태워주는 기본적인 문법인데 Java12부터 switch 연산자라는 것이 추가되었다.

    class LiveStudy{
        public static void main(String[] args) {
            String studyName = "";
            int study = 3;
            switch (study){
                case 1: studyName = "JVM이란?";
                        break;
                case 2: studyName = "자바 데이터 타입";
                        break;
                case 3: studyName = "연산자";
                        break;
            }
            System.out.println(studyName);   //연산자
    
            studyName = switch(study){
                case 1 -> "JVM이란";
                case 2 -> "자바 데이터 타입";
                case 3 -> "연산자";
            }
            System.out.println(studyName);   //연산자
        }
    }
    

    위 스위치 문과 아래의 스위치문은 동일하다. break를 표기하지 않아도 되며. 결과를 return 받을 수 있다. 

    댓글

Designed by Tistory.