열심히 끝까지

Java1 day02 본문

Java1(주말)

Java1 day02

노유림 2022. 4. 10. 16:01

[2일차 수업내용] 연산자(Operator)

 

연산자(Operator) : 연산을 수행하는 기호 ( +, -, *, / .....)

피연산자 : 연산자와 연산을 수행하려면 반드시 필요한 연산의 대상 => 연산자의 작업 대상

==> ** 기억해 둘 것 : 연산자는 피연산자로 연산을 수행하면 항상 결과값을 반환한다. 

 

식(표현식, Expression) : 연산자와 피연산자를 조합하여 계산하고자 하는 바를 표현하는 것을 식(표현식)이라고 한다.

 

연산자 종류

종류 연산자 설명
산술연산자 +, -, *, /, %, <<, >> 사칙연산과 나머지 연산
비교연산자 >, <, >=, <=, ==, != 크고 작음과 같고 다름을 비교
논리연산자 &&, ||, ~, &, ^ 그리고(AND)와 또는(OR)으로 조건 연결
대입연산자 = 우변의 값을 좌변에 저장
기타연산자 (type), ? :, instanceof 형변환연산자, 삼항연산자,
instanceof연산자

연산자의 우선순위와 결합규칙

 - 식에 사용된 연산자가 둘 이상일 경우, 연산자의 우선순위에 의해서 연산순서가 결정

 - 단항연산자가 이항연산자보다 우선순위가 높음

 - 우선순위가 확실하지 않다면, 먼저 계산되어야 하는 부분을 괄호로 묶어주기(괄호 안의 계산식의 우선순위 제일 높음)

 - 연산자의 결합규칙은 왼쪽에서 오른쪽, 대입연산자의 결합규칙은 오른쪽에서 왼쪽

 

<정리>

산술 > 비교 > 논리 > 대입 순서로 진행, 대입은 제일 마지막에 실행

단항(1) > 이항(2) > 삼항(3) 순서로 진행

대입연산자는 연산의 진행방향이 오른쪽에서 왼쪽

 

산술변환

 - 이항연산자는 두 피연산자의 타입이 일치해야 연산이 가능 

   ==> 피연산자의 타입이 서로 다르면 타입 중 더 큰 타입으로 일치시키기

 - 두 피연산자의 타입 중 더 큰 타입으로 일치시키는 이유 : 작은 타입으로 형변환하면 원래 값 손실 가능성이 있기 때문

 - 작은 타입에서 큰 타입으로 형변환하는 경우, 자동적으로 형변환 연산자 생략 가능

 

* 두 피연산자의 타입을 일치시킨다(보다 더 큰 타입으로 일치) *

   long       +         int    ->    long       +       long

   float       +         int    ->    float       +         int

   double    +       float    ->   double    +     double

 

* 피연산자의 타입이 int보다 작은 타입이면 int로 변환 *

   byte      +        short   ->   int         +          int

   char      +        short   ->   int         +          int

 

package example01;

       public class OperatorEx04 {
               public static void main(String[] args) {
               // 산술변환
               // byte 범위 : -128 ~ 127
               byte b1 = 127;
               byte b2 = 1;
               char ch = 'A'; //내부적으로 'A'는 정수 65로 저장
               float f1 = 15.5F;
               double d1 = 10.5;
               byte b3 = -128;
               byte b4 = 1;

               byte bb3 = (byte)(b1 + b2); // byte + byte ==> int + int ==> int 강제형변환 b1, b2 전체를 묶어서 변환
               int i1 = b1+ b2; // byte + byte ==> int + int ==> int 
               int i2 = ch + b2;           // char + byte ==> int + int ==> int
               float f2 = b2 + f1;      // byte + float ==> float + float ==> float
               double d2 = f1 + d1; // float + double ==> double + double ==> double
               byte bb4 = (byte)(b3 - b4); // byte + byte ==> int + int ==> int

               System.out.println(bb3);  // 128 ==> overflow : 최대값 + 1 ==> 최소값 ==> -128이 맞는 것
               System.out.println(i1);   // 128
               System.out.println(i2);   // 66
               System.out.println(f2);   // 142.5
               System.out.println(d2);   // 26.0
               System.out.println(bb4);  // -129 ==> underflow : 최소값 - 1 ==> 최대값 ==> 127이 맞는 것
        }
}

 

 

-단향연산자(증감연산자) : ++, --

 : 피연산자에 저장된 값을 1 증가 또는 1 감소

 : 단향연산자는 피연산자의 왼쪽에 위치하지만 증감연산자는 양쪽 모두 가능

     int num = 10;

     num++;      ++num;     num--;     --num;

 : 피연산자의 왼쪽에 위치하면 전위형( prefix ), 피연산자의 오른쪽에 위치하면 후위형 ( postfix )

 : 전위형, 후위형 모두 피연산자의 값을 1 증가 혹은 감소시키지만,

   증감연산자가 수식이나 메소드 호출에 포함된 경우, 전위형일 때와 후위형일 때의 결과가 다름

      * 메소드 : 이름 뒤에 소괄호()

       ex ) System.out.println()

             public static void main(String[] args)

 

