[JAVA] 2. Operator_연산자

말랑이·2023년 6월 15일
0

JAVA

목록 보기
6/13
post-thumbnail

1 연산자

🧡 연산자(operator) : 연산을 수행하는 기호

📍 x + 3

// 피연산자 : x, 3
// 연산자 : +
  • 연산자는 피연산자로 연산 수행 후 → 항상 결과값 반환

  • 대입연산자 사용 → 변수에 결과 저장

  • 식 : 연산자 + 피연산자 조합 (계산하고자하는 바를 표현한 것)

  • 평가 : 결과를 얻는 것

1️⃣ 연산자 종류

종류연산자기능
산술연산자+, -, *, /, %, <<, >>사칙연산, 나머지연산(%)
비교연산자>, <, >=, <=, ==, !=크고 작음, 같고 다름
논리연산자&&, !, &, ^, ~AND, OR → 조건연결
대입연산자=우변의 값 → 좌변에 저장
기타(type) ?: instanceof형변환연산자, 삼항연산자, instanceof 연산자

2️⃣ 연산자 결합규칙

🧡 연산자결합규칙

  • 산술 > 비교 > 논리 > 대입 → 대입 가장 마지막에 수행
  • 단항 > 이항 > 삼항
  • 대입연산자 연산 진행방향 : 오른쪽 → 왼쪽
  • 일반 연산 진행방향 : 왼쪽 → 오른쪽

3️⃣ Java code

 class Operator1 {
    public static void main(String[] args) {
        int x, y;

        // (대입)연산순서 : 오른쪽 -> 왼쪽
        x = y = 3;

        System.out.println("x = " + x);
        System.out.println("y = " + y);
    }
}

2 증감연산자

🧡 증감연산자 : 피연산자에 저장된 값 → 1증가 or 1감소

  • 피연산자 → 정수, 실수 가능 ✅, 상수 불가능 ⛔️

  • 일반 산술변환에 의한 자동형변환 ❌

📍 증가연산자(++) : 피연산자 값 1증가

📍 감소연산자(--) : 피연산자 값 1감소

1️⃣ 위치에 따라 다른 증감연산자

타입기능예시
전위형값이 참조(출력)되기 전에 증가j = ++i;
후위형값이 참조(출력)된 후에 증가j = i++;
  • 단항연산자 → 피연산자 왼쪽에 위치

  • 증감연산자 → 피연산자 양쪽에 위치 가능 ✅

  • 독립적인 하나의 문장에 쓰인 경우 → 전위형, 후위형 차이없음 ⛔️

2️⃣ Java code

📍 전위형, 후위형 비교
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);
    }
}

3 부호연산자

🧡 부호연산자 : 피연산자 부호 → 반대로 변경한 결과 반환

  • 피연산자 음수 → 부호연산자 - ➡️ 피연산자 양수

  • 피연산자 양수 → 부호연산자 - ➡️ 피연산자 음수

  • 기본형에만 사용가능 ✅

 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);
    }
}

4 형변환연산자

🧡 형변환(casting) : 변수, 상수, 리터럴 type → 다른 type으로 변환하는 것

📍 (변환하고자하는 type)피연산자

	double d = 99.5;
    int score = (int)d;
    // 85 출력

1️⃣ 형변환연산자 특징

  • 형변환은 일시적임 ✅

  • 피연산자 변수 값 → 형변환 후에도 변화가 없음

2️⃣ 형변환 예시

변환수식결과
int → char(char)65'A'
char → int(int)'A'65
float → int(int)1.6f1
int → float(float)1010.0f
  • 정수와 문자 형변환은 아스키코드를 참조함

  • 정수와 실수 형변환은 소수점 아래를 버림 (반올림 ⛔️)

3️⃣ Java code

 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);
    }
}

4️⃣ 자동형변환

📎 기존의 값을 최대한 보존할 수 있는 타입으로 자동형변환

  • 컴파일러가 생략된 형변환을 자동적으로 추가함

  • 값 손실이 없도록 두 type 중, 표현범위가 더 넓은 쪽으로 형변환

