AI·빅데이터 융합 경영학 Study Note

Do it 자바! 완전 정복 3장 연산자 필기 본문

C·Java·Python

Do it 자바! 완전 정복 3장 연산자 필기

SubjectOwner 2023. 2. 20. 10:50

Do it 자바! 완전 정복 3장 연산자

 

 

 

 

기본 자료형 간의 연산에서 int/int = int 이므로 5/2의 값은 2.5가 아니라 2이다. 즉 정수.정수의 결과는 나눗셈의 몫이다.

나머지 연산 (%)을 모듈로 연산이라고 한다.

 

 

둘 다 증감 연산(a1을 1만큼 증가시키기)과 대입 연산(b1에 a1 값을 대입하기) 2가지 명령을 포함한다.

전위형(int b1= ++a1) :  증감 연산 시행 후 대입 연산 시행

a에 1 더하고 b에 대입

후위형(int b2= a2++) :  대입 연산 시행 후 증감 연산 시행

a를 b에 대입하고 a에 1 더하기

int a1=3;
int b1= ++a1; //쁠쁠에이는 전위형. 
System.out.println(a1); //4
System.out.println(b1); //4

int a2=3;
int b2= a2++; //에이쁠쁠은 후위형. 
System.out.println(a2); //4
System.out.println(b2); //3

 

 

비트 연산자 진리표

비트 XOR(^)은 두 값이 같을 때 0, 다를 때 1의 값을 지니며, 비트 NOT(~)은 0은 1, 1은 0으로 반전하는 연산자다.

비트 연산자의 0과 1을 논리 연산자의 false dhk true에 대응하면 논리 연산자의 진리표와 같다.

 

 

 

정수의 진법 변환 방법

 

자바 코드 상에서 10진수를 2진수, 8진수, 16진수로 변환하는 메서드

Integer.toBinaryString()

Integer.toOctalString()

Integer.toHexString()

 

이를 다시 10진수로 변환하는 메서드

Integer.parseInt()

 

출처: https://choichumji.tistory.com/171

알고리즘 문제에서 자주 사용되는, 10진수 -> n진수 변환 방법에 대해 알아보자.

 

Integer.toString 과 toBinaryString 메서드

 

2진수로 변환

final String binNum = Integer.toBinaryString(16);
System.out.println("binNum = " + binNum);

final String formattedNumber = String.format("%8s", binNum).replace(" ", "0");
System.out.println("formattedNumber = " + formattedNumber);

2진수는 toBinaryString(int number); 메서드를 사용하면 문자열로 변환해 보여준다.

만약, 앞에 0을 원하는만큼 붙여주고 싶다면 String.format을 활용 가능하다.

 

n진수로 변환

 

동적으로 2진법, 8진법을 가리지 않고 적용시키고 싶다면 toString(int i, int radix); 메서드를 활용하면 된다.

아래 코드를 통해 3진수, 12진수까지 100 이란 정수를 변환해보았다.

for (int radix = 3; radix < 12; radix++) {
    final String s = Integer.toString(100, radix);
    System.out.println("radix " + radix + " = " + s);
}

 

직접 계산

public String radix(int num, int n) {
        StringBuilder sb = new StringBuilder();
        
        // 숫자가 0이면 0을 리턴
        if (num == 0) return "0";
        
        while (num > 0) {
            // 나머지가 1자릿수면 그대로 추가
            if (num % n < 10) {
                sb.append(num % n);
                
            // 10, 11, 12 .. 의 경우 알파벳을 추가해야함. 10=A, 11=B ...
            } else {
                sb.append((char)(num%n-10 + 'A'));
            }
            // 추가가 끝났다면 n으로 나눈 몫을 다시 계산
            num /= n;
        }
        
        // 계산한 나머지값의 역순으로 만들어야한다.
        return sb.reverse().toString();
    }

설명은 주석으로 대체한다.

 

위 함수로 100을 여러 진법으로 계산해도 위 Integer.toString() 과 동일한 결과가 나온다.

 

