JAVA TIL #1

원종운·2019년 10월 27일
1

연산자

1. 연산자 관련 숙지사항


  • 괄호는 연산자가 아니다. 연산자의 우선순위를 임의로 지정할 때 사용하는 기호일 뿐이다.

  • 두 피연산자의 타입이 일치하지 않을 경우, 피연산자들의 타입을 형변환 연산자로 일치시켜야 한다. 이 때 두 피연산자의 타입 중에서 더 큰 타입으로 일치시키는데, 그 이유는 작은 타입으로 형변환을 하게 되면, 원래의 값이 손실될 가능성이 있기 떄문이며 작은 타입에서 큰 타입으로 형변환하는 경우, 자동적으로 형변환이 되므로 형변환 연산자를 생략할 수 있다.
	int i = 10;
	float f = 20.0f;
	float result = f + i; // 큰 타입으로 형변환시, 형변환연산자 생략 가능

  • 산술 변환
    연산 전에 피연산자의 타입을 일치를 위해 자동 형변환 되는 것을 '산술 변환' 또는 '일반 산술 변환'이라 하며, 이 변환은 이항 연산에서만 아니라 단항 연산자에서도 일어난다. 규칙은 다음과 같다.

    + 두 피연산자의 타입을 같게 일치시킨다. ( 보다 큰 타입으로 일치 )
    + long + int -> long + long -> long
    + float + int -> float + float -> float
    + double + float -> double + double -> double

     + 피연산자의 타입이 int보다 작은 타입이면 int로 변환된다.
    	+ byte + short -> int + int -> int
        + char + short -> int + int -> int
        
     + 모든 연산에서 '산술 변환'이 일어나지만, 쉬프트 연산자(<<, >>), 증감 연산자(++, --)는 예외이다.'

  • 식에 두 번 이상 포함된 변수에 증감 연산자를 사용하는 것은 피해야한다.

  • 피연산자가 정수형인 경우, 나누는 수로 0을 사용할 수 없으며, 만일 0으로 나누면, 컴파일은 정상적으로 되지만 실행 시 오류(ArithmeticException)이 발생한다.
    단, 부동 실수인 0.0f, 0.0d로 나누는 것은 가능하지만. 그 결과는 무한대(Infinity)이다.

오늘의 문제 !

아래의 코드에서 컴파일 에러가 발생하는 원인은 ?

	byte a = 10;
	byte b = 30;
	byte c = a * b; // (3)

컴파일 에러가 발생하는 원인
int형보다 크기가 작은 자료형의 값의 경우는 '산술 변환'에 의하여 int형으로 변환이 일어나게 된다. 따라서 "a b" 라는 표현식의 경우는 int int로 연산되며, 그에 따른 결과 또한 int형이다. 따라 int형보다 크기가 작은 byte형 변수에 별도의 형변환없이 대입하려고하여 발생한 에러이다.만약 int형보다 큰 자료형의 경우에는 자동으로 형변환이 일어나므로 괜찮다.

profile
Java, Python, JavaScript Lover

0개의 댓글