자바의 정석

SUADI·2022년 6월 2일

3장 - 연산자(operator)

1.3 연산자의 종류

  • 산술 연산자(+,-,*,/,%,<<,>>), 비교연산자(<,>,<=,>=,==,!=), 논리 연산자(&&,||,!,&,|,^,~), 대입연산자(=) 등이 있다.

  • 연산자의 연산 순서는 산술, 비교, 논리, 대입 순이다.

  • 산술 연산자에서 타입이 다른 두 가지를 연산할 때 타입을 일치시킨 후 연산을 해야한다. 작은 타입에서 큰 타입으로 형변환을 해야하는 경우 자동형변환이 되므로 형변환을 생략해도 된다.

int a = 10;
float f = 20.1f;

float result = f + (float) a; 
// int보다 float가 더 큰 타입이므로 생략가능
float reuslt = f + a;
  • 두 문자열을 비교할 때 '=='를 사용하는 대신 equals 메소드를 사용하는 게 좋다.
boolean test1 = "apple" == "apple"; // 에러가 나지는 않는다.
boolean test2 = "apple".equals("apple");
  • String는 클래스이므로 여타 다른 클래스에서 객체를 생성했던 것과 같이 String 객체를 생성해야 하지만 예외적으로 String은 간단히 사용할 수 있다.
String string1 = new String("apple");
String string2 = "apple";
  • 논리연산자(&&,||,!..)는 코드를 짜면서 자주 이용했지만 비트연산자(&,|,^,~,<<,>>)는 많이 이용하지 않았었다. 논리 연산자와 비슷한 맥락인데 피연산자를 비트단위로 논리연산 하는 것이 비트 연산자이다.

  • & (AND연산자), |(OR연산자), ^(XOR연산자, 값이 서로 다를 때만 1을 결과로 얻는다.)

  • <<와 >>는 쉬프트(shift) 연산자로 예를 들어 2진수인 피연산자를 <<5이면 왼쪽으로 숫자를 5칸 옮긴다는 의미이다.

6.1 조건연산자

if문과 비슷한 개념의 연산자이다. 기본적인 틀은 이렇다.

조건식 ?1 :2;

? 왼쪽의 조건식에 따라 참이면 식1을 결과값으로 내고, 거짓이면 식2를 결과값으로 낸다. 밑의 두 식은 서로 바꿔 쓸 수 있다.

result = (x>y) ? x : y;
if (x>y) result = x;
else result = y;
a *= b + 3;
// a = a * (b + 3); (O)
// a = a * b + 3; (X)

4장 - 조건문과 반복문

조건문과 반복문의 개념에 대해서는 파이썬을 공부했을 때부터 나름 열심히 했었기 때문에 개념보다는 예제위주로 포스팅하려고 한다.

1.5 switch 문

  • if문과는 달리 하나의 조건식으로 많은 경우의 수를 처리할 수 있고, 표현도 간결하다. 처리할 경우의 수가 많을 경우 switch문을 사용하는 것이 좋다. 하지만 switch문의 경우 조건식의 결과값이 반드시 정수형태여야 하기 때문에 제약이 있다. case문의 값 역시 정수여야하고 중복이 되서는 안된다. case문의 값이 실수, 변수, 문자열이면 컴파일 에러가 난다.
switch(result) {
	case '1': // char은 유니코드로 저장되므로 가능
    case ONE: // 정수 상수 가능
    case "YES": // 문자열 불가능
    case num: // 변수 불가능
    case 3.14: // 실수 불가능
}
  • case 문을 빠져나오기 위해서 break문을 사용한다. break문을 사용하지 않으면 그 아래의 case문을 모두 수행하게 된다. 경우에 따라 break문을 적절히 사용할 수 있어야 한다.

  • case문에 원하는 결과값이 없는 경우 default문으로 이동한다. default문은 맨 마지막의 경우이기 때문에 break문 생략이 가능하다.

  • switch 문을 이용하게 되면 조건식이 많아질수록 if문보다 처리속도가 더 빨라진다. 예를 들어 점수에 따른 등급을 매기는 프로그램을 작성한다면

import java.util.Scanner;

public class Sample {
    public static void main(String[] args) {
        char grade = ' ';
        System.out.println("점수 입력");
        Scanner scanner = new Scanner(System.in);
        int point = scanner.nextInt();
        switch (point) {
            case 99: case 98: case 97: case 96: case 95: 
            case 94: case 93: case 92: case 91: case 90:
                grade = 'A';
                break;
            case 89: case 88: ..............
            	grade = 'B';
           ......
        }
        System.out.println(grade);
    }
}

만약 if문을 사용한다면 point에 대한 조건식이 여러개 생길 것이고, 이게 수만개가 되면 처리 속도에 영향을 끼칠지도 모른다. 다만 switch문을 이용했을 때 작성할 case가 많아지기 때문에 이럴 땐 편법을 써는 것도 방법이다.

public class Sample {
    public static void main(String[] args) {
        char grade = ' ';
        System.out.println("점수 입력");
        Scanner scanner = new Scanner(System.in);
        int point = scanner.nextInt();
        switch (point / 10) {
			case 10: case 9:
            	grade = 'A';
                break;
            case 8:
            	grade = 'B';
                break;
            ....

2.1 for 문

  • for문에 변수를 두개 이상 지정할 수 있다는 사실을 알게 되었다. 예를 들면 다음과 같다. 하지만 변수는 줄일수록 깔끔한 코드가 되므로 웬만하면 하나로 해결하는게 좋다고 한다.
for (int i=0,j=4; i<5; i++,j--;) {
	System.out.printf("%d %d",i,j);
	// System.out.printf("%d %d",i,4-i);
}
  • 다음으로 별찍는 프로그램을 짜보자. 일단 정사각형을 짜려면 이중 for문을 사용해야한다.
public class Sample {
    public static void main(String[] args) {
        for (int i=0; i<5; i++) {
            for (int j=0; j<5; j++) {
                System.out.printf("*\t");
            }
            System.out.println();
        }
    }
}
  • 삼각형을 찍으려면 이중 for문의 안쪽 for문에서 범위를 i보다 작거나 같음으로 바꾸면 삼각형이 출력된다.
public class Sample {
    public static void main(String[] args) {
        for (int i=0; i<5; i++) {
            for (int j=0; j<=i; j++) {
                System.out.printf("*\t");
            }
            System.out.println();
        }
    }
}

0개의 댓글