개발자 미니민의 개발스터디

5. 연산자

by mini_min

◾ short, byte 변수를 선언하고 연산을 실행할 때, 자료형 때문에 오류가 발생하는 경우가 있다. 

이때 형 변환을 해주면 오류는 해결되는데, 형 변환을 해주는게 별로 효율적인 방법은 아니라고 한다.

byte a, b, c;
a = 10;
b = 5;
// c = a + b; // int 형을 byte 형에 넣은 격. (큰 값을 작은 값에 넣으려고 한 것) 
    // byte 형인 것을 int로 변환해야한다.
    // byte + byte => int형 + int형 => int형
// c = (byte)a + (byte)b; <= 오류..
c = (byte)(a+b); 

a = 100;
b = 120;
c = (byte)(a+b); // byte가 담을 수 있는 값을 넘어선... overflow 발생 : -36
                // a 랑 b 값도 모르는 쓰레기값 나옴
System.out.println(c); // -36

short s1 = 100, s2 = 200, s3;
// short + short => int + int 로 바뀌면서 컴파일 오류.

s3 = (short)(s1+s2);
System.out.println(s3); // 300

char c1 = 'A', c2 = 10, c3;
// 	c3 = c1 + c2; // 컴파일 오류. char + char => int + int 가 된다. int형을 char에 대입할 수 없음
c3 = (char)(c1+c2);
System.out.println(c3);

int x;
x = 0b101 + 20;
System.out.println(x); // 25

 

◾ 정수 연산 결과는 '정수'

연산자 우선순위로 정수가 우선 연산된다.

int a;

// 정수 연산자 정수 => 결과는 정수
a = 3/2 + 1/2 + 2/3;
System.out.println(a);

double b;
b = 3/2 + 1/2 + 2/3; //1.5+0.5+0.33 = 2.3 << 아님... 정수 연산자 정수는 정수...
    // 연산자 우선순위로 3/2 1/2 2/3 정수 우선 연산함...
System.out.println(b); // 1.0 ... 

// 실수 연산자 정수 -> 실수
b = 3/2. + 1/2 + 2/3; // 정수 연산자 실수 -> 실수
// 1.5 + 0 + 0 = 1.5
System.out.println(b);

 

◾ 형 변환을 어디에 붙이느냐에 따라 결과가 달리 나올 수 있다.

int a = 3, b = 2;
double c;

c = a/b + a/b;
System.out.println(c); // 2.0

c = (double)(a/b) + a/b; // 1.0 + 1 = 2.0
System.out.println(c); // 2.0

c = (double)a/b + a/b; // 붙어있는 a만 더블로 바꾼거. // 1.5 + 1
System.out.println(c); // 2.5

c = (double)a/b + (double)a/b; // 3.0 값 출력 (1.5+1.5)
System.out.println(c); // 3.0

c = 'A' / 10.;
System.out.println(c); // 6.5

c = 'A' / 10;
System.out.println(c); // 6.0 // 10. 소수점이 없기 때문에 정수처럼 처리 후 쩜을 찍는다.

 

◾ 반지름을 입력 받아 원의 넓이와 둘레 계산하기

Scanner sc = new Scanner(System.in);
double a;
double b, c;

System.out.println("반지름 ? ");
a = sc.nextDouble();

b = a * a * 3.141592;
c = a * 2 * 3.141592;

System.out.println("넓이 : " + b + "," + "둘레 : " + c);


sc.close();

 

◾ 정수 연산 결과는 정수이기 때문에, 1의 자리를 버릴 때는 나누기 10을 하고 10을 다시 곱해주면 되고, 반올림이 필요할 때는 5를 더해서 십의 자리 숫자를 올리고 나누기 10을 하고 10을 다시 곱해주면 된다.

 

double 변수에서 반올림하여 2자리 출력하고 싶으면,

%.2f 

 

소수점 3째자리에서 버려서 2자리 출력하고 싶으면,

곱하기 100 하여 int 형변환

그리고 다시 100.0 으로 나눠서 소수점을 찍어준다.

int a = 123456;
//1자리 버림
a= a / 10 * 10; // 나머지가 떨어져 나감!
System.out.println(a);

//1자리 반올림
a = 12356;
a = (a+5) / 10 * 10;
System.out.println(a);


double b = 126.4563;
// 소수점 3째자리에서 반올림해서 2자리 출력하기
System.out.printf("%.2f\n", b); // 126.46

// 소수점 3째자리에서 버려서 2자리 출력하기
b = (int)(b * 100) / 100.0; // 소수점 2자리까지 확보해두고 다시 나눠서 소수점 찍기!
System.out.print(b);

 

◾ 증감 연산자

a = 10;
b = a++ + a++ + 1;  // 10 + 10 + 1 = b는 21 / a는 12
System.out.println(a + "," + b);

a = 10;
b = ++a + ++a + 1;  // 11 + 12 + 1 = b는 24 / 12    => "항을 넘어가면서 ++ 해주기!"++++++
System.out.println(a + "," + b);


