Programming/Java \ Spring

🔥자바스터디🔥 자바의 정석 CH3 연산자(단항, 산술, 비교, 논리 등)

1.1 연산자(operator)

 

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

     피연산자 : 연산자의 작업대상(변수, 상수, 리터럴, 수식)

 

     - 연산자는 피연산자로 연산을 수행하고 나면 항상 결과값을 반환한다.

 

1.2 식과 대입연산자

 

     식(expression) : 4 * 5 +3; 과 같이 연산식을 의미한다.

                         식을 실행하면 결과값을 반환하지만 저장 공간 등을 설정하지 않았기 때문에 어디에도 쓰이지 않고 사라지게 된다.

     대입연산자(=) : 식을 계산하여 결과를 얻은 후(식의평가) 결과값을 저장하기 위해 사용된다. (y = 4 * 5 +3;)

 

1.3 연산자의 종류

자세하게 분류한 연산자의 종류

 

연산자는 크게 산술, 비교, 논리, 대입연산자로 나눌수 있고, 피연산자의 개수로 연산자를 분류하기도 한다.

피연산자의 개수가 하나면 단항연산자, 두개면 이항연산자, 세개면 삼항연산자라 한다.

 

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

 

연산자의 결합규칙 : 하나의 식에 같은 우선순위의 연산자가 여럿일 경우 연산 수행의 순서를 정하는 규칙

                          왼쪽에서 오른쪽 (단항연산자, 대입연산자는 반대)

 

** 정리

    1) 산술 > 비교 > 논리 > 대입

    2) 단항 > 이항 > 삼항

    3) 단항연산자와 대입연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽

 

1.5 산술변환

 

    이항연산자는 두 피연산자의 타입이 일치해야만 연산이 가능하다.

    따라서, 피연산자의 타입이 일치하지 않을경우, 연산전 형변환 연산자로 타입을 일치시켜야한다.

    (값손실 방지를 위하여 두 피연산자의 타입 중 더 큰 타입으로 일치한다.)

   

    ** 작은 타입에서 큰타입으로의 형변환은 자동적으로 진행되므로 형변환 연산자를 생략할 수 있다. (산술변환)

    ** 산술 변환 규칙

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

        2) 피연산자의 타입이 int 보다 작을 경우 int로 변환 (연산중 오버플로우 방지)

    ** 쉬프트 연산자, 증감연산자는 산술변환이 일어나지 않는다.

    ** 연산결과의 타입은 피연산자의 타입과 일치한다.

 

2. 단항연산자

2.1 증감연산자 ++ --

 

   상수는 값을 변경할수 없으므로 피연산자로 부적격하다.

   대입연산자와 증감연산자만이 피연산자의 값을 변경할수 있다.

   ** 하나의 식에 증감연산자의 사용을 최소화하고, 식에 두번 이상 포함된 변수에 증감연산자를 사용하는 것은 피해야한다.

증가연산자(++) 피연산자의 값을 1 증가
감소연산자(--) 피연산자의 값을 1 감소

전위형(++i) : 값이 참조되기 전에 증가
후위형(i++) : 값이 참조된 후 증가

단, 수식이나 메서드 호출에 포함되지 않고 독립적으로 쓰인 경우 전위형과 후위형의 차이가 없다

class OperatorEx1{
 public static void main(String args[]){
 	int i = 5;
    i++;                    // i=i+1; 과 같은 의미이다. ++i;도 동일한 결과를 반환한다.
    System.out.println(i);  // 6
    
    i=5;
    ++i;
    System.out.println(i);  // 6
 }
}
    

2.2 부호연산자 + -

 

   부호연산자'-'는 피연산자의 부호를 반대로 변경한 결과를 반환한다.

   

3. 산술연산자          

3.1 사칙연산자 +-*/

** 정수형 피연산자를 0으로 나눌 경우 컴파일은 정상적으로 진행되나 ArithmeticException(산술예외)이 발생한다.

** 0.0f, 0.0d 로 나눌 경우 결과값이 Infinity(무한대)가 된다.

 

