관리 메뉴

나구리의 개발공부기록

자바의 정석 기초편 ch3 - 5 ~ 8[증감연산자, 부호연산자, 형변환 연산자, 자동 형변환] 본문

유튜브 공부/JAVA의 정석 기초편(유튜브)

자바의 정석 기초편 ch3 - 5 ~ 8[증감연산자, 부호연산자, 형변환 연산자, 자동 형변환]

소소한나구리 2023. 11. 5. 14:36

1) 증감연산자

  • 코드의 식을 간단히 하려고 고안 됨
  • 증가 연산자(++) : 피연산자의 값을 1 증가 시킨다
  • 감소 연산자(--) :  피연산자의 값을 1 감소 시킨다
    • 전위형 : 값이 참조되기 전에 반영
    •  j = ++i;
      • ++i;  -> i의 값이 증가
      • j = i; -> 증가된 i의 값을 참조하여 대입
    • 후위형 : 값이 참조된 후에 반영
    • j = i++;
      • j = i;  -> 먼저 참조하여 대입
      • i++;  -> 그 후에 i의 값을 증가
  • ++i, i++ 이렇게 증감 연산자만 독립적으로 사용된 경우 전위형과 후위형의 차이가 없음

예시

public class ex3_{
	public static void main(String[] args) {
		
		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

2) 부호연산자

(1) 부호연산자

  • 단항연산자에 적용(피연산자 1개)
  • '-' : 피연산자의 부호를 반대로 변경
  • '+' : 사용하지 않음 = 아무런 일도 일어나지 않음..
i = -10;
i = -i;
System.out.println(i); // -(-10)으로 10이 출력됨

3) 형변환

(1) 형변환

  • 변수 또는 상수의 타입을 다른 타입으로 변환하는 것
  • (타입)피연산자
double d = 85.4;
int score = (int)d; // -> int score = (int)85.4;
int score = 85;
  • 주의점 - 변수 d의 값은 여전히 그대로이고 불러온 값(score의 값)만 형변환이 된 것

(2) 형변환 예시

  • (char)유니코드 문자표
  • 문자에서 숫자로 변환시에도 유니코드 문자표 결과값으로 출력
    • '0' -> 48, '2' -> 50
    • 'A' -> 65, 'F' -> 70
    • 'a' -> 97, 'd' -> 100
    • 유니코드문자표는 순차적으로 나열 됨
  • 실수 -> 정수 형변환시 소수점은 무조건 버림 처리

(3) 자동 형변환 : 컴파일러가 자동으로 형변환 해줌

  • float f = 1234; -> 자동 형변환 적용
  • flaot f = (float)1234;
  • 실수 = 정수로 타입 불일치이지만 저장 가능함

(4) 에러 발생 -> 수동형변환으로 진행

  • int i = 3.14f : 에러 발생, 3.14의 값이 3으로 값손실이 발생하여 자동형변환 안됨
  • int i = (int)3.14f; : 수동으로 형변환 하여 소수점의 자리가 모두 버림처리되어 3으로 출력 됨
  • 기존의 값을 최대한 보존할 수 있는 타입으로만 자동 형변환이 되며 그 외에는 수동 형변환

  • long -> float 형변환이 가능한 이유는 float의 저장 형식때문에 float가 표현할 수 있는 범위가 더 넓음
  • long (10의 19제곱) -> float (10의 38제곱)

(5) 예외적 상황

  • byte b = 100; -> 자동형변환 OK
    • byte타입의 범위(-128 ~ 127)의 값이기 때문에 자동으로 형변환 가능
  • int i = 100;
  • byte b = i;  -> 에러발생
    • 위의 상황은 100의 값이 리터럴 이지만, i의 값은 변수이므로 변수에 무슨값이 저장 되어있을지 모르기 때문에 자동형변환 불가
    • byte b = (byte)i; // 수동형변환은 가능
  • byte b = 1000; -> 에러발생, byte타입의 범위를 넘어감(값손실이 발생할 것이 확실)
  • byte b = (byte)1000; // 수동형변환 -> 값손실이 발생하여 -24의 값으로 저장됨(오버플로우 적용)

** 출처 : 남궁성의 정석코딩_자바의정석_기초편 유튜브 강의