study

(230427) Java - 누적값 구하기 / 연산자(대입, 증감, 비트)

hjkeeeem 2024. 7. 25. 20:23

EADFF2 형광 색상 코드

9:20까지 - 각 자리수를 더한 값 나타내기 ( 나머지를 구해 누적하기 ) Accumulate678.java

 

나머지가 0이 될 때까지 반복하기 

public static void main(String[] args) { //9:20까지
        //변수, 누적, 연산자, 누적 ,몫
        // 나머지를 구해 누적하기
        int num = 687;
        int answer = 0;

        //나머지를 먼저 구하고
        answer = answer + (num % 10);
        //그 뒤에 몫을 구해야 한다,
        num = num / 10;
        // 68 --> 10으로 나눈 나머지 8
        System.out.printf("num : %d, answer : %d\n", num , answer);

        answer = answer + (num % 10);
        num = num / 10;
        System.out.printf("num : %d, answer : %d\n", num , answer);

        answer = answer + (num % 10);
        num = num / 10;
        System.out.printf("num : %d, answer : %d\n", num , answer);

    }
}

 

이렇게 세 번 반복해주어도 되지만 더 편한 방식인 반복문을 사용할 수 있다.

public class Accumulate687While {
    public static void main(String[] args) {
        int num=687;
        int answer=0;


        while(num > 0){
            answer = answer + (num % 10);
            num = num / 10;
            System.out.printf("num : %d, answer : %d\n", num , answer);
        }
    }
}

 

배열에 있는 모든 값 더하기, length를 이용해 배열의 길이 구하기 -9:28 까지 실습

public class SumOfValues {
    public static void main(String[] args) { // 배열에 있는 모든 값 더하기
        int answer = 0;
        int[] arr = {2,1,7,4};
        answer = answer + arr[0];
        answer = answer + arr[1];
        answer = answer + arr[2];
        answer = answer + arr[3];
        
        System.out.printf("%d\n", answer);
        System.out.printf("%d",arr.length);


//        System.out.println(arr[0]);
//        System.out.println(arr[1]);
//        System.out.println(arr[2]);
//        System.out.println(arr[3]);
//
//        System.out.println(arr[0]+arr[1]+arr[2]+arr[3]);
    }
}

 

복합 대입 연산자

 

 

복합 대입 연산자 예제 실습  (CompundAssignmentOperator.java) - 9:35분 까지

public class CompundAssignmentOperator {
    public static void main(String[] args) {
        int x = 10;
        x += 1;
        System.out.printf("+=1 %d\n", x);

        x -= 5;
        System.out.printf("-=5 %d\n", x);

        x *= 2;
        System.out.printf("*=2 %d\n", x);

        x /= 3;
        System.out.printf("/=3 %d\n", x);

        x %= 8;
        System.out.printf("%%= 8 %d\n", x);
    }
}

CompundAssignmentOperator 결과

 

복합대입연산자를 이용해 누적값 구하기 예제 (Accumulate687Compound.java) -9:48분 까지

    public static void main(String[] args) {
        int num = 687;
        int answer = 0;

        //1. 나머지 2. 몫
        answer += num % 10; //answer = answer + (num % 10)
        num /= 10; // num = num / 10

        answer += num % 10;
        num /= 10;

        answer += num % 10;
        num /= 10;

        System.out.println(answer);
    }
}

+ 복합연산자는 print에 찍히지 않음. 찍혀도 우리가 원하는 값이 나오지 않는다. 

 

증감연산자

증(Increase) 연산자 i++, ++i가 있고,
감(Decrease)연산자 i--, --i가 있다. (총 네 가지)

i = i + 1, i = i - 1 → i++, i--
i++ 쓰고 나서 증감
++i 증가 시키고 사용

증감 연산자 사용법 예제

public class IncreaseOperator {
    public static void main(String[] args) {
        int i = 10;
        System.out.println(i++);
    }
}

결과는 10

 

public class DecreaseOperator {
    public static void main(String[] args) {
        int i = 10;
        //--가 뒤에 오는 경우 = 은행에서 빌린 돈 .후이자. 나중에 뗀다
        System.out.println(i--);
        System.out.println(i);

        System.out.println("-------------감소---------------");
        System.out.println(--i); // 일단 떼고 준다.
        System.out.println(i);

    }
}

 

증감연산자 배열에서 사용

public class IncreaseFirst {
    public static void main(String[] args) {
        //배열 연산 시 사용
        int idx = 0;
        int[] arr = {2,1,7,4};

        System.out.println(arr[idx]); // idx=0, 첫번째 인덱스인 2가 출력 됨
        idx += 1; //idx=0 에서 1을 더한다.
        System.out.println(arr[idx]); //dx = 1, 두번째 인덱스인 1이 출력 됨
        idx += 1; // idx=1 에서 1을 더 더함
        System.out.println(arr[idx]); //idx=2, 세번째 인덱스인 7이 출력 됨 
    }
}

 

 

한 줄로 정리하기

