본문 바로가기

programming/Gukbi

국비 교육 3일차 - 형 변환

728x90
반응형

목요일에 수업을 들었지만 집에 친구가와서, 크리스마스를 핑계로 이틀을 쉬었당

 

이게 수업 내용 복습겸 쓰는 블로그긴 하지만 그냥 기록용 이라고 생각하고 사담도 조금 해보자면..

 

올해 많은 일이 있었던 관계로 참 복잡한 마음이었는데

정신승리하면서 대충 묻어뒀던게 갑자기 어제 터졌다. 내가 대졸무직백수라는것에 별 의미를 두지 않으려고 노력했는데

드림 기업에 취뽀한 친구를 보고 (이제 친구 아닐수도 있음) 열폭에 시달리게 됐다. 

 

근데 그 친구가 얼마나 노력했는지를 봐왔기에 잘됐다는 마음도

난 그동한 뭐하고 살았냐 이 개쓰레기야 라는 마음도 겹쳤었다. 

사실 후자가 더 컸다. 

 

친구의 성공에 축하는 못할망정 추하게 열폭하는 내자신이 너무 못나보였다. 

그리고 결국 잘못된 선택이 되어버린 일들이 무의미하게 느껴졌다...

 

근데 열폭하는 내 자신이 싫으면.. 안하면 되는데 그 방법은

1. 인스타를 안한다 (원래도 안하고 있었는데 뭐 확인한다고 다시 열었다가 그만...)

2. 열폭하지 않게 나도 성공한다. 

 

 

그래서 둘 다 하기로 했다. 

다만 이제 잘못된 선택이 너무 하기 싫다. 

엄한데다가 시간과 노력을 쏟는게 싫어졌다. 누가 좋겠냐만은...

시행착오라는걸 좀 그만하고 제대로 보장된 길임을 알고 그 길만 걷고 싶은데

그걸 누가 알겠어 

돈있고 빽있어서 자기 갈길이 정해져 있는 사람말곤......

 

그래서 오늘의 추함일기의 결론은

열폭하기 싫으면 잘하자

 

 

자 그래서 들었던 수업 내용은요 ^^

 

(수업 복습 내용을 적기 위한 엄청난 빌드업 이었음)

 

 

 

변수활용과 연산자에 대해서 배웠다. 변수와 데이터 형을 지난 시간에 엄청 공을 들여서 배웠고, 처음에는 다시 복습도 했다. 

 

진법에 대해서 먼저 배웠다. 컴퓨터에서는 2진법을 기본으로 쓰기 때문에 2진법정도는 알고 있어야겠다고 생각은 했지만 8진법, 16진법까지 알아야할 줄은 몰랐다. 

 

강사님이 2진법 말고는 딱히 기억하고 있을 필요는 없다고 하긴 했는데, 알아두면 언젠간 쓰이지 않을까 생각하기로 했다. 

 

/*
 *  변수 : 저장, 읽기, 쓰기 (수정)
 *  	단, 한 개만 저장이 가능
 *  	정수, 실수, 문자, 논리 등 데이터 형에 따라 메모리가 달라짐
 *  
 *  1. 변수 선언
 *  2. 변수 초기화
 *  3. 변수값 변경
 *  4. 데이터 출력
 *  
 *  1) 정수를 출력하는 방법
 *  	- 10진법 (주로 사용)
 *  	- 2진법
 *  	- 8진법
 *  	- 16진법 (필요할 떄도 있음, HTML 색상표가 16진법임)
 *  
 *  	<< >>, &, |, ^ - 비트 연산자
 *  
 *  	
 *  	2진법
 *  	100을 2진법으로 바꾸면?
 *  	64 32 16 8 4 2 0(1)
 *  	1  1  0  0 1 0 0 = 1100100
 *  
 *  	8진법
 *  	27을 8진법으로 바꾸면?
 *  	11|011 (2진법)
 *  	3   3  = 033
 *  
 *  	16진법
 *  	100을 16진법으로 바꾸면?
 *  	110|0100
 *  	6     4 = 0x64
 *  	
 *  	
 *  
 */
public class 변수활용_1 {

