Coding(Java)/Java(이론)2021. 8. 20. 12:30
반응형

[Java] 5. 단항연산자, 산술연산자

 

 

자바 프로그래밍에서의 연산자는 자료의 가공을 위해 정해진 방법에 따라 계산하고 결과를 얻기 위한 행위를 의미하는 기호들을 뜻한다.  

다음은 연산자의 종류들이다.

종류 연산자
증감연산자 ++, --
산술연산자 +, -, *, /, %
시프트연산자 >>, <<, >>>
비교연산자 >, <, >=, <=, ==, !=
비트연산자 &, |, ^, ~
논리연산자 &&, ||, !
조건(3항)연산자 ?, ;
대입연산자 =, *=, /=, %=, +=, -=

 

단항연산자

 

단항연산자는 ~(2진논리 not연산자), !(일반논리 not연산자), ++(증가연산자), --(감소연산자), -(부호연산자), cast(강제형변환) 등이 있다. 

 

다음은 위 연산자들을 이용한 자바 프로그램의 코드이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package mymain;
 
public class Operation1 {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        //1. 2진논리 not연산자 ~
        
        //2진수         
        int n=15;  // => 00000000000000000000000000001111
        int m=~n;  // => 11111111111111111111111111110000
        int c=-n;  // => 11111111111111111111111111110001
        // Integer.toBinaryString(정수) : 정수를 2진수 문자열로 변환
        System.out.printf("n=[%32s]\n", Integer.toBinaryString(n));
        System.out.printf("m=[%32s]\n", Integer.toBinaryString(m));
        System.out.printf("c=[%32s]\n", Integer.toBinaryString(c));
        System.out.println();
        //16진수: 16진수 한 자리는 2진수 4자리
        //                     f   0   e   0   d   0
        n=0xf0f0f0f0// =>    111100001110000011010000
        m=~n;         // =>    000011110001111100101111
        System.out.printf("n=[%32s]\n", Integer.toBinaryString(n));
        System.out.printf("m=[%32s]\n", Integer.toBinaryString(m));
        
        
        //2. 일반논리 not연산자 !
        boolean b=10>5;
        System.out.printf("10>5=> %b\n",b);
        b=!(10>5);
        System.out.printf("!(10>5)=> %b\n",b);
        System.out.printf("!true=%b, !false=%b\n"!true!false);
        System.out.println();
        
        //3. 증감연산자 ++, --
        
        int a=0;
        //자신의 값을 1증가(독립적으로 사용시에는 전/후위형 결과 동일)
        ++a; //a=a+1 (a에 a+1를 대입, a에 1을 더한 것을 a로)
        System.out.printf("a=%d\n", a);
        
        a++//a=a+1 ()
        System.out.printf("a=%d\n", a);
        
        //자신의 값을 1감소
        --a; // a=a-1
        System.out.printf("a=%d\n", a);
 
        a--// a=a-1
        System.out.printf("a=%d\n", a);
        
        int x=100;
        System.out.printf("x++=%d x=%d ++x=%d\n", x++, x, ++x);
        
        //4.부호연산자 -
        int z=+111;
        int y=-z;
        System.out.printf("z=%d, y=%d\n", z, y);        
        System.out.printf("|-1111|=%d\n"-(-1111));  // (-100)*(-1)
        System.out.println();
        
        //5.cast: 강제 형변환        
        double d=1.0+1// 1.0(double)+1(int) => int->double변환
        //  1.0(double)+1.0(double)
 
        //대입 시 자동 형변환
        float f=1// f(float)=1(int) (X) => 1.0f(float)변환 => f=10.f;
        
        //강제형변환: (cast)값
        float f1=(float)1.0// f1(float)=1.0(double) (X) 
           //=> 자동형변환 안되면 강제로 변환
        
        byte b1=1, b2=2, b3;        
        b3=(byte)(b1+b2);        
        short s1=3, s2=4, s3;
        s3=(short)(s1+s2);
        
        System.out.printf("d=%f\n",d);
        System.out.printf("f=%f\n",f);
        System.out.printf("f1=%f\n",f1);
        System.out.printf("b3=%d\n",b3);
        System.out.printf("s3=%d\n",s3);
        System.out.println();
        
        //6. 산술연산자. +(더하기),-(빼기),*(곱하기),/(몫),%(나머지)
        int p=22, q=7, res;
        
