제 3장 연 산 자 연 산 자 의 종 류 연 산 자 우 선 순 위 형 변 환
연산자 식의 의미를 결정: 문장에서 값을 계산 언어와 비슷 좋은 시스템을 작성 연산자(operator), 피연자(operand) 산술식,,관계식, 논리식 // 연산자의 종류 언어와 비슷 연산자는 식의 의미를 결정 좋은 시스템을 작성 언어시스템에서 제공하는 연산자들의 의미와 사용법 습득 자바 언어의 연산자는 표준 C언어의 연산자와 비슷 특히, 수학적인 의미와 구별
연산자의 종류 피연산자가 어떻게 계산될지 나타내는 기호(43개) 산술 연산자 : + - * / % 단항+ 단항- 산술 연산자 : + - * / % 단항+ 단항- 관계 연산자 : > >= < <= == != 논리 연산자 : && || ! 증감 연산자 : ++ -- 비트 연산자 : & | ^ ~ << >> >>> 자바 언어의 연산자 조건 연산자 : ?: 배정 연산자 : = += -= *= /= %= &= ^= |= >>= <<= >>>= 캐스트 연산자 : (자료형) 배열 연산자 : [] 메소드 연산자 : () . instanceof 연산자 : instanceof
산술 연산자 수치 연산을 나타내는 연산자 x = -5 ; x = -(-5) ; x % y = x - (x / y) * y 단항 산술 연산자 : +, - 이항 산술 연산자 : +, -, *, /, % % : remainder opreator(나머지 연산자) 정수형만을 피연산자로 가짐 x % y = x - (x / y) * y x = -5 ; x = -(-5) ; x = -(3-5) ;
예제3-1 DivideOperator.java public class DivideOperator { public static void main(String[] args) { int i; double x; i = 1 / 2; x = 1 / 2; System.out.print("i = " + i); System.out.println(", x = " + x); i = (int) (1 / 2.0); x = 1 / 2.0; }
예제3-2 RemainderOperator.java public class RemainderOperator { public static void main(String[] args) { int n, rem; rem = 10 % 3; n = 10 - (10 / 3 ) * 3; System.out.println("10 % 3 = " + rem); System.out.println("10-(10/3)*3 = " + n); }
산술 연산자 실수형 연산 무한연산(infinite arithmetic) 부동 소수점 표현방법과 연산방법 : IEEE754 표준 underflow, overflow 무한연산(infinite arithmetic) java.lang.Float, java.lang.Double에서 POSITIVE_INFINITY, NEGATIVE_INFINITY 상수 제공 NaN(Not a Number)
관계 연산자 두 개의 값을 비교하는 연산자 연산자 for, while, ... 우선순위 연산결과 : true or false 관계 연산자가 포함된 식 : 관계식 for, while, ... 연산자 , , , , , 우선순위 산술 연산자보다 낮다. b == x < y ===> b == (x < y) a > b + c ===> a > (b + c)
예제3-4 RelationalOperators .java public class RelationalOperators { public static void main(String[] args) { int x=3, y=5, z=7; boolean f, t; f = x > y; t = x < y && y < z; System.out.println("f = " + f + ", t = " + t); f = x <= y; t = x >= y == y >= x; }
논리 연산자 두 피연산자의 논리 관계를 나타내는 연산자 연산자 [예제 3.6] 테스트 ! , && , || (낮음) (높음) a < b && b < c 1 2 3
예제3-5 LogicalOr.java public class LogicalOr { public static void main(String[] args) { System.out.println("TRUE OR TRUE = " + (true || true)); System.out.println("TRUE OR FALSE = " + (true || false)); System.out.println("FALSE OR TRUE = " + (false || true)); System.out.println("FALSE OR FALSE = " + (false || false)); }
예제3-6 LogicalOperators.java public class LogicalOperators { public static void main(String[] args) { int x=3, y=5, z=7; boolean b; b = x < y && y < z; System.out.println("Result = " + b); b = x == y || x < y && y > z; }
증가 및 감소 연산자 연산자 전위 연산자 후위 연산자 (a + b)++ // error n = 1; ++, -- 변수가 아닌 식에는 사용 못함 실수형 적용 안됨 전위 연산자 후위 연산자 (a + b)++ // error n = 1; x = ++n; // x=2, n=2 n = 1; x = n++; // x=1, n=2
예제3-7 IncDecOperators.java public class IncDecOperators { public static void main(String[] args) { int x=3, y=5; int a, b; ++x; --y; System.out.println("x = " + x + " , y = " + y); a = (++x) + 1; System.out.println("x = " + x + " , a = " + a); b = (y++) + 1; System.out.println("y = " + y + " , b = " + b); }
<< >> >>> 비트 연산자 비트 연산자 비트 단위로 연산 --- 기억장소 절약(자바의 저급언어적 특성) 종류 --- &, |, <<, >>, >>>, ^, ~ 피연산자는 반드시 정수형 우선순위 연산자 우선순위 ~ << >> >>> & ^ | (높음) (낮음)
비트 연산자 [1/2] 비트 논리곱 비트 논리합 배타적 논리합(Exclusive OR) 10012 & 00112 = 00012 변수의 일정 부분을 매스킹(masking)하여 특정 부분만을 추출하기 위해 사용 비트 논리합 10012 | 00112 = 10112 배타적 논리합(Exclusive OR) 10012 ^ 00112 = 10102 1의 보수(One’s Complement) ~ 000010102 = 111101012
예제3-8 BitOperators.java public class BitOperators { public static void main(String[] args) { int x=9, y=3; System.out.println(x + " & " + y + " = " + (x&y)); System.out.println(x + " | " + y + " = " + (x|y)); System.out.println(x + " ^ " + y + " = " + (x^y)); System.out.println("~10 = " + (~10)); }
비트 연산자 [2/2] 비트 이동 연산자(shift operator) x << y = x * 2y 왼쪽 이동(<<) 오른쪽 이동(>>) 부호없는 오른쪽 이동(>>>) 부호없는 정수(unsigned integer)를 지원하지 않기 때문에 제공 (-1) >>> 1 ? x << y = x * 2y x >> y = x / 2y
예제3-9 ShiftOperators.java public class ShiftOperators { public static void main(String[] args) { System.out.println(" 10 << 2 = " + (10<<2)); System.out.println(" 10 >> 2 = " + (10>>2)); System.out.println(" 10 >>> 2 = " + (10>>>2)); System.out.println("-10 >>> 2 = " + (-10>>>2)); }
조건 연산자 조건 연산자 max = x; max = y; x > y 형태 : 식1 ? 식2 : 식3 (3항 연산자) 형태 : 식1 ? 식2 : 식3 (3항 연산자) [예제 3.10] 테스트 --- 교과서 80쪽 max = x > y ? x : y ; if (x > y) max = x; else max = y; 참 거짓 max = x; max = y; x > y
예제3-10 ConditionalOperator.java public class ConditionalOperator { public static void main(String[] args) throws java.io.IOException { int a, b, c; int m=0; System.out.print("Enter three numbers : "); a = System.in.read() - '0'; b = System.in.read() - '0'; c = System.in.read() - '0'; m = (a > b) ? a : b; m = (m > c) ? m : c; System.out.println("The largest number = " + m); }
예제3-11 PrintTenItem.java public class PrintTenItem { public static void main(String[] args) { int i, n=25; for (i=1; i<=n; ++i) System.out.print(i + ((i%10 == 0 || i==n) ? "\n" : " ")); }
배정 연산자 배정 연산자의 형태 결합 연산자 의미 : 식1 = 식1 op 식2 식1 op= 식2 x = x * y + 1; 산술 연산자 : + - * / % 비트 연산자 : & | ^ << >> >>> 의미 : x = x * y + 1; x *= y + 1; sum = sum + i ; sum += i ; x = x * (y+1)
캐스트 연산자 캐스트 연산자 --- 자료형 변환 연산자 (자료형) 식 정수사이의 연산 결과는 정수 형태 : 캐스트 연산자 사용 예 : 정수사이의 연산 결과는 정수 (자료형) 식 (int) 3.75 ===> 3 (float) 3 ===> 3.0 (float) (1 / 2) ===> 0.0 (float) 1/2 ===> 0.5
연산자 우선순위 [1/2] 연산자 결합법칙 우선순위 () [] . 좌측결합 (높음) ! ~ ++ -- 단항+ 단항- (자료형) 연산자 결합법칙 우선순위 () [] . ! ~ ++ -- 단항+ 단항- (자료형) * / % + - << >> >>> < <= > >= instanceof == != & ^ | && || ? : = += -= *= /= %= &= ^= |= <<= >>= >>>= 좌측결합 (높음) 우측결합 좌측결합 우측결합 (낮음)
연산자 우선순위 [2/2] y = x + y - z ; // 좌측 결합 y = -x ; // 우측 결합 y = -x++ ; // x의 값에 단항 – 연산을 적용한 후 y에 배정하고 x를 증가 y = -++x ; // x를 증가한 후 x의 값에 단항 - 연산을 적용한 후 y에 배정 y = -x + z ; // x의 값에 단항 – 연산한 후 z를 더하 고 그 결과를 y에 배정
형 변환 [1/6] 캐스팅을 이용하여 프로그래머가 형 변환을 명시 자료형의 크기 방향 형 변환의 주체 묵시적 형 변환 광역화 형 변환 작은 자료형의 값을 큰 자료형의 값으로 변환 협소화 형 변환 큰 자료형의 값을 작은 자료형의 값으로 변환 형 변환의 주체 묵시적 형 변환 컴파일러에 의해 자동수행 명시적 형 변환 캐스팅을 이용하여 프로그래머가 형 변환을 명시
형 변환 [2/6] 광역화 형 변환 컴파일러에 의해 자동으로 수행되는 묵시적 변환 예 : 정밀도 상실 : int -> float long -> float, long -> double byte -> short, int, long, float, double short -> int, long, float, double char -> int, long, float, double int -> long, float, double long -> float, double float -> double
형 변환 [3/6] 협소화 형 변환 byte -> char short -> byte, char 프로그래머가 반드시 캐스트 연산자를 사용하여 변환될 자료형을 표시하여 변환. 예 : byte -> char short -> byte, char char -> byte, short int -> byte, short, char long -> byte, short, char, int float -> byte, short, char, int, long double -> byte, short, char, int, long, float
형 변환 [4/6] 묵시적 형 변환 char c='A'; short s=1; int i=2; long l=3; 컴파일러에 의해 자동적으로 수행 char c='A'; short s=1; int i=2; long l=3; float f=2.1f; double d=3.2; ① i = ( c + s ); // i = 66 (int) (char) (short) (short) (int) [예제 3.16] 테스트
형 변환 [4/6] l = s + i ; // l = 3 (long) (short) (int) (int) (long) d = f + d; // d = 5.3 (double) (float) (double) (double)
형 변환 [5/6] 명시적 형 변환 char c='A'; short s=1; int i=2; long l=3; 프로그래머가 캐스트 연산자를 사용하여 변환 char c='A'; short s=1; int i=2; long l=3; float f=2.1f; double d=3.2; ① s = (short) ( c + i ); // s = 67 (short) (char) (int) (int) (short)
형 변환 [5/6] f = (float) ( f + d ); // f = 5.3 (float) (float) (double)
public class LosePrecision { [예제3.18-LosePrecision.java] _______________________________________ public class LosePrecision { public static void main(String[] args) throws java.io.IOException { int big = 1234567890; float approx; approx = (float) big; System.out.println("difference = " + (big - (int)approx)); System.in.read(); } ________________________________________________________________ 실행결과 : difference = -46
형 변환 [6/6] 형 변환 금지 [예제 3.19] 테스트 --- 교과서 93쪽 같은 자료형 이외에 다른 자료형으로의 변환이 금지된 자료형 boolean 형 [예제 3.19] 테스트 --- 교과서 93쪽