상세 컨텐츠

본문 제목

Java 공부 3주차 과제

Java 공부/Java 주차별 공부

by Banjosh 2022. 12. 22. 21:54

본문

학습할 것

 1. 산술 연산자

 2. 비트 연산자

 3. 관계 연산자

 4. 논리 연산자

 5. instanceof

 6. assignment(=) operator

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

 8. 3항 연산자

 9. 연산자 우선순위

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

---------------------------------------------------------------

Q0. 연산자의 종류

A0. 연산자에는 단항 연산자,  이항 연산자, 삼항 연산자가 있다. 

      1. 단항 연산자 : 피연산자가 1개인 연산자로 전위 증감, 후위 증감 연산자(++,--), 부호연산자(+,-), 비트 반전 연산자 (~)

                                , 논리 부정 연산자(!) 등이 있다.

      2. 이항 연산자 : 피연산자가 2개인 연산자로 산술 연산자, 비트 연산자, 관계 연산자, 대입 연산자, 논리 연산자가 있다.

      3. 삼항 연산자 : 피연산자가 3개인 연산자로 조건 연산자가 있다.

Q1. 산술 연산자

A1. 산술 연산자는 수치 계산을 하는 연산자를 말하며 +, -, *, /, %가 있다. 연산 결과의 타입은 피연산자의 타입에 따라 달

      라진다. int 타입 보다 크기가 작은 타입(byte, short, char)은 int로 타입 프로모션 된다. 그 이외의 경우는 피연산자 중 더

      큰 타입의 연산자로 타입 프로모션이 된다. (int < long < float < double 순으로 예를 들면 int와 double의 연산은 double

      이 된다.)

      1, + 연산자 

          1) 왼쪽의 피연산자에 오른쪽 피연산자를 더한 값을 반환한다. (숫자)

          2) 문자열(String 타입)에서 쓰일 경우 왼쪽의 문자열 뒤에 오른쪽의 문자열을 합친 문자열을 반환한다.

          (단항 연산자로 쓰인 경우 양수를 의미)

      2.  - 연산자

          1) 왼쪽의 피연산자에 오른쪽 피연산자를 뺀 값을 반환한다. (숫자)

          (단항 연산자로 쓰인 경우 음수를 의미)

      3.  * 연산자

          1) 왼쪽의 피연산자에 오른쪽 피연산자를 곱한 값을 반환한다. (숫자) 

      4.  / 연산자

          1) 왼쪽의 피연산자에 오른쪽 피연산자를 나눈 값의 몫을 반환한다. (숫자)

          2) 오른쪽의 피연산자가 0(int)인 경우 ArithmeticException이 발생한다. ( / by zero )

          3) 오른쪽 피연산자가 0.0(실수형)인 경우 Infinity를 반환한다.

      5.  % 연산자

          1) 왼쪽의 피연산자에 오른쪽 피연산자를 나눈 값의 나머지를 반환한다. (숫자)

          2) 오른쪽의 피연산자가 0(int)인 경우 ArithmeticException이 발생한다. ( / by zero )

          3) 오른쪽 피연산자가 0.0(실수형)인경우 NaN을 반환한다.

 

Q2. 비트연산자

A2. 비트 연산자는 ~, &, |, ^, <<, >>, >>>가 있으며 정수 혹은 boolean을 연산한다. 비트 단위로 연산하며 결과 값은 정수 혹은 boolean으로 반환한다.

      1. ~ 연산자 

          1) 단항 연산자로 정수로 표현할 수 있는 피연산자를 연산한다. NOT연산을 하며 1이면 0, 0이면 1로 반전시킨다.

             ex)  a = 00011001 (=25) /  ~a = 11100110 (= -26)으로 ~a의 결과 값은 10진수로 (-a)-1과 같다.

      2. & 연산자

          1) 대응되는 비트가 모두 1이면 1을 반환하고 아니면 0을 반환한다.

             ex) a = 0011101 , b = 1101110   /   a & b = 0001100  (AND 연산)

      3. | 연산자

          1) 대응되는 비트가 하나라도 1이면 1을 반환하고 두 비트가 모두 0일 때 0을 반환한다.

             ex) a = 1000101 , b = 1110000   /   a | b = 1110101 (OR 연산)

      4. ^ 연산자

          1) 대응되는 비트가 다르면 1을 반환하고 같으면 0을 반환한다.

             ex) a = 1010111 , b = 1011110   /   a ^ b = 0001001 (XOR 연산)

      5. << 연산자

          1) 왼쪽의 피연산자를 오른쪽 피연산자만큼 왼쪽으로 이동시키고 빈자리는 0으로 채운다.

             ex) a = 0000011 , b = 2   /   a << 2 = 0001100

      6. >> 연산자

          1) 왼쪽의 피연산자를 오른쪽 피연산자 만큼 오른쪽으로 이동시키고 부호를 유지시키기 위해서 빈자리는 가장 왼쪽

              비트로 채운다.

             ex) a = 0011011 , b = 2   /   a >> 2 = 0000110  ///////  c = 1001110 , d = 2   /   c >> 2 = 1110011

      7.  >>> 연산자

          1) 왼쪽의 피연산자를 오른쪽 피연산자 만큼 오른쪽으로 이동시키고 빈자리는 0으로 채운다.

             ex) a = 0011011 , b = 2   /   a >> 2 = 0000110  ///////  c = 1001110 , d = 2   /   c >> 2 = 0010011

 

