산술 연산자(+,-,*,/,%,<<,>>), 비교연산자(<,>,<=,>=,==,!=), 논리 연산자(&&,||,!,&,|,^,~), 대입연산자(=) 등이 있다.
연산자의 연산 순서는 산술, 비교, 논리, 대입 순이다.
산술 연산자에서 타입이 다른 두 가지를 연산할 때 타입을 일치시킨 후 연산을 해야한다. 작은 타입에서 큰 타입으로 형변환을 해야하는 경우 자동형변환이 되므로 형변환을 생략해도 된다.
int a = 10;
float f = 20.1f;
float result = f + (float) a;
// int보다 float가 더 큰 타입이므로 생략가능
float reuslt = f + a;
boolean test1 = "apple" == "apple"; // 에러가 나지는 않는다.
boolean test2 = "apple".equals("apple");
String string1 = new String("apple");
String string2 = "apple";
논리연산자(&&,||,!..)는 코드를 짜면서 자주 이용했지만 비트연산자(&,|,^,~,<<,>>)는 많이 이용하지 않았었다. 논리 연산자와 비슷한 맥락인데 피연산자를 비트단위로 논리연산 하는 것이 비트 연산자이다.
& (AND연산자), |(OR연산자), ^(XOR연산자, 값이 서로 다를 때만 1을 결과로 얻는다.)
<<와 >>는 쉬프트(shift) 연산자로 예를 들어 2진수인 피연산자를 <<5이면 왼쪽으로 숫자를 5칸 옮긴다는 의미이다.
if문과 비슷한 개념의 연산자이다. 기본적인 틀은 이렇다.
조건식 ? 식1 : 식2;
? 왼쪽의 조건식에 따라 참이면 식1을 결과값으로 내고, 거짓이면 식2를 결과값으로 낸다. 밑의 두 식은 서로 바꿔 쓸 수 있다.
result = (x>y) ? x : y;
if (x>y) result = x;
else result = y;
a *= b + 3;
// a = a * (b + 3); (O)
// a = a * b + 3; (X)
조건문과 반복문의 개념에 대해서는 파이썬을 공부했을 때부터 나름 열심히 했었기 때문에 개념보다는 예제위주로 포스팅하려고 한다.
switch(result) {
case '1': // char은 유니코드로 저장되므로 가능
case ONE: // 정수 상수 가능
case "YES": // 문자열 불가능
case num: // 변수 불가능
case 3.14: // 실수 불가능
}
case 문을 빠져나오기 위해서 break문을 사용한다. break문을 사용하지 않으면 그 아래의 case문을 모두 수행하게 된다. 경우에 따라 break문을 적절히 사용할 수 있어야 한다.
case문에 원하는 결과값이 없는 경우 default문으로 이동한다. default문은 맨 마지막의 경우이기 때문에 break문 생략이 가능하다.
switch 문을 이용하게 되면 조건식이 많아질수록 if문보다 처리속도가 더 빨라진다. 예를 들어 점수에 따른 등급을 매기는 프로그램을 작성한다면
import java.util.Scanner;
public class Sample {
public static void main(String[] args) {
char grade = ' ';
System.out.println("점수 입력");
Scanner scanner = new Scanner(System.in);
int point = scanner.nextInt();
switch (point) {
case 99: case 98: case 97: case 96: case 95:
case 94: case 93: case 92: case 91: case 90:
grade = 'A';
break;
case 89: case 88: ..............
grade = 'B';
......
}
System.out.println(grade);
}
}
만약 if문을 사용한다면 point에 대한 조건식이 여러개 생길 것이고, 이게 수만개가 되면 처리 속도에 영향을 끼칠지도 모른다. 다만 switch문을 이용했을 때 작성할 case가 많아지기 때문에 이럴 땐 편법을 써는 것도 방법이다.
public class Sample {
public static void main(String[] args) {
char grade = ' ';
System.out.println("점수 입력");
Scanner scanner = new Scanner(System.in);
int point = scanner.nextInt();
switch (point / 10) {
case 10: case 9:
grade = 'A';
break;
case 8:
grade = 'B';
break;
....
for (int i=0,j=4; i<5; i++,j--;) {
System.out.printf("%d %d",i,j);
// System.out.printf("%d %d",i,4-i);
}
public class Sample {
public static void main(String[] args) {
for (int i=0; i<5; i++) {
for (int j=0; j<5; j++) {
System.out.printf("*\t");
}
System.out.println();
}
}
}
public class Sample {
public static void main(String[] args) {
for (int i=0; i<5; i++) {
for (int j=0; j<=i; j++) {
System.out.printf("*\t");
}
System.out.println();
}
}
}