자바 도전기-7

김치전사·2021년 12월 30일
0

자바도전기

목록 보기
7/17

이번 시간은 산술 연산자에 대해 공부한다

산술 연산자에는 사칙 연산자(+, -, *, /)와 나머지 연산자(%)가 있다

곱셈(*), 나눗셈(/), 나머지(%) 연산자가 덧셈(+), 뺄셈(-)연산자보다 우선순위가 높으므로 먼저 처리된다

public class OperatorEx5 {
    public static void main(String args[]){
        int a=10;
        int b=4;

        System.out.printf("%d + %d = %d%n",a,b,a+b);
        System.out.printf("%d - %d = %d%n",a,b,a-b);
        System.out.printf("%d * %d = %d%n",a,b,a*b);
        System.out.printf("%d / %d = %d%n",a,b,a/b);
        System.out.printf("%d / %f = %f%n",a,(float)b,a/(float)b);
    }
}

int타입은 소수점을 저장하지 못하므로 정수만 남고, 반올림이 발생하지 않는다

public class OperatorEx6 {
    public static void main(String[] args){
        byte a=10;
        byte b=20;
        byte c=(byte)(a+b);//byte로 형변환
        System.out.println(c);
    }
}

byte+byte 덧셈은 int로 형변환 후 처리되기 때문에 byte형으로 형변환을 해줘야지 오류가 안 발생한다

public class OperatorEx8 {
    public static void main(String[] args){
        int a=1_000_000;
        int b=2_000_000;

        long c=a*b;
        System.out.println(c);//-1454759936
    }
}

int*int는 int형이므로 연산결과는 int타입이다. 그래서 long형으로 변환하여도 값이 오류가 나온다.

public class OperatorEx9 {
    public static void main(String[] args){
        long a= 1_000_000*1_000_000;
        long b= 1_000_000*1_000_000L;

        System.out.println("a="+a);//-727379968
        System.out.println("b="+b);//1000000000000;
    }
}

a는 long형이여도 int형과 int형의 연산결과가 int형이므로 오류가 나왔고 b는 long형으로 자동형변환해서 계산하므로 원하는 결과값이 나왔다

public class OperatorEx10 {
    public static void main(String[] args){
        int a= 1000000;

        int result1= a*a/a;
        int result2= a/a*a;

        System.out.printf("%d * %d / %d = %d%n",a,a,a,result1);//-727
        System.out.printf("%d / %d * %d = %d%n",a,a,a,result2);//1000000
    }
}

같은 연산이여도 연산순서에 따라 결과값이 바뀐다

public class OperatorEx11 {
    public static void main(String[] args){
        char a='a';
        char d='d';
        char zero='0';
        char two='2';

        System.out.printf("'%c' - '%c' =%d%n",d,a,d-a);
        System.out.printf("'%c' - '%c' =%d%n",two,zero,two-zero);
        System.out.printf("'%c'=%d%n",a,(int)a);
        System.out.printf("'%c'=%d%n",d,(int)d);
        System.out.printf("'%c'=%d%n",zero,(int)zero);
        System.out.printf("'%c'=%d%n",two,(int)two);

    }
}

문자로도 사칙연산이 가능하다

public class OperatorEx12 {
    public static void main(String[] args){
        char c1= 'a';
        char c2= c1;
        char c3=' ';

        int i=c1+1;

        c3=(char)(c1+1);
        c2++;
        c2++;

        System.out.println("i="+i);//i=98
        System.out.println("c2="+c2);//c2=c
        System.out.println("c3="+c3);//c3=b
    }
}

유니코드로 저장되므로 1을 올리면 다른 문자로 바뀌게 된다

public class OperatorEx15 {
    public static void main(String[] args){
        char lowerCase='a';
        char upperCase=(char)(lowerCase-32);
        System.out.println(upperCase);//A
    }
}

소문자에서 대문자의 코드값 차이는 10진수로 32이므로 사칙연산을 통해 대문자로 바뀌는 것을 알 수 있다

나머지 연산자 %

나머지 연산자는 모듈러 연산자라고도 부른다
나머지 연산자는 짝수, 홀수 또는 배수 검사 등에 주로 사용된다

public class OperatorEx19 {
    public static void main(String args[]){
        int x=10;
        int y=8;

        System.out.printf("%d을 %d로 나누면, %n",x,y);//10,8
        System.out.printf("몫은 %d이고, 나머지는 %d입니다. %n",x/y,x%y);//1,2
    }
}
public class OperatorEx20 {
    public static void main(String[] args){
        System.out.println(-10%8);//-2
        System.out.println(10%-8);//2
        System.out.println(-10%-8);//2
    }
}

나머지 연산자(%)는 나누는 수로 음수도 허용한다. 그러나 부호는 무시된다.

profile
개인공부 블로그입니다. 상업적 용도 X

0개의 댓글