📍 float > int
	float f = 1234; // (float)가 생략
    
📍 변수저장범위 <byte b = 1000; // 🚨 Error (값 손실 우려)

📍 의도적으로 유도한 값 손실
	byte b = (byte)1000; // ✅ OK

5️⃣ 산술변환

📎 피연산자 타입의 일치를 위해 자동형변환 되는 것

📍 1. 두 피연산자 타입을 같게 일치 (더 큰 타입으로) → 값 손실 최소화 ✅
	long + intlong + long ➡️ long
    float + intfloat + float ➡️ float

📍 2. 피연산자 타입 int보다 작으면 int로 변환 → 오버플로우 방지 ✅
	byte + shortint + int ➡️ int
    char + shortint + 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);
    }
}

5 사칙연산자

  • 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);
    }
}

6 Math.round() 반올림

🧡 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);
    }
}

7 나머지연산자

🧡 나머지연산자(%) : 왼쪽 피연산자 → 오른쪽 피연산자로 나누고 난 나머지값을 결과로 반환

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);
    }
}

8 비교연산자

🧡 비교연산자 : 두 피연산자 비교

  • 조건문 및 반복문 → 조건식에 사용

  • 연산결과 : True or False

  • 이항연산자 → 타입이 다른 경우, 범위가 큰 쪽으로 자동 형변환

1️⃣ 대소비교연산자

📎 <, >, <=, >=

  • 두 피연산자 값 크기를 비교하는 연산자

  • boolean 자료형 및 참조형 자료형 사용불가 ⛔️

2️⃣ 등가비교연산자

📎 ==, !=

  • 두 피연산자 값 같은지 다른지 비교하는 연산자

  • 모든자료형 (기본형, 참조형 포함) 사용가능 ✅

    • 기본형 : 변수 저장값 같은지 확인
    • 참조형 : 객체 주소값 (참조변수가 같은 객체를 가리키는지) 확인
      • 참조형 → String 객체 포함
  • 기본형과 참조형 비교는 불가능 ⛔️


9 문자열비교

🧡 문자열비교

  • 비교연산자 (==) 사용불가 ⛔️
  • equals() 메서드 사용 ✅ → True or False return

1️⃣ String 비교연산자 사용할 수 없는 이유

  • String 비교연산자 (==) 사용 → 객체가 다르면 False

  • String equals() 사용 → 객체가 달라도 문자열만 같으면 True

2️⃣ Java code

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);
    }
}

10 논리연산자

🧡 논리연산자 : 둘 이상의 조건 → AND, OR로 연결하여 하나의 식으로 표현해주는 것

1️⃣ 논리연산자 종류

논리연산자기능
OR결합하나라도 True → True 반환
AND결합둘 모두 True → True 반환

2️⃣ 논리연산자 활용

📍 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')

3️⃣ Java code

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");
        }
    }
}

11 논리부정연산자

🧡 논리부정연산자 : True와 False를 반대로 바꾸는 것

  • 토글버튼 논리구현에 사용
    • 논리부정연산자 반복 사용
    • 참과 거짓이 차례대로 반복

📎 단항연산자 논리부정연산자 결합

📍 단항연산자 결합방향 : 오른쪽 → 왼쪽
	boolean b = true;
    !!b → !!true!FalseTrue

📎 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);
    }
}

12 조건연산자

🧡 조건연산자

  • 조건식 + 식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);
    }
}

13 대입연산자

🧡 대입연산자 : 변수와 같은 저장공간에 값, 수식 연산결과를 저장하는데 사용

  • 오른쪽 피연산자 값 → 왼쪽 피연산자에 저장

  • 저장된 값 → 결과로 반환

  • 대입연산자 : 연산자 중, 가장 낮은 우선순위

  • 연산진행방향 : 오른쪽 → 왼쪽

📍 lvalue와 rvalue
	x = 3;
    
    - rvalue : 변수,, 상수 모두 가능
    - lvalue : 변수 (반드시 값을 변경할 수 있는 것) ⭐️
profile
🐰 I'm Sunyeon-Jeong, mallang

0개의 댓글