구리

자바의정석_연산자(Operater) 본문

Java

자바의정석_연산자(Operater)

guriguriguri 2021. 3. 22. 18:17
  • 증감연산자 종류 : 증가연산자(++), 감소연산자(--(
  • 증감연산자 타입 : 전위형 (++i), 후위형 (i++)
  • 증감연산자가 수식이나 메서드 호출에 포함되지 않고 독립적인 하나의 문장으로 쓰이면
    전위형이나 후위형이나 차이가 없다.

    ex) int i = 1;
        ++i;  => 2
        i++;  => 3

- 증감연산자 예시 1

	public class Chapter3_operator {

	public static void main(String[] args) {
    	int i=5, j=0;
		
		j = i++;
		System.out.println("j=i++ 실행 후, i=" + i + ", j=" + j);
        
        // 결과 i = 6, j = 5

		i=5;
		j=0;
		
		j = ++i;
		System.out.println("j=++i 실행 후, i=" + i + ", j=" + j);
        
        // 결과 i=6, j=6
        }
    }

- 증감연산자 예시 2

	public class Chapter3_operator {

	public static void main(String[] args) {
    	int a =5, b=5;
		
        System.out.println(a++); // a값을 출력 후 1 더함 
		System.out.println(++b); // b에 1을 더한 후 출력 
		
        System.out.println("a = " + a + ", b = " + b); 
        // a = 6, b= 6 ( 두번째로 사용되는 a는 1 더해진 값으로 출력 )
        
        }
    }

 

  • 산술 변환 : 두개의 피연산자 타입을 같게 일치시킨다 ( 더 큰 타입으로 변환한다) ex) long+int = long
  • 이때 피연산자 타입이 int보다 작으면 int로 변환한다. ex) byte + short = int, char + short = int

byte A = 10;
byte B = 20;
//byte C = a + b;
//System.out.println(C); 이렇게 하면 c는 산술변환으로 인해 int값으로 출력되어야 하는데 byte 변수에 형변환 없이 저장하려 했으므로 오류
	    
// 맞는 출력법
byte C = (byte)(A+B);
System.out.println(C);
	   
int c = 1_000_000;
int f = 1_000_000;
System.out.println(c*f);            // 결과값 : -727379968
System.out.println(c*(long)f );     // 결과값 : 1000000000000

// int + long = long
// c*f = 1,000,000,000,000 이지만 int 범위 값에서 오버플로우되므로 정확한 값을 얻고 싶으면 c, f중 하나를 long으로 형변환

 

  • Math.round() : 소수점 첫번째 자리에서 반올림하는 메서드


// 4번째에서 반올림하기 
double pi = 3.141592;
double shortPi = Math.round(pi * 1000) / 1000.0; // 1000으로 나누면 int/int로 되어 3으로 출력 !
System.out.println(shortPi); // 결과 : 3.142

// pi로 3.141 만들기
double answer = ((int)(pi*1000))/ 1000.0; // 형변환을 시켜 double값을 int값으로 강제로 바꿔 소수점 아래 자리 버린다
System.out.println(answer);

 

  • 문자열 비교
  • 두 문자열 비교시, 비교연산자 '==' 대신 equlas() 메서드 사용
    ('==' 비교 연산자는 두 문자열이 완전히 같은 것인지 비교할뿐이다)
String str1 = "abc";
String str2 = new String("abc");

// str2도 abc라는 내용을 같지만 "=="로 비교하면 거짓 !
// equalIgnoreCase 는 대소문자 구문 X
	    
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"));

/* 결과 : "abc"=="abc" ? true
  str1=="abc" ? true
  str2=="abc" ? false
  str1.equals("abc") ? true
  str2.equals("abc") ? true
  str2.equals("ABC") ? false
  str2.equalsIgnoreCase("ABC") ? true */

- str2와 "abc"의 내용이 같은데도 '=='로 비교하면 false인 이유 ? 내용은 같으나 다른 객체기에 거짓이다.

- equals()는 객체가 달라도 내용이 같으면 true 반환 

 

  • 논리 연산자 
    • || (OR결합) : 피연산자 중 어느 한 쪽이 true면 결과 true로 반환
    • && (AND결합) : 피연산자 양쪽 모두 true여야 결과 true로 반환
 Scanner scanner = new Scanner(System.in);
char ch = ' ';
	    
System.out.println("문자를 하나 입력하세요.>");
	    
String input = scanner.nextLine();
ch = input.charAt(0);
	    
	if('0' <=ch && ch <= '9') {
	    System.out.println("입력하신 문자는 숫자입니다."); 
	}
	    
	if(('a' <= ch && ch <= 'b') || ('A' <= ch && ch <= 'Z')) {
	 	System.out.println("입력하신 문자는 영문자입니다.");
     }

 

  • 논리 부정 연산자 ( ! ) : 피연산자가 true면 -> false, false면 -> true 반환
 public class Chapter3_operator {

	public static void main(String[] args) {
 
        int num = 456;
	    
	    if(num == 456) {
	    	System.out.printf("%d", ((int)(num/100))*100);
            // 백의 자리 이하를 버리는 코드 
	    }
	   
        // 결과 : 400 
    }
 }
        

 

  • 조건 연산자 : 조건식, 식1, 식2 모두 세개의 피연산자를 필요로 하는 삼항 연산자
    • 조건식 ? (조건식 true면) 식1 : (조건식 false면) 식2
    • ex) result = ( x > y) ? x : y ;  (x가 더 크면 result에는 x의 값이 아니면 y의 값이 대입된다)