티스토리 뷰

728x90

프로그램에서 데이터를 처리하여 결과를 산출하는 것을 연산(operations)이라고 한다.

연산에 사용되는 기호를 연산자(operator)라고 하고, 연산되는 데이터는 피연산자 (operand)라고 한다.

연산자와 피연산자를 이용하여 연산의 과정을 기술한 것을 연산식(expression)이라고 한다.

출처 - 이것이 자바다. 자바언어가 제공하는 다양한 연산자

산술 연산자

자바의 산술연산자는 +(더하기), -(빼기), *(곱하기), %(나누기) 그리고 나머지 연산이 있다.

출처 - 이것이 자바다 산술 연산자

public static void main(String[] args) {

    int a = 6;
    int b = 3;

    System.out.println(a+b);    //9
    System.out.println(a-b);    //3
    System.out.println(a*b);    //18
    System.out.println(a%b);    //0
    System.out.println(a/b);    //2
}

나눗셈 연산은 정수형 기본인 int 형으로 나눗셈을 하게 되면 5/2 했을 때 소수점을 버린 2의 값이 나오지만

double 형으로 나눗셈을 했을 때는 5/2를 하면 2.5의 값이 나오게 된다.

int a = 5;
int b = 2;
System.out.println(a/b);    //2

double aa = 5;
double bb = 2;
System.out.println(aa/bb);  //2.5

더하기와 빼기는 산술연산자이기도하고, 부호연산자 이기도 하다.

int a = +10;
int b = -10;

부호 연산자의 산출 타입은 int 타입이 된다. 즉 아래와 같이 했을 경우 컴파일 에러가 난다. (IDE에서 잡아줌)

byte aa = 6;
int result = -aa;

비트 연산자

출처 - 이것이 자바다 비트 연산자

비트연산자는 ~, &, |, ^ 4개로 구성된다.

& 연산은 그림과 같다.  Bit 연산 시 둘 다 1이면 1 하나라도 0이면 0이다.

출처 - Logical Sensibility 네이버 블로그 [논리회로] 기본 논리 게이트

/**
* &(AND) 연산
*/
int bit = 6;
int bit2 = 10;

System.out.println(Integer.toBinaryString(bit));    //0110
System.out.println(Integer.toBinaryString(bit2));   //1010
System.out.println(Integer.toBinaryString(bit & bit2)); //0010

| (OR) 연산은 아래 그림과 같다. Bit 연산 시 하나라도 1이면 1이다.

출처 - Logical Sensibility 네이버 블로그 [논리회로] 기본 논리 게이트

/**
* |(OR) 연산
*/
int bit = 6;
int bit2 = 10;

System.out.println(Integer.toBinaryString(bit));    //0110
System.out.println(Integer.toBinaryString(bit2));   //1010
System.out.println(Integer.toBinaryString(bit | bit2)); //1110

^연산은 XOR(exclusive or : 배타적 논리합)  연산이다. 서로 다를 때 1을 나타낸다.

출처 - Logical Sensibility 네이버 블로그 [논리회로] 기본 논리 게이트

/**
* ^(XOR) 연산
*/
int bit = 6;
int bit2 = 10;

System.out.println(Integer.toBinaryString(bit));    //0110
System.out.println(Integer.toBinaryString(bit2));   //1010
System.out.println(Integer.toBinaryString(bit ^ bit2)); //1100

 

~는 비트 반전 연산자로서 비트가 0이면 1로 바꾸고 1이면 0으로 반전시킨다.

출처 - Logical Sensibility 네이버 블로그 [논리회로] 기본 논리 게이트

/**
* 모든 비트를 반전 (0->1 , 1->0) 한 후에
* 2의 보수를 취한 값에 -부호를 붙여서 반환한다.
*/
int bit = 5;
System.out.println(Integer.toBinaryString(bit));    //101
System.out.println(Integer.toBinaryString(~bit));   //11111111111111111111111111111010
System.out.println(~bit);   //-6

관계 연산자

관계 연산자는 대소 또는 동등을 비교해서 boolean 타입을 산출한다.

출처 - 이것이 자바다. 관계 연산자

/**
* 관계연산자
*/
int a = 10;
int b = 20;

System.out.println(a == b); //false
System.out.println(a != b); //true
System.out.println(a > b);  //false
System.out.println(a >= b); //false
System.out.println(a < b);  //true
System.out.println(a <= b); //true

char charA = 'A';
char charB = 'B';
System.out.println(charA ==charB); //false
System.out.println(charA !=charB); //true
System.out.println(charA > charB);  //false
System.out.println(charA >=charB); //false
System.out.println(charA < charB);  //true
System.out.println(charA <=charB); //true

논리 연산자

논리 연산자는 논리곱(&&), 논리합(||), 배타적 논리합(^), 그리고 논리 부정(!)을 사용한다.

비트 연산과 비슷하지만 논리 연산자의 피연산자는 모두 boolean 타입만 사용할 수 있다.

또한 &&와 &의 차이는 &&연산의 경우 앞의 값이 false이면 뒤의 값을 평가하지 않고 false를 반환한다.

||와 |의 차이도 같다.

이렇다 보니 같은 조건식이라도 피연산자의 위치에 따라서 연산속도가 달라질 수 있다.

OR 연산의 경우 연산의 결과가 true일 확률이 높은 피연산자를 왼쪽에 놓는 게 더 빠른 연산 결과를 얻을 수 있다.

출처 - 이것이 자바다 논리연산자

boolean a = true;
boolean b = false;