n진수 문자열을 10진수 정수로 변환

어려울 것 없이, Integer.parseInt(int i, int radix); 를 이용하면 된다.

숫자 문자열을 2번째 파라미터의 정수문자열 값으로 n진수 변환한다.

아래는 11을 8진수로 변환할 때 10진수 정수 9가 나오는 모습이다.

final int StringToInteger = Integer.parseInt("11", 8);
System.out.println("StringToInteger = " + StringToInteger);

 

 

양숫값과 음숫값 읽는 법

 

값의 첫 번째 비트는 부호 비트(0: 양수, 1: 음수)로, 숫자의 부호를 결정한다.

양수는 1을 기준으로 값을 읽는다. 음수는 0을 기준으로 값을 읽은 후 1을 더한 값이 음수의 절댓값이다.

 

예를 들어 2진수 00...0101 은 양수이고 2^3 +2^1 = 10이다.

2진수 11...11010은 음수이고 절댓값은 2^2+2^0+1 = 6으로 -6이다.

 

시프트 연산자

:비트의 위치를 좌우로 이동하는 연산으로, 산술 시프트(<<, >>)와 논리 시프트(>>>)가 있다.

산술 시프트는 숫자의 부호 비트는 유지하면서 나머지 비트를 왼쪽(<<) 또는 오른쪽(>>)으로 이동하는 연산자이다. 

 

<<연산일 때 빈킨이 오른쪽에 생기며 0으로 빈칸을 채운다.

>> 연산일 때 빈칸은 왼쪽 부호 비트 다움에 생기며, 이때는 부호 비트값과 동일한 값으로 채운다.

 

http://wiki.hash.kr/index.php/%EC%8B%9C%ED%94%84%ED%8A%B8%EC%97%B0%EC%82%B0%EC%9E%90

 

시프트연산자 - 해시넷

시프트 연산자(shift operator)는 비트 연산자 중 하나로 비트값을 왼쪽(<<) 또는 오른쪽(>>)으로 이동시키는 연산자이다. 연산자 중 '>>>'는 자바에만 있는 연산자로 부호를 신경쓰지 않는 것으로 비트

wiki.hash.kr

시프트 연산자연산자설 명

>> 비트값을 주어진 숫자만큼 오른쪽으로 이동시킨다.
<< 비트 값을 주어진 숫자만큼 왼쪽으로 이동시킨다.
>>> 비트 값을 주어진 숫자 만큼 오른쪽으로 이동 시킨 후 빈공간을 모두 0으로 채운다.

시프트연산자는 비트 값을 주어진 숫자만큼 부호 방향으로 이동시키는 연산자이다. 부호로는 '>>, <<, >>>'가 있다. 그 중 '>>>'는 자바에만 있는 연산자로 부호에 상관없이 비트 값들을 주어진 비트 수 만큼 오른쪽으로 이동시킨 후 빈 공간을 모두 0으로 채운다.

 

 

쇼트 서킷

 

https://dkswnkk.tistory.com/417

 

[Java] 쇼트-서킷 (Short-Circuit)

쇼트-서킷 (Short-Circuit) 쇼트서킷이란 논리 연산에서 두 피연산자 중 어느 한쪽만 '참'이면은 우측 피연산자의 값은 평가하지 않고 바로 결과를 얻는 행위를 말합니다. 그래서 같은 조건식이라도

dkswnkk.tistory.com

쇼트-서킷 (Short-Circuit)

쇼트서킷이란 논리 연산에서 두 피연산자 중 어느 한쪽만 '참'이면은 우측 피연산자의 값은 평가하지 않고 바로 결과를 얻는 행위를 말합니다. 그래서 같은 조건식이라도 피연산자의 위치에 따라서 연산속도가 달라질 수 있습니다. 

예를 들어 아래와 같은 코드가 있습니다. 과연 출력 결과는 어떻게 나올까요?

