3. 연산자(operator)

연산자 유형

유형 운영자 설명
산술 연산자 + – * / % 우선순위 1, 왼쪽 -> 오른쪽
비교 연산자 > < >= <= == != 우선 순위 2, 왼쪽 -> 오른쪽
논리 연산자 && || ! 우선 순위 3, 왼쪽 -> 오른쪽
작업 관리자 = 우선 순위 4, 오른쪽으로 이동 -> 왼쪽으로 이동
중요한 기타 연산자 (유형) | ? a:b | 대신에

연산자 조합 규칙

  1. 산술 > 비교 > 논리 > 대체
  2. 단항 > 이항 > 삼항
  3. 단항 연산자와 대입 연산자를 제외한 모든 연산은 왼쪽에서 오른쪽으로 수행됩니다.

증가 연산자(++, –)

  • 산술 연산자와 달리 증가 및 감소 연산자는 자동 유형 변환을 거치지 않습니다.
  • 독립적으로 사용되는 경우 증가 및 감소 연산자는 전치사 또는 접미사에 대해 신경 쓰지 않습니다.
  • 이해하기 쉬운 (i++; ++i; 당신이 이런 코드 라인에 혼자 있지 않다면)
    1. i++; -> i++를 포함하는 표현식을 실행한 다음 다음 줄에서 i++를 실행합니다.
    2. ++나; -> ++i를 포함하는 ++i 표현식을 실행한 후 다음 라인의 표현식을 실행한다.
  • 참조
더보기

public class Main {
    public static void main(String() args) {
        int i=5, j=5;
//      System.out.println(i++);
        System.out.println(i);
        i++;
//      System.out.println(++j);
        ++j;
        System.out.println(j);
    }
}

증가 연산자

사용 가능한 연산자 유형을 늘립니다.
정수, 실수 영형
상수 엑스
연산자 유형 증가
전치 유형(값이 참조되기 전에 증가) j = ++i;
접미사(값 참조 후 증가) j = i++;

증감자를 왜 쓰나? 내가 지정한 변수 안에 값을 증가 시키려고 쓰는 것이다.
-> 기준은 내가 값을 올리고 싶은 변수 안의 값을 증가하고 감소 시키는 것이다.

1) 증감연산자를 먼저 사용 후 print 하는 것은 전위 후위 상관 없음
    int i = 1; // i라고 명한 변수 = 메모리 box 안에 1을 넣음
    i++;	// 2
    System.out.println(i); // 2 

    int j =1; // j라고 명한 변수 = 메모리 box 안에 1을 넣음
    ++j;  // 2
    System.out.println(j); // 2

2) 증감연산자는 내가 기준으로 정한 값의 변수와 다른 것이 섞일 때 차이를 보인다
	ex) print와 섞일 때
    int i = 1;
    System.out.println(i++); // 1 
    System.out.println(i); // 2 
	int j = 1;
    System.out.println(++j); // 2 
    System.out.println(j); // 2
    
    ex) 다른 변수와 섞일 때
    int i =1;
    int j = i++;
    System.out.println(j); // 1
    System.out.println(i); // 2
    
3) 자동 형변환 안됨
	char a="A" // 유니코드상 65
    System.out.println(++a); // 'A' + 1 = 66. 하지만 자동형변환을 하지 않으므로 'B' 값을 가짐

캐스트 연산자(유형) 피연산자

  • 붓다
    • 변수 또는 상수의 유형을 다른 유형으로 변환
    • 변환 후 저장할 변수의 타입은 피연산자의 타입보다 크거나 같아야 합니다.
double a =1.12;
int b = (int) a;
System.out.println(a); // 형변환과 별개로 a의 값은 변화 없다
System.out.println(b); // 1 소수점 이하 값을 버림

자동 유형 변환

  • 변수 유형의 범위가 리터럴 값 또는 유형보다 크거나 같으면 컴파일러가 자동으로 이를 캐스팅합니다.
  • 반대로 변수는 리터럴 값이 아니므로 수동 변환이 필요합니다.
자동 
1) 변수 >= 리터럴
float f = 1234; // float > int -> float f = (float) 1234; compiler 자동형변환

수동
1) 변수 < 리터럴
    byte b = 1000; // error byte 범위 -128~127, 1000은 int값이 됨. byte < int
    byte b = (byte)1000; // ok 하지만 overflow 됨
2) 리터럴이 아니고 변수일 때
    int i = 100;
    byte b = i; // error 100이 byte의 범위안에 들어가지만 i는 변수이기에 byte 이상의 값으로 변경 가능
    byte b = (byte)i; // ok
3) byte, short, char 일 때
    byte b = 2;
    char c = b; // error char는 0~65535 범위고 byte -128~127 이므로 범위 구간이 다르기 때문
    
    * char c =1232;		
    // 이처럼 '' 안넣고 숫자 넣어도 됨. 이때 정수의 의미가 아니라 범위의 숫자와 연결된 문자를 의미

