본문 바로가기
Develope_Web&App/01_Java & JavaFX

[Java] 03 연산자(Operator)

by 스타트업_디벨로퍼 2021. 1. 26.

1. 연산자

1.1 연산자와 피연산자

연산자 : 연산을 수행하는 기호 피연산자 : 연산자의 작업 대상( 변수, 상수, 리터럴, 수식)

연산자의 종류는 산술 연산자, 비교연산자, 논리 연산자, 대입 연산자, 기타 등이 있다.

  1. 산술 > 비교 > 논리 > 대입. 대입은 제일 마지막에 수행한다.
  2. 단항 > 이항 > 삼항.
  3. 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽이다.

1.5 산술 변환

타입 다른 경우, long + int → long + long → long float + int → float + float → float double + float → double + double → double

byte + short → int + int → int char + short → int + int → int

산술 변환이란? 연산 수행 직전에 발생하는 피연산자의 자동 형변환

  1. 두 피연산자의 타입을 같게 일치시킨다(보다 큰 타입으로 일치)
  2. 피연산자의 타입이 int 보다 작은 타입이면 int로 변환된다.

2. 단항 연산자

2.1 증감 연산자

증가 연산자(++) 피연산자의 갑을 1 증가시킨다. 감소 연산자(- -) 피연산자의 값을 1 감소시킨다.

전위형 : 값이 참조되기 전에 증가시킨다. ex) j = ++i; 후위형 : 값이 참조된 후에 증가시킨다. ex) j = i++

 

package chap03;

public class OperatorEx2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int i=5, j=0;
		
		j = i++;
		
		System.out.println("j=i++; 실행 후, i=" + i+ ", j="+j);
		i = 5;
		j = 0;
		
		j = ++i;
		
		System.out.println("j=++i; 실행 후, i="+i+", j ="+j);
	}

}
더보기

j=i++; 실행 후, i=6, j=5
j=++i; 실행 후, i=6, j =6

 

3. 산술 연산자

package chap03;

public class OperatorEx5 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int a = 10;
		int b = 4;
		
		System.out.printf("%d + %d = %d%n", a,b,a+b);
		System.out.printf("%d - %d = %d%n", a,b,a-b);
		System.out.printf("%d * %d = %d%n", a,b,a*b);
		System.out.printf("%d / %d = %d%n", a,b,a/b);
		System.out.printf("%d / %f = %f%n", a,(float)b,a/(float)b);
	}

}
더보기

10 + 4 = 14

10 - 4 = 6

10 * 4 = 40

10 / 4 = 2

10 / 4.000000 = 2.500000

 

package chap03;

public class OperatorEx6 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		byte a = 10;
		byte b = 20;
		//byte c = a+b;
		byte c = (byte)(a+b);
		System.out.println(c);
	}

}
//30

-> 이 경우, 바이트로 형 변환을 수행해줘야 한다.

 

-> 명시적인 형변환을 수행해야 하고, 오버플로우가 발생하지 않도록 만들어야 한다. 

 

package chap03;

public class OperatorEx11 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		char a = 'a';
		char d = 'd';
		char zero = '0';
		char two = '2';
		
		System.out.printf("'%c' - '%c' = %d%n",d,a,d-a);
		System.out.printf("'%c' - '%c'=  %d%n",two,zero,two-zero);
		System.out.printf("'%c'=%d%n",a,(int)a);
		System.out.printf("'%c'=%d%n",d,(int)d);
		System.out.printf("'%c'=%d%n",zero,(int)zero);
		System.out.printf("'%c'=%d%n",two,(int)two);
	}

}
더보기

'd' - 'a' = 3
'2' - '0'=  2
'a'=97
'd'=100
'0'=48
'2'=50

 

4. 비교 연산자

: 좌변 값이 크면 참 아니면 거짓 ≥ : 좌변 값이 크거나 같으면 참 아니면 거짓 == 두 값이 같으면, 참 아니면 거짓 != 두 값이 다르면, 참 아니면 거짓

5. 논리 연산자

5.1 논리 연산자

|| (OR 연산자) 피연산 자 중 어느 한쪽만 참이면 참으로 결과를 얻는다. && (AND 연산자) 피연산자 양쪽 모두 참이여야 참으로 결과를 얻는다.

문자 ch는 숫자('0'~'9')이다. → '0' < = ch && ch <= '9'

