[Java] 연산자와 연산식

soheeoott·2021년 9월 6일
1

Java

목록 보기
8/12

연산 (operation)

프로그램에서 데이터를 처리하여 결과를 (산출)만들어내는걸 의미한다.

x + y

▪︎ + : 연산자
▪︎ x : 피연산자
▪︎ y : 피연산자

연산자 (operator)

연산에 사용되는 표시 또는 기호를 의미하며, 연산의 종류를 결정짓는다.

피연산자 (operand)

연산자에 의해 연산 되는 수나 변수를 의미한다.

3 + x
// 피연산자 : 3, x

연산식 (expression)

연산자와 피연산자를 사용하여 연산 과정을 기술한걸 의미한다.
연산식은 반드시 하나의 값을 산출하며, 피연산자 위치에 연산식을 사용할 수도 있다.

// 피연산자 위치 = (x + y)
boolean result = (x + y) < 5; 


연산자의 종류

연산자별로 산출되는 값의 타입이 다르다.
피연산자의 수는 연산자를 사용할 때 필요한 피연산자의 개수를 의미한다.
증감, 비교, 논리, 대입, 삼항 연산자는 자주 사용된다.

연산자 종류 연산자 피연산자 수 산출값 기능
산술 +, -, *, /, % 이항 숫자 사칙연산 및 나머지 계산
부호 +, - 단항 숫자 음수와 양수의 부호
문자열 + 이항 문자열 두 문자열을 연결
대입 =, +=, -=, *=, /=, %= 이항 다양 우변의 값을 좌변의 변수에 대입
증감 ++, -- 단항 숫자 1만큼 증가/감소
비교 ==, !=, >, <, >=, <=, instanceof 이항 boolean 값의 비교
논리 !, &, |, %%, || 단항
이항
boolean 논리 부정, 논리곱, 논리합
조건 (조건식) ? A : B 삼항 다양 조건식에 따라 A 또는 B 중 하나를 선택

연산자의 우선순위

하나의 연산식에 여러 종류의 연산들을 사용하는 경우가 많다.
이 때는 우선순위에 따라 연산이 수행된다.
▪︎ 단항 → 이항 → 삼항
▪︎ 산술 → 비교 → 논리 → 대입

연산의 방향

같은 우선순위의 연산자로 연산을 수행하면 연산이 수행되는 방향이 있다.
증감, 부호, 논리, 대입 연산자는 오른쪽에서 왼쪽 방향으로 수행된다.

연산자 연산 방향 우선순위
증감(++, --), 부호(+, -), 논리(!) 1
산술(*, /, %) 2
산술(+, -) 3
비교(<, >, <=, >=, instanceof) 4
비교(==, !=) 5
논리(&) 6
논리(^) 7
논리(|) 8
논리(&&) 9
논리(||) 10
조건(?:) 11
대입(=, +=, -=, *=, /=, %=) 12

괄호

먼저 연산을 수행하고 싶은 연산식이 있다면 괄호로 묶으면 된다.
괄호로 감싼 연산식이 우선순위 중 제일 높은 최우선순위를 갖으므로 제일 먼저 수행된다.

int var1 = 1;
int var2 = 3;
int var3 = 2;
int result = var1 + var2 * var3;
// var2 * var3
// var1
int result = (var1 + var2) * var3;
// var1 + var2
// * var3


연산자의 구분

피연산자 수에 따라 단항, 이항, 삼항 연산자로 구분된다.

▪︎ 단항 연산자 : 부호, 증감 연산자
▪︎ 이항 연산자 : 산술, 비교, 논리 연산자
▪︎ 삼항 연산자 : 조건 연산자

단항 연산자

부호 연산자

boolean 타입과 char 타입을 제외한 기본 타입에 사용할 수 있다.

-는 변수의 부호를 양수를 음수로, 음수를 양수로 바꾼다.

int x = -100;
int result1 = +x; // -100 (음수, +는 부호를 그대로 유지)
int result2 = -x; // 100 (양수, -는 부호를 변경)