a = 10;
b = a++ + ++a + ++a + a++ + a++; // 10 + 12 + 13 + 13 + 14 = 57 / a는 15
System.out.println(a + "," + b);

a = 0;
b = a-- - a;
System.out.println(a + "," + b);


char c = 'A';
System.out.println((c++) + "," + (++c) + "," + (c+10)+ "," + (char)(c+10));  // A, C, 77 //문자 + 숫자 = 정수형

 

◾ 실수도 ++ 연산이 가능하다.

double d = 43.5;
d++;			// 실수도 ++ 연산이 가능하다.
System.out.println(d); // 44.5

 

 

◾ 관계 연산자 : > >= < <=, ==, != (참 or 거짓)

c = a > b;
System.out.println(c);	// true


a = 10; b = 10;
System.out.println(a > b); // false
System.out.println(a >= b); // true

 

◾ 논리 연산자 : &&, ||, !

&& 는 둘 다 참일 때 참, || 는 둘 중 하나만 참이어도 참, ! 는 반대값이 나온다.

// 논리 연산자 : &&, ||, !
boolean a = true, b = false;

System.out.println(a && b);
System.out.println(a || b);
System.out.println(!a);

 

◾ &&는 앞에 있는 것이 거짓이면 뒤쪽 연산을 안함!!!!!!! (단축 연산)

||는 앞에 있는 것이 참이면 뒤쪽 연산을 안함 !!!! (단축 연산)

a = 10;
b1 = false;
b2 = a > 20 && (b1 = true);
System.out.println(b1 + "," + b2);
a = 10;
b1 = false;
b2 = a < 20 || (b1 = true);	
System.out.println(b1 + "," + b2); // false, true

 

◾ 비트 단위 연산 : & 는 and 연산은 필요없는걸 없앨 때 사용한다. 

^ 는 덧셈처럼 사용한다.  (결합)

| 는 항상 자기보다 큰 값이 나온다. (줄어든 수가 나올 수 없다.)

// 비트 단위 연산
int a, b, c;

a = 12;
c = ~a;
System.out.println("~12 : " + c);

a = 12;
b = 6;
System.out.println("12 & 6 : " + (a & b)); // 0100 : 4
System.out.println("12 | 6 : " + (a | b)); // 1110 : 14
System.out.println("12 ^ 6 : " + (a ^ b)); // 1010 : 10

 

int a, b, c;

a = 13;
a = a ^ 20;
System.out.println(a); //25

a = a ^ 20;
System.out.println(a); //13 ??? : 위에 25는 암호화 알고리즘이 뜬 것이라고 보면 된다. 

a = 17;
b = 22;
// a와 b 변수가 가지고 있는 값 바꾸기
c = a; a = b; b = c;
System.out.println(a + "," + b);

a = 17;
b = 22;
a = a ^ b;
b = b ^ a;
a = a ^ b;
System.out.println(a + "," + b);

 

◾ 배정연산

a 와 b 를 c = a + b 연산하는 것이 아닌

a += b 

이렇게 연산하는 것을 배정 연산이라고 하며, 형 변환이 일어나지 않아서 연산 속도가 빠르다.

// 배정 연산
short a, b;

a = 10; b = 5;
a = (short)(a + b); // 형 변환 필요
System.out.println(a);

a = 10; b = 5;
a += b; // 형 변환이 일어나지 않으므로 연산 속도가 더 빠르다.
System.out.println(a); // 15 나오지만 더 빠르다.

 

◾ 배정연산 활용하기 

int a;

a = (+-+-+-((5%3)*(4/2))); // -가 3개가 있으니 음수가 나온다.
System.out.println(a);

int x=2, y=5, z=0; 
x += 3 + 2;
System.out.println(x + "," + y + "," + z);

x += y -= z = 4;
System.out.println(x + "," + y + "," + z);

 

 

◾ 삼항 연산자 활용하기

변수 = 조건식 ? 참일 경우 : 거짓일 경우 

이렇게 쓰는 것이 삼항 연산자이다.

Scanner sc = new Scanner(System.in);
int a, b;

System.out.print("정수 ? ");
a = sc.nextInt();

b = a > 0 ? a : -a;

System.out.println(a + " -> " + b);


sc.close();
b = a % 2 == 0 ? "짝수" : "홀수";

System.out.printf("%d는 %s 입니다.", a, b);

 

◾ 삼항 연산자 활용하기

b = a > 0 ? "양수" : (a == 0 ? "영" : "음수");

System.out.println(a + " -> " + b);

 

 

 

'개발 공부중 > 📑 코드 복습' 카테고리의 다른 글

7. IF 제어문 + 퀴즈  (0) 2023.02.22
6. 연산자 - 퀴즈  (0) 2023.02.22
4. 확장 문자열 : 키보드로 표현할 수 없는 문자들  (0) 2023.02.22
3. Scanner 입력 받기  (0) 2023.02.22
2. JAVA 데이터 타입  (0) 2023.02.22

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기