ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java-13] 자바 산술 연산자
    Java 2020. 11. 27. 14:06

    Java Arithmetic Operator

     

    1. 산술 연산자 (Arithmetic Operator)

     

    산술 연산자는 부동 소수점, Characters, 정수형과 함께 사용할 수 있다. (Boolean 연산자를 제외하고, 기본형 타입은 전부 사용할 수 있다.) 만약 우리가 자바에서 실수(부동 소수점) + 정수를  한다면, 실수 산술 연산자가 진행 되고, 그렇지 않다면 정수 연산이 진행된다. 왜 그렇게 될까? 라고 생각을 한다면, 타입 캐스팅 블로그 포스팅을 보고오면 감이 올 것이다. 

     

    더하기 (+) Addition

    • ‘+’ 연산자는 두개의 숫자를 더해줍니다. 또한 + 연산에서 String 타입이 있으면 이 두가지 타입을 연결해준다.

    • 만약 피연산자 중 하나가 String 타입이면, 즉 “String” +  3 이면 이 둘을 이어서 출력해 주는데, 이는 ‘3’ 을 문자열로 생각한다. 그러므로 출력은 String 3 이 나오게 된다. 

    • 모든 숫자를 문자열로 인식하기 때문에 (“StudyHalle” +3+ 4) 의 출력은 StuddyHale 34 가 된다.

    • 이를 막아주기 위해서는 괄호 처리를 해줘서 정수끼리의 연산을 미리 해줄 수 있다.

    • 나중에 더 알아보도록 하겠지만 만약 비트연산을 하면 어떻게 진행되는지 맛베기로 함 보도록 하자. 이렇게 맛보기로 슬슬 보다 보면 비트연산할 때 당황하지 않을거다.

    빼기 (-) Subtraction

    • 우리가 이항 연산을 사용할 때, 보통 ‘-’ 연산자를 사용하게 된다. ‘-’ 연산은 두번째 피연산자를 첫번째에서 빼기 를 진행하게 된다. 아까 더하기 에서는 다음과 + 가 String에서 append 하게 붙는다고 얘기했는데, ‘-’ 연산은 다음과 같이 지원하지 않는다. 만약 진짜 문자열 중에 자기가 원하는 문자열을 제거하고 싶다면, 다음 사진처럼 ‘str.substring()’ 으로 제거 가능하다 : )

    • 단항연산자에서 사용할 수 있는데, 그러면 원래 단항에서의 부정을 나타낸다. -1 * -12 는 12처럼 말이다. 하지만 --12 는 사용할 수 없다. ‘--’ 라는 연산자가 따로 있기 때문에 이는 적절한 방법이 아니다.

    곱하기 (*) Multiplication

    • ‘ * ’ 연산자는 단연, 그냥 곱하기 라고 생각하면 된다. 두개의 피연산자를 곱한다. 1 * 2 는 2처럼 말이다. *는 ‘ ( , )’  를 붙이지 않고 단독적으로 사용할 수 있다. 이번엔 심심하니 문자 자체를 정수로 캐스팅? 하고 연산하도록 하자. String 을 (int)로 캐스팅은 불가능하지만, Integer.parseInt(str)로는 가능하다. 이걸 캐스팅이라고 하긴 뭐하고 파싱한다 라고 한자

    나누기 ( / ) Division

    • ‘ / ‘ 연산자는 첫번째 피연산자에서 두번 째 피 연산자를 나눈다. 만약 연산자들이 전부 정수(Integer)라고 한다면 int를 반환하게 되고, 밑에 부동소수점은 전부 잃게 된다. 만약 하나라고 피연산자라고 한다면 부동 소수점으로 반환하게 된다. 이게 무슨소리냐면  다음 사진과 같이 반환한다고 생각하면 된다.

    • 그럼 반환값은 어떻게 될까? 당연히 3.0/2 는 double 을 반환하고 3/2 는 int를 반환하게 된다. 그래서 이 값을 assign 할 때 타입을 잘 고려하길 바란다.

    • ‘ / ‘ 연산을 사용하면서 주의할 점이 한가지 더 있는데, 만약 0 을 나누려 한다면 ArithmeticException 이 발생하게 된다. 자바 docs 링크를 걸었는데, 원인은 간단하다. 그냥 처리할 수 없는 산술 연산이 나오면, 런타임 오류를 발생 시킨다.

    • 위에 말한건 정수/0 이었을 때인데, 차라리 저렇게 정수 / 연산을 할 때, 에러가 떠주면 차라리 고맙다. 하지만 ‘실수 / 0’ 이면 골치아프다. 왜냐면 실수에 0을 나누면 Infinity 라는 ‘String’타입 문자열이 출력이 된다. 이러면 연산이 엄청나게 Chaining 걸렸을 때 나중에 어디서 문제가 발생했는지 디버깅 하기도 귀찮아진다.

    • 그래서 만약에 문제가 생길거같은 지점은 알아서 예외처리를 해서 Infinity값이 들어갔을 때 개발자가 알 수 있도록 해주는게 좋다. 

     

    나머지 연산 ( % ) Modulo

    •  % 연산은 기본적으로 첫번째 연산자에서 2번째 피연산자의 나머지를 계산해서 반환해준다. 예를들어 7%3을 연산을 할경우 1을 반환해준다. 당연히 3%7을 할경우 3을 반환해 준다.

    • 사실 일반적으로 보토의 개발을 할 경우 모듈러 연산은 정수 % 정수 의 상태일 때 진행될 가능성이 높긴하다. 하지만, 실수형 (부동 소수점)에서도 잘 적용이 되야 하는데, 이상하게 안된다. 아 내가 틀린줄 알고 직접 계산도 해봤는데 기대값 처럼 나오지 않고

    • 나머지 연산에서의 Zero( 0 ) 은 ‘/’과 똑같이 ArithmeticException 이 발생하게 된다. 만약 다른 연산자가 하나라도 부동소수점을 반환하게 된다면 “NaN”이라는 String 타입을 뱉기 때문에 이 점 또한 주의하면 좋다.


    여기까지 기본적인 산술 연산에 대해서 알아보았다.

     

    'Java' 카테고리의 다른 글

    [Java-15] 관계 연산자  (0) 2020.11.27
    [Java-14] 비트 연산자와 쉬프트 연산자  (1) 2020.11.27
    [Java-12] 자바 배열  (0) 2020.11.20
    [Java-11]타입추론 var  (1) 2020.11.20
    [Java-10]변수의 스코프&라이프타임  (0) 2020.11.20

    댓글

Designed by Tistory.