Q3. 관계 연산자

A3. 피연산자 2개를 서로 비교하여 boolean 값을 return 하는 연산자로 primitive type 인 피연산자에서 연산이 가능하다.

      ==, !=, >, <, >=, <=가 있으며 타입 프로모션은 산술연산자와 같이 적용된다.

      1. == 연산자

           1)  왼쪽의 피연산자와 오른쪽의 피연산자가 같으면 true, 다르면 false를 return 한다.

      2. != 연산자

           1)  왼쪽의 피연산자와 오른쪽의 피연산자가 다르면 true, 같으면 false를 return 한다.

      4. > 연산자

           1)  왼쪽의 피연산자보다 오른쪽의 피연산자가 작으면 true, 크면 false를 return 한다.

      5. < 연산자

           1)  왼쪽의 피연산자보다 오른쪽의 피연산자가 크면 true, 작으면 false를 return 한다.

      6. >= 연산자

           1)  왼쪽의 피연산자보다 오른쪽의 피연산자가 작거나 같으면 true, 크면 false를 return 한다.

      7. <= 연산자

           1)  왼쪽의 피연산자보다 오른쪽의 피연산자가 크거나 같으면 true, 작으면 false를 return 한다.

    

Q4. 논리 연산자

A4. boolean 피연산자 2개를 연산하는 연산자로 boolean값을 return 한다. 논리 연산자에는 &&, ||, ^, !가 있다.

      1. && 연산자

             1) 피연산자가 모두 true면 경우에만 true를 return 하고 나머지 경우에는 false를 return 한다.

      2. || 연산자

             1) 피연산자가 하나라도 true면 true를 return 하고 피연산자가 모두 false면 false를 return 한다. 

      3. ^ 연산자

             1) 피연산자가 서로 다른 경우 true를 return 하고 피연산자가 같으면 false를 return 한다.

      4. ! 연산자

             1) 다른 연산자와 다르게 단항 연산자로 피연산자의 boolean값을 반대로 return 한다.

 

Q5. instanceof

A5. 객체가 특정 타입인지 확인하는 연산자이다. 왼쪽의 피연산자가 오른쪽의 피연산자 타입인지 확인하고 일치한 경우

       true를 반환하고 이는 오른쪽의 서브 타입인 경우도 true를 반환한다.

      ex ) String s = new String();

             boolean a = s instanceof String ;  // a = true

             boolean b = s instanceof Object ; // b = true (s는 Object의 서브 타입인 String 타입이므로 true를 return.)

 

Q6. assignment(=) operator

A6. =는 대입 연산자로 왼쪽의 피연산자에 오른쪽의 피연산자를 대입한다. 피연산자는 서로 타입 호환이 가능해야 한다.

      대입 연산자는 다른 연산자와 같이 사용할 수도 있다. 예를 들면 a(연산자) = b인 경우 a = a (연산자) b와 같다.

      =로 대입할 때 깊은 복사와 얕은 복사 2가지가 있는데 이를 구분해 보면 primitive type의 피연산자를 대입할 때는 깊은

      복사라고 하여 왼쪽 피연산자에 오른쪽 피연산자를 직접 대입한다. 그러나 new 연산으로 되어있는 reference type의

      피연산자를 대입할 때는 보통 얕은 복사라고 하여 왼쪽 피연산자에 오른쪽 피연산자의 주소를 대입하여 서로 값을 공

      유하는 관계가 된다.

 

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

