ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 연산자
    Develop/Java 2021. 6. 12. 17:46
    - 산술 연산자
    - 비트 연산자
    - 관계 연산자
    - 논리 연산자
    - instanceof
    - assignment (=) operator
    - 화살표 (->)연산자
    - 3항연산자
    - 연산자의 우선 순위
    - switch operator

     

     

    산술 연산자

    연산자가 특정 작업을 위한 기호라면, 산술 연산자는 수학적인 계산을 하기 위해 쓰는 기호.

    부호 ( + , - )

    증감 ( ++ , -- )

    + , - , * , % , /

     

    연산자 (operator)  : 연산을 수행하는 기호.

    피연산자 (operand) : 연산자의 작업 대상 ( 변수, 상수, 리터럴, 수식 )

     

    사칙 연산자 ( + , - , * , / )

    피연산자가 정수형인 경우, 나누는 수로 0을 사용할 수 없다. 0으로 나눈다면 실행시에 에러가 발생한다.

    (ArithmeticException / Infinity 발생 )

    정수형일 경우, 소수점이 잘린다.

    올바른 연산결과를 얻기 위해서는, 2개의 피연산자 중 어느 한쪽이라도 실수형으로 형변환을 진행해야 한다. 그래야 나머지 한쪽도 자동변환됨.

     

    10 / 4.0f -> 10.0f / 4.0f -> 2.5f
    (int) (float) (float) (")     (")

     

    비트 연산자

    비트연산자는, 피연산자를 비트 단위로 논리 연산한다. 피연산자로 실수는 허용하지 않는다. 정수(문자 포함)만 허용한다.

    | (OR) : 피연산자 중 한쪽의 값이 1이면, 1을 결과로 얻는다. 외에는 0

    & (AND) :  피연산자 양쪽이 모두 1이어야 한다. 외에는 0

    ^ (XOR) : 값이 서로 다를 때만 1을 결과로 얻고, 같으면 0

     

    OR연산자는 특정 비트의 값을 변경할 때, AND는 특정 비트의 값을 뽑아낼 때, XOR는 같은 값으로 두고 수행하면, 다시 원래의 값으로 돌아와서 간단한 암호화에 사용된다.

     

    ~ (비트전환연산자)

    피연산자를 2진수로 표현했을 때 0->1 , 1->0으로 바꾼다. 논리부정 연산자 !와 유사하다. 비트 전환이 되고나면, 부호가 있을 경우 반대로 변경되어서 1의 보수를 얻을 수 있다.

     

    shift연산자 <<,>>

    피연산자의 각 자리 (2진수)를 >>오른쪽, <<왼쪽으로 이동(shift)한다. 

    자리 이동으로 저장 범위를 벗어난 값들은 버려지고, 빈 자리는 0으로 채워진다. >>이동할 경우, 부호 유지가 필요하면 왼쪽 피연산자가 음수인 경우 빈자리를 1로 채운다.

    x << n : x * 2^n
    x >> n : x / 2^n

     

    관계 연산자(비교연산자)

    주로 조건문과 반복문의 조건식에 사용된다. 연산 결과는 오직 true/false.

     

    1) 대소 비교 < , > , <= , >= 

    두 피연산자의 크기를 비교한다.

     

    2) 등가 비교 == , !=

    두 피연산자의 값이 같은지 다른지 비교한다. 모든 자료형에 사용 가능하다.

    참조형의 경우, 객체의 주소값을 저장하므로 두개의 피연산자가 같은 객체를 가리키고 있는지 알 수 있다.

    실수형은 근사값으로 저장되어 오차가 발생할 수 있다.

     

    float f = 0.1f; //f에 0.100001490-H로 저장
    double d = 0.1; //d에 0.1000 ...1로 저장.
    
    //float와 double을 비교 할 때에는, double타입의 값을 float타입으로 형변환하고 비교해야한다.

    문자열 비교

    문자열은 '=='대신 .equals()를 사용하자.

    ==쓰면 내용이 같아도 다른 객체라서 false를 리턴한다.

     

     

    논리 연산자

    ||(OR결합) : 한쪽만 true여도 true

    && (AND결합) : 피연산자 양쪽 모두 true여야 true임

    -> 위치 유의해서 쓰면 더 효율적임.

     

    논리부정 연산자 !

    피연산자가 true => return false

    피연산자가 false => return true

     

     

    instanceof

    참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 instanceof연산자를 사용한다. 주로 조건문에 사용한다.

    instanceof 왼쪽 : 참조변수 / 오른쪽 : 타입(클래스명) 이 피연산자로 위치한다.

     

    연산결과 : true / false

     

    true : 참조변수가 검사한 타입으로 형변환이 가능하다.

     

    FireEngine class extends Car
    class Car
    
    FireEngine fe = new FireEngine();
    
    if(fe instanceof FireEngine){} // true
    if(fe instanceof Car){} //true
    if(fe instanceof Object){} //true
    
    //FireEngine이 부모를 상속받았으므로, 다 포함하고 있다.
    

     

    메서드의 경우 오버라이딩 한 경우, 참조변수 타입 관계 없이 항상 실제 인스턴스의 메서드(오버라이딩 메서드)가 호출된다.

    멤버변수의 경우, 참조 변수의 타입에 따라 달라진다. 멤버변수가 조상 클래스의 자손 클래스에 중복으로 정의된 경우, 조상 타입의 참조변수를 사용하면 조상 클래스에 선언된 멤버변수가 사용되고, 자손타입을 사용하면 자손 타입이 들어간다.

     

     

    assignment(=) operator ( 대입연산자)

    변수와 같은 저장공간에 값 또는 수식의 연산결과를 저장하는데 사용된다.

    lvalue : 왼쪽 피연산자 -> 변수처럼 값을 저장할 수 있는것

    rvalue : 오른쪽 피연산자 -> 변수, 식, 상수 가능.

     

     

    화살표(->) 연산자

    lambda식에서 사용된다. 메서드를 하나의 expression(식)으로 표현한것. 이렇게 하면 이름과 반환값이 없어져서, 익명함수라고 부른다.

     

    method vs 함수

    객체지향의 의미에서 function 대신 객체의 행위나, 동작을 의미하는 method를 사용한다. 메서드는 반드시 특정 클래스에 속해야 한다.

     

    Runnable r = ()-> System.out.print("Run method");
    //(매개변수) -> {statememt};
    

     

    익명 클래스

    inner class의 한 종류로, 이름이 없는 객체를 만들 수 있다.

    부모 클래스를 상속받는 sub 클래스를 사용하지 않고도, 단일 객체를 만들어서 부모 클래스에 정의된 동작에 행위를 추가 가능하다.

    -> listener interface를 만들 때 유용하다.

    t는 Thread클래스를 확장한 익명 클래스의 객체이다.

    익명 클래스 vs 일반 클래스

    일반 클래스는 interface를 제한 없이 상속받을 수 있다. 익명 클래스는 단 하나만의 인터페이스, 클래스를 구현할 수 있고, 별도의 생성자 작성이 불가능하다. 만들어진 클래스의 생성자와 동일하게 객체 생성을 한다.

     

    특징

    - new를 사용한다.

    - instantiation할 경우, parameter가 없어야 한다.

    - ()뒤에 interface implement나 class extends가 존재해야함.

     

    FunctionalInterface f = (arg1, arg2, ...) -> {implementation};
    //인자가 하나라면 소괄호는 생략 가능하다.
    //인자를 받아서 implementation에서 활용 가능하다.
    //statement 개수가 1개면, 중괄호 생략도 가능하다.

     

    3항 연산자

    int a = (20 < 50) ? 10 : 1;
    //조건문 (20 < 50)이 참일 경우 a가 10, 거짓일 경우 1이 된다

     

    연산자 우선 순위

    1.  () 괄호 속 연산자

    2. 증감(++,--) / 부호 (+,-) / 비트(~) / 논리(!)

    3. 산술 (* , / , %)

    4. 산술 (+, -)

    5. shift ( << , >> )

    6. 비교 ( < , > , <= , >= , instanceof)

    7. 논리 &

    8. 논리 ^

    9. 논리 |

    10. 논리 &&

    11. 조건 (? : )

    12. 대입 ( =, += , ... )

     

    ex)

    x > 0 && y < 0  // 1 3 2
    100 * 2 / 3 % 5 // 1 2 3
    a = b = c = 5; // 3 2 1
    

     

     

    괄호의 우선순위가 제일 높고, 산술 > 비교 > 논리 > 대입 / 단항 > 이항 > 삼항 순서를 가진다.

    Java 13 - switch 연산자

     

    switch statement

    다수의 case, break가 존재한다. break;를 안넣으면 무조건 다음 분기로 넘어간다. 

    return값이 존재할 수 없다.

     

    switch operator

    break를 사용하지 않아도 된다.

    yield가 존재한다.

    return값이 존재해도 된다.

    case -> A 형식으로 표현 가능하다.

     

    switch의 반환값이 따로 필요하지 않거나, case가 switch로 들어오는 모든 인자를 커버하는 경우 default를 사용하지 않아도 되지만, 아닐 경우 default -> code를 작성해야 한다.

     

    //Java12
    returnNum = switch(num){
    	case 1->1;
        case 2->2;
        default-> throw new IllegalException("Unexpected value:" + num);
    };
    
    
    //Java13
    returnNum = switch(num){
    	case 1 : yield 3;
        default : throw new IllegalException("Unexpected value:" + num);
    };
    
    // yield x 하면 x가 리턴됨. 예약어이지만 변수명으로도 사용 가능하다. (int yield = 3)
    

     

    : 대신 -> 도 추가되었고, yield 기능을 이용해 값을 리턴 가능하다.

    댓글

Designed by Tistory.