whatIf...?

uc·2024년 2월 10일
post-thumbnail

- 타입 변환을 하면 리터럴이 변할까?

// 강제 타입 변환
		double b = 10.5;
		System.out.println(b);						// 10.5
		System.out.println((float)(b + 1));			// 11.5
		System.out.println((long)b);				// 10
		System.out.println(b);						// 10.5		출력문에서 타입 변환은 리터럴이 변하지 않음
		System.out.println((int)(b += 1));			// 11		
		System.out.println(b);						// 11.5		대입 연산자는 리터럴이 변함
        System.out.println(b++);					// 11.5		
		System.out.println(b);						// 12.5		증감 연산자도 리터럴이 변함

		System.out.println("=====");

// 자동 타입 변환
		int i = 100;
		long l = i;
		System.out.println(l);						// 100
		float f = l;
		System.out.println(f += 0.1);				// 100.1
		double d = f;
		System.out.println(d);						// 100.0999984741211	100.1보다 작음?
/*
		boolean b = d < 100.1;
		System.out.println(bb);						// true 100.1 보다 작다
				b = d > 100;
		System.out.println(bb);						// true 100 보다 크다
													// 오류 아님
*/
		System.out.println("=====");
        
		d = 100.5;
		double result = (int)(d += 10);				// result는 double타입(소수점), d는 정수타입(소수점 버림)
		System.out.println(result);					// 110.0	소수점이 버려지고 소수점 출력
		System.out.println((int)d);					// 110		
		System.out.println(d);						// 110.5	식에서의 타입 변환도 리터럴이 변하지 않음
													
		System.out.println("=====");

		double dd = 100.5;
		int a = (int)dd;
		System.out.println(a);						// 100
		double ff = a;
		System.out.println(ff);						// 100.0	실수형double -> 정수형int -> 실수형double 은 소수점 값이 버림되어 돌아오지않음
		System.out.println(dd);						// 100.5	실수형double dd의 리터럴은 변하지 않음
        

결론 : 타입 변환은 리터럴에 영향을 주지 않음

+추가)
부동소숫점 오류
실수 변수는 절대 정확한 값을 가지고 있지 않음
float보다는 double형 변수를 쓰는게 좋음
정수가 들어있는 실수형 변수를 정수로 바로 캐스팅하면 안됨
비교 연산을 할 때는 등호를 사용하면 안됨
https://www.acmicpc.net/blog/view/37

- String타입 " "의 앞, 뒤에 char를 사용하면 어떻게될까?

		String a = (65 + 1 + "왓" + (char)65 + 1);
		System.out.println(a);							// 66왓A1
        
        String b = (65 + 1 + "이프" + 1 + (char)65);
		System.out.println(b);							// 66이프1A
        
        String c = (65 + 1 + "왓이프" + (char)(1 + 65));
		System.out.println(c);							// 66왓이프B
        
        String d = ((char)65 + 1 + "왓이프" + (char)(1 + 65));
		System.out.println(d);							// 66왓이프B
        												// int > char , 자동 타입 변환
		String e = ((char)(65 + 1) + "왓이프" + (char)(1 + 65));
		System.out.println(e);							// B왓이프B

결론 : ""(큰따옴표) 앞,앞에 오는 +는 산술 연산자 +를 의미, 뒤에 오는 +는 문자열을 이어주는 +를 의미

- 같은 타입끼리 대입 가능. 다른 타입은 대입이 안될까?

		int a = 65;
		byte b = (byte)a;
		System.out.println(b);			// 
		char c = (char)a;
		System.out.println(c);			// 
		short s = (short)a;
		System.out.println(s);			// 캐스팅 연산자로 타입 변환 후 대입 가능
		int i = a;
		System.out.println(i);			// 
		long l = a;
		System.out.println(l);			// 
		float f = a;
		System.out.println(f);			// 
		double d = a;
		System.out.println(d);			// 자동 타입 변환으로 대입 됨

결론 : 같거나, 보다 큰 타입으로는 자동 타입 변환이 이루어져 대입 가능

보다 작은 타입으로는 ()캐스팅 연산자로 강제 타입 변환을 해줘야 대입 가능

+추가)
자바는 정수형 기본은 int로 처리

- char 문자를 문장으로 만들 수 있을까?

		char c1 = '자';
		char c2 = '바';
		System.out.println(c1+c2);				// 99236
		System.out.println((char)c1+(char)c2);	// 99236
		System.out.println((char)c1+c2);		// 99236	정수형으로 연산됨
		System.out.println((char)(c1+c2));		// ?	99236 아스키코드 없음
		
		String s1 = c1+c2+"c1+c2"+c1+c2;		// "" 앞은 연산, 뒤는 문자열
		String s2 = ""+c1+c2;
		System.out.println(s1);					// 99236c1+c2자바
		System.out.println(s2);					// 자바

		char ch1 = 'j';
		char ch2 = 'a';
		char ch3 = 'v';
		String st = "" + ch1 + ch2 + ch3 + ch2;
		System.out.println(st);					// java

결론 : String "" 뒤에 문자열이 오는것을 이용해서 char 변수를 이어붙여 문장으로 만들 수 있음