class OperatorEx6 {
	public static void main(String[] args){
    	byte a = 10;
        byte b = 30;
        byte c = a * b; // 에러발생: 피연산자가 정수형일 경우 int로 자동 형변환되어 연산된다.
        				// int형의 결과값을 byte형 변수에 대입하기 위해서는 명시적 형변환이 필요하다.
                        // 따라서 byte c = (byte) a * b; 로 변경해야 컴파일 에러가 발생하지 않는다.
       
        System.out.println(c); // 결과값 : 44                 
        // 10 * 30의 결과값은 300이나, byte 타입은 128까지의 데이터 저장범위를 가지고 있다.
        // 따라서, 오버플로우 발생으로 인해 값손실을 가져와 값이 다르게 저장된다.
    }
 }
       
        

 

3.2 나머지연산자 %

 

    왼쪽의 피연산자를 오른쪽 피연산자로 나누고 난 나머지 값을 결과로 반환하는 연산자

    (짝수, 홀수, 배수 검사 등에 주로 사용)

    나누는 수의 부호는 무시되며, 나머지 연산 후 결과에 왼쪽 피연산자의 부호를 적용한다.

 

4. 비교연산자          

4.1 대소비교 연산자(<,  >, <=, >=), 등가비교 연산자(==, !=)

 

대소비교연산자는 boolean형을 제외한 나머지 자료형에서 사용할수 있지만 참조형에는 사용불가하다.

등가비교연산자는 기본형, 참조형 등 모든 자료형에 사용할 수 있다. (기본형 : 값비교, 참조형 : 객체의 주소값 비교)

 

double 타입과 float 타입의 값을 비교할 경우 (float)double == float 으로 형변환 후 비교해야 올바른 값을 구할수 있다.

(실수형의 정밀도가 double형이 더 높기 때문에 double형으로 형변환후 비교시 정확한 값을 구할수 없다)

 

** 문자열 비교시 비교연산자(==) 대신 equals() 라는 메소드를 이용한다. (같으면 true, 다르면 false 반환)

    equals()는 객체의 주소값을 비교하는 것이 아닌 문자열의 내용을 비교한다.

    (대소문자 구별하지 않고 비교하고 싶을 경우 equalsIgnoreCase() 를 사용하면 된다)

 

5. 논리연산자          

 

논리연산자는 둘 이상의 조건을 그리고(AND) 나 또는(OR)로 연결하여 하나의 식으로 표현할수 있게 해준다.

 

5.1 논리연산자(&&, ||, !)

 

논리연산자는 피연산자로 boolean형 또는 boolean형 값을 결과로 하는 조건식만 허용한다

|| (OR결합) 피연산자 중 어느 한쪽만 true 이면 true를 결과값으로 반환
&& (AND결합) 피연산자 양쪽 모두 true이어야 true 반환

OR 연산의 경우 좌측 피연산자가 참이면, 우측 피연산자의 값은 평가하지 않는다.
AND 연산도 마찬가지로 좌측 피연산자가 거짓이면 우측 피연산자의 값은 평가하지 않는다.

따라서 피연산자의 위치에 따라 연산속도가 달라질수 있다.

! (논리부정연산자) 피연산자가 true이면 false, false면 true 반환

 

5.2 비트연산자(&, |, ^, ~, <<, >>)

  • &(AND)
  • |(OR)
  • ^(XOR)
  • >> (right SHIFT)
  • << (left SHIFT)
  • >>> (unsigned right SHIFT) : 비트값을 오른쪽으로 이동한 이후 왼쪽 공간은 모두 0로 채움, C/C++ 에 없음

 

6. 그 외 연산자          

6.1 조건연산자 ?:

    삼항연산자(조건식? 식1, 식2)는 조건연산자 하나이다.

    조건식이 참이면 식1, 거짓이면 식2를 결과값으로 반환한다.

 

6.2 대입연산자 = op=

  • 객체에 값을 할당
  • 다른 연산자와 묶어서 사용 가능
  • declaration statement, assignment expression 에서 사용된다.
  • Java 는 reference type 의 경우 주소값을 할당한다는것에 주의해야 한다.