public class IncreaseFirst2 {
    public static void main(String[] args) {
        int idx = 0 ;
        int[] arr = {2,1,7,4};

        System.out.println(arr[idx++]);
        System.out.println(arr[idx++]);
        System.out.println(arr[idx++]);
    }
}

배열에는 +=1 을 사용할 수 없지만 i++은 배열값에 접근할 때 사용 가능하다.

 

 

배열에서 증감연산 사용하기 활용 (+for문으로도 풀어보기)

public class IncreaseFirst3 {
    public static void main(String[] args) {
        int idx = 0;
        int[] arr = {2,1,7,4};

        System.out.println(arr[idx++]); //0에서 시작하여 2 출력 후 1++
        System.out.println(arr[idx++]); // ++되어 두번째 인덱스인 1이 출력 후 1++
        System.out.println(arr[idx--]); // ++되어 세번째 인덱스인 7이 출력 후 1--
        System.out.println(arr[idx--]); // --되어 두번째 인덱스인 1이 출력 후
        System.out.println(arr[idx]); // --되어 첫번째 인덱스인 0이 출력 된다.
        System.out.println("----------------------------------");
        System.out.println(arr[idx++]); //0에서 1 더하기 
        System.out.println(arr[++idx]); //1 더한것과 먼저 증감되어 세번째 인덱스인 7이 출력 됨
        System.out.println(arr[idx]); // 이후로 더하거나 마이너스 된 것이 없기 때문에 똑같이 7이 출력 됨
    }
}

IncreaseFirst3.java 결과

 

비교연산자 (Comparison Operator)

- 두 개의 값을 비교하여 결과를 논리값(boolean) 으로 알려주는 연산자

public class ComparisonOperatorsEx2 {
    public static void main(String[] args) {
        int iVal1 = 10;
        int iVal2 = 20;

        System.out.printf("iVal1 == iVal2 : %b\n", iVal1 == iVal2); //같냐
        System.out.printf("iVal1 != iVal2 : %b\n", iVal1 != iVal2); //다르냐
        System.out.printf("iVal1 < iVal2 : %b\n", iVal1 < iVal2); //2가 1보다 크냐
        System.out.printf("iVal1 <= iVal2 : %b\n", iVal1 <= iVal2); //2가 1보다 크거나 같냐
        System.out.printf("iVal1 > iVal2 : %b\n", iVal1 > iVal2); //1이 2보다 크냐
        System.out.printf("iVal1 >= iVal2 : %b\n", iVal1 >= iVal2); //1이 2보다 크거나 같냐
    }
}

ComparisonOperatorEx2.java 결과

 

 

배열 인덱스 값 비교하기

- 버블정렬 알고리즘을 풀 때도 사용한다.

import java.util.Arrays;

public class ComparisonArray {
    public static void main(String[] args) {
        //버블정렬 예제. 앞에것과 비교하여 나보다 크면 뒤로 보내 정렬하기
        int[] arr = {2,1,7,9};
        System.out.printf("%d > %d --> %b \n", arr[0], arr[1], arr[0]>arr[1]);
        int temp = arr[0];
        arr[0] = arr[1];
        arr[1] = temp;
        System.out.println(Arrays.toString(arr));

        System.out.printf("%d > %d --> %b \n", arr[1], arr[2], arr[1]>arr[2]);
        System.out.printf("%d > %d --> %b \n", arr[2], arr[3], arr[2]>arr[3]);

        System.out.println(Arrays.toString(arr));
    }
}

결과

버블정렬을 이용해 오름차순으로 정리가 된 것을 확인할 수 있다.

 

 

 

 

논리 연산자 (Logical Operator)

논리 연산자는 세가지 종류가 있으며 위 사진과 같이 표현한다.

 

  • &한개만 쓰는 경우

: 한개가 false가 나와도 뒤에 값을 검사하며, 조건을 둘 다 검사

   ex) num1 == 0 & num2 == 0;

 

  • &&두개씩 쓰는 경우 (추천!!)

: 한개라도 false 이면 false 인 경우이며, 앞에 false가 나오면 뒤에 값은 계산할 필요가 없다.

 

AND 연산자 ( && )

public class LogicalOperatorEx {
    public static void main(String[] args) {
        int age = 25;
        boolean isStudent = false;

        if(age >= 18 && !isStudent){ //&& -> AND 연산자로 모두 참인지를 확인
            System.out.println("성인이며, 학생이 아닙니다.");
        }
    }
}

 

 

if문에서 조건에 맞는 나이 18살 이상이고, 학생이 아닐 경우 printf 문이 출력된다.

boolean 값과 if 문은 같은 값이어야 실행이 되므로 boolean isStudent = true 여도 if 문에서 age >= 18 %% isStudent면 돌아간다.

때문에 학생이 아닌 것을 증명해야하므로 isStudent는 false를 넣고, if문에서도 !isStudent (=not student) 상태로 만들어줘야 한다.

.printf()에서 학생이 아닌 것을 출력하기 위해서는.

 

