Operator 연산자
+, -, *, /, %
/ : 몫
% : 나눈 후 나머지
활용하기
int num1, num2;
int result; //결과
num1 = 25;
num2 = 7; //나누는 값이 0이되면 에러발생.
result = num1 + num2;
System.out.println(num1 + " + " + num2 + " = " + result);
result = num1 - num2;
System.out.println(num1 + " - " + num2 + " = " + result);
result = num1 * num2;
System.out.println(num1 + " * " + num2 + " = " + result);
result = num1 / num2;
System.out.println(num1 + " / " + num2 + " = " + result);
result = num1 % num2;
System.out.println(num1 + " % " + num2 + " = " + result);
int number = 0;
number = number + 1; // 자기 자신의 값을 갱신
number += 1;
number *= 1; //곱셈 뺄셈 모두 사용 가능
// increment(증가연산자) ++
// decrement(감소연산자) --
number++; // == number = number + 1;
++number;
number--;
--number;
System.out.println("number = "+number);
int tag;
tag = ++number; //number = 3, tag = 3
System.out.println("number = "+number);
System.out.println("tag = "+tag);
tag = number++; //number = 4, tag = 3
System.out.println("number = "+number);
System.out.println("tag = "+tag);
tag = (number++); //number = 5, tag = 4
System.out.println("number = "+number);
System.out.println("tag = "+tag);
}
}
논리연산자(true/false)
&& AND 그리고
|| OR 또는
! NOT ~아닌
(일반적으로 제어문과 같이 사용(if, while, do while) )
< > <= >= == 비교연산자
int number = 0;
/*
AND 0 0 -> 0
0 1 -> 0
1 0 -> 0
1 1 -> 1
*/
System.out.println(number > 0 && number < 10);
/*
OR 0 0 -> 0
0 1 -> 1
1 0 -> 1
1 1 -> 1
*/
System.out.println(number > 0 || number < 10);
/*
NOT 0 -> 1
1 -> 0
*/
number = 5;
System.out.println(number == 5);
System.out.println(number != 5); //같지 않다
System.out.println(!(number > 5 && number < 10));
//()안의 값은 false이나 !가 붙어 true가 된다
System.out.println(!(number < 5));
//!가 붙어 ()안이 number >= 5로 변해 true가 되는 상황
}
}
삼항연산자
value = (조건) ? '값1' : '값2' ;
(조건)이 참일경우 값1, (조건)이 거짓일경우 값2 대입.
char c;
c = (number > 0)?'Y':'N';
System.out.println("c = " + c);
int n;
n = (number < 5)?10:20;
System.out.println("n = "+ n);
String str;
str = (number > 3)?"3보다 크다":"3보다 작다";
System.out.println("str = "+ str);
============================================================
***2진법 쉽게 계산하는 방법
ㄱ. ㄴ.
1010 1100 (의 경우 앞 4자리와 뒷 4자리를 ㄱ. 과 ㄴ. 으로나눔)
ㄱ. ㄴ.
1010 1100 (의 경우 앞 4자리와 뒷 4자리를 나눔)
8 4 2 1 8 4 2 1 (아래 1 2 4 8 순으로 숫자 대입)
8 + 2 8 + 4 ( 1의 아래 숫자만 추출 후 더함)
10 12
10*16의1승 12*16의0승
10*16 12*1
A C
10진법 답은 ㄱ+ㄴ = 172
ㄷ. ㄹ. ㅁ.
1111 0000 1010
15 0 10
=F(외울것) 0 =A(외울것)
EX) &의 사용법
0xAC &0xF0의 경우
0xAC
0xF0
------ &연산자 도출(겹치는것만 1)
값
int result;
result = 0xAC & 0xF0;
System.out.println("result = " + result); //답 : result = 160
System.out.printf("0x%x", result); //16진수 출력, 답 : 0xa0
***16진법 2진법으로 쉽게 계산하는 방법
Ex)
ㄱ. ㄴ.
0xC4 ^ 0x78 => XOR연산자
0xC4 ^ 0x78 => XOR연산자
ㄱ. C 4
12 4
(8421) (8421)
1100 0100
ㄴ. 7 8
0111 1000
ㄱ. 0xC4 = 1100 0100
ㄴ. 0x78 = 0111 1000
도출 --------------- ^(XOR)로 다를 때만 1
ㄷ. 1011 1100
(8421) (8421)
11 12
B C
정답은 0xBC
//XOR c4 78
result = 0xc4 ^ 0x78;
System.out.printf("0x%x\n", result); //답 : 0xbc
Ex)
다음의 결과 값을 먼저 기입하고 결과를 확인하라.
int num1, num2;
num1 = 128;
num2 = 56;
16진수로 바꾼다
num1 = (num1 & num2) | (num1 & num2);
num2 = ~(num1 ^ num2);
package main;
public class Ex11 {
public static void main(String[] args) {
int num1, num2;
num1 = 128;
num2 = 56;
//16진수로 바꾼다
//num1 = 128 = 8*16의 1승 + 0*16의 0승 = 80(16진수) = 1000 0000
//num2 = 56 = 3*16의 1승 + 5*16의 0승 = 35(16진수) = 0011 0101
//num1 = 0x80;
//num2 = 0x35;
System.out.printf("0x%x\n",num1);
System.out.printf("0x%x\n",num2);
num1 = (num1 & num2) | (num1 & num2);
//num1 = (1000 0000 & 0011 0101) | (1000 0000 & 0011 0101)
// = (0000 0000) | (0000 0000)
// = 0000 0000
// = 0
System.out.println(num1);
System.out.printf("0x%x\n",num1);
num2 = ~(num1 ^ num2);
//num2 = ~(1000 0000 ^ 0011 0101)
//= ~(1011 0101)
//= 0100 1010
//= -4*16 + 10
//= -64 + 10
System.out.println(num2);
System.out.printf("0x%x",num2);
}
}
===============================================================================
비트연산자 (bit Operator)
bit : 0, 1 로 표현
종류 :
& : AND 겹치는것만 1
| : OR 둘중하나가 1이면 1
^ : XOR -> 보안쪽에서 사용. 1이나 0으로 안겹치는 것만 1
<< : left shift
>> : right shift
~ : 반전
1. & : AND 연산자
//AND
int result;
result = 0xAC & 0xF0;
System.out.println("result = " + result); //답 : result = 160
System.out.printf("0x%x\n", result); //16진수 출력, //답 : 0xa0
result = 0x48 | 0xB4;
System.out.printf("0x%x\n",result); //답 : 0xfc
2. ^ : XOR 연산자
//XOR c4 78
result = 0xc4 ^ 0x78;
System.out.printf("0x%x\n", result); //답 : 0xbc
3. ~ : 반전연산자
//반전 (~) 0 -> 1 1 -> 0 (=NOT 연산자)
byte by = 0x55; // 0101 0101 -> ~0101 0101 == 1010 1010
// A A
System.out.printf("0x%x\n", by);
4. << : Left shift 연산자
>> : Right shift 연산자
// left shift << (*2)
/*
0000 0001(옆으로 한칸 밈) -> 1(값은 *2가 됨)
0000 0010 -> 2
0000 0100 -> 4
8421 8421
*/
byte by1;
by1 = 0x1 << 1;
System.out.println("by1 = "+by1);
by1 <<= 1; //기존 by1*2의 값이 됨
System.out.println("by1 = "+by1);
by1 <<= 1;
System.out.println("by1 = "+by1);
//right shift >> (/2)
by1 >>= 1; //기존 by1/2의 값이 됨
System.out.println("by1 = "+by1);
Ex)
int number;
number = 5;
number = number << 4;
number = number >> 5;
number = number >> 1;
package main;
public class Ex10 {
public static void main(String[] args) {
//8421
int number;
number = 5; //0101
System.out.println(number);
number = number << 4; // 0101 0000 // = 5*16 + 0 = 80
System.out.println(number);
number = number >> 5; // 0010 // = 2
System.out.println(number);
number = number >> 1; // 0001 // = 1
System.out.println(number);
}
}
**공학계열 연습문제
num1 = 0x12;
num2 = 0x34;
number = ~(num1 & ~num2)
**형변환
자료형변환
boolean 1byte
byte 1
short 2
int 4
long 8
float 4
double 8
1. 자동형변환
short sh = 10;
int num;
num = sh; //자동형 변환
System.out.println("num = "+num);
2. 강제(cast) 형변환
num = 20;
sh = (short)num; //강제(cast) 형변환
System.out.println("sh = "+sh);
num = 128;
byte by = (byte)num;
System.out.println("by = "+by); //작은 그릇에 큰 값을 담아 오류값이 나옴
float f1;
f1 = (float)3 / 2;
System.out.println("f1 = "+f1);
우선순위
long lo = 12312341324L;
float fl;
fl = lo; //소수점값이 정수값보다 우선순위가 높아 에러 없음
오차범위와 오류 E10
double d;
d = lo;
System.out.println("fl = "+fl); //fl = 1.23123415E10
System.out.println("d = "+d); //d = 1.2312341324E10
//float의 오차범위로 fl과 d가 값이 다름
//fl = 1.23123415E10 의 뜻
// *10의 10승
// E3이 뒤에 붙으면 *10의 3승
// E-2이 뒤에 붙으면 *(1/10)의 2승 -> 소수점이 앞으로 2칸 이동
형 변환으로 소수점 뒷자리 자르기
double value = 123.4567;
int n;
n = (int)value;
System.out.println("n = "+n); //소숫점 뒷자리 자르기
**Random
random : 난수, 무작위 (<-> pattern)
int rnum;
rnum = (int)(Math.random() * 5); // 5 : 0 ~ 4의 범위
System.out.println("rnum = "+rnum);
//0 ~ 9
rnum = (int)(Math.random() * 10);
System.out.println("rnum = "+rnum);
//10 ~ 20
rnum = (int)(Math.random() * 11) + 10;
// 0 ~ 10
// 10 20 30 40 50
rnum = ((int)(Math.random() * 5) + 1) * 10;
// -1 0 1
rnum = (int)(Math.random() * 3) - 1;
x, y 축에서의 랜덤이동
//x축과 y축 함수에서 몹의 랜덤 이동경로
int x = (int)(Math.random() * 3) - 1; // -1 0 1
int y = (int)(Math.random() * 3) - 1; // -1 0 1