JAVA 연산자

금송·2024년 9월 3일
0

이론

목록 보기
11/17
post-thumbnail

연산자

연산자의 순서를 생각 해봤을 때 괄호 안 사칙연산 먼저 그 다음 곱셈 그다음 =

true

조금 더 명확하게 표현식을 적어주는 것이 좋음.

연산자

구분연산자비고
결과가 boolean숫자 비교 연산자<, <=, >, >=
숫자 동등 연산자==, !=
결과가 int 혹은 long기본 사칙 연산자+, -, *, /, %%는 나머지 연산 (ex. 10%3=1)
증감 연산자++, --단항 연산자
비트 연산자&,, ^, ~, <<, >>, >>>

조건문에서 논리 연산자로 많이 사용
&& (=&, AND)
|| (=|, OR) |
| 기타 연산자 | 삼항 연산자 | ? : | |
| | 형 변환 연산자 | (타입) | 캐스팅 |
| | 문자열 더하기 연산자 | + | |

연산자 분류는 피연산자 수에 따라 단항, 이항, 삼항 연산자로 구분

단항 연산자 : ++x;
이항 연산자 : x + y;
삼항 연산자 : (sum > 90) ? "A" : "B"; // 앞의 식이 true일때 A false일때 B

연산식

연산식은 하나의 값을 산출

연산의 방향과 우선순위

연산의 방향

// 해당 연산식의 처리 순서
x > 0 && y < 0 // > < && 순으로 처리

// [AND 연산자]
// true && true = true
// true && false = false
// false && true = false
// false && false = false
a = b = c = 5;
// 위에 int a; int b; int c;가 쓰여져 있다는 가정 하에
// 첫번째로 연산될 등호는 c = 5; 그 다음은 b, 그 다음은 a순으로 실행.
연산자연산 방향우선 순위
증감(++, --), 부호(+, -), 비트(~), 논리(!)높음
산술(*, /, %)
산술(+, -)
쉬프트(<<, >>, >>>)처리 속도가 빠름
비교(<, >, <=, >=)
비교(==, !=)
논리(&)
논리(^)
논리()
논리(&&)
논리()
조건(?:)
대입(=, +=, -=, *=, /=, %=, &=, ^=, …)낮음
int x;
int y;
int result = x++ + y--;
//이 경우에는 x++ 먼저 그 다음 y-- 그 다음 + 그 다음 =

단항 연산자

피연산자가 하나뿐인 연산자

부호 연산자, 증감 연산자, 논리 부정 연산자, 비트 반전 연산자가 있음.

부호 연산자

+,- 변수 값의 부호를 유지하거나 바꾸기 위해 사용하기도 함.

증감 연산자

++,— 변수 값을 1 증가 시키거나 1 감소 시키는 연산자

boolean타입을 제외한 모든 기본 타입의 피연산자에 사용 가능

연산식설명예시) int x = 5;
++피연산자다른 연산을 수행하기 전에 피연산자의 값을 1 증가시킴int reslult = ++x; // x = 6
--피연산자다른 연산을 수행하기 전에 피연산자의 값을 1 감소시킴
피연산자++값을 먼저 읽어온 후에 피연산자의 값을 1 증가시킴int reslult = x++; // x = 5
피연산자--값을 먼저 읽어온 후에 피연산자의 값을 1 감소시킴

전위 연산자는 먼저 증가나 감소를 하고 후위 연산자는 선언시에는 변화없고 그 후에 증가나 감소를 함.

실습
// 단항연산자 - 감소 후위 연산자
int x = 5;
int result = x--;
System.out.println(result); // 연산의 결과, x-- 즉 연산이 되지 않은 상태
System.out.println(x); // 연산이 끝난 상태.

// 단항연산자 - 감소 전위 연산자
int x = 14;
int result = --x;
System.out.println(result); // 연산의 결과, --x 즉 연산이 끝난 상태
System.out.println(x); // 연산이 끝난 상태.

// 단항연산자 - 증감 전/후위 연산자
int x = 14;
int result = --x;
System.out.println(result); // 연산의 결과, --x 즉 연산이 끝난 상태
System.out.println(x++); // 연산이 끝난 상태. 여기서 x는 13
System.out.println(x); // 여기서 x는 14

// 단항연산자 - 증감 전/후위 연산자
int x = 5;
int result = x++ + 3;
System.out.println(result); // 8
System.out.println(x); // 6
//예제
public class IncreaseDecreaseOperatorExample {
    public static void main(String[] args){
        int x = 10;
        int y = 10;
        int z;

        System.out.println("----------------------");
        x++; // 10
        ++x; // ++11 // 즉, 12
        System.out.println("x=" + x); // 12

        System.out.println("----------------------");
        y--; // 10
        --y; // --9 // 즉, 8
        System.out.println("y=" + y); // 8

        System.out.println("----------------------");
        z = x++; // 12
        System.out.println("z=" + z); // 13 -> 틀림. 정답은 12. z는 연산 되지않고 바로 읽어내서
        System.out.println("x=" + x); // 13

        System.out.println("----------------------");
        z = ++x; // 14
        System.out.println("z=" + z); // 14
        System.out.println("x=" + x); // 14

        System.out.println("----------------------");
        z = ++x + y++; // 15 + 8 = 23
        System.out.println("z=" + z); // 23
        System.out.println("x=" + x); // 15
        System.out.println("y=" + y); // 9
    }
}

