본문 바로가기

programming/Gukbi

국비 교육 3일차 - 연산자

728x90
반응형

연산자 

 

뭔가... 다 아는 내용이지만? 자세히 배우니까 색다른 파트였다. 각설하고 정리부터 하면

 

연산자에는 총 3가지 종류가 있다. 

1. 단항 연산자

2. 이항 연산자

3. 삼항 연산자

 

 

/*
 * 	자바 연산자
 * 
 * 	1. 단항 연산자
 * 	2. 이항 연산자
 * 	3. 삼항 연산자
 * 
 */
public class 연산자_단항연산자 {

	public static void main(String[] args) {
		
		/*
		 * 	1. 증감연산사 (++, --)
		 * 		+1, -1을 하는 연산자
		 * 		전치연산자 
		 * 		int a = 10; 
		 * 		++a; a+1
		 * 		a++; a+1
		 * 		++a; a+1
		 * 		a++; a+1
		 * 		-> a == 14 
		 * 
		 * 		후치연산자
		 * 		int a = 10;
		 * 		a++ 
		 * 
		 * 		but) 결과 값은 똑같음 
		 * 
		 */
		
			/*
			//메모리에 데이터 저장
			int a = 10;
			// 저장된 데이터를 출력한다 - 명령
			System.out.println("a="+a);
			//a값을 1개 증가시켜라
			++a; // 전치연산자
			// 저장된 데이터를 출력
			System.out.println("a="+a);
			
			a++;// 후치 연산자 a==12
			System.out.println("a="+a);
			*/
			
			int a = 10; // 저장
			int b = ++a;
			/*
			 *  	b = ++a // a값을 증가한 다음에 b에 대입, ++(우선 적용), =(나중 적용)
			 *  		전치 연산자는 1을 증가시키는게 우선 연산
			 *  
			 *  	b = a++ //a값을 b에 대입을 하고 a값을 1개 증가시킴 =(우선 적용), ++(나중 적용)
			 *  		후치 연산자는 b에 a를 대입하는 것이 우선적으로 계산됨 
			 *  		
			 */
			System.out.println("a="+a+", b="+b);
			
			int c = 10;
			int d = c++;
			System.out.println("c="+c+" , d="+d);
			
			/*
			 *  	int a = 10;
			 *  	int b = ++a + a++ + ++a + a++
			 *  			===   ===   ===   ===
			 *  			11    11    13    13  ==> 48
			 *  
			 *  
			 */
			
			// 감소 ++, -- (한 개 증가, 한 개 감소) : 반복문 등장
			int i = 10;
			i--; // i = 9
			System.out.println("i="+i);
			--i; 
			System.out.println("i="+i);
			// 대입하기 전까지는 후치, 전치 연산자의 결과 값은 똑같음
			
			
			
	}
	

}

단항 연산자는 피연산자가 1개 있는거고, 이항은 2개, 삼항은 3개가 있다. 

 

단항 연산자에서 젤 중요한 것은 

++, -- 인데 1씩 증가, 1씩 감소 시키는 연산자이다. 

단순하긴 하지만, 대입할때는 전치 하는지 후치 하는지에 따라 결과값이 달라진다. 

 

 

b = a++ , b = ++a

두개의 계산 결과가 달라진다

 

전치일때는 1을 먼저 더해준 다음에 대입을 하고, 후치일때는 대입이 이미 된 상태에서 a의 값이 1 증가한다. 

그래서 후치 일때는 a의 값만 증가하고 b의 값은 그대로 이다. 

 

 

 

/*
 *  	부정연산자 (단항연산자)
 *  	연산자 기호 : !
 *  	사용하는 데이터형이 boolean 
 *  	true=>false
 *  	false=>true
 *  
 *  	-> 결과값이 boolean이면 조건문에 사용됨 
 */

import java.util.Scanner; // 키보드로 입력값을 받는 경우 사용

public class 연산자_부정연산자 {

	public static void main(String[] args) {
		
		//Scanner 선언
		
		/*
		 * 변수선언
		 * 데이터형 변수명=값
		 * int i = 10;
		 * 클래스 선언
		 * 클래스명 변수명(객체) = new 생성자() -> 클래스명과 동일
		 * 
		 * 
		 */
		
		Scanner scan = new Scanner(System.in); // System.in -> 키보드값을 읽어올때
		System.out.print("true/false 입력 : ");
		boolean bCheck=scan.nextBoolean();
		System.out.println("bCheck="+bCheck);
		// 변경
		System.out.println("변경후 : " + !bCheck);
	}

}

 

또 부정 연산자라는게 있다. 