- String과 char의 문자를 boolean으로 비교해보면 true가 나올까?

		String s1 = "A";
		char c = 'A';
		System.out.println(s1);			// A
		System.out.println(c);			// A
//		boolean b = (s == c);			// 에러
										// 비교연산자 ‘==’ 에 사용된 피연산자. 즉, 비교 대상 값이 이상하다는 에러
		int i = 65;
		boolean b1 = (c == i);
		System.out.println(b1);			// true

		String s2 = "A";
		boolean b2 = (s1 == s2);
		System.out.println(b2);			// true

결론 : 논리형 boolean은 숫자는 숫자끼리, 문자는 문자끼리 비교 가능

char '문자'는 숫자로 인식

+추가)

// float과 double을 비교해보면 true가 나올까?
		float f = 1.0F;
		double d = 1.0;
		System.out.println(f);			//1.0
		System.out.println(d);			//1.0
		boolean bb = (f == d);
		System.out.println(bb);			//true
        
// 정수형과 실수형을 비교하면?

		int ii = 1;
		bb = (f == ii);
		System.out.println(bb);			//true
		bb = (d == ii);
		System.out.println(bb);			//true
// 정수 1과 실수 1.0은 같다는 판정

// 부동 소수점 오차로 double 값 변한다면? float과 비교
		f = 1.3F;
		d = f;
		System.out.println(f);			// 1.3
		System.out.println(d);			// 1.2999~
		bb = (d == f);
		System.out.println(bb);			// true
        								//소수점 오차가 나도 true 나옴
		bb = (d < f);
		System.out.println(bb);			// false

//		System.out.println(d += 0.0000000000000001);
//		System.out.println(f == d);		// true
// 소수점 16번째 자리에 1을 더하면 true가 나옴 / 나머지는 false

결론 : 기본 타입 끼리 같은 값을 논리형으로 비교해 보았을때 true가 나옴

실수형은 되도록 double을 쓰고, 소수점 오차를 파고들지 말기

- 삼항 연산자 진행 중 false가 나오면 뒤에오는 대입, 증감 연산자는 무시되어 리터럴이 바뀌지 않을까?

		int a = 10;
		int result = (a > 0) ? (++a > 5) ? (a++ > 9) ? 1000 : 100 : 10 : 0;
		System.out.println(result);		// 1000
		System.out.println(a);			// 12
        
        System.out.println("=====");
        
		int b = 20;
		result = (b < 0) ? (++b > 5) ? (b++ > 9) ? 1000 : 100 : 10 : 0;        
        System.out.println(result);		// 0
        System.out.println(b);			// 20
        
        System.out.println("=====");
        
        int c = 30;
		result = (c > 0) ? (c-=10 <= 5) ? (c*=2 > 9) ? 1000 : 100 : 10 : 0;        
        System.out.println(result);		// 피연산자가 잘못되었다는 에러
        System.out.println(c);			// first type : int , second type : boolean			

인트타입 변수 + 복합대입 연산자 + 비교 연산자 사용 불가?

+해결)
복합대입 연산자와 비교 연산자가 혼합되어 있어서 우선순위를 명확히 할 수 없음
괄호를 추가하여 연산자 우선순위를 명확히 해주어야 함

		int c = 30;
		result = (c > 0) ? ((c-=10) < 5) ? ((c*=2) > 9) ? 1000 : 100 : 10 : 0;        
        System.out.println(result);		// 10
        System.out.println(c);			// 20

+추가)
삼항 연산자를 중첩해서 사용하는 것이 코드의 가독성을 해치고 오류를 발생시킬 가능성을 높일 수 있음.
이를 방지하기 위해 코드를 명확하고 간결하게 작성하는 것이 좋음

결론 : 삼항 연산자 진행중 false가 나오면 진행순서 상 뒤에 나오는 대입, 증감 연산자가 실행되지 않아 리터럴이 변하지 않음

- 논리 연산자 || 에서 이미 true가 나오면 뒤에 오는 조건식에 대입 연산자가 나왔을때 무시될까?

		int a = 10;
		int b = 20;
		boolean result = a < b || a++ > ++b;
		System.out.println(result);			// true
		System.out.println(a);				// 10
        System.out.println(b);				// 20

결론 : || (or 연산자) 는 한개만 true여도 true이기 때문에 앞선 조건식에서 true가 나오면 뒤에 조건식은 계산하지 않음

- 비트 이동 연산자로 0b1010 >> 2 하고 << 2 하면 사라진 값이 되돌아올까?

		int bin = 0b1010;
		int result = bin >> 2;
		System.out.println(result);			// 2
		System.out.println(bin);			// 10
// bin의 리터럴이 변하는 것이 아님
		result = bin >>= 2;
		System.out.println(result);			// 2
		System.out.println(bin);			// 2
		result = bin << 2;
		System.out.println(result);			// 8

결론 : 비트 이동 연산자로 bin의 리터럴이 변하지 않음

비트 이동 연산자에 =을 붙여 이동 후 대입을 할 수 있음

profile
velini

0개의 댓글