package example01;

public class OperatorEx02 {

public static void main(String[] args){
     // 증감연산자
        int x = 10;
        int y = 10;
        
        ++X; 
        x++;
        //단독으로 증가하는 경우 전위, 후위 상관없음
        
        System.out.println("++x와 x++를 한 값 : " + x); // x값 : 12
        Sysyem.out.println("==================================================");
        
        x=10;
        System.out.println("초기 x값 : " + x ); // x값 : 10
        System.out.println("x++ : " + (x++)); // x++ 진행하고 나온 값 : 10
        // 후위형 : 출력하고 증가
        System.out.println("최종 x값 : " + x ); // x값 : 11
        
        Sysyem.out.println("==================================================");
        System.out.println("초기 y값 : " + y ); // y값 : 10
        System.out.println("++y : " + (++y)); // ++y 진행하고 나온 값 : 11
        // 전위형 : 증가하고 출력
        System.out.println("최종 y값 : " + y ); // y값 : 11
        
        Sysyem.out.println("==================================================");
        x = 10;
        
        int result = x++;
        //대입하고 증가
        System.out.println("result : " + result); // result 값 : 10
        System.out.println("x : " + x); // x 값 : 11
        
        Sysyem.out.println("==================================================");
        x = 10;
        int result2 = ++x;
        //증가하고 대입
        System.out.println("result2 : " + result2); // result 값 : 11
        }
}

 

 

-산술연산자 : +(덧셈), -(뺄셈), *(곱셈), /(나눗셈), %(나머지)

 

package example01;

 

public class OperatorEx01 {

        public static void main(String[] args) {

        //산술연산

        int v1 = 5;

        int v2 = 2;

        int result = 0;

 

       result = v1 + v2;

       System.out.println("더하기 결과 : " + result);  // 7

       System.out.println("더하기 결과 : " + v1 + v2); // 앞부터 차례로 문자열로 받아 계산해서 52

       System.out.println("더하기 결과 : " + (v1 + v2));  //7

 

       result = v1 - v2;

       System.out.println("빼기 결과 : " + result);  //3

       System.out.println("빼기 결과 : " + (v1 - v2));  //3

 

       result = v1 * v2;

       System.out.println("곱하기 결과 : " + result);  //10

       System.out.println("곱하기 결과 : " + (v1 * v2));  //10

 

       result = v1 / v2;

       System.out.println("나누기 결과 : " + result);  //2

       System.out.println("나누기 결과 : " + (v1 / v2));  //2 

 

       result = v1 % v2;

       System.out.println("나머지 결과 : " + result);  //1

       System.out.println("나머지 결과 : " + (v1 % v2));  //1

        }

}

 

 

-비교연산자

: 두 피연산자를 비교하는데 사용되는 연산자

: 조건문과 반복문의 조건식에 사용, 연산결과는 오직 true, false 

: 비교연산자는 이항연산자이므로 비교하는 피연산자의 타입이 서로 다를 경우

 자료형의 범위가 큰 쪽으로 자동형변환되어 피연산자의 타입을 일치시킨 후 비교

대소비교연산자  :  >, <, >=, <=
비교연산자 연산결과
> 좌변값이 크면 true, 아니면 false
< 좌변값이 작으면 true, 아니면 false
>= 좌변값이 크거나 같으면 true, 아니면 false
<= 좌변값이 작거나 같으면 true, 아니면 false
등가비교연산자  :  ==, !=
- 두 피연산자의 값이 같은지 또는 다른지를 비교하는 연산자 -
- 기본형은 물론 참조형에서도 사용 -
- 기본형의 경우 변수에 저장되어 있는 값이 같은지 알 수 있고 참조형의 경우
객체의 주소값을 저장하기 때문에 두개의 피연산자가 같은 객체를 가리키고 있는지를 확인 가능 -
비교연산자 연산결과
== 두 값이 같으면 true, 아니면 false
!= 두 값이 다르면 true, 아니면 false

 

-논리연산자 : &&(AND결합), ||(OR결합), !(NOT)

:둘 이상의 조건을 '그리고(AND)나 또는(OR)'으로 연결하여 하나의 식으로 표현할 수 있게 함

: &&(AND결합) - 피연산자 모두 true여야 true

  ||(OR결합) - 피연산자 중 어느 한쪽만 true면 true

  !(NOT) - true -> false, false -> true

: 쓰는 방법 - A > B && A > C   /   A > B || A > C

: 효율적인 연산을 위해 OR 연산의 경우 연산 결과가 참일 확률이 높은 피연산자를 왼쪽에 놓는 것이 좋음

: AND연산의 경우 연산 결과가 거짓일 확률이 높은 피연산자를 왼쪽에 놓는 것이 좋음

논리연산자 OR, AND 예시
x y x||y x&&y
true true true true
true false true false
false true true false
false false false false
논리연산자 NOT 예시
x !x
true false
false true