        //더하기
        res=p+q;
        System.out.printf("%d+%d=%d\n",p,q,res);
        
        //빼기
        res=p-q;
        System.out.printf("%d-%d=%d\n",p,q,res);
        //곱하기
        res=p*q;
        System.out.printf("%d×%d=%d\n",p,q,res);
        //몫(나누기)
        res=p/q;
        System.out.printf("%d/%d=%d\n",p,q,res);
        //나머지(나누기)
        res=p%q;
        System.out.printf("%d%%%d=%d\n",p,q,res);
        System.out.println();
        
        //몫연산자는 정수/정수 연산시 정확한 몫 발생
        double w=10.0/3// 3(int)->3.0(double) => 10.0/3.0 연산실행
        System.out.println(w);//10을 3으로 나누는 연산 실행
        System.out.println((int)w);//10을 3으로 나눈 몫
        
        //나머지 연산자는 정수/정수 실수/실수 상관없다
        w=10.0%3.0;
        System.out.println(w);//10.0을 3.0으로 나눈 나머지
    }
 
}
cs

 

1.이진논리 not 연산자 부분의 코드는 다음과 같고,

        //2진수         
        int n=15;  // => 00000000000000000000000000001111
        int m=~n;  // => 11111111111111111111111111110000
        int c=-n;  // => 11111111111111111111111111110001
        // Integer.toBinaryString(정수) : 정수를 2진수 문자열로 변환
        System.out.printf("n=[%32s]\n", Integer.toBinaryString(n));
        System.out.printf("m=[%32s]\n", Integer.toBinaryString(m));
        System.out.printf("c=[%32s]\n", Integer.toBinaryString(c));
        System.out.println();
        //16진수: 16진수 한 자리는 2진수 4자리
        //                     f   0   e   0   d   0
        n=0xf0f0f0f0// =>    111100001110000011010000
        m=~n;         // =>    000011110001111100101111
        System.out.printf("n=[%32s]\n", Integer.toBinaryString(n));
        System.out.printf("m=[%32s]\n", Integer.toBinaryString(m));

위 코드의 실행결과는 다음과 같다.

n=[                            1111]
m=[11111111111111111111111111110000]
c=[11111111111111111111111111110001]

n=[11110000111100001111000011110000]
m=[    1111000011110000111100001111]

첫 번째 m, c는 각각 n의 2진논리 부정, 음의 부호이다. m은 n에서 0과 1이 뒤바뀐 것이고, c는 n에서 0과 1이 뒤바뀐 m에 1을 더한 것이고 이것을 각각 1의 보수, 2의 보수라고 한다. 

c는 n의 음의 값이고, 컴퓨터는 음수를 다룰 때 2의 보수를 취해서 다룬다. 

 

2.일반논리 not 연산자 부분의 코드는 다음과 같고

//2. 일반논리 not연산자 !
        boolean b=10>5;
        System.out.printf("10>5=> %b\n",b);
        b=!(10>5);
        System.out.printf("!(10>5)=> %b\n",b);
        System.out.printf("!true : %b  !false=%b\n"!true!false);
        System.out.println();

위 코드의 실행결과는 다음과 같다.

10>5=> true
!(10>5)=> false
!true=false, !false=true

10은 5보다 크니 당연히 true이고, 이것의 부정은 거짓이므로 false. 참의 부정은 거짓, 거짓의 부정은 참이다.

 

3.증감연산자 부분의 코드는 다음과 같고

        //3. 증감연산자 ++, --
        int a=0;
        //자신의 값을 1증가(독립적으로 사용시에는 전/후위형 결과 동일)
        ++a; //a=a+1 (a에 a+1를 대입, a에 1을 더한 것을 a로)
        System.out.printf("a=%d\n", a);
        
        a++//a=a+1 ()
        System.out.printf("a=%d\n", a);
        
        //자신의 값을 1감소
        --a; // a=a-1
        System.out.printf("a=%d\n", a);


        a--// a=a-1
        System.out.printf("a=%d\n", a);
        
        int x=100;
        System.out.printf("x++=%d x=%d ++x=%d\n", x++, x, ++x);

위 코드의 실행결과는 다음과 같다.

a=1
a=2
a=1
a=0
x++=100 x=101 ++x=102

전위형: 변수 자신의 연산부터 먼저 실행, ++변수, --변수
후위형: 다른 작업부터 실행 후 자신의 증감연산 실행, 변수++, 변수--

 