논리 부정 연산자

! not 이라는 뜻. 연산자를 부정시킨다.

즉 true를 false로, false를 true로 변경시킨다. 그렇기 때문에 boolean 타입에만 사용 가능.

조건문, 제어문에서 사용되어 조건식의 값을 부정할 때 사용.

!true = false; !false = true;

가독성은 좋진 않음. 부정식을 작성해서 사용하는 것을 지향.

이항연산자

피연산자가 두 개인 연산자

산술 연산자

산술 연산자설명
+덧셈
-뺄셈
*곱셈
/나눗셈
%왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 나머지
// 이항연산자 - 산술 연산자
int a = 10;
int b = 3;

System.out.println(a + b); // 13
System.out.println(a - b); // 7
System.out.println(a * b); // 30
System.out.println(a / b); // 3
System.out.println(a % b); // 1

int result = a % b; // 변수로 담을 수도 있음.

만약 피연산자들의 타입이 다를 경우

대체로 피연산자 중에 크기가 더 큰 타입으로 자동 변환 되어 연산

  1. 피연산자들이 모두 int보다 크기가 작을 경우 int로 변환 후 연산

    1. byte + byte → int + int
    byte x = 45;
    byte y = 67;
    
    int result = x + y; // 여기서 x 와 y 가 자동 형변환(int)되서 계산됨, 이때 타입을 byte로 하고 싶으면 캐스팅을 해주어야 한다
    System.out.println(result); // 112
  2. 피연산자 중에 long 타입이 있을 경우 모두 long으로 변환 후 연산

    1. int + long → long + long
  3. 피연산자 중에 float 혹은 double 타입이 있을 경우 크기가 큰 실수 타입으로 변환 후 연산

    1. int + float → float + float
    2. 이때 둘 다 4byte인데 왜 float를 따르는지 → 정수와 실수 중에는 실수가 더 크기 때문에 float를 따른다.

int + float 를 int로 받으면 오류

int + float 를 int로 받으면 오류

int로 받고 싶을 땐 캐스팅을 해준다.

캐스팅 방식에 따라 계산 되는 식

//캐스팅에 따라 값이 달라질 수 있는 예시
int x1 = 51;
double x2 = 50.34;

int result1 = (int)(x1-x2);
int result2 = x1-(int)x2;
System.out.println(result1); // 0
System.out.println(result2); // 1

//예시2
int a = 10;
int b = 4;
int c = a / b; // 2
double d = a / b; // 2.0
double e = (double)a / b; // 2.5

오버플로우

저장할 수 있는 범위를 초과하면 엉뚱한 값이 나옴.

int a = 1000000;
int b = 1000000;
int c = a * b;

System.out.println(c);  // -727379968
// 해당 내용은 long으로 바꾸면 해결 가능

NaN(Not a Number), Infinity

실수 타입 연산 중에 발생. 해당 값이 보이면 오류.

public class NaNInfinitySample {
    public static void main(String[] args) {
        double a = 10;
        double b = 0;

        System.out.println(a / b); // Infinity
        System.out.println(a % b); // NaN

        Double.isInfinite(a/b); // true
        Double.isNaN(a%b); // true
        // is~ 메서드는 결과가 boolean으로 나옴.
        
        System.out.println(Double.isInfinite(a/b));
        System.out.println(Double.isNaN(a%b));
    }
}

문자열 연결 연산자

  • 연산자는 산술 연산자, 부호 연산자인 동시에 문자열 연결 연산자.

피연산자 중 한쪽이 문자열이면 + 연산자는 문자열 연결 연산자로 사용되어 문자열을 결합

System.out.println("Hello" + 123 + 456); //Hello123456
System.out.println(123 + 456 + "Hello"); //579Hello

비교연산자

피연산자들을 비교하여 boolean 타입인 true, false를 산출

크기 비교

연산식설명
A > BA가 B보다 큰 지 검사
A >= BA가 B보다 크거나 같은지 검사
A < BA가 B보다 작은 지 검사
A <= BA가 B보다 작거나 같은지 검사

동등 비교

연산식설명
A == BA와 B가 같은지 검사
A != BA와 B가 다른지 검사
// 피연산자가 char 타입이면 유니코드 값으로 비교 연산
('A' < 'B') -> (65 < 66)

// char 타입과 int 타입을 비교할 때는 int로 타입을 일치시킨 후 비교
'A' == 65  // true
10 == 10.0  // true (int타입인 10을 double 타입인 10.0으로 변환 후 비교)