부호연산
int 타입 이하의 정수는 int 타입으로 변환되므로 부호연산의 결과는 int 타입이다.
int 타입으로 변환된 값은 byte 타입에 저장할 수 없으므로 컴파일 에러가 발생한다.

byte value = 100;
byte result = -value; // 컴파일 에러 발생
int result = -value; // 올바른 작성법

증감 연산자

boolean 타입을 제외한 모든 기본 타입인 피연산자에 사용 가능하다.
변수의 값을 1씩 증가하거나 1씩 감소시킨다.

증가 연산자(++)
피연산자 값에 1을 더하고, 그 결과를 다시 피연산자에 저장한다.

num = 5;
++num; // 6

감소 연산자(--)
피연산자 값에서 1을 빼고, 그 결과를 다시 피연산자에 저장한다.

num = 5;
--num; // 4

다른 연산자와 함께 사용
변수의 앞, 뒤에 사용할 수 있으나,
다른 연산자와 함께 사용하면 연산자의 위치에 따라 결과가 달라진다.
▪︎ 부호가 앞에 위치 : 값을 증가 또는 감소 후 연산을 수행
▪︎ 부호가 뒤에 위치 : 연산을 수행 후 값을 증가 또는 감소

int x = 1;
int resultX = ++x + 10; // 12
int y = 1;
int resultX = y++ + 10; // 11

논리 부정 연산자

피연산자 앞에 부호 (!)를 입력한다.
피연산자의 논리값을 반대로 변경하므로 boolean 타입에만 사용 가능하다.
true → false, false → true
조건문과 제어문에서 변수의 값을 부정(반대로)하여 실행 흐름을 제어할 수 있다.

boolean start = true;
start = !start; // !true → false
start = !start; // !false → true


이항 연산자

산술 연산자

나머지를 구하는 연산자를 제외하고는 사칙연산과 동일하다.


문자열 결합 연산자 (+)

+ 연산자의 피연산자 중 한 쪽이 문자열인 경우 결합 연산을 수행한다.
문자열과 숫자 값을 결합하면 숫자 값이 문자열로 자동 변환된다.
이 때, 숫자 + 숫자 + 문자열인 경우 숫자의 연산을 수행 후 문자열과 결합된다.

String str1 = "JDK" 10 + 1; // "JDK101" 
String str2 = 10 + 1 + "JDK"; // "11JDK"

비교 연산자

두 피연산자를 비교하여 논리값(true 또는 false)을 산출한다.
조건문이나 반복문에서 실행의 흐름을 제어할 때 사용한다.

동등 비교 연산자는 모든 타입에 사용 가능하다.
크기 비교 연산자는 boolean 타입을 제외한 모든 기본 타입에 사용 가능하다.

int value1 = 7;
int value2 = 7;

boolean resultCompare = (value1 == value2); // true
boolean resultNotCompare = (value1 != value2); // false
boolean resultSmaller = (value1 < value2); // false

실수와 정수의 비교 연산

비교하기 전 int 타입의 변수가 자동으로 double 타입으로 변환된다.

int intValue = 1;
double doubleValue = 1.0;

System.out.println(intValue == doubleValue);
// true

float 타입과 double 타입의 비교 연산
실수 타입은 부동 소수점 방식으로 저장되는데,
정확하게 0.1를 저장할 수 없는 구조이다.
그렇기 때문에 double 타입을 float 타입으로 변환해야 한다.

double doubleValue = 0.1;
float floatValue = 0.1f;
System.out.println((double)floatValue); // 0.10000000149011612
System.out.println(doubleValue == floatValue); // false
System.out.println((float)doubleValue == floatValue); // true

피연산자의 타입이 동일하지 않은 경우
비교 대상이 다른 타입을 가지는 경우를 말한다.
float 타입과 double 타입