문자 ch는 대문자 또는 소문자이다. → ('a' <= ch && ch < = 'z') || ('A' <= ch && ch < = 'Z')

효율적인 연산 (short circuit evaluation)

한쪽만 참이어도 or 연산자는 참이다.

한쪽만 거짓이어도 and 연산자는 거짓이다.

5.2 비트 연산자

| (OR 연산자) 한쪽의 값이 1이면 1로 얻는다. & (AND 연산자) 둘다 1이어야 1로 얻는다. ^(XOR 연산자) 피연산자의 값이 서로 다를 떄만 1을 결과로 얻는다.

package chap03;

public class OperatorEx30 {

	static String toBinaryString(int x) {
		// TODO Auto-generated method stub
		String zero = "00000000000000000000000000000000";
		String tmp = zero + Integer.toBinaryString(x);
		return tmp.substring(tmp.length()-32);
	}
		public static void main(String[] args) {
			int dec = 8;
			System.out.printf("%d >> %d = %4d \t%s%n",dec,0,dec >>0,toBinaryString(dec >> 0));
			System.out.printf("%d >> %d = %4d \t%s%n",dec,1,dec >>1,toBinaryString(dec >> 1));
			System.out.printf("%d >> %d = %4d \t%s%n",dec,2,dec >>2,toBinaryString(dec >> 2));

			System.out.printf("%d >> %d = %4d \t%s%n",dec,0,dec <<0,toBinaryString(dec << 0));
			System.out.printf("%d >> %d = %4d \t%s%n",dec,1,dec <<1,toBinaryString(dec << 1));
			System.out.printf("%d >> %d = %4d \t%s%n",dec,2,dec <<2,toBinaryString(dec << 2));
			

			System.out.printf("%d >> %2d = %4d \t%s%n",dec,0,dec >>0,toBinaryString(dec >> 0));
			System.out.printf("%d >> %2d = %4d \t%s%n",dec,32,dec >>32,toBinaryString(dec >> 32));

		
	}

}
더보기

8 >> 0 =    8  00000000000000000000000000001000
8 >> 1 =    4  00000000000000000000000000000100
8 >> 2 =    2  00000000000000000000000000000010
8 >> 0 =    8  00000000000000000000000000001000
8 >> 1 =   16  00000000000000000000000000010000
8 >> 2 =   32  00000000000000000000000000100000
8 >>  0 =    8  00000000000000000000000000001000
8 >> 32 =    8  00000000000000000000000000001000

package chap03;

public class OperatorEx31 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int dec = 1234;
		int hex = 0xABCD;
		int mask = 0xF;
		
		System.out.printf("hex=%X%n",hex);
		System.out.printf("%X%n",hex & mask);
		
		hex = hex >> 4;
		System.out.printf("%X%n", hex & mask);
		

		hex = hex >> 4;
		System.out.printf("%X%n", hex & mask);
		

		hex = hex >> 4;
		System.out.printf("%X%n", hex & mask);
	}

}

 

더보기

hex=ABCD
D
C
B
A

 

 

6. 그 외의 연산자

6.1 조건 연산자 ? :

조건식 ? 식 1 : 식2

result = (x>y) ? x : y;

package chap03;

public class OperatorEx32 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int x,y,z;
		
		int absX, absY, absZ;
		
		char signX, signY, signZ;
		
		x = 10;
		y = -5;
		z = 0;
		
		absX = x>=0 ? x : -x;
		absY = y>=0 ? y : -y;
		absZ = z>=0 ? z : -z;
		
		signX = x > 0 ? '+' : (x==0 ? ' ' : '-');
		signY = y > 0 ? '+' : (y==0 ? ' ' : '-');
		signZ = z > 0 ? '+' : (z==0 ? ' ' : '-');
		
		System.out.printf("x=%c%d%n",signX, absX);
		System.out.printf("y=%c%d%n",signY, absY);
		System.out.printf("z=%c%d%n",signZ, absZ);
	}

}

x=+10

y=-5

z= 0

반응형

'Develope_Web&amp;App > 01_Java &amp; JavaFX' 카테고리의 다른 글

[java] 예외처리  (0) 2021.01.27
[Java] Chap04 조건문과 반복문  (0) 2021.01.27
[Java] chap 02. 변수  (0) 2021.01.26
객체지향 디자인패턴2  (0) 2020.12.26
객체지향 디자인 패턴  (0) 2020.12.26