네 가지 산술 연산의 자동 유형 변환

    1. 사후 계산 감가 상각을 제거하기 위해 장거리 유형으로 유형 변환
    2. 오버플로를 방지하기 위해
  • 규칙
    1. 두 피연산자의 유형 일치(더 큰 유형) -> 값 손실 방지
      1. 긴 + int -> 긴
      2. 플로트 + 정수 -> 플로트
      3. 플로트 + 롱 -> 플로트
      4. 더블 + 플로트 -> 더블
    2. 피연산자 유형이 int보다 작은 경우(int로 변환) – 오버플로 방지
      1. 바이트 + short -> int
      2. 문자 + 짧은 -> int
실수 가능성 높은 예제
byte a = 1;
byte b = 2;
byte c = a + b // error. a+b ->int
byte c = (byte)(a + b) // ok

int a = 1_000_000; // _로 구분 가능
int b = 2_000_000;
// overflow. int인 a*b가 int 범위를 넘어가고 int가 long 범위 내에 존재하므로 문제 없음
long c = a * b;
// 형변환
long c = a * (long)b;

나머지 연산자

a % b;

b로 나눌 때 나머지

특수 기능: 구분자 b는 항상 절대값입니다.

비교 연산자

부울을 제외한 모든 데이터 유형에서 비교할 수 있습니다. 참조 유형 없음

부울 값으로 반환 값로 대표되는

문자열 비교(개념 중요)

  • == 대 같음 ()
    • == : 객체까지 확인
    • equals() : 내용만 확인
String str1 = "abc";
String str2 = new String("abc");
String str3 = "abc";
System.out.println(str1==str2); // false
System.out.println(str1.equals(str2));  // true
System.out.println(str1==str3); // true

*참고: str1 == str2가 참인 이유는 new를 사용하지 않고 생성된 문자열 리터럴이 동일한 값을 가질 경우 공유되기 때문입니다.

str1 0x100 str2 0x100 – (0x100 – “abc”)

논리 연산자 && ||

여러 비교 코드 생성

6의 배수
i%2==0 && i%3==0

2와 3의 배수지만 6의 배수는 아닐 때
(i%2==0 || i%3==0) && i%6!=0 // 걍 여러개면 먼저 해야되는 거 ()치기

복합 할당 연산자

i += 1;
i = i + 1;
  • + – * / %< >> & | 가능한
  • i*=1+j; == 나는 = 나는 * (1 + j);

수학 라운드();

수학 라운드() 반올림 구문: 정수(int)로 돌아가

영상이나 시계를 만들때 사용하는것 같습니다

long time = Math.round(6.25)  // 6

n의 자리에서 반올림 하고 싶다  // 10en-1 곱하고 결과값 가진 후 10en-1 만큼 나누기
double pi = 3.141592;
double shortPi = Math.round(pi*10)/10; // 3.1

정수를 반올림 하고 싶다 // 10en-1 나눠서 결과값 가진 후 10en-1 만큼 곱해주기
int d = 1532;
int d1 = Math.round(d/1000)*1000; //2000

? 기능

조건식 ? 식1 : 식2;  // 조건식이 참이면 식1  거짓이면 식2

if (조건식){
    식1;
} else{
    식2;
}

조건식1 ? 식1 : (조건식2 ? 식2: 식3) // if else

1) if else
    int x = 1;
    int y = 2;

    int resurt = (x<y) ? x : y;
    /*
    int resurt;
    if (x<y)
        resurlt =x;
    else
        resurlt = y;
    */
    System.out.print(result);

2) if else if else
    int num = -10;
    System.out.println(num > 0 ? "possitive": num == 0 ? "0": "negative");
    /*
    if (num > 0)
        System.out.println("positive");
    else if (num = 0)
        System.out.println("0");
    else
        System.out.println("negative");
    */

이전 판

2023.03.02 – (자바/자바 베이스) – 2번째 변수

두 번째 변수

변수 선언 및 저장 변수의 값을 저장할 수 있는 메모리 위치, 단순히 값을 보유할 수 있는 메모리 위치입니다. 값은 메모리 주소(메모리 위치 및 메모리 위치 이름)에 저장됩니다.

code-is-me.tistory.com

다음 판

2022.12.03 – (Java) – 조건문(if, switch)

조건문(if, switch)

핵심 용어 제어문 – 조건문, 루프문 – ( if / if – else / if-else if / nested if ) | ( switch ) 1. if 수식은 조건식에서 비교 연산자와 논리 연산자로 구성됨 ex) str.equals(), 0) System.out.println(“true”); System.out.pri

code-is-me.tistory.com


출처 – Java의 기초