[JAVA의 정석] CH3. 연산자

[JAVA의 정석] CH3. 연산자

02) 연산자의 종류

  • 괄호 ( ) 는 연산자가 아니다.
  • 비프 연산자 ( « » & l ^ ~ ) 는 잘 쓰이지 않으나, 알고있으면 좋다.

03) 연산자의 우선순위

  • 부호연산자(1항 연산자)와 뺄셈 연산자는 다르니, 잘 알아두자
  • 상식적으로 생각하면 굳이 외우지 않아도 어렵지 않다.

04) 연산자의 결합법칙

  • 1) 산술(+ =) > 비교(>,<) > 논리(&&,ll) > 대입(=) // 대입은 가장 마지막에 수행된다.
  • 2) 단항(1) > 이항(2) > 삼항(3) // 단항 연산자의 우선순위가 이항 연산자보다 높다.
  • 3) 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽이다.

05) 증감연산자 ++, –

  • 증가 연산자(++) : 피연산자의 값을 1 증가시킨다.
  • 감소 연산자(–) : 피연산자의 값을 1 감소시킨다.

class Ex3_2 {
	public static void main(String args[]) {
		int i=5, j=0;

		j = i++;
		System.out.println("j=i++; 실행 후, i=" + i +", j="+ j);

		i=5;        // 결과를 비교하기 위해, i와 j의 값을 다시 5와 0으로 변경
		j=0;

		j = ++i;
		System.out.println("j=++i; 실행 후, i=" + i +", j="+ j);
	}
}

결과 ↓

추가 설명

06) 부호 연산자

  • 부호연산자는 덧셈, 뺄셈 연산자와 같은 기호를 쓰지만 다른 연산자이다. 기호는 같아도 피연산자의 개수가 달라서 구별이 가능하다.
  • 이것 또한 상식적으로 생각하면 매우 쉽게구별 가능.
  • ’-‘ 는 피연산자의 부호를 반대로 변경
  • ’+’ 는 아무런 일도 하지 않는다. (실제 사용x)

07) 형변환 연산자

  • 형변환(casting)이란, 변수 또는 상수의 타입을 다른 타입으로 변환하는것.
  • 형변환 방법은 형변환하고자 하는 변수나 리터럴의 앞에 변환하고자 하는 타입을 괄호와 함께 붙여주기만 하면 된다.
  • (타입)피연산자
double d = 54.4;
int score = int(d);
  • 위에 두줄의 연산과정을 단계별로 살펴보면
  • int score = (int)d; → int score = (int)54.4; // 이 과정에서 소수점 0.4 버려짐 → int score = 54;

08) 자동 형변환

  • 값손실이 나지 않는 범위에서 자동형변환이 된다.
  • “기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환된다.”

10) 산술변환

  • 두 연산자의 타입을 같게 일치시킨다. (보다 큰 타입으로 일치)
    • long + int → long + long → long
    • float + int → float + float → float
    • double + float → double + double → double
  • 피연산자의 타입이 int보다 작은 타입이면 int로 변환된다.
    • byte + short → int + int → int
    • char + short → int + int → int

11) Math.round() 로 반올림하기

  • 반올림을 하려면 Math.round() 를 사용하면 된다. (Math 클래스에 있는 round 메소드)
  • Math.round()를 이용하면 소수점 첫째 자리에서 반올림 한 결과를 정수료 반환한다.
  • long result = Math.round(4.52); // result에 5가 저장된다)
class Ex3_11 {
	public static void main(String args[]) { 
		double pi = 3.141592; 
		double shortPi = Math.round(pi * 1000) / 1000.0;
		// 소수점 3번째 자리까지 표현하려면 1000을 Math.round()에서 곱하고, 다시 1000.0을 나눈다
		// double 형식으로 써야 소숫점까지 결과로 나오기때문에 int형식인 1000이 아닌 1000.0 으로 나눈다.
		// 1000으로 나눌경우 결과값으로 3이 나온다.
		System.out.println(shortPi);
	}
}

// result : 3.142

