항해 Pre-onboarding 2일차

황지성·2022년 11월 8일
0

20221108 TIL(Today I learn)


1. 연산자

  • 연산자의 종류
  1. 단항 연산자 : 피연산자가 하나인 연산자

    ++x, --x, +x, -x, !x

  2. 이항 연산자 : 피연산자가 2개인 연산자

    x+y, x-y, x*y, x/y, x%y

  3. 삼항 연산자 : 피연산자가 3개인 연산자

    (x>y) ? a: b

2. '&'와 '&&'의 차이점 - 논리연산자, 비교연산자

&&와 &는 산출 결과는 같지만 연산 과정이 조금 다릅니다. &&는 앞의 피연산자가 false라면 뒤의 피연산자를 평가하지 않고 바로 false라는 산출 결과를 냅니다. 왜냐하면 하나라도 false라면 전체 연산식은 false이기 때문입니다. 그러나 &는 두 피연산자 모두를 평가해서 산출 결과를 냅니다. 따라서 &보다는 &&가 더 효율적으로 동작합니다.

  • 신용권, 혼자 공부하는 자바, 한빛미디어(2022), p122

논리연산자를 쉽게 이해할 수 있는 부분이다. 하지만 '&'를 논리 연산자로써 바라본 적이 없었기에 처음 글을 읽을 때는 어색했다. 그래도 논리 연산자로써의 '&'가 아닌 비트 연산자로써의 '&'를 들여다보면 인용문의 내용이 왜 그런지 알 수 있게 된다.

  • 논리 연산자 '&&'
public static void main(String args[]){
	 int x = 9;
     int y = 12;
     
     ...
     
     if(x > 10 && y > 10){		//  x = 9이므로   'x > 10' 논리식의 값은 false
     	return true;			//  'y > 10' 논리식의 결과는 보지 않아도 됨.
     }
     else{
     	return false;			// false return
     }
}
public static void main(String args[]){
	int x = 11;
    int y = 9;
    
    ...
    
    if(x > 10 || y >10){		// x = 11아므로 'x > 10' 논리식의 값은 true
    	return true;			// 'y > 10' 논리식의 결과는 보지 않아도 됨
    }							// true return
    else{
    	return false;
    }
}

논리 연산자 '&&'는 위의 코드에서 보이는 것처럼 앞선 논리식의 결과에 따라 결과가 나온다면 뒤의 논리식은 살펴보지 않아도 된다.

  • 비트 연산자 '&'
public static void main(String args[]){
	int num1 = 0b0010;
    int num2 = 0b0011;
    
    System.out.println(num1 & num2); // 0b0010
    System.out.println(num1 | num2); // 0b0011
}

나는 연산의 결과가 더 빨라서 '&&'를 사용하기보단 나에게 논리연산자는 '&&'와 '||'이였기에 논리식에 해당 연산자들을 사용해왔다. '&'와 '|'를 논리식에 사용할 수 있다는 것을 새롭게 알게 되었고 왜 2가지 연산자는 앞 뒤 조건을 모두 따지는지 생각해 보았다.

흔히 'bitmasking'이라 불리는 알고리즘에서 '&'와 '|'을 사용한다.
컴퓨터는 내부적으로 10진수가 아닌 모든 데이터와 자료들을 2진수로 표현한다. 이러한 특성을 고려해 'bitmasking'을 사용해 수행 시간 단축, 메모리 효율성 증가 등의 효과를 얻는다.

위의 코드를 보면 2진수 '0b0010'과 '0b0011'을 비트 연산한다.

모든 비트를 'AND', 'OR'을 한 결과를 도출한다. 연산자를 중심으로 양쪽의 값들을 모두 비교하는 특성이 논리 연산자로 사용될 때도 적용된다고 생각해도 무방할 듯하다.

public static void main(String args[]){
	 int x = 9;
     int y = 12;
     
     ...
     
     if(x > 10 & y > 10){		//  x = 9이므로   'x > 10' 논리식의 값은 false
     	return true;			//  앞의 논리식의 결과로 인해 이미 false를
        						//  return하는 것이 결정되었지만 뒤의 'y >10' 논리식도 점검한다.
     }
     else{
     	return false;			// false return
     }
}
public static void main(String args[]){
	int x = 11;
    int y = 9;
    
    ...
    
    if(x > 10 | y >10){			// x = 11아므로 'x > 10' 논리식의 값은 true
    	return true;			// 앞의 논리식의 결과로 인해 true를
    							// return하는 것이 결정되었지만 뒤의 'y>10' 논리식도 점검한다.						  
                                // true return
    }							
    else{
    	return false;
    }
}
profile
성장하는 개발자

0개의 댓글