표현은 '!' 이렇게 해준다. boolean 앞에 붙으면 true는 false로, false는 true로 변환해준다. 

 

 

2. 이항 연산자

 

/*
 * 	비트연산자 (&,    |,   ^)
 * 	======================
 * 			&(*)   |(+) ^(비트가 다르면 1, 비트가 같으면 0)
 *  ======================
 *  1 1      1		1	0
 *  ======================
 *  1 0      0		1	1
 *  ======================
 *  0 1      0		1	1
 *  ======================
 *  0 0	     0		0	0
 *  ======================
 * 
 * 	10 & 8
 *  1010
 *  1000
 *  =====&
 *  1000 ==> 8
 *  
 *  17 & 9
 *  10001
 *  01001
 *  ===== &
 *  00001 => 1
 *  		    
 *  10 | 8
 *  1010
 *  1000
 *  =====|
 *  1010 ==> 10
 *  
 *  17 | 9
 *  10001
 *  01001
 *  ===== |
 *  11001 => 25
 *  
 *  10 ^ 8
 *  1010
 *  1000
 *  =====^
 *  0010 ==> 2
 *  
 *  17 ^ 9
 *  10001
 *  01001
 *  ===== ^
 *  11000 => 24
 *  
 * 
 */
public class 연산자_비트연산자 {

	public static void main(String[] args) {
		System.out.println(Integer.toBinaryString(10&8)); // 1000
		System.out.println(Integer.toBinaryString(10 | 8)); // 1010
		System.out.println(Integer.toBinaryString(10^8)); // 0010
	}

}

비트연산자...

&와 |

 

and or 이라고 생각하면 빠르다. 

근데 비트 연산이라서 아예 *, + 라고 생각하니까 이해가 더 쉬웠다. 

^ 는 비트가 같으면 0, 다르면 1이다. 

 

이해는 그렇다 치고 그냥 이걸 어디에 쓸지가 궁금하다. 

 

*
 *  <<왼쪽 이동 
 *  >>오른쪽 이동
 *  
 *  10<<2 
 *  == 
 *    1010
 *  101000 -> 앞으로 2칸 이동후, 이동한 빈자리는 00으로 채워줌 = 40
 *  
 *  13<<3
 *  ==
 *     1101 
 *  1101000 -> 앞으로 3칸 이동후, 이동한 빈자리 00으로 채워줌 = 104
 *  
 *  	7<<2 => 28 
 *  	111
 *    11100 => 16+8+4 => 28
 *    
 *   왼쪽 이동 	오른쪽 이동
 *   <<			 	>>
 *   x<<y		 	x>>y
 *   x*2^y 			x/2^y
 *  
 */
public class 연산자_비트이동연산자 {

	public static void main(String[] args) {
		System.out.println("10<<2="+(10<<2)); //40
		System.out.println("7<<2="+(7<<2)); //28
		System.out.println("10>>2="+(10>>2));//2

	}

}

 

이걸 이렇게 빨리 배우게 될 줄 몰랐다. 

혼자 엑스형 명대사 프로젝트하다가 발견했던 연산자인데 혼자 공부하려고 했을때는 애를 먹었다. 

근데 기본 컨셉은 이미 알고 있던 터라 수업을 들을때는 괜찮았다. 

 

일단 <<는 왼쪽 이동후 10진법으로 변환, >>는 오른쪽으로 이동후 10진법으로 변환

근데 이걸 2진법으로 바꿨다가 이동을 해서 다시 10진법으로 계산하는건 복잡해 보였는데

더 간단한 계산법이 있었다. 

 

 

왼쪽 이동  오른쪽 이동
<<             >>

x<<y          x>>y
x*2^y         x/2^y

 

2의 y승으로 곱하거나 나눠주면 된다. 나눌때는 몫을 가져온다. 

 

 

/*
 * 		산술연산자 = 이항연산자 (연산대상이 2개가 필요)
 * 		+ (덧셈), -(뺄셈), *(곱셈), /(나눗셈), %(나눈 나머지)
 * 
 * 		2) 다른 데이터형이 연산이 된 경우 (가장 큰 데이터형으로 변경후에 연산)
 * 			int + double
 * 			===
 * 			double -> double+double (연산은 항상 같은 데이터형만 연산처리가 된다) 자동형변환
 * 			ex) 10 + 10.5 = 10.0+10.5 = 20.5
 * 
 * 
 * 			char + int 
 * 			===
 * 			int로 변환 -> int + int = int
 * 			ex) 
 * 				'A' + 100
 * 				===
 * 				65+100=165 (자동형변환)
 * 
 * 			int + long
 * 			===
 * 			long 
 * 			ex) 10+100L
 * 				==
 * 				10L + 100L ==> 110L
 * 			
 * 			char + byte = 결과값 (int)
 * 			short + short = int
 * 			int 이하 데이터형 (char, byte, short)는 연산시에 결과값 int로 자동변환됨
 * 
 *  
 * 		
 */