ex ) int num = 5;          int num1 = 10;

          num > num1   ==> false

          !(num > num1) ==> true

 

package example01;
        public class OperatorEx05 {
                public static void main(String[] args) {
                // 비교연산자, 논리연산자
                boolean result = false;
                int i = 10;
                char ch = 'b'; // 98


                result = ( i > 5 );
                System.out.println("result : " + result); // true
                System.out.println("( i > 5 ) : " + (i > 5)); // true
                System.out.println("==================================================");

                 result = ( i >= 9 ) && ( i < -8); // false
                 System.out.println("result : " + result);

                result = ( i >= 9 ) || ( i < -8); // true
                System.out.println("result : " + result);
                System.out.println("==================================================");
                /*
                 *  1. 해당 문자가 영어 소문자인지 확인하는 조건문
                 *  2. 해당 문자가 알파벳인지 확인하는 조건문
                 *  
                 *    A : 65
                 *    Z : 90
                 *    a : 97
                 *    z : 122
                  */
                  // ch == 'b' 98
                  // 1. 해당 문자가 영어 소문자인지 확인하는 조건문
                  result = (ch >= 97 ) && (ch <= 122);
                  System.out.println("소문자 여부: " + result);

                  // 2. 해당 문자가 알파벳인지 확인하는 조건문
                 result = (ch >= 65  && ch <= 90 ) || (ch >= 97  && ch <= 122);
                 // result = (ch >= A  && ch <= Z ) || (ch >= a  && ch <= z);
                 System.out.println("알파벳 여부 : " + result);
          }
}

 

package example01;
       public class OperatorEx03 {
              public static void main(String[] args) {
              // !(NOT) true -> false, false -> true

             boolean flag = false;

             System.out.println("flag : " + flag); // false

              flag = !flag;
             System.out.println("flag : " + flag); //true

             flag = !flag;
            System.out.println("flag : " + flag); //false

            System.out.println("flag : " + !flag); //true
            System.out.println("flag : " + flag); //false

            if(flag ) {
            //조건식이 참이어야 실행되는 문장
            System.out.println("if문내부");
             }

      }

}

 

 

 

-비트연산자

: &, |, ^, <<, >>

: 어떤 변수의 값을 0과 1의 조합, 즉 비트로 변환한 뒤에 비트 단위로 연산을 수행

: bit > byte > KB > MB > GB > TB

: 1 byte = 8 bit

2진수 0 0 0 0 0 0 0 0
128 64 32 16 8 4 2 1

ex ) 10 ==> 00001010(2)

      11 ==> 00001011(2)

 

비트연산자 종류

&(AND) a & b a와 b를 AND처리( 둘 다 1이어야 1 )
|(OR) a | b a와 b를 OR처리
( 둘 중 하나만 1이면 1 )
^(XOR) a ^ b a와 b를 XOR처리
( 두 비트가 달라야 1 )
<<(SHIFT) a << 2 a를 비트로 변환하여
왼쪽으로 2비트 이동
>>(SHIFT) a >> 2 a를 비트로 변환하여
오른쪽으로 2비트 이동

ex ) 10 ==> 00001010(2)

      10 << 2 ==> 00101000(2) ==> 40

      10 >> 2 ==> 00000010(2) ==> 2

 

 

-그 외의 연산자

: 조건연산자(삼항연산자) 

          : 조건식, 식1, 식2 모두 세 개의 피연산자를 필요로하는 삼항연산자, 조건연산자는 하나 뿐

          : 조건식  ?   식1  : 식2

           ==> 조건식이 true라면 식1, false라면 식2

          ex ) int score = 90;

               char grade = score >= 90 ? 'A' : 'B'   ==> 'A'

               

               int score = 80;

               char grade = score >= 90 ? 'A' : 'B'   ==> 'B' 

 

: 대입연산자 

         : 변수와 같은 저장공간에 값 또는 수식의 연산결과를 저장하는데 사용

         : 대입연산자의 왼쪽 피연산자는 lvalue(left value), 오론쪽 피연산자는 rvalue(right value)

         : rvalue는 변수뿐만 아니라 식이나 상수 모두 가능,

           lvalue는 반드시 변수처럼 변경할 수 있는 것이어야 함

 

 

* 복합대입연산자 

 

+=  더한 값을 저장

-=   뺀 값을 저장

*=   곱한 값을 저장

/=   나눈 값을 저장

%=  나눈 나머지 값을 저장

 

ex ) int sum = 13;

      sum += 2;        // sum = sum + 2; ==> 15

      sum -= 2;        // sum = sum - 2; ==> 11

      sum *= 2;        // sum = sum * 2; ==> 26

      sum /= 2;        // sum = sum / 2; ==> 6

      sum %= 2;        // sum = sum % 2; ==> 1

 

'Java1(주말)' 카테고리의 다른 글

Java1 day03  (0) 2022.04.16
Java1 day02 보충 2  (0) 2022.04.16
Java1 day02 보충 1  (0) 2022.04.12
Java1 day01 추가 보충  (0) 2022.04.10
Java1 day01  (0) 2022.04.09