[혼자 공부하는 자바] 6/28 02-3 형변환

2020. 6. 28. 20:50·JAVA


한 변수값을 다른 변수에 복사해서 저장할 때, 두 변수의 타입이 다르다면?

저장이 가능할 수도, 안될수도.

<타입 변환>

byte a =10;

int b =a;

복사해서 저장할 때 int타입의 값으로 변환되었다.

 

ㅇ자동 타입 변환 (=promotion)

ㄴ큰 = 작은 

ㄴbyte < short < int < long < float < double,

따라서 정수 타입을 실수 타입으로 저장할 때에는 무조건 자동 타입 변환

ㄴ예외: byte 타입을 char타입으로 자동 변환은 불가. byte는 음수 가능하지만 char은 음수 불가능.

 

ㅇ강제 타입 변환 (=casting)

ㄴ작은 = 큰

ㄴ예) int intValue = 10; byte byteValue = (byte) intValue; 

(byte)캐스팅 연산자를 사용하여 강제 변환하였다.

 

<정수 연산에서의 자동 타입 변환>

연산시 int타입보다 작은 byte, short타입이 피연산자로 사용되면 int타입으로 변환되어 연산된다.

따라서 연산 결과를 byte가 아닌 int에 저장해야 한다.

예를 들어서..

byte x = 10;

byte y = 20;

byte result = x + y;  //컴파일에러

int result = x + y;

 

그래서 연산 할거면 타입 설정을 int로 하는게 나을 수 있다. 타입 변환이 줄면 실행 성능 향상된다.

 

(주의 : 피연산자가 변수가 아니면 상관 없다. 예를 들어서 byte result = 10 + 20;은 문제 없다. 피연산자가 변수가 아니므로 int타입으로 변환하지 않음. <<자바 컴파일러는 컴파일 단계에서 10+20을 미리 연산해 30을 만들고, result 변수에 30을 저장하도록 바이트 코드를 생성한다 우와 신기신기)

 

 

정수 연산식에서 모든 변수가 int로 변환되는건 아니다. 피연산자중에 범위가 가장 큰 타입으로 변환된다.

그래서 피연산자 중 범위가 큰 애의 타입으로 연산 결과를 저장해야한다.

 

<실수 연산에서의 타입 변환> 이것도 마찬가지다.

자동 타입 변환은 큰 범위인걸로 되는데, 만약 실수랑 정수 연산에서 정수결과를 얻고 싶다면 이런 식으로 캐스팅한다.

int intValue = 10;

double doubleValue  = 5.5;

int result = intValue + (int) doubleValue;

 

실수연산할 때 주의.. 자바는 기본적으로 실수 리터럴을 double로 해석하므로 float을 나타내고 싶으면 꼭 f를 붙여 연산하자. 예를 들면 float result = 1.5f + 2.3f;

 

 

<나눗셈 할 때>

int x =1; int y =2;

double result = x / y;

System.out.println(result);

위 코드는 0.0이 출력된다. int계산을 먼저 한 값 0을 double타입인 result에 넣기 때문에.. 0.0이 나온다.

 

0.5가 나오게 하려면 x/y의 연산에서 x또는 y를 (double)하고 연산하면 된다.

이 때 (double)(x/y)는 뻘짓이다


<문자열을 기본 타입으로 강제 변환>

오 이거 예전에 많이 해본거다! 

문자열 속 숫자를 정수or실수타입 변수에 넣기

 

String str = "10";

byte value = Byte.parseByte(str);

 

String str = "200";

short value = Short.praseShort(str);

 

String str = "300000";

int value = Integer.parseInt(str);

 

String str = "40000000000";

long value = Long.parseLong(str);

 

String str = "12.345";

float value = Float.parseFloat(str);

 

String str = "12.345";

double value = Double.parseDouble(str);

 

String str = "true";

boolean value = Boolean.parseBoolean(str);

 

아 이게 논리값도 되는구나

 

아무튼

문자열 변환 가능한 거 말고 알파벳이나 특문, 한글 등 포함된 것을 숫자 타입으로 변환하려고 하면

숫자 형식 예외가 발생한다. (NumberFormatException)

 

 

위와 반대로 기본타입을 문자열로 변경하려면, 간단히

String.valueOf() 메소드를 이용한다.


확인 문제.. 

 

1번: short shortValue = charValue;는 컴파일 에러가 날 수 있다.

short의 범위 -2^15 ~ 2^15 -1 이고 char의 범위 0 ~ 2^16 -1이므로

short의 범위를 벗어나는 값이 존재한다. 

 

2번: 문자열을 char타입으로 캐스팅할 수 없다. parse에 없다. 강제 타입 변환 못한다.

 

5번: 컴파일 에러

char c1 = 'a';

char c2 = c1 +1;

System.out.println(c2);

->> 두번째 줄에서 연산 값은 int인데 char타입 변수에 저장하고 있음.. 캐스팅 해줘야 함.

char c2 = (char) (c1 + 1); 이렇게

반응형

'JAVA' 카테고리의 다른 글

[혼자 공부하는 자바] 6/30 02-4~03-2  (1) 2020.06.30
[혼자 공부하는 자바] 6/28 02-4 변수와 시스템 입출력  (0) 2020.06.28
[혼자 공부하는 자바] 6/28 01-1 ~ 02-2  (0) 2020.06.28
[혼자 공부하는 자바][신용권] 목차  (0) 2020.06.28
[JAVA] 클래스의 구성요소 / 필드(field)  (0) 2020.04.22
'JAVA' 카테고리의 다른 글
  • [혼자 공부하는 자바] 6/30 02-4~03-2
  • [혼자 공부하는 자바] 6/28 02-4 변수와 시스템 입출력
  • [혼자 공부하는 자바] 6/28 01-1 ~ 02-2
  • [혼자 공부하는 자바][신용권] 목차
히어로맛쿠키
히어로맛쿠키
  • 히어로맛쿠키
    yeny_lab
    히어로맛쿠키
  • 전체
    오늘
    어제
    • 분류 전체보기 (389)
      • 미분류글 (32)
        • ㅇ (2)
      • JAVA (84)
        • Effective Java (1)
        • Application (21)
      • 컴퓨터구조 & OS (28)
      • 자료구조 + 알고리즘 (43)
      • Database (12)
      • 컴파일러 (10)
      • 수학 (33)
        • 미분방정식 (12)
      • 데이터분석과 머신러닝 (38)
      • 기타 (59)
      • yyeeennyy (25)
  • 공지사항

    • ^o^/♡
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
히어로맛쿠키
[혼자 공부하는 자바] 6/28 02-3 형변환
상단으로

티스토리툴바