🧡 연산자(operator)
: 연산을 수행하는 기호
📍 x + 3
// 피연산자 : x, 3
// 연산자 : +
연산자는 피연산자로 연산 수행 후 → 항상 결과값 반환
대입연산자 사용 → 변수에 결과 저장
식 : 연산자 + 피연산자 조합 (계산하고자하는 바를 표현한 것)
평가 : 결과를 얻는 것
종류 | 연산자 | 기능 |
---|---|---|
산술연산자 | +, -, *, /, %, <<, >> | 사칙연산, 나머지연산(%) |
비교연산자 | >, <, >=, <=, ==, != | 크고 작음, 같고 다름 |
논리연산자 | &&, !, &, ^, ~ | AND, OR → 조건연결 |
대입연산자 | = | 우변의 값 → 좌변에 저장 |
기타 | (type) ?: instanceof | 형변환연산자, 삼항연산자, instanceof 연산자 |
🧡 연산자결합규칙
- 산술 > 비교 > 논리 > 대입 → 대입 가장 마지막에 수행
- 단항 > 이항 > 삼항
- 대입연산자 연산 진행방향 : 오른쪽 → 왼쪽
- 일반 연산 진행방향 : 왼쪽 → 오른쪽
class Operator1 {
public static void main(String[] args) {
int x, y;
// (대입)연산순서 : 오른쪽 -> 왼쪽
x = y = 3;
System.out.println("x = " + x);
System.out.println("y = " + y);
}
}
🧡 증감연산자
: 피연산자에 저장된 값 → 1증가 or 1감소
피연산자 → 정수, 실수 가능 ✅, 상수 불가능 ⛔️
일반 산술변환에 의한 자동형변환 ❌
📍 증가연산자(++) : 피연산자 값 1증가
📍 감소연산자(--) : 피연산자 값 1감소
타입 | 기능 | 예시 |
---|---|---|
전위형 | 값이 참조(출력)되기 전에 증가 | j = ++i; |
후위형 | 값이 참조(출력)된 후에 증가 | j = i++; |
단항연산자 → 피연산자 왼쪽에 위치
증감연산자 → 피연산자 양쪽에 위치 가능 ✅
독립적인 하나의 문장에 쓰인 경우 → 전위형, 후위형 차이없음 ⛔️
📍 전위형, 후위형 비교
class Operator2 {
public static void main(String[] args) {
int i = 5, j = 0;
// 후위형
j = i++;
System.out.println("j = i++; 실행 후, i = " + i + " j = " + j);
// 값 초기화
i = 5;
j = 0;
// 전위형
j = ++i;
System.out.println("j = ++i; 실행 후, i = " + i + " j = " + j);
}
}
// j = i++; 실행 후, i = 6 j = 5
// j = ++i; 실행 후, i = 6 j = 6
📍 메서드호출에 증감연산자 사용
class Operator3 {
public static void main(String[] args) {
int i = 5, j = 5;
// 후위형 : i값 출력 -> 1증가
System.out.println(i++);
// 전위형 : j값 1 증가 -> 출력
System.out.println(++j);
// 한번 출력 후 -> i값 증가됨
System.out.println("i = " + i + " j = " + j);
}
}
🧡 부호연산자
: 피연산자 부호 → 반대로 변경한 결과 반환
피연산자 음수 → 부호연산자 -
➡️ 피연산자 양수
피연산자 양수 → 부호연산자 -
➡️ 피연산자 음수
기본형에만 사용가능 ✅
class Operator4 {
public static void main(String[] args) {
int i = -10;
i = +i; // + 연산자 하는일 없음
System.out.println(i);
i = -10;
i = -i; // - 연산자 -> 부호변경
System.out.println(i);
}
}
🧡 형변환(casting)
: 변수, 상수, 리터럴 type → 다른 type으로 변환하는 것
📍 (변환하고자하는 type)피연산자
double d = 99.5;
int score = (int)d;
// 85 출력
형변환은 일시적임 ✅
피연산자 변수 값 → 형변환 후에도 변화가 없음
변환 | 수식 | 결과 |
---|---|---|
int → char | (char)65 | 'A' |
char → int | (int)'A' | 65 |
float → int | (int)1.6f | 1 |
int → float | (float)10 | 10.0f |
정수와 문자 형변환은 아스키코드를 참조함
정수와 실수 형변환은 소수점 아래를 버림 (반올림 ⛔️)
class Operator5 {
public static void main(String[] args) {
double d = 85.4;
int score = (int) d;
// 형변환 -> 일시적 (피연산자 변수값 그대로 유지)
System.out.println("score = " + score);
System.out.println("d = " + d);
}
}
📎 기존의 값을 최대한 보존할 수 있는 타입으로 자동형변환
컴파일러가 생략된 형변환을 자동적으로 추가함
값 손실이 없도록 두 type 중, 표현범위가 더 넓은 쪽으로 형변환
📍 float > int
float f = 1234; // (float)가 생략
📍 변수저장범위 < 값
byte b = 1000; // 🚨 Error (값 손실 우려)
📍 의도적으로 유도한 값 손실
byte b = (byte)1000; // ✅ OK
📎 피연산자 타입의 일치를 위해 자동형변환 되는 것
📍 1. 두 피연산자 타입을 같게 일치 (더 큰 타입으로) → 값 손실 최소화 ✅
long + int → long + long ➡️ long
float + int → float + float ➡️ float
📍 2. 피연산자 타입 int보다 작으면 int로 변환 → 오버플로우 방지 ✅
byte + short → int + int ➡️ int
char + short → int + int ➡️ int
class Operator8 {
public static void main(String[] args) {
byte a = 10;
byte b = 30;
// a, b -> int로 변환 -> byte c에 저장 불가 -> 형 명시 필수
byte c = (byte)(a * b);
// 데이터손실 issue
System.out.println(c);
}
}
int type → 소수점 저장 ⛔️
데이터 손실 방지 → 범위가 넓은 type으로 형 일치시킨 후 ➡️ 연산수행
class Operator6 {
public static void main(String[] args) {
int a = 10, b = 4;
System.out.println(a + b); // 덧셈
System.out.println(a - b); // 뺄셈
System.out.println(a * b); // 곱셈
System.out.println(a / b); // 나눗셈
// 2.5 자동형변환 -> 실수형
System.out.println(a / (float)b);
}
}
🧡 Math.round()
: 소수점 첫째자리 → 반올림한 결과 정수로 반환하는 메서드
class Operator9 {
public static void main(String[] args) {
double pi = 3.141592;
double shortPi = Math.round(pi * 1000) / 1000.0;
System.out.println(shortPi);
}
}
🧡 나머지연산자(%)
: 왼쪽 피연산자 → 오른쪽 피연산자로 나누고 난 나머지값을 결과로 반환
class Operator10 {
public static void main(String[] args) {
int x = 10, y = 8;
System.out.printf("%d을 %d로 나누면, %n", x, y);
System.out.printf("몫은 %d이고, 나머지는 %d입니다.%n", x / y, x % y);
// 나머지연산자 -> 부호 무시하고 결과출력
System.out.println(-10 % 8);
System.out.println(10 % 8);
}
}
🧡 비교연산자
: 두 피연산자 비교
조건문 및 반복문 → 조건식에 사용
연산결과 : True or False
이항연산자 → 타입이 다른 경우, 범위가 큰 쪽으로 자동 형변환
📎 <, >, <=, >=
두 피연산자 값 크기를 비교하는 연산자
boolean 자료형 및 참조형 자료형 사용불가 ⛔️
📎 ==, !=
두 피연산자 값 같은지 다른지 비교하는 연산자
모든자료형 (기본형, 참조형 포함) 사용가능 ✅
기본형과 참조형 비교는 불가능 ⛔️
🧡 문자열비교
- 비교연산자 (==) 사용불가 ⛔️
- equals() 메서드 사용 ✅ → True or False return
String 비교연산자 (==) 사용 → 객체가 다르면 False
String equals() 사용 → 객체가 달라도 문자열만 같으면 True
class Operator11 {
public static void main(String[] args) {
String str1 = new String<("mallang");
String str2 = "chunsik";
String str3 = "chunsik";
// 대소문자 구별
boolean result1 = str1.equals("mallang");
System.out.println(result1);
// 대소문자 구별X
boolean result2 = str2.equalsIgnoreCase("Chunsik");
System.out.println(result2);
// (==) -> 객체가 다르면 False
// equals() -> 객체가 달라도 내용만 같으면 True
boolean result3 = str2.equals(str3);
System.out.println(result3);
}
}
🧡 논리연산자
: 둘 이상의 조건 → AND, OR로 연결하여 하나의 식으로 표현해주는 것
논리연산자 | 기능 |
---|---|
OR결합 | 하나라도 True → True 반환 |
AND결합 | 둘 모두 True → True 반환 |
📍 x는 10보다 크고 20보다 작다
- x > 10 && x < 20
- 10 < x && x < 20
📍 i는 2또는 3의 배수이다
- i % 2 == 0 || i % 3 == 0
📍 i는 2의 배수 또는 3의 배수이지만, 6의 배수는 아니다
- (i % 2 == 0 || i % 3 == 0) && i % 6 != 0
📍 문자 ch는 숫자 ('0' ~ '9')이다
- '0' <= ch && ch <= '9'
// 유니코드
📍 문자 ch는 대문자 또는 소문자다
- ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z')
class Operator12 {
public static void main(String[] args) {
// 사용자입력 받기 위한 객체생성
Scanner scanner = new Scanner(System.in);
char ch = ' ';
System.out.printf("문자를 하나 입력하시오 >>>");
String input = scanner.nextLine();
// input -> 문자로 형변환
ch = input.charAt(0);
if ('0' <= ch && ch <= '9') {
System.out.printf("입력하신 문자는 숫자입니다.%n");
}
if (('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z')) {
System.out.printf("입력하신 문자는 영문자입니다.%n");
}
}
}
🧡 논리부정연산자
: True와 False를 반대로 바꾸는 것
📎 단항연산자 논리부정연산자 결합
📍 단항연산자 결합방향 : 오른쪽 → 왼쪽
boolean b = true;
!!b → !!true → !False → True
📎 Java code
class Operator13 {
public static void main(String[] args) {
boolean b = true;
char ch = 'C';
System.out.printf("b = %b%n", b);
System.out.printf("!b = %b%n", !b);
System.out.printf("!!b = %b%n", !!b);
System.out.printf("!!!b = %b%n", !!!b);
}
}
🧡 조건연산자
- 조건식 + 식1 + 식2 → 세 개의 피연산자를 필요로하는 삼항연산자
- 조건식의 평가결과 → 다른 결과를 반환
📎 조건연산자 구조
📍 (조건식) ? 식1 : 식2 ;
- 조건식 True → 식1 수행
- 조건식 False → 식2 수행
📎 조건연산자와 조건문if
📍 조건연산자
result = (x > y) ? x : y ;
📍 조건문if
if (x > y) {
result = x;
} else {
result = y;
}
📎 Java code
class Operator14 {
public static void main<(String[] args) {
int num1 = 5, num2 = 7;
int result;
result = (num1 - num2 > 0) ? num1 : num2;
System.out.println("두 정수 중, 더 큰 수 : " + result);
}
}
🧡 대입연산자
: 변수와 같은 저장공간에 값, 수식 연산결과를 저장하는데 사용
오른쪽 피연산자 값 → 왼쪽 피연산자에 저장
저장된 값 → 결과로 반환
대입연산자 : 연산자 중, 가장 낮은 우선순위
연산진행방향 : 오른쪽 → 왼쪽
📍 lvalue와 rvalue
x = 3;
- rvalue : 변수, 식, 상수 모두 가능
- lvalue : 변수 (반드시 값을 변경할 수 있는 것) ⭐️