728x90
1. 연산자의 종류
종류 | 연산자 | 설명 |
산술 연산자 | + - * / % | 우선순위1, 좌 -> 우 |
비교 연산자 | > < >= <= == != | 우선순위2, 좌 -> 우 |
논리 연산자 | && || ! | 우선순위3, 좌 -> 우 |
대입 연산자 | = | 우선순위4, 우->좌로 이동 |
중요 기타 연산자 | (type) | ? a:b | instanceof |
2. 연산자 결합 규칙
- 산술>비교>논리>대입
- 단항>이항>삼항
- 단항 연산자, 대입 연산자 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽이다.
3. 증감 연산자(++, --)
- 증감 연산자는 산술연산자와 달리 자동 형변환이 발생하지 않는다.
- 증감 연산자는 독립적으로 사용될 때, 전위 후위 상관 없다.
- 쉽게 이해하는 방법 ( i++; ++i; 이렇게 code line에 혼자 있지 않는 경우 )
- i++; -> i++이 포함된 식 수행 후 다음 line에 i++
- ++i; -> ++i이 포함된 식 ++i 수행 후 다음 line에 식 수행
- 참고
더보기
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);
}
}
증감연산자
증감 연산자 사용 가능한 type | |
정수,실수 | o |
상수 | x |
증감 연산자 종류 | |
전위형 (값이 참조 되기 전 증가) | 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' 값을 가짐
4. 형변환 연산자 (type) 피연산자
- 형변환
- 변수 또는 상수의 타입을 다른 타입으로 변환
- 변환 시킨 후 저장할 변수의 타입은 피연산자의 타입보다 크거나 같아야 한다.
double a =1.12;
int b = (int) a;
System.out.println(a); // 형변환과 별개로 a의 값은 변화 없다
System.out.println(b); // 1 소수점 이하 값을 버림
5. 자동 형변환
- 변수 타입의 범위가 리터럴 값, 타입보다 크거나 같으면 컴파일러가 자동으로 형변환 해줌
- 반대로 변수는 리터럴 값이 아니므로 수동으로 형변환 필요
자동
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;
// 이처럼 '' 안넣고 숫자 넣어도 됨. 이때 정수의 의미가 아니라 범위의 숫자와 연결된 문자를 의미
6. 사칙연산의 자동 형변환
- 왜
- 계산 후 값손실을 없애기 위해서 범위가 큰 type으로 형변환
- 오버플로우 발생 막기 위해
- 규칙
- 두 피연사자의 타입을 일치 시킴(큰 타입으로) -> 값 손실 막기
- long + int -> long
- float + int -> float
- float +long -> float
- double + float -> double
- 피연산자의 타입이 int보다 작은 타입일 경우 (int로 변환) - overflow 막기
- byte + short -> int
- char + short -> 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;
7. 나머지 연산자
a % b;
b로 나누었을 때 나머지
특징: 나누는 값 b는 항상 절대값이다.
8. 비교연산자
자료형 타입에서 boolean을 제외한 모든 타입에서 비교 가능. 참조형 type은 안됨
결과값을 boolean으로 나타냄
등가비교 연산자 == , !=
- 기본형
- 변수에 저장된 값 자체를 비교
- 참조형
- 변수에 객체의 주소값을 저장하기 때문에 주소를 비교
문자열(String) 비교(개념 중요)
- == vs equals()
- == : 객체 주소 비교
- 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"]
9. 논리 연산자 && ||
배수 비교 코드 만들기
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; == i = i * (1 + j );
10. Math.round();
Math.round() 반올림 문법 : 정수(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
11. ? 함수
조건식 ? 식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 - [java/java 기초] - 2. 변수(variable)
다음 발행글
2022.12.03 - [java] - 조건문(if, switch)
출처 - 자바의 정석 기초편