4.부호연산자 부분의 코드는 다음과 같고

        int z=+111;
        int y=-z;
        System.out.printf("z=%d, y=%d\n", z, y);        
        System.out.printf("|-1111|=%d\n"-(-1111));  // (-100)*(-1)
        System.out.println();

위 코드의 실행결과는 다음과 같다.

z=111, y=-111
|-1111|=1111

수학에서처럼 -부호 붙이는 것과 같다.

 

5. cast(강제 형변환) 부분의 코드는 다음과 같고,

//5.cast: 강제 형변환

        double d=1.0+1// 1.0(double)+1(int) => int->double변환
        //  1.0(double)+1.0(double)


        //대입 시 자동 형변환
        float f=1// f(float)=1(int) (X) => 1.0f(float)변환 => f=10.f;
        
        //강제형변환: (cast)값
        float f1=(float)1.0// f1(float)=1.0(double) (X) 
           //=> 자동형변환 안되면 강제로 변환
        
        byte b1=1, b2=2, b3;        
        b3=(byte)(b1+b2);        
        short s1=3, s2=4, s3;
        s3=(short)(s1+s2);
        
        System.out.printf("d=%f\n",d);
        System.out.printf("f=%f\n",f);
        System.out.printf("f1=%f\n",f1);
        System.out.printf("b3=%d\n",b3);
        System.out.printf("s3=%d\n",s3);
        System.out.println();

이 코드의 실행결과는 다음과 같다.

d=2.000000
f=1.000000
f1=1.000000
b3=3
s3=7

자동 형변환은 연산을 실행할 때 자료형이 큰 쪽으로 변환되고, 대입을 실행할 때 좌변항 쪽에 맞춰지는데 좌변항이 우변항보다 크거나 같을 때만 맞춰진다.

예를들어 위의 예처럼 float형 변수 f를 정수값 1로 주었다면 1.0이 된다.

강제 형변환은 형변환을 하려는 수 앞에 괄호를 입력하고, 그 괄호 안에 형변환하려는 형태(int, float 등등)를 입력하여 괄호 안의 형태로 형변환한다. 자료형이 작은 것으로 형변환하면 정보의 손실이 있을 수 있다.

*참고: 자료형 크기순서: byte < short < int < long < float < double

 

6. 산술연산자 부분의 코드는 다음과 같고

        //6. 산술연산자. +(더하기),-(빼기),*(곱하기),/(몫),%(나머지)
        int p=22, q=7, res;
        
        //더하기
        res=p+q;
        System.out.printf("%d+%d=%d\n",p,q,res);
        
        //빼기
        res=p-q;
        System.out.printf("%d-%d=%d\n",p,q,res);
        //곱하기
        res=p*q;
        System.out.printf("%d×%d=%d\n",p,q,res);
        //몫(나누기)
        res=p/q;
        System.out.printf("%d/%d=%d\n",p,q,res);
        //나머지(나누기)
        res=p%q;
        System.out.printf("%d%%%d=%d\n",p,q,res);
        System.out.println();
        
        //몫연산자는 정수/정수 연산시 정확한 몫 발생
        double w=10.0/3// 3(int)->3.0(double) => 10.0/3.0 연산실행
        System.out.println(w);//10을 3으로 나누는 연산 실행
        System.out.println((int)w);//10을 3으로 나눈 몫
        
        //나머지 연산자는 정수/정수 실수/실수 상관없다
        w=10.0%3.0;
        System.out.println(w);//10.0을 3.0으로 나눈 나머지

이 코드의 실행결과는 다음과 같다.

22+7=29
22-7=15
22×7=154
22/7=3
22%7=1

3.3333333333333335
3
1.0

서로 다른 형태의 수를 연산하려고 하면 앞에서처럼 형변환을 해야 한다(그렇지 않으면 에러 발생), 덧셈, 뺄셈, 곱셈은 수학과 일치하고, 나눗셈의 경우 몫(/) 따로, 나머지(%) 따로 분리되어 있다.

몫연산자는 정수/정수 연산에서 정확한 몫을 발생시키고, 나머지 연산자는 정수/정수 연산, 실수/실수 연산 관계없이 나머지를 발생시킨다. 만약 실수(double)형인 10.0을 정수(int)형 3으로 나누면 3.333333333...의 결과가 출력된다.

마지막으로 0으로 나누는 연산은 실행되지 않는다. 

반응형
Posted by skywalker222