본문 바로가기
Programming/Java, Spring

[Java 기초문법] Control flow | if 조건문, switch 조건문

by Renechoi 2022. 10. 18.

[Java 기초문법] by Professional Java Developer Career Starter: Java Foundations @ Udemy

 


 

if 조건문 

 

 

1~3중 한 숫자를 랜덤으로 생성하고 

그게 3이면 맞았다는 문장을 출력하는 코드를 짜보자. 

 

import java.util.Random;

public class GuessIt {
    public static void main(String[] args) {
        int randomNum = new Random().nextInt(3) + 1;
        System.out.printf("Generated number is : %d", randomNum);

        if (randomNum ==3){
            System.out.println("You got it!");
        }
    }
}

 

 

Using eaulities

 

import java.util.Random;

public class GuessIt {
    public static void main(String[] args) {
        int randomNum = new Random().nextInt(5) + 1;
        System.out.printf("Generated number is : %d%n", randomNum);

        if (randomNum ==31){
            System.out.println("The color is RED");
        } else if (randomNum == 2 && (randomNum % 2 == 0)){     // even number
            System.out.println("The color is GREEN");
        } else if (randomNum ==3) {
            System.out.println("The color is BLUE");
        } else {
            System.out.println("The color is POLKA-DOT");
        }
    }
}

 

 

 

 


 

Switch 조건문 

 

 

if문이 특정 logical한 조건이 등장하고, 그리고 then ~ 구조라면 

 

switch는 그냥 주어진다 

 

 

switch (randomNum){
    case 1 :
        System.out.println("The color is RED");
        break;
}

 

로직 자체는 같다. 

 

switch (randomNum){
    case 1 :
        System.out.println("The color is RED");
        break;
    case 2 :
        System.out.println("The color is BLUE");
        break;
    case  3:
        System.out.println("The color is GREEN");
        break;
    case 4 :
        System.out.println("The color is PURPLE");
        break;
    default:
        System.out.println("The color is WHATEVER");
    }

 

 

그런데 왜 도중에 break이 필요할까? 

 

the thread is keep moving these case statement

 

until break appears 

 

 

 

 

Switch의 좋은점 

1) 보기 좋다 (관점에 따름)

2) 좀 더 빠르다 

 

나쁜점 

1) careful 해야 한다 

2) null에 대한 check가 조건문 자체에서 힘들다. 

 

 

 

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.hashCode()" because "<local3>" is null
at GuessIt.main(GuessIt.java:10)

 

 

하지만 if 문에서는 이런 상황을 방지할 수 있다.

 

String command = null;

if ("go".equals(command)){
    System.out.println("it's ok");
}

 

 

 

 


 

블랙잭 로직 Switch statement로 살펴보기 

 

 

아래와 같은 간단한 조건문을 형성한다고 할 때 

 

자바 14버전 이상에서는 arrow 사용이 가능해졌다. 

 

variable에 switch문 전체를 할당하고 

 

3개를 한 번에 할당할 수 있다. 

 

 

case 안에서 "ace"는 1 or 11로 할당된다. 

 

이때 return이 아니라 yield를 쓴다. 

 

 

 

종합하면 

 

public class GuessIt2 {
    public static void main(String[] args) {
        String card ="jack";
        int currentTotalValue = 10;

        int currentValue =  switch (card) {
            case "king", "queen", "jack" -> 10;
            case "ace" -> {                         // 1 or 11
                if (currentTotalValue < 11){
                    yield 11;                       // return이 아니라
                } else {
                    yield 1;
                }
            }
            default -> Integer.parseInt(card);      // str인 숫자를 int로 변환
        };
        System.out.printf("Current Card Value : %d%n", currentValue);
        System.out.printf("Total value %d%n", currentTotalValue + currentValue);
    }

}

 

 


 

Switch 문 추가된 feature (JDK 17) 

 

 

 

 

lg lvel 설정하면

 

 

 

 

all is well 

 

 

조건문에서 type을 같이 검증 

 

not only is the case statement matching on the data type of the object or obj, it's also giving us a local variable that we can use to refer to whatever 

that was passed in. 

 

3번째 줄을 보면 

 

if obj is a type person, then let's start calling it P instead of OBJ, and if p 's firstname and its length > 3, then ~ 

 

type에 대한 검증 + 그게 맞다면 p라는 valiable로 새롭게 create하고 + 그것의 속성에서 조건을 검증 

 

=> pretty advanced features 

 

 

또한 traditionally null을 다루지 못했는데 

 

with this preview implementation, it is possible. 

 

 

 

 

 

 

 

public class PatternMatching {
    public static void main(String[] args) {
        record Person(String firstName, String lastName, int age){}
        String var1 = "Hello World";
        Integer var2 = 34;
        String[] var3 = {"hello", "world"};
        Person var4 = new Person("Jake", "Johnson", 49);
        Person var5 = new Person("Abe", "HON",30);

        Object obj = var2;
        switch (obj){
            case String msg -> System.out.println(msg);
            case Integer num -> System.out.println("Your name is");
            case Person p && p.firstName().length() > 3 -> System.out.println("you probably are");
            case String[] arr -> System.out.println("Looks like");
            case null -> System.out.println("It's null");
            case default -> System.out.println("Have no idea");
        }
    }
}

 

 


 

 

반응형