// JAVA
public class Test {
    public static void main(String[] args) {
        int a = 0, b = 0;
        if (a == 0 || ++b == 1) {
        }
        System.out.print(a + " " + b);
    }
}

위 코드의 출력 결과는 0 0 이 나옵니다.

실행 결과에서 알 수 있듯이, 두 번의 논리 연산 후에도 b의 값은 여전히 0인 채로 남아있습니다. '||(OR)'의 경우는 좌측 피연산자 (a==0)가 참이라서 우측 연산자를 평가하지 않고 바로 넘어갔기 때문입니다. 따라서 결론적으로 같은 조건식이라도 피연산자의 위치에 따라서 연산속도가 달라질 수 있습니다. 

즉 연산 결과가 '참'일 확률이 높은 피연산자를 연산자의 앞쪽에 놓아야 더 빠른 연산 결과를 얻을 수 있습니다.

그렇다면 JAVA뿐만 아니라 다른 언어들도 Short-Circuit을 지원할까요? 

 

Short-circuit evaluation - Wikipedia

Programming language construct Short-circuit evaluation, minimal evaluation, or McCarthy evaluation (after John McCarthy) is the semantics of some Boolean operators in some programming languages in which the second argument is executed or evaluated only if

en.wikipedia.org

위키피디아의 Support in common programming and scripting languages 부분 목차를 살펴보면 Short-Circuit을 지원하는 언어 목록을 확인할 수 있습니다. 우리가 알고 있는 언어인 C, C++, JAVA, Kotlin, Python, JS과 같은 언어들도 기본적으로 Short-Circuit을 지원함을 알 수 있습니다.

 

 

삼향 연산자

(참 또는 거짓) ? 참일 떄 연산 결과 : 거짓일 때 연산 결과

 

https://coding-factory.tistory.com/266

 

[Java] 삼항연산자 사용법 & 예제

if문을 사용하여 코딩을 할 경우 코드 라인이 의미 없이 길어지는 경우들이 종종 생깁니다. if(){ }else if(){ } 이렇게만 해도 벌써 5라인이죠. 하지만 단순한 if문일 경우 라인수를 획기적으로 줄여

coding-factory.tistory.com

if문을 사용하여 코딩을 할 경우 코드 라인이 의미 없이 길어지는 경우들이 종종 생깁니다.

if(){

}else if(){

}

이렇게만 해도 벌써 5라인이죠. 

하지만 단순한 if문일 경우 라인수를 획기적으로 줄여주는 방식이 있습니다. 바로 삼항 연산자라는 것인데요. 이번 포스팅에서는 삼항 연산자의 사용법에 대해 알아보도록 하겠습니다.

 

삼항 연산자의 예를 가볍게 들어보겠습니다. 위와 같은 경우 괄호 안의 조건문이 참일 경우 int a에 50이 담기게 되고 거짓일 경우에는 40이 담기게 되는 코드입니다. 삼항 연산자는 (조건문) : ? 참 : 거짓이라는 문법을 가지게 됩니다.

//if else
int a;
if(5<4) {
    a = 50;
}else {
    a = 40;
}
System.out.println(a); //결과 = 40 
		
//삼항연산자
int b = (5 < 4) ? 50 : 40; 
System.out.println(b); //결과 = 40

위와 같이 삼항 연산자가 할 수 있는 것은 if ~ else문을 통해서도 처리가 가능합니다. 다만 if ~ else로 처리했을 때보다 라인수를 획기적으로 줄여주죠. 위의 예시처럼 가벼운 로직을 처리한다면 삼항 연산자로 if문보다는 삼항 연산자로 처리하는 것도 좋은 방법일 듯합니다.

 

※ 주의사항

1. 삼항 연산자를 사용하여 코드의 라인이 줄어들었다고 컴파일 속도가 빨라지는 것은 아닙니다.

2. 삼항 연산자를 중복해서 처리할 경우. 가독성이 떨어질 수 있으므로 중복처리는 피하는 것이 좋습니다.