language/java

3. 연산자(operator)

wooweee 2023. 3. 2. 17:23
728x90

 

1. 연산자의 종류

종류 연산자 설명
산술 연산자 +   -  *   /   % 우선순위1, 좌 -> 우
비교 연산자 >   <   >=   <=   ==   != 우선순위2, 좌 -> 우
논리 연산자 &&     ||       !  우선순위3, 좌 -> 우
대입 연산자     = 우선순위4, 우->좌로 이동
중요 기타 연산자 (type)    |    ? a:b       |       instanceof   

 

2. 연산자 결합 규칙

  1. 산술>비교>논리>대입
  2. 단항>이항>삼항
  3. 단항 연산자, 대입 연산자 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽이다.

 

3. 증감 연산자(++, --)

  • 증감 연산자는 산술연산자와 달리 자동 형변환이 발생하지 않는다.
  • 증감 연산자는 독립적으로 사용될 때, 전위 후위 상관 없다.
  • 쉽게 이해하는 방법 ( i++; ++i; 이렇게 code line에 혼자 있지 않는 경우 )
    1. i++; -> i++이 포함된 식 수행 후 다음 line에 i++
    2. ++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. 사칙연산의 자동 형변환

    1. 계산 후 값손실을 없애기 위해서 범위가 큰 type으로 형변환
    2. 오버플로우 발생 막기 위해
  • 규칙
    1. 두 피연사자의 타입을 일치 시킴(큰 타입으로) -> 값 손실 막기
      1. long + int -> long
      2. float + int -> float
      3. float +long -> float
      4. double + float -> double
    2. 피연산자의 타입이 int보다 작은 타입일 경우 (int로 변환) - overflow 막기
      1. byte + short -> int
      2. 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)

 


출처 - 자바의 정석 기초편