12) 나머지 연산자 (%)

  • 나머지 연산자는 주로 짝수, 홀수 또는 배수 검사등에 주로 사용된다.
class Ex3_13 { 
	public static void main(String[] args) { 
		System.out.println(-10%8); 
		System.out.println(10%-8); 
		System.out.println(-10%-8); 
	} 
}

// result : -2
//			2
//          -2
  • System.out.println(10%8); _// 10을 8로 나눈 나머지 2가 출력된다.
  • System.out.println(10%-8); _// 10을 -8로 나눈 나머지 2가 출력된다. (위와 같은 결과를 얻음)
  • 10을 8로 나눈 나머지 = 10을 -8로 나눈 나머지 → ‘-‘의 의미가 없다.

13) 비교 연산자

대소비교 연산자 < > <= >=

  • > : 좌변 값이 크면, true 아니면 false
  • < : 좌변 값이 작으면, true 아니면 false
  • >= : 좌변 값이 크거나 같으면, true 아니면 false
  • <= : 좌변 값이 작거나 같으면, true 아니면 false

등가비교 연산자 == !=

  • == : 두 값이 같으면, true 아니면 false
  • != : 두 값이 다르면, true 아니면 false

  • 대소비교 연산자와 등가비교 연산자를 사용할때 등호의 순서에 유의하자.

14) 문자열의 비교

  • 두 문자열을 비교할때는 비교연산자 ‘==’대신, equals() 라는 메서드를 사용해야 한다.
class Ex3_14 {
	public static void main(String[] args) {
		String str1 = "abc";
		String str2 = new String("abc");

		System.out.printf("\"abc\"==\"abc\" ? %b%n", "abc"=="abc");
		System.out.printf(" str1==\"abc\" ? %b%n",    str1=="abc");
		System.out.printf(" str2==\"abc\" ? %b%n",    str2=="abc");
		System.out.printf("str1.equals(\"abc\") ? %b%n", str1.equals("abc"));
		System.out.printf("str2.equals(\"abc\") ? %b%n", str2.equals("abc")); 
		System.out.printf("str2.equals(\"ABC\") ? %b%n", str2.equals("ABC"));
		System.out.printf("str2.equalsIgnoreCase(\"ABC\") ? %b%n", str2.equalsIgnoreCase("ABC"));
	}
}

결과 ↓

15) 논리연산자 && ll

  • ll(or결합) : 피연산자 중 어느 한쪽이 true이면 true를 결과로 얻는다.
  • &&(and결합) : 피연산자 양쪽 모두 true여야 true를 결과로 얻는다.
  • && 와 ll 이 함께 쓰일때는 괄호를 이용해 명확하게 구분한다.

16) 논리 부정 연산자 !

  • 논리 부정 연산자 (!) : 피연산자가 true이면 false를, false이면 true를 결과로 변환한다.
  • true와 false를 반대로 바꾸는 것.
  • ch < ‘a’ ll ch > ‘z’ ↔ !(‘a’ <= ch && ch <= ‘z’)

17) 조건 연산자

  • 조건 연산자 : 조건식, 식1, 식2 모두 세 개의 피연산자를 필요로 하는 삼항 연산자이며, 삼항 연산자는 조건 연산자 하나뿐이다.
  • 조건 연산자를 이용해 if문을 간단하게 표현 가능하다.

18) 대입 연산자

  • 오른쪽 피연산자의 값을 왼쪽 피연산자에 저장한다.
  • 그리고 저장된 값을 연산결과로 반환한다.
  • 모든 연산자는 결과값을 반환한다
  • ← 방향으로 진행

lvalue 와 rvalue

  • 대입연산자의 왼쪽 피연산자를 ‘lvalue(left value)’ 라고 하고, 오른쪽 피연산자를 ‘rvalue(right value)’ 라고 한다.

19) 복합 대입 연산자

  • 대표적으로 맨 윗줄 i + =3; ↔ i = i + 3; 만 숙지하고 있으면 나머지도 쉽게 유추 가능하다.
  • 마지막 줄 i *= 10 + j; ↔ i = i * (10 + j); 에서 괄호에 유의하자.