Java 연산자

jooyeongmee·2023년 2월 13일
0

TIL2023/2

목록 보기
4/8

TIL(2023.2.13)


연산자: 연산을 수행하는 기호, + - *
피연산자: 연산자의 연산 수행 대상, x 9 3

모든 연산자는 연산결과를 반환한다. 즉, 연산결과를 반환하지 않으면 연산자가 아니다. (괄호는 연산자가 아님)

연산자의 종류

연산자의 우선순위

  1. 산술 > 비교 > 논리 > 대입 : 대입은 제일 마지막에 수행됩니다.
  2. 단항(1) > 이항(2) > 삼항(3) : 단항 연산자의 우선순위가 제일 높습니다.
  3. 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행 방향은 왼쪽에서 오른쪽입니다.

증감연산자

  • 전위형(++x): 값을 먼저 증가시키고 참조한다.
  • 후위형(x++): 값을 먼저 참조하고 증가시킨다.

부호 연산자

'-'는 피연사자의 부호를 반대로 변경한다.

산술변환

연산 전에 피연산자의 타입을 일치시키는 것을 의미한다.
1. 두 피연산자의 타입이 다르면 보다 더 큰 타입으로 일치시킨다.
2. 피연산자의 타입이 int보다 작은 타입이면 int로 변환된다.

Math class

Math는 수학과 관련된 메서드를 가지고 있는 클래스 입니다.
메서드는 '특정한 기능을 수행하기 위해 코드로 작성된 단위!' 라고 생각하시면 됩니다.

round() : 실수를 소수점 첫 째자리에서 반올림한 정수를 반환합니다.
ceil() : 올림값을 double 형으로 반환합니다.
floor() : 내림값을 double 형으로 반환합니다.
abs() : int, double 기본형 모두 사용 가능하며 절대값을 얻습니다.
class Operator5_2 {
    public static void main(String[] args) {
        double num = 3.14;
        
        System.out.println("반올림 : " + Math.round(num)); // 반올림 : 3
        System.out.println("올림 : " + Math.ceil(num)); // 올림 : 4.0
        System.out.println("내림 : " + Math.floor(num)); // 내림 : 3.0
        System.out.println("절대값 : " + Math.abs(num*-1)); // 절대값 : 3.14
    }
}

나머지 연산자 %

오른쪽 피연산자로 나누고 남은 나머지를 반환합니다.
나누는 피연산자는 0이 아닌 정수만 허용합니다.
부호는 무시됩니다.

문자열 비교

문자열 비교에는 == 대신 equals()를 사용해야 한다.
"=="는 비교하고자 하는 두 피연산자의 주소값을 비교한다.

class Operator6_2 {
    public static void main(String[] args) {
        String s1 = "사랑";
        String s2 = "사랑";

        System.out.print("s1 == s2 = "); // true
        System.out.println(s1 == s2);
        System.out.println("s1.equals(s2) = " + s1.equals(s2)); // true

        // 하지만!
        String s3 = new String("사랑");
        System.out.print("s1 == s3 = "); // false
        System.out.println(s1 == s3);
        System.out.println("s1.equals(s3) = " + s1.equals(s3)); // true
    }
}

자바 String 메모리 저장 방법

String은 두 가지 생성 방식이 있다.
1. new 연산자를 이용한 방식 --> heap 영역에 존재
2. 리터럴을 이용한 방식 --> string constant pool이라는 영역에 존재

String을 리터럴로 선언할 경우, 내부적으로 String의 intern() 메서드가 호출하게 된다.
intern() 메서드는 주어진 문자열이 string constant pool에 존재하는지 검색하고 있다면 그 주소값을 반환하고 없다면 string constant pool에 넣고 새로운 주소값을 반환하게 된다.

그러므로, 위의 코드처럼 리터럴의 방식으로 같은 String을 선언했을 때 s1, s2가 가리키는 메모리 주소는 같은 곳이다.

String constant pool 위치 변경
Java6까지 string constant pool의 위치는 Perm 영역이었다. Perm 영역에 위치하였던 게 Java7에서 Heap 영역으로 변경되었다. 그 이유는 OOM 문제 때문이다.
Perm 영역은 고정된 사이즈고 Runtime에 사이즈가 확장되지 않는다. Perm 영역의 사이즈를 늘릴 수는 있지만 어쨌거나 Runtime에 사이즈가 변경되는 것은 아니다. 그래서 Java6까지는 String의 intern() 메서드를 호출하는 것은 OutOfMemoryException을 발생시킬 수 있고 그 부분을 컨트롤할 수 없었기 때문에 거의 사용하지 않는 것이 맞다.
그래서 Oracle의 엔지니어들이 Java7에서 Perm 영역이 아닌 Heap 영역으로 string constant pool의 위치를 변경하였다.

비트연산자, 2진수의 음수표현

  1. 부호 절대값
    sign bit가 0일때는 양수 , 1일때는 음수
    2진수 00000011 = 10진수: 3
    2진수 10000011 = 10진수: -3
  2. 1의 보수
    11111111 - x 를 하는 방식, 즉 ~x이다
    -13을 1의 보수 방식으로 표현해 보겠습니다.
    13을 2진수로 표현 : 00001101
    11111111 - x 공식에 대입
    결과 : 11110010
  3. 2의 보수 (가장 많이 사용)
    100000000 - x 를 하는 방식, 가장 왼쪽숫자가 0일 경우 양수, 1일 경우 음수를 표현, 즉, ~x +1이다.
    -9를 2의 보수 방식으로 표현해 보겠습니다.
    -9를 1의 보수 방식으로 표현 : 00001001(9) -> 11110110
    11110110 + 1
    결과 : 11110111

조건 연산자

  • 삼항 연산자 : 조건식 ? 반환값1 : 반환값2
profile
부지런하면서도 게으른 공순이

0개의 댓글