A7.  화살표 연산자는 단일 메서드 인터페이스를 구현하는 명확하고 간결한 방법을 제공한다. 이를 Lambda 표현식이라하

       는데 예시를 보고 이해하자. (람다식은 익명객체를 생성하기 위한 표현식이다.)

      1. 화살표 연산자 사용 x (Lambda식 x)

       (1)  public interface Foo {

                             void printInt(int x);

             }

             public class JavaStudy{ 

                public void printInt(int x){

                    System.out.println(x);

                  }

                public static void main(String[] args){

                     JavaStudy js = new JavaStudy();

                     int y = 3;

                     js.printInt(y);

                   }

             }

            여기서 (1)은 기본적으로 인터페이스의 메소드를 오버라이드를 하여 사용하는 방법이다.

       (2)  public interface Foo {

                             void printInt(int x);

             }

             public class JavaStudy{ 

                public static void main(String[] args){

                     Foo foo = new Foo(){

                      public void printInt(int x) {

                           System.out.println(x);

                        }

                     }

                     int y = 3;

                     foo.printInt(y);

                   }

             }

              여기서 (2)는 (1)의 방법에서 메소드 오버라이드를 인터페이스 객체 생성을 동시에 해주는 방법이다.

      2. 화살표 연산자 사용 o (Lambda식 o)

         (1)  public interface Foo {

                             void printInt(int x);

             }

             public class JavaStudy{ 

                public static void main(String[] args){

                     Foo foo = (x) -> {System.out.println(x);}

                     int y = 3;

                     foo.printInt(y);

                   }

             }

           1번과 다르게 2번은 Lambda 식을 사용하여 더욱 간편하게 줄인 코드이다. 화살표 연산자 사용법을 보면

            왼쪽 피연산자는 똑같이 쓰고 오른쪽 피연산자를 ( 매개변수 목록) -> {실행문 / 리턴문}으로 쓴다.

 

Q8. 3항 연산자

A8. 피연산자가 3개인 연산자로 조건 연산자가 대표적이다. 형태는 ' (조건) ? 참일 경우 실행 : 거짓일 경우 실행 '이 된다.

       ex) int a = 1;

             int b = (a > 0) ? 2 : 3 ; // b=2

 

Q9. 연산자 우선순위

A9. 여러 개의 연산자가 같이 있는 경우 우선순위에 따라 먼저 실행순서가 달라진다.

        <우선순위>

   1. 최우선 연산자 :  .  [ ]  ( )

   2. 단항 연산자 : ++  --  +  -  ~  !

   3. 산술 연산자 : *  /  %  +  -

   4. 시프트 연산자 : >>  <<  >>>

   5. 비교 연산자 : >  <  >=  <=  ==  !=

   6. 비트 연산자 : &  ^  |

   7. 논리 연산자 : &&  ||

   8. 3항 연산자 : (조건) ? 참일때 실행 : 거짓일때 실행 

   9. 대입 연산자 : =  += 등...

 

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

A10. 입력변수에 따른 실행문이 달라지는 연산자로 예를 보고 익히자.

   switch (입력변수) {

       case 입력값1 : 실행문 ;

                              break ; 

       case 입력값2 -> 실행문 ;

                               yield 리턴 값;

       default : 실행문 ;

                    break ;

           }

      다음과 같이 입력변수 값에 따라 case가 정해지고 맞는 case가 없을 시  default가 실행된다. 

     case 1과 같이 입력 값과 실행문 사이에 : 를 사용해 나눌 수도 있고

     case 2와 같이 입력 값과 실행문 사이에 ->를 사용해 나눌 수도 있다.

     그리고 case 실행문을 종료할 때는 break ;를 쓰고 종료를 하지만 return을 하고 싶으면 yield를 쓴다.   

     보통 조건이 많아서 가독성이 좋게 쓰고 싶은 경우에 if문 보다는 switch/case문이 좋을 수 있다.

'Java 공부 > Java 주차별 공부' 카테고리의 다른 글

Java 공부 2주차 과제  (0) 2022.12.20
Java 공부 1주차 과제  (0) 2022.12.09

관련글 더보기