ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [스터디 3주차] JAVA 연산자
    프로그래밍 언어/JAVA 2021. 5. 30. 16:45
    더보기

    목표: 자바가 제공하는 다양한 연산자 학습

     

    1. 산술 연산자

    산술 연산자를 알아보기 전제 연산자가 무엇인지부터 알아보자.

    연산자는 프로그램에서 데이터를 처리하여 결과를 산출하는 연산에 사용되는 표시나 기호를 의미한다.

    그러면 산술 연산자는 무엇일까?

    산술 연산자는 우리가 흔히 쓰는 사칙연산인 덧셈(+), 뺄셈(-), 곱셈(*), 나눗셈(/)과 나머지를 구하는 %연산자를 포함하고 있는 연산자이다.

    산술 연산자는 피연산자로 boolean 타입을 제외한 모든 기본 타입이 가능하다.

    산술 연산자의 특징은 피연산자들의 타입이 동일하지 않을 경우 수행되는 규칙이 존재한다.

    첫 번째로, 피연산자들이 모두 정수 타입이고 int타입보다 크기가 작은 타입인 경우에는 피연산자는 int 타입으로 변환 후 연산을 수행하고 연산 결과도 int 타입이다.

    두 번째로, 피연산자들이 모두 정수 타입이고 피연산자 중에 long타입이 있을 경우 모든 피연산자를 long타입으로 변환 후 연산을 수행하고 연산 결과도 long 타입이다.

    마지막으로 피연산자 중 실수 타입(float이나 double)이 있을 경우에 크기가 큰 실수 타입으로 모든 피연산자를 변환 후 연산을 수행하고 연산 결과도 크기가 큰 실수 타입이다.

     

    산술 연산자의 규칙을 따라 실행이 되면 재미있는 부분이 발생한다.

    int var1 = 14;
    int var2 = 4;
    int ans1 = var1 / var2;
    double ans2 = var1 / var2;

    먼저, 14 나누기 4는 다들 알듯이 3.5이다.

    하지만, 위에서 말한 첫 번째 규칙에 의해 int와 int 피연산자가 연산되었으므로 결과도 int 타입이므로 3만 산출된다.

    그래서 ans1에는 3이 저장된다.

    그러면 ans2는 실수형 타입인데 3.5가 저장될까?

    그렇지 않다. ans2에 대입하기 전 var1/var2는 연산 결과로 3(int 타입)이 나왔다. 그러므로 int타입이 double 타입으로 바뀌어 3.0이 ans2에 저장이 된다.

    만약에 ans2에 3.5가 저장되기를 원한다면 var1이나 var2 둘 중 하나를 실수형 타입으로 변환 후 연산을 하면 된다.

     

    산술 연산을 할 경우에 주의할 점은 연산 후 결과값이 산출 타입으로 표현 가능한지를 살펴봐야한다는 것이다.

    만약에 결과값이 산출 타입의 크기로 표현할 수 없는 값이라면, 오버플로우가 발생하게 된다.

     

     

    2. 비트 연산자

    비트 연산자는 데이터를 비트(bit)단위로 연산하는 것으로 0과 1이 피연산자가 된다.

    그러므로 0과 1로 표현이 가능한 정수 타입만 비트 연산이 가능하다.

    비트 연산자에는 비트 논리 연산자(&, |, ^, ~)와 비트 이동 연산자(<<. >>, >>>)가 있다.

    먼저 비트 논리 연산자에 대해 알아보자.

    비트 논리 연산자는 &, |, ^, ~가 있는데 이 중에 &, |,^ 연산자는 피연산자가 boolean 타입일 경우에는 아래에서 설명할 논리 연산자로 사용되고 피연산자가 정수 타입일 경우에는 비트 논리 연산자로 사용된다.

    그러면 각각의 연산자가 어떠한 역할을 하는지 알아보자.

    &연산자는 마치 AND(논리곱)처럼 동작하여 피연산자가 1,1이면 결과가 1이고 0,1이나 1,0이나 0,0이면 결과가 0이다.

    |연산자는 OR(논리합)처럼 동작하여 피연산자가 0, 0이면 결과가 0이고 1,1이나 1,0이나 0,1이면 결과가 1이다.

    ^연산자는 XOR(베타적 논리합)처럼 동작하여 피연산자가 1,1이나 0,0이면 결과가 0이고 1,0이나 0,1이면 결과가 1이다.

    ~연산자는 NOT(논리 부정)처럼 동작하여 피연산자가 1이면 결과가 0이고 피연산자가 0이면 결과가 1이다.

     

    다음으로 비트 이동 연산자에 대해 알아보자.

    비트 이동 연산자는 정수 데이터의 비트를 좌측 또는 우측으로 밀어서 이동시키는 연산을 수행한다.

    비트 이동 연산자에는 <<, >>, >>>가 있고 각각에 대한 기능은 아래와 같다.

    각각의 연산자에 대해 비트가 어떻게 이동되어 변경되는지 그림으로 살펴보자.

    먼저, int var1 = 1 << 2를 보자.

    다음으로 int var1 = -8 >> 2를 보자.

    마지막으로 int result -8 >>> 2를 보자.

     

     

    3. 관계 연산자

    관계 연산자는 두 개의 피연산자를 비교하여 boolean 타입인 true와 false를 결과값으로 산출한다.

    관계 연산자에는 두 피연산자의 크거나 작거나를 비교하는 대소 연산자와 두 피연산자가 같은지 다른지를 비교하는 동등 연산자가 있다.

    대소 연산자는 boolean타입의 피연산자를 제외한 기본 타입의 피연산자에서 사용할 수 있고 동등 연산자는 모든 타입의 피연산자에서 사용할 수 있다.

    관계 연산자의 종류는 다음과 같다.

    만약에 피연산자가 char 타입인 경우에는 문자를 유니코드 값으로 비교 연산을 수행한다.

     

     

    4. 논리 연산자

    논리 연산자는 우리가 수학시간에 배운 and, or, not 등과 같은 연산을 수행하는 연산자로 &&, ||, &, |, ^, !가 있다.

    논리 연산자의 피연산자는 boolean타입만 가능하고 논리 연산자의 종류와 기능은 아래와 같다.

     

     

    5. instanceof

    instanceof 연산자는 객체가 특정 클래스 / 인터페이스 유형인지 여부를 확인할 때 사용하는 연산자다.
    해당 여부를 true, false로 알려주고 부모 객체의 인스턴스인지 자식 객체인지를 알려줄 때 사용한다.

    class Test {
      ...
    }
    
    class Test2 extends Test{
      ...
    }
    
    class Operator{
        public static void main(String[] args) {
            Test obj1 = new Test();
            Test obj2 = new Test2();
            System.out.println(obj1 instanceof Test);    // true
            System.out.println(obj1 instanceof Test2);   // false
            System.out.println(obj2 instanceof Test);    // true
            System.out.println(obj2 instanceof Test2);   // true
        }
    }

     

     

    6. assignment(=) operator

    assignment operator는 대입 연산자로 오른쪽 피연산자의 값을 왼쪽 피연산자인 변수에 저장하는 것이다.

    대입 연사자에는 단순히 오른쪽 피연산자의 값을 왼쪽 피연산자에 저장하는 단순 대입 연산자가 있고

    정해진 연산을 수행 후 결과를 왼쪽 피연산자에 저장하는 복합 대입 연산자가 있다.

    대입 연산자의 종류와 기능은 아래와 같다.

     

     

    7. 화살표(->) 연산자

    화살표 연산자는 Java 8버전 부터 추가된 람다식을 지원하기 위해 사용되는 연산자이다.

    기존의 메서드를 람다식(화살표 연산자)으로 표현하면 메서드의 이름과 반환값이 없어져서 익명함수(anonymous function)이라고도 부르는데, 메서드를 하나의 인수로 취급할 수도 있어 유연한 프로그래밍을 가능하게 해준다.

     

     

    8. 3항 연산자

    연산자는 필요로 하는 피연산자의 수에 따라 단항 연산자, 이항 연산자, 삼항 연산자로 구분된다.

    (피연산자는 연산되는 데이터를 의미한다. 예를 들어 x+y라는 연산식이 있으면 x와 y가 피연산자가 된다.)

    부호 연산자(+,-로 음수와 양수를 나타내는 부호)와 증가/감소 연산자(++,--로 피연산자를 1만큼 증가/감소)는 피연산자 하나만 요구하므로 단항 연산자이다.

    이외에도 논리 연산자 중 !와 비트 연산자 중 ~가 단항 연산자에 속한다.

    /* 단항 연산자 예시 */
    int var1 = +100; // var1이 양수라는 것을 표현하는 부호 연산자
    int var2 = -100; // var2가 음수라는 것을 표현하는 부호 연산자
    
    // 부호 연산자의 산출 타입은 int 타입이 되어야 하므로 아래와 같은 경우에 컴파일 에러가 발생한다.
    byte a = 100;
    byte b = -a;
    // 위의 경우처럼 부호 연산자의 결과는 int이지만 byte 타입 변숭 담으려고 해서 에러가 나므로 아래와 같이 고쳐야한다.
    byte a = 100;
    int b = -a;

     

    다음으로 삼항 연산자에 대해 알아보자.

    삼항 연산자는 세 개의 피연산자를 필요로 하는 연산자를 의미한다.

    삼항 연산자에는 (조건식) ? A(값 또는 연산식) : B(값 또는 연산식)로 표현되는 조건 연산자가 있다. 

    여기서 ?앞의 조건식 1개와 : 앞뒤의 값 또는 연산식 2개를 포함하여 피연산자가 3개가 있어 삼항 연산자이다.

    삼항 연산자의 연산 결과는 다음과 같다.

    우선, ? 앞의 조건식의 연산 결과가 참(true)이면 삼항 연산자의 결과는 A가 되고 거짓(false)이면 삼항 연산자의 결과는 B가 된다.

    코드의 예시를 보면서 이해를 해보자.

    int var1 = 50;
    int ans  = (var1>40) ? 20 : 10;

    우선 조건식을 연산하면 var1이 40보다 크므로 참이 되므로 콜론(:)앞의 값인 20이 ans에 저장된다.

     

     

    9. 연산자 우선 순위

    연산식에는 하나의 연산자를 이용하여 쓰는 경우도 있지만 다양한 연산자를 이용하여 쓰는 경우도 있다.

    다양한 연산자를 이용한 경우에는 어떠한 연산자를 우선적으로 연산을 할지에 대한 기준이 있어야한다.

    예를 들어, 우리가 수학시간에 배운 덧셈, 뺄셈, 곱셈, 나눗셈은 곱셈, 나눗셈을 덧셈, 뺄셈보다 먼저 계산하는 규칙이 있다는 것을 알고 있다.

    그러면 프로그램에서 연산자는 어떠한 우선 순위를 가지고 있을까?

    위와 같은 순서로 연산 순위를 갖는다. 여기서 연산 방향이 ->인 경우와 <-인 경우가 있는데 무엇을 의미할까?

    먼저, 대부분의 경우에 ->인 경우를 가지는데 이 의미는

    만약에 하나의 연산식에 산술연산자 *,/,%가 함께 있는 경우를 생각해보자.

    x * y / z % a 이 연산식을 보면 우선 순위가 같은 연산자로만 구성되어있는데 이 경우에 연산 방향인 ->으로 연산을 진행하는 것이다. x*y를 먼저 계산하고 계산 결과와 / z를 계산하고 계산 결과와 % a를 계산하는 것이다.

    그러면 그 반대 방향인 <-의 경우를 생각해보자.

    대입 연산자 =, +=이 같이 있는 x = y += z =5 연산식을 보자.

    이 경우에는 =, +=는 우선 순위가 같으므로 연산 방향인 <-을 고려하여 계산한다.

    즉, z=5, y+=z, x=y 순으로 계산되어야 한다는 것이다.

     

    이렇게 정해져 있는 우선 순위로 연산하는 것 말고 자신이 원하는 연산을 먼저 계산하고 싶은 경우가 있을 것이다.

    예를 들어 a + 5 *8 연산식은 우선 순위에 따라 5*8이 먼저 계산되고 그 후에 a와 5*8의 계산 결과와 +연산이 된다.

    하지만 +연산자를 먼저 연산을 하고 싶은 경우에는 괄호 ( )를 사용하면 된다.

    즉, (a + 5) *8로 표현하면 된다.

     

    댓글

Designed by Tistory.