public class 연산자_산술연산자 {

	public static void main(String[] args) {
		byte b1 = 10;
		byte b2 = 20;
		byte b3 = (byte) (b1+b2);
		/*
		 * byte b3 (byte)(b1+b2)
		 * int b3 = b1+b2
		 */
		int a = 10;
		double d = 10.5;
		// a+d 한 결과값을 출력
		int res = (int) (a+d);
		// a = 10.0 d=10.5 -> 10.0+10.5=20.5 (자동형변환)
		System.out.println(res);
		
		double d1 = 10.5;
		double d2 = 10.5;
		//int res1 = (int)(d1+d2); d1+d2=21.0 -> (int) 21.0 -> 21
		
		int res1=(int)d1+(int)d2; // (int)d1 = 10, (int)d2=10, 10+10=20
		System.out.println(res1);
		
		//뺄셈 (-)
		int x = 10;
		int y =6;
		int z = x-y;
		System.out.println(z);
		
		//곱셈 (*)
		//역시 동일
	}

}

산술연산자

 

하... 진짜 오래걸리네 ㅋㅋㅋㅋ

 

간단하다. 말그대로 진짜 산수. 근데 이제 데이터 형에 따라서 결과 값이 달라질 수 있다는 걸 명심해야한다. 

큰 데이터 + 작은 데이터 끼리 연산하면 기본적으로 무조건 큰 데이터형으로 저장된다. 

 

char + int 는 데이터 크기가 같지만 자동으로 int 

char + byte

short + short

등 int 이하 데이터형은 연산시에 결과 값이 int로 자동변환된다. 

 

/*
 * 	산술연산자
 * 	/, %
 * 		나눗셈 (/)
 * 		1. 0으로 나눌 수 없음 10/0 -> error
 * 		2. 정수/정수 = 정수
 * 			5/2=2.5(x) 5/2 = 2 (소수점 이하는 다 지워버림) ==> 5/2.0 = 2.5
 * 			double d=5/2 => 2.0
 * 			따라서 나눗셈 할때는 기본적으로 실수로 나누는 것이 좋음
 * 
 * 		% 나누고 나머지값
 * 			1. 주의점 : 결과 값은 왼쪽 편의 부호를 따라간다 
 * 				5%2 === 1 (1+4/2)
 * 			   -5%2 === -1 (-1-4/2)
 * 			    5%-2  === 1 (1+4/2)
 * 			   -5%-2  === -1 (-1-4/-2)
 * 
 * 			==> 자동 형변환 
 * 			==> 프로그래머가 변경 (강제 형변환)
 * 				
 */

//최적화
//에러를 예측 (오류 방지)
public class 연산자_산술연산자2 {

	public static void main(String[] args) {
		
		int a = 10;
		int b = 3; 
		System.out.println(a/(double)b);
		a=10;
		b=0;
		System.out.println(a/b); 

	}

}

나눗셈과 나머지 연산자

 

나눗셈 연산자는 데이터형이 중요하다. 정수로 나눠버리면 나머지가 소숫점이 나와도 소수점 밑으로는 다 지워버리기 때문이다. 마치 Math.floor를 쓴것과 같은 효과

 

그래서 나눗셈을 할때는 어지간해서 실수형 데이터 타입을 써줘야 한다. 그래야 소수점 자리까지 표시가 가능하다. 

 

%는 내가 늘 헷갈려 하던 연산자이다. 

나눴을때의 몫이 아니라 나머지 값을 알려주는 연산자 이다. 

 

5%2 면 1이 출력된다. 

다만 나눠지는 수의 부호를 따라가기 때문에 그 점은 인지를 하고 있어야 한다. 

 

복습 끄읕...

 

다음 시간에는 아마 삼항 연산자 진도를 나가게 될것 같다.

수업 끝나고 산책 후 바로 그날 진도 복습 포스팅을 올리는 걸 습관 들여야지

다 지나고 하려니까 좀 힘들다

 

 

 

728x90
반응형

'programming > Gukbi' 카테고리의 다른 글

국비 교육 5일차 - 조건문  (0) 2020.12.31
국비 교육 4일차 - 연산자, 제어문  (0) 2020.12.28
국비 교육 3일차 - 형 변환  (0) 2020.12.26
국비 교육 2일차  (0) 2020.12.23
국비 교육 1일차  (0) 2020.12.22