[Java] 01. 기본 문법 및 응용(연산자, 조건문)
1. 연산자란?
- 어떤 기능을 수행하는 기호(+,-,*,/ …)
- 연산자의 종류와 우선순위 및 결합 방향
연산기호 결합방향 우선순위 (),. ++ – +(부호) -(부호) ~ ! (type):형변환 <- 높음 * / % -> +(덧셈) -(뺄셈) -> « » »> -> < > <= >= instanceof -> == != -> & -> ^ -> ㅣ -> && -> ㅣㅣ -> ? : -> = *= /= %= += -= «= »= »>= &= ^= ㅣ= <- 낮음
- 우선순위는 헷갈리기 쉬우니까 (소괄호) 이용하자
산술 이항 연산자는 연산 전에 피 연산자의 타입을 일치시킨다.
byte b1 = 10;
byte b2 = 20;
byte b3 = b1 + b2; //Type mismatch: cannot convert from int to byte
//피연산자의 크기가 4byte(int) 미만이면 int로 변경한 후 연산 진행
int i1 = 10;
long l1 = 20;
int i2 = i1 + l1; //Type mismatch: cannot convert from long to int
//두 개의 피연산자 중 큰 타입으로 형 변환 후 연산 진행
float f1 = 10.0;
float f2 = f1 + 20.0; //Type mismatch: cannot convert from double to float
int i = 10;
System.out.println((i--)%2); //0
System.out.println(--i); //8
System.out.println(i++); //8
System.out.println(++(i-2)); //컴파일 에러
++, --는 변수에만 사용할 수 있다.
비트 논리 연산자
- 2진수 형태로 변환 후 연산
연산자 연산자 기능 결합방향 & 두 피 연산자의 비트 값이 모두 1인 경우만 1, 나머지는 0 (ex> a&b) -> ㅣ 두 피 연산자의 비트 값이 모두 0인 경우만 0, 나머지는 1 (ex> aㅣb) -> ^ 두 피 연산자의 비트 값이 서로 다르면 1, 같으면 0 (ex> a^b) -> ~ 두 피 연산자의 모든 비트를 반전시킴 -> 1의 보수 (ex> ~a) <-
a: 10진수 3 -> 2진수 0 0 0 0 0 0 1 1
b: 10진수 5 -> 2진수 0 0 0 0 0 1 0 1
a & b : 0 0 0 0 0 0 0 1
a | b : 0 0 0 0 0 1 1 1
a ^ b : 0 0 0 0 0 1 1 0
비트 이동 연산자 (쉬프트 연산자)
- *2, /2에 비해 속도가 빠름
연산자 연산자 기능 결합방향 « 앞의 피 연산자 비트 열을 뒤 피 연산자 만큼 왼쪽으로 이동하고 이동에 따른 빈 공간은 0으로 채움 (ex> a«2) -> » 앞의 피 연산자 비트 열을 뒤 피 연산자 만큼 오른쪽으로 이동하고 이동에 따른 빈 공간은 음수는 1, 양수는 0으로 채움 (ex> a»2) -> »> 앞의 피 연산자 비트 열을 뒤 피 연산자 만큼 오른쪽으로 이동하고 이동에 따른 빈 공간은 0으로 채움 (ex> a»>2) ->
a = 10;
b = a << 1 => *2와 동일
c = a >> 1 => /2와 동일
논리 연산자
- 논리 연산자
연산자 연산자 기능 결합방향 & 두 개의 피 연산자 모두 true인 경우 true (ex> a>0 & b>0) -> ㅣ 두 개의 피 연산자가 하나라도 true이면 true (ex> a>0 ㅣ b<0) -> ! 단항 연산자로 피 연산자의 값이 false이면 true, true이면 false로 변경 (ex> !a) <- ^ 두 피 연산자가 서로 다를 경우만 true, 같으면 false (ex> true ^ false -> true, true ^ true -> false) ->
& T F ㅣ T F T T F T T T F F F F T F
- Short Circuit 연산자
연산자 연산자 기능 결합방향 && &와 동일한 의미이나 앞의 피 연산자가 false이면 뒤의 피 연산자를 검사하지 않는다. (ex> a>0 && b>0) -> ㅣㅣ ㅣ와 동일한 의미이나 앞의 피 연산자가 true이면 뒤의 피 연산자를 검사하지 않는다. (ex> a>0 ㅣㅣ b>0) ->
2. 조건문
if문
- if(_____)
(논리형) boolean b;
(비교식) x>=y
(Method Call) isEven()
- if문 예제
int a = 20;
String grade = null;
if(a>=6){ if(a>=19)
grade = "아동"; grade = "성인";
} else if(a>=13){ System.out.println("성인");
grade = "청소년"; else if(a>=13)
} else if(a>=19){ grade = "청소년";
grade = "성인"; else if(a>=6)
} esle{ grade = "아동";
grade = "유아"; else
} grade = "유아";
오류 코드
- 3항 연산자
int a =10;
String str = null;
if(a>=10){
str = "10 이상";
} else{
str = "10 미만";
}
3항 연산자 사용
str = a>=10 ? "10 이상" : "10 미만";
switch문
- switch(_____)
(정수호환) byte, short, char, int x;
(Enum) Day.MONDAY
(Class Object) Byte, Short, Character, Integer, String
(Method Call) getNumber()
- switch문 예제
switch(value)
case 1: ...;
case 2: ...; break;
case 3: ...;
case 4: ...;
case 5: ...; break;
default:
=> ~부터 break 만나기 전 까지 실행
=> value값이 case 조건에 없으면 default 실행
int month = 3;
int day = -1;
switch(month){
case 2:
day = 29; break;
case 4:
case 6:
case 9:
case 11:
day = 30; break;
default:
day = 31;
}
etc. ★Random 수 활용★
구분 코드 범위 Math.random() double d = Math.random() 0.0 <= d < 1.0 double d = Math.random()*N 0.0 <= d < N.0 int i = (int)(Math.random()*N) 0 <= i <= N-1 int i = (int)(Math.random()*N)+1 1 <= i < N Random rand = new Random(); rand.nextInt(N) int i = rand.nextInt(N) 0 <= i < N int i = rand.nextInt(N)+1 1 <= i <= N
- 주사위를 던져서 나올 수 있는 경우의 수(1~6) 구하기 (Random 이용)
int N = 6;
int num = (int)(Math.random()*N)+1;
System.out.println(num);
Random rand = new Random();
num = rand.nextInt(N)+1;
System.out.println(num);
num = rand.nextInt(100)%N+1;
System.out.println(num);
- 주사위를 두 번 던져서 연속적으로 짝수 또는 홀수가 나오면 ‘A’를, 그렇지 않으면 ‘B’를 출력하는 코드
int N = 6;
Random rand = new Random();
int num1 = rand.nextInt(N)+1;
int num2 = rand.nextInt(N)+1;
String result = null;
boolean isNum1Even = num1%2 == 0;
boolean isNum2Even = num2%2 == 0;
result = isNum1Even == isNum2Even ? "A" : "B";
또는
result = (num1 + num2) % 2 == 0 ? "A" : "B";
댓글남기기