System.out.println(a && b); //false
System.out.println(a & b);  //false
System.out.println(a || b); //true
System.out.println(a | b);  //true
System.out.println(!a); //false
System.out.println(!b); //true

instanceof

instanceof는 객체의 타입을 확인할 때 사용한다. 

어떤 객체가 어떤 클래스의 인스턴스인지 확인하려면 instanceof 연산자를 사용할 수 있다.

boolean result = 좌항(객체) instanceof 우항(타입)

좌항의 객체가 우항의 타입으로 생성되었다면 true 를 반환하고 아니면 false를 반환한다.

assignment(=) operator

처음 프로그래밍을 배울 때 헷갈릴수도 있는 부분 중 하나가 이 대입연산자 이다.

학교에서 배우는 수학에서는 =의 기호가 같다는 기호로 쓰이지만 프로그래밍에서는 Lvalue = Rvalue이다.

대입연산자의 왼쪽 피연산자를 Lvalue(left value) 라고 하고 오른쪽 피연산자를 Rvalue(right value)라고 한다.

=연산자는 오른쪽 피연산자의 값을 왼쪽의 피연산자에 대입하는 연산자이다.

출처 - 이것이 자바다 대입연산자

화살표(->) 연산자

화살표 연산자는 자바8에서 추가된 람다 표현식(lambda expression)에서 쓰이는 연산자이다.

 

3항 연산자

출처 - 이것이 자바다 삼항연산자

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

조건식의 결과에 따라서 선택적으로 값을 반환한다.

연산자 우선 순위

프로그램에서 연산자의 연산 방향과 연산자 간의 우선순위가 정해져 있다.

아래 그림처럼 우선순위가 같은 연산자들은 연산 방향에 따라서 연산을 한다.

출처 - 이것이 자바다. 연산자 우선순위

Java13 switch 연산자

Java 13 switch를 검색해서 알아보았는데 그동안 switch문은 if문을 좀 더 깔끔하게 보기위해서 사용하는 줄로만 알았는데 어떠한 변수 값에 값을 할당할 수 있는지도 처음 알았다.

public class JEP354 {

    public static void main(String[] args) {

        System.out.println(getValueViaYield("a"));
        System.out.println(getValueViaYield("c"));
        System.out.println(getValueViaYield("e"));
        System.out.println(getValueViaYield("z"));

    }

    // Traditional switch
    private static int getValueBefore12(String mode) {
        int result;
        switch (mode) {
            case "a":
            case "b":
                result = 1;
                break;
            case "c":
                result = 2;
                break;
            case "d":
            case "e":
            case "f":
                result = 3;
                break;
            default:
                result = -1;
        }
        ;
        return result;
    }

    // Java 12, multiple comma-separated labels
    private static int getValueMultipleLabels(String mode) {
        int result;
        switch (mode) {
            case "a", "b":
                result = 1;
                break;
            case "c":
                result = 2;
                break;
            case "d", "e", "f":
                result = 3;
                break;
            default:
                result = -1;
        }
        ;
        return result;
    }

    // Java 13, value breaks are superseded by 'yield' statements
    // Java 12, switch expression returning value via break
    /*private static int getValueViaBreak(String mode) {
        int result = switch (mode) {
            case "a":
            case "b":
                break 1;
            case "c":
                break 2;
            case "d":
            case "e":
            case "f":
                break 3;
            default:
                break -1;
        };
        return result;
    }*/

    // Java 12, switch expression returns a value via label rules (arrow)
    private static int getValueViaArrow(String mode) {
        int result = switch (mode) {
            case "a", "b" -> 1;
            case "c" -> 2;
            case "d", "e", "f" -> {
                // do something here...
                System.out.println("Supports multi line block!");
                yield 3;
            }
            default -> -1;
        };
        return result;
    }

    // Java 13, switch expression returns a value via yield
    private static int getValueViaYield(String mode) {
        int result = switch (mode) {
            case "a", "b":
                yield 1;
            case "c":
                yield 2;
            case "d", "e", "f":
                // do something here...
                System.out.println("Supports multi line block!");
                yield 3;
            default:
                yield -1;
        };
        return result;
    }

}

OUTPUT

1
2
Supports multi line block!
3
-1

 

 

참조

http://www.yes24.com/Product/Goods/15651484

 

이것이 자바다

15년 이상 자바 언어를 교육해온 자바 전문강사의 노하우를 아낌 없이 담아낸 자바 입문서. 저자 직강의 인터넷 강의와 Q/A를 위한 커뮤니티(네이커 카페)까지 무료로 제공하여 자바 개발자로 가

www.yes24.com

http://www.yes24.com/Product/Goods/24259565

 

Java의 정석

최근 7년동안 자바 분야의 베스트 셀러 1위를 지켜온 `자바의 정석`의 최신판. 저자가 카페에서 12년간 직접 독자들에게 답변을 해오면서 초보자가 어려워하는 부분을 잘 파악하고 쓴 책. 뿐만 아

www.yes24.com

https://vmpo.tistory.com/106

 

[알고리즘] java 비트연산 정리하기

기초개념인 java 비트연산을 정리해보도록 하겠습니다. 비트연산은 2개의 이진수에 대해서 연산하는 것을 말합니다. 컴퓨터는 이진수로 대화를 하고 있기 때문에 이 비트연산을 알아두는 것이

vmpo.tistory.com

https://mkyong.com/java/java-13-switch-expressions/

 

Java 13 - Switch Expressions - Mkyong.com

- Java 13 - Switch Expressions

mkyong.com

 

728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함