	public static void main(String[] args) {
		
		System.out.println("100의 2진법 : " +Integer.toBinaryString(100));
		System.out.println("27의 2진법 : " + Integer.toBinaryString(27));
		System.out.println("27의 8진법 : "+Integer.toOctalString(27));
		System.out.println("100의 16진법 : " +Integer.toHexString(100));
		//0~15 - 10(A), 11(B), 12(C), 13(D), 14(E), 15(F)
		//8bit -> 1byte -> word(문자열)
		/*
		 * 키보드 입력
		 * 8bit       8bit
		 * ===================
		 * scan-code | ASC ->자동으로 처리 
		 * ===================
		 *
		 */
		// 2진법 -> 8진법 : 뒤에서부터 3bit씩 나눠서 처리
		// 	    -> 16진법 : 뒤에서부터 4bit씩 나눠서 처리
		
		/*
		 * 음수 표현법
		 * ========
		 * 	  1의 보수
		 * 	  2의 보수
		 * ==> 78 ==> -79
		 * 	  ====
		 * 	  
		 * 		1의 보수
		 *    01001110
		 * 	->10110001 / 0을 1로 변화, 1을 0으로 변환
		 * 
		 * 
		 * 		2의 보수
		 *    10110001
		 *    		+1
		 *   =10110010	(최종 음수 표현)
		 *   
		 */
		
		//System.out.println(0b0110010);
		System.out.println(~78); // ~  음수 
		// 100을 음수로 하면 101, 0도 음수로 치기 떄문에
		
		/*
		 *  10진법 -> 2진법
		 *  	Integer.toBinaryString(정수)
		 *	10진법 -> 8진법
		 *		Integer.toOctalString(정수)
		 *  10진법 -> 16진법
		 *  	Integer.toHexString(정수)
		 *  
		 *  2진법 -> 10진법
		 *  	0b (2진법)
		 *  8진법 -> 10진법
		 *  	0(8진법)
		 *  16진법 -> 10진법
		 *  	0x(16진법)
		 *  양수 -> 음수
		 *  	~정수값
		 */
		
		/*
		 * 	기본데이터형
		 * 	1. 논리형
		 * 		boolean : 조건식, 반복문 - 제어문에서 주로 사용
		 * 		true / false
		 * 
		 *  2. 정수형
		 *  	byte : 파일관련 (파일 다운로드, 파일 업로드)
		 *  	short : C언어와 호환 용도 (java 에서는 많이 사용 x)
		 *  	int : 주로 사용하는 데이터형 (default -> 컴퓨터에서는 모든 숫자를 정수로 인식)
		 *  	long : 금융권, 증권, 빅데이터 
		 *
		 *  3. 문자형
		 *  	char : 인코딩 / 디코딩
		 *  		   ====   ====
		 *  								인코딩   디코딩 -> 필요시마다 정수로 변환
		 *  		   숫자 	  문자  => 'A' -> 65 -> 'A' 
		 *  								저장값  출력물
		 *  
		 *  4. 실수형
		 *  	float 
		 *  	double : 주로 사용 (default) 
		 */
		System.out.println('A'); // 'A'를 출력해라
		System.out.println((int)'A'); // 'A'를 정수로 변환한 값을 출력
		System.out.println((char)65); // 정수를 문자로 출력
		
		/* 	특수문자
		 *  \n - 한 줄 띄어 쓰기
		 *  \t - 탭 
		 *  \\ - 경로명
		 *  \" - 따옴표 쓸 수 있음 
		 */
		System.out.println("\"홍길동\"");
		
		// 인코딩과 디코딩 잘 알아 두기
	}

}

 

이렇게가 필기 내용이었다. 8진법과 16진법을 계산을 하는 코드를 직접 짤 수도 있지만 

이미 자바에는 10진법의 수를 각각 진법으로 바꿔주는 코드가 있기 때문에 그걸 사용하는게 더 좋은 방법이라고 한다. 

 

숫자.Integer.toVBinaryString, OctalString, HexString 등등

 

숫자 앞에 ~를 붙이면 음수로 표현된다. 다만 주의할 점은 음수 표현할때는 -를 붙이고 그 상태에서 -1하게 된다. 

ex) ~78 == -79 

이렇게 

 

 

다음 배운 내용은 형변환이다. 

 