보일러 컨트롤러 예제

public class BoilerControl {
    public static void main(String[] args) {
        int waterTemperature = 45;
        int roomTemperature =22;

        //둘 다 50보다 낮으면 보일러를 틀어야 함
        boolean result = (waterTemperature < 50 && roomTemperature < 50 ? true : false);
        System.out.println(result == true ? "보일러 켜세요" : "보일러 안 켜도 됨");
    }
}

 

OR ( || )연산

public class OrEx {
    public static void main(String[] args) {
        boolean result = true || true;
        System.out.printf("%b\n", result);
        result = true || false;
        System.out.printf("%b\n", result);
        result = false || true;
        System.out.printf("%b\n", result);
        result = false || false;
        System.out.printf("%b\n", result);
    }
}

코드 결과와 같이 하나라도 true 가 있다면 true를 출력한다.

 

NOT ( ! )연산

public class NotEx {
    public static void main(String[] args) {
        boolean result = !true;
        System.out.printf("%b\n", result);
        result = !false;
        System.out.printf("%b\n", result);
    }
}

boolean 값을 반대로 바꿔주는 연산이다.

 

성인 판단 예제 NOT 버전

public class CheckWhetherAdult {
    public static void main(String[] args) {
        int age=30;
        boolean isAdult = age >= 18; //만 18세 이상
        System.out.printf("미성년자입니까? %b", !isAdult);
    }
}

boolean 값에 age가 18살과 같거나 보다 높다면 성인(isAdult)이다. 라는 값을 넣었다.

.printf 질문에서 미성년자입니까? 라고 물었기 때문에 부정해줘야 한다. isAdult는 age가 18살과 같거나 보다 많기 때문이다.

 

 

비트연산

| (OR연산자) : 피연산자 중 한 쪽의 값이 1이면, 1을 결과로 얻는다. 그 외에는 0을 얻는다.


& (AND연산자) : 피연산자 양 쪽의 값이 모두 1이어야만 1을 결과로 얻는다. 그 외에는 0을 얻는다.


^(XOR연산자) : 피연산자의 값이 서로 다를 때만 1을 결과로 얻는다. 같을 때는 0을 얻는다.

 

다음 예제는 쉬프트 연산자를 이용해 자리를 이동할 수 있다. (2진수로 표현했을 때)

2 4 8 16 32 64 128 256
1 2 3 4 5 6 7 8
public class BitOperatorEx {
    public static void main(String[] args) {
        int val1 = 1;

        System.out.println(val1 << 1);//올리기
        System.out.println(val1 << 2);

        int val2 = 32;
        System.out.println(val2 >> 1); //내리기
        System.out.println(val2 >> 2);
    }
}

결과

 

비트연산자 예제 2

public class BitOperatorEx2 {
    public static void main(String[] args) {
        int val1 = 1; //-2
        int val2 = 0; //-1
        int val3 = 3; //-4

        System.out.println(~val1);
        System.out.println(~val2);
        System.out.println(~val3);
        System.out.println(Integer.toBinaryString(~val1));
        System.out.println(Integer.toBinaryString(~val2));
        System.out.println(Integer.toBinaryString(~val2));
    }
}

"~" 는 단항 연산자로서 피연자의 모든 비트를 반전시킨다.

위 코드를 예시로 들어, val1 = 1; 은 사실 2진수로 표현한다면 32비트의 00000000 00000000 00000000 00000001 이기 때문에

~연산자로 뒤집을 시 아래 결과 사진과 같이 11111111 11111111 11111111 11111110 으로 나오며 다른 val2, val3도 마찬가지로

val2 : 00000000 00000000 00000000 00000000

val3 : 00000000 00000000 00000000 00000011    이다.

 

비트연산자의 AND 연산 ( & )

 

비트연산자의 AND 연산자 ( & )로

모두 다 참(True, 1)일 때만 1로 출력된다.

 

 

 

 

 

 

 

 

 

 

비트 연산자의 OR 연산자( | )로

하나라도 참(True, 1)라면 1을 출력한다.

 

 

 

 

 

 

 

 

 

비트 연산자의 XOR 연산자(^)로

True , True 혹은 false, false 일 때는 거짓(false, 0)을 출력하고

서로 다른 값이 들어 있을 때 참(True, 1)을 출력한다.

 

 

 

 

 

 

 

 

 

 

 

.printf() 사용 할 때 여러개 출력 시 \n 매번 입력하기 구차늘때

Intellij 설정( cmd + , ) > Live Template 검색 > Java > souf 찾아서 텍스트에 \n추가해주면 자동으로 나타난다!

 

'study' 카테고리의 다른 글

(230501) JAVA - For문 / 코드업 문제 풀이  (0) 2024.07.25
(230428) Java - 제어문  (0) 2024.07.25
(230426) JAVA - 인스턴스화, Swap예제  (0) 2024.07.25
(230425) Java / Codeup 1037까지  (0) 2024.07.25
(230424) Java - 타입변환  (0) 2024.07.25