0.1 == 0.1f  // false, 0.1f는 0.1의 근사 값이(예를 들어 0.100000000149와 같은 값) 되기 때문에
(float)0.1 == 0.1f  // true
(int)(0.1 * 10) == (int)(0.1f * 10)  // true

// String 타입의 문자열은 대소 비교를 할 수 없고, 동등 비교는 할 수 있는데 이때도 주의 해서 확인.
// .equals() 메서드 사용하여 동등 비교 진행!!
String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");

System.out.println(str1 == str2);  // true
System.out.println(str1 == str3);  // false
System.out.println(str1.equals(str3));  // true

논리연산자

조건식을 연결하거나 비교할 때 사용.

피연산자는 boolean 타입만 사용 가능.

AND (&&)

피연산자가 모두 true일 경우에만 결과가 true

xyx && y
truetruetrue
truefalsefalse
falsetruefalse
falsefalsefalse

OR (||)

피연산자 중 하나만 true이면 결과는 true

xyx
truetruetrue
truefalsetrue
falsetruetrue
falsefalsefalse

XOR (배타적 논리합)

피연산자가 하나는 true이고 다른 하나는 false일 경우에만 결과가 true

연산식결과
true ^ truefalse
true ^ falsetrue
false ^ falsefalse

NOT (논리 부정)

피연산자의 논리 값을 바꿉니다.

연산식결과
!truefalse
!falsetrue
// x는 5보다 크고 13보다 작다
x > 5 && x < 13
// i는 2의 배수 또는 3의 배수이다.
i % 2 = 0 || i % 3 = 0

비트연산자

비트(bit, binary digit) : 1과 0으로 구성 되어있는 정보의 최소단위.

10진수 → 2진수 방법 참고

// 10진수의 연산을 2진수의 연산으로 변환하는 연습
// 16을 2로 나눈다음 나온 숫자로 조합
16 -> 10000

비트 논리 연산자

비트 논리 연산자에는 &, |, ^, ~

&, |, ^ 연산자는 피연산자가 boolean이면 일반 논리 연산자이고, 피연산자가 정수이면 비트 논리 연산자로 동작.

xyx & yxy
1 (true)1 (true)1 (true)1 (true)0 (false)
10011
01011
00000

이진수

01111 : 15

11110 : 30

논리합

01111 | 11110 == 11111

배타적 논리합

01111 ^ 11110 == 10001

논리부정 (단항연산)

~01111 == 10000

~11110 == 00001

int x = 15;
int y = 30;

System.out.println(x & y); // 14 // 1110 // 2의 3승 + 2의 2승 + 2의 1승 (1이 있는 자리 뒤 숫자 갯수 만큼 승으로 올려주면 됨)
System.out.println(x | y); // 31 // 11111 // 2의 4승 + 2의 3승 + 2의 2승 + 2의 1승 + 2의 0승 즉 16 + 8 + 4 + 2 + 1
System.out.println(x ^ y); // 17
System.out.println(x >>> y); // 0
System.out.println(~x); // -16

비트 이동 연산자

연산식결과
a << b정수 a의 각 비트를 b만큼 왼쪽으로 이동 (빈자리는 0으로 채워짐)
a >> b정수 a의 각 비트를 b만큼 오른쪽으로 이동 (빈자리는 최상위 부호 비트(MSB)와 같은 값으로 채워짐)
a >>> b정수 a의 각 비트를 b만큼 오른쪽으로 이동시키며, 새로운 비트는 전부 0으로 채워짐

num1 * 2 == num1 << 1 (성능이 훨씬 좋음) 10000 = 16
num1 * 4 == num1 << 2 (성능이 훨씬 좋음) 100000 = 32

음수를 이진법으로 바꾸는법

  1. 양수 값의 2진수에서 (8비트 표현식)
  2. 전체 비트를 반전
  3. +1

예) -8의 2진수

  1. 00001000
  2. 11110111
  3. 11111000 : -8의 2진수 값 (대게 맨 앞자리가 1이면 음수 0이면 양수)

삼항 연산자

세 개의 피연산자가 있는 연산자

public class Example {
	public static void main(String[] args) {
		int score = 95;
		char grade = (score > 90) ? 'A' : 'B';
		System.out.println("당신의 학점은 : " + grade);
	}
}
// 삼항연산자를 풀어서 쓰면
	char grade;
	if (score > 90){
		grade = 'A'
	} else {
		grade = 'B'
	}

데일리퀴즈 1

(num % 2 == 0) ? “짝수” : “홀수”;

정답

데일리퀴즈 2

int a = 1;
int b = 2;
//값이 같다면 a 반환
int result = (a >= b) ? a : b; 
System.out.println(result)

if (a >= b){
	result = a;
} else {
	result = b;
}

데일리퀴즈3

int score = 60;
if (score >= 60) {
	result = "합격";
} else {
	result = "불합격";
}
System.out.println(result)
profile
goldsong

0개의 댓글