/*
 * 	형변환 : 변수의 데이터를 다른 데이터형으로 변환
 * 	1. 가장 많이 변경 
 * 		Web, 윈도우 프로그램, 모바일 프로그램 : 정수가 없다 (문자열)
 * 		문자열 -> 정수형으로 변경
 * 		
 * 	1-1 문자 -> 정수, 정수 -> 문자
 * 		정수 -> 실수, 실수 -> 정수
 * 	
 *  1-2
 *  	1. 자동 형변환 (UpCasting) -> 작은 데이터형을 큰 데이터형으로 변경
 *  		int a = 'A' 
 *  				=== int로 변경되어 저장됨
 *  		long a = 100
 *  				 ===
 *  				 int -> long (100L)
 *  		double d = 100
 *  				   ===
 *  				   int -> double (100.0)
 *  
 *  		데이터형의 크기를 알고 있어야함 (숫자 - 정수, 실수/ 문자)
 *  		===========================================
 *  		byte < short < int < long < float < double 
 *  				char 
 *  		===========================================
 *  		ex) double d = 'A'
 *  					   === char -> double (65.0)
 *  	2. 강제 형변환 (DownCasting) -> 큰 데이터형을 작은 데이터형으로 변경 
 *  
 */
public class 형변환_1 {

	public static void main(String[] args) {
		
		// 작은 데이터형 값을 첨부 -> 큰데이터형으로 변환 
		int a = 'A'; // 'A' -> (int변경 -> 65)
		System.out.println("a="+a);
		double d = 'A'; // 'A' -> (double 변경 -> 65.0)
		System.out.println("d="+d);
		double d1 = 100; // 100 (int로 변경 -> 100.0)
		System.out.println("d1="+d1); 
		
		//큰 값을 작은 데이터 형에 넣을 수 없음
		int a1 =(int)10.5; // 실수 -> 정수 (소수점은 인식하지 않는다) -> a1 = 10
		System.out.println("a1="+a1);
		// 강제 형번환 -> (데이터형)값
		
		int a2 = Integer.parseInt("100");
		System.out.println(a2); // 100
		
		/*	숫자와 관련된 내용만 가능
		 *  int -> char : (char)65 -> 'A'
		 *  char -> int : (int)'A'-> 65
		 *  double -> int : (int)10.5 -> 10
		 *  int -> double : (double)10 ->10.0
		 *  
		 *  형변환 : 큰 데이터형에 작은 데이터형을 대입하는 경우에는 자동변환됨
		 *  	   작은 데이터형에 큰 데이터형을 대입시에는 반드시 지정된 데이터형을 설정한다
		 *  
		 */
			
		// 형변환 주의점 - 오버플로우
		byte b1 = (byte)350; // byte의 범위는 -128부터 127까지, 범위를 벗어난 것
		
		/*
		 *  1 0101 1110
		 *  -> byte는 8개 bit만 저장 할 수 있음
		 *  그렇기 때문에 오른쪽에서 부터 8개만 가져옴 = 94
		 *  범위를 초과한 상태에서 변환해서는 안됨
		 */
		
		System.out.println(b1);
		
		
		
	}

}

데이터 형을 엄청 열심히 배운 이유가 여기서 나온다. 

작은 데이터 형을 큰 데이터 형에 저장하는건 가능하지만, 큰 데이터형을 작은 데이터형으로 저장할 수는 없다. 

그때 필요한 것이 형변환이다. 

 

형변환에는 두 가지 종류가 있다. 

1. 자동형변환

2. 강제형변환

 

작은 값을 큰 값으로 저장하는건 자동으로 이뤄진다. 

ex) double a = 2; a=2.0

이런식으로 바이트가 더 큰 곳에 저장하는것은 충돌없이 생길 수 있다. 

 

반대로 큰 값을 작은 값으로 저장은 불가능하다. 

그것을 가능하게 하기 위해서는 강제적으로 형을 변화 시켜야한다. 

ex) int a = (int) 3.5; // 이렇게 하면 int는 소숫점 이하 자리를 다 버리기 때문에 3으로 저장&출력된다. 

 

하지만 강제 형변환을 해도 너무 작은 데이터형에 큰 데이터를 저장하면 오류가 날 수 있다. 

그래서 저장 capa를 생각하고 형변환을 해줘야 한다. 

 

연산자까지 쓰려고 했는데 너무 길어지는거 같아서

다음 포스팅에 나눠 쓰겠다. 

 

 

 

 

 

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