연산자 유형
| 유형 | 운영자 | 설명 |
| 산술 연산자 | + – * / % | 우선순위 1, 왼쪽 -> 오른쪽 |
| 비교 연산자 | > < >= <= == != | 우선 순위 2, 왼쪽 -> 오른쪽 |
| 논리 연산자 | && || ! | 우선 순위 3, 왼쪽 -> 오른쪽 |
| 작업 관리자 | = | 우선 순위 4, 오른쪽으로 이동 -> 왼쪽으로 이동 |
| 중요한 기타 연산자 | (유형) | ? a:b | 대신에 |
연산자 조합 규칙
- 산술 > 비교 > 논리 > 대체
- 단항 > 이항 > 삼항
- 단항 연산자와 대입 연산자를 제외한 모든 연산은 왼쪽에서 오른쪽으로 수행됩니다.
증가 연산자(++, –)
- 산술 연산자와 달리 증가 및 감소 연산자는 자동 유형 변환을 거치지 않습니다.
- 독립적으로 사용되는 경우 증가 및 감소 연산자는 전치사 또는 접미사에 대해 신경 쓰지 않습니다.
- 이해하기 쉬운 (i++; ++i; 당신이 이런 코드 라인에 혼자 있지 않다면)
- i++; -> i++를 포함하는 표현식을 실행한 다음 다음 줄에서 i++를 실행합니다.
- ++나; -> ++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;
// 이처럼 '' 안넣고 숫자 넣어도 됨. 이때 정수의 의미가 아니라 범위의 숫자와 연결된 문자를 의미
네 가지 산술 연산의 자동 유형 변환
- 왜
- 사후 계산 감가 상각을 제거하기 위해 장거리 유형으로 유형 변환
- 오버플로를 방지하기 위해
- 규칙
- 두 피연산자의 유형 일치(더 큰 유형) -> 값 손실 방지
- 긴 + int -> 긴
- 플로트 + 정수 -> 플로트
- 플로트 + 롱 -> 플로트
- 더블 + 플로트 -> 더블
- 피연산자 유형이 int보다 작은 경우(int로 변환) – 오버플로 방지
- 바이트 + short -> int
- 문자 + 짧은 -> 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의 기초