아래의 규칙에 따라 타입을 변환하여 두 타입을 일치시킨다.
▪︎ 피연산자 중 byte, short, char 타입 포함 : 모두 int 타입으로 자동 변환
▪︎ 피연산자 중 long 타입 포함 : 모두 long 타입으로 자동 변환
▪︎ 피연산자 중 실수 타입 포함 : 허용 범위가 큰 실수 타입으로 자동 변환
두 타입을 동일한 타입으로 선언하는 걸 권장한다.

논리 연산자

논리값으로 연산을 수행, 피연산자의 타입은 boolean 타입만 사용 가능하다.

TRUE는 참을 의미하고, FALSE는 거짓을 의미한다.

사과는 과일이다. (참 = TRUE)
사과는 채소이다. (거짓 = FALSE)

AND(논리곱)의 &와 &&
▪︎ & : 앞의 조건이 false여도 뒤의 조건을 검사한다.

사과는 과일이고(조건1 = TRUE) & 먹을 수 있다.(조건2 = TRUE) (참 = TRUE)
사과는 과일이고(조건1 = TRUE) & 먹을 수 없다.(조건2 = FALSE) (거짓 = FALSE)

▪︎ && : 앞의 조건이 false면 바로 false를 반환, 연산 속도가 & 보다 빠르다.

사과는 채소이고(조건1 = FALSE) && 먹을 수 있다. (FALSE)

OR(논리합)의 |와 ||
▪︎ | : 앞의 조건이 true여도 뒤의 조건을 검사한다.

사과는 과일이고(조건1 = TRUE) | 먹을 수 없다.(조건2 = FALSE) (TRUE)
사과는 채소이고(조건1 = FALSE) | 먹을 수 없다.(조건2 = FALSE) (FALSE)

▪︎ || : 앞의 조건이 true면 바로 true를 반환, 속도면에서 유리하다.

사과는 과일이고(조건1 = TRUE) || 먹을 수 없다. (TRUE)

XOR (배타적 논리값)
▪︎ 연산자가 서로 다르면 TRUE를 반환하고, 같으면 FALSE를 반환한다.

사과는 과일이고(조건1 = TRUE) XOR 먹을 수 없다.(조건2 = FALSE) (TRUE)
사과는 과일이고(조건1 = TRUE) XOR 먹을 수 있다.(조건2 = TRUE) (FALSE)

NOT (논리 부정)
▪︎ TRUE이면 FALSE를 반환한다.
▪︎ FALSE이면 TRUE를 반환한다.

NOT 사과는 과일이다. (TRUE -> FALSE)
NOT 사과는 채소이다. (FALSE -> TRUE)

상황에 맞게 논리 연산자를 적절히 사용하면 성능 최적화를 기대할 수 있다.

대입 연산자

오른쪽 피연산자의 값을 왼쪽 피연산자인 변수에 대입(저장)한다.
▪︎ 단순 대입 연산자 : 단순히 값을 저장한다.
▪︎ 복합 대입 연산자 : 연산을 수행 후 값을 대입(저장)한다.

int intValue1 = 10;
int intValue2 = 10;
int result1 = intValue1 += 3; // 10 += 3
int result2 = intValue2 -= 3; // 10 -= 3

System.out.println(result1); // 13
System.out.println(result2); // 7

삼항 연산자

3개의 피연산자가 필요하며, ?와 :(콜론)으로 조건식을 처리한다.

? 앞의 조건식에 따라
▪︎ : 앞 : 조건식이 true일 때의 결과값이 된다.
▪︎ : 뒤 : 조건식이 false일 때의 결과값이 된다.

(조건식) ? A(true) : B(false)

// 삼항 연산자
int score = 85;
char grade = (score > 90) ? 'A' : ((score > 80) ? 'B' : 'C');
// if문으로 작성한 삼항 연산자
int score = 95;
char grade;

if (score > 90) {
    // true
    grade = 'A';
} else {
    // false, 조건식
    if (score > 80) {
    	// true
        grade = 'B';
    } else {
	// false
    	grade = 'C';
    }
}

혼공자 강의를 기반으로 작성하였습니다. 🙏
15강 16강 17강

profile
📚 글쓰는 습관 들이기 📚

0개의 댓글