🌱Backend/Java

#3. Java - 1 κΈ°μ΄ˆλ¬Έλ²•

JiwonDev 2021. 7. 1. 05:38

# IntelliJ

introduce value, reformat file, line duplicate, line delete

javadocs plugins

# λͺ¨λ˜ μžλ°”, Java 8~

2014λ…„, Java8 (1.8)이 λ‚˜μ˜€κΈ° μ „κΉŒμ§€λŠ” μžλ°”λŠ” μ—…λ°μ΄νŠΈλ₯Ό μžμ£Όν•˜μ§€ μ•Šμ•˜λ‹€. ν•˜λ”λΌλ„ 크게 μƒˆλ‘œμš΄ κ°œλ…λ„ μ—†μ—ˆλ‹€. ν•˜μ§€λ§Œ Java 8 μ—μ„œ μ•„λž˜μ™€ 같은 λͺ¨λ˜ν•œ μ–Έμ–΄λ“€μ˜ κΈ°λŠ₯듀이 많이 μΆ”κ°€λ˜μ—ˆλŠ”λ° 이 기점을 μ‹œμž‘μœΌλ‘œ 맀년 3μ›”, 9μ›”λ§ˆλ‹€ κΎΈμ€€νžˆ μ—…λ°μ΄νŠΈλ₯Ό ν•΄μ£Όκ³  μžˆλ‹€.

  • λžŒλ‹€ ν‘œν˜„μ‹
  • λ©”μ†Œλ“œ 레퍼런슀
  • 슀트림 API
  • Optional

μ§€κΈˆ ν˜„μ—…μ—μ„œ μ‚¬μš©ν•˜λŠ” λͺ¨λ˜ μžλ°”λŠ” Java 8μ—μ„œ λ‚˜μ˜¨ μƒˆλ‘œμš΄ κ°œλ…μ„ ν¬ν•¨ν•˜μ—¬ μ‚¬μš©ν•˜κ³  μžˆλ‹€. 참고둜 μ§€κΈˆ κ°€μž₯ 많이 μ‚¬μš©ν•˜λŠ” LTS(Long-Term-Service)버전은 Java11이고 ν˜„μž¬ Java17버전을 LTS둜 μ—…λ°μ΄νŠΈ ν•  μ˜ˆμ •μ΄λΌκ³  ν•œλ‹€.

 

ν•΄λ‹Ή κΈ€μ—μ„œλŠ” μžλ°”μ˜ κΈ°λ³ΈκΈ°λ₯Ό 닀루고, λͺ¨λ˜ Java의 κΈ°λŠ₯듀은 λ‹€μŒ 글에 λ”°λ‘œ 닀루겠닀.


# Hello World

μžλ°”μ—μ„œλŠ” λͺ¨λ“  것이 ν΄λž˜μŠ€μ΄λ‹€. ν•˜λ‚˜μ˜ μžλ°” Appμ—μ„œλŠ” μ΅œμ†Œ ν•˜λ‚˜μ˜ Main Method κ°€ ν•„μš”ν•˜λ‹€.

참고둜 λ‚˜μ€‘μ— 배울 μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬ λ“±μ—μ„œλŠ” Main Method κ°€ μ‹œμž‘μ§€μ μ΄ μ•„λ‹Œλ° μ΄λŠ” λ‚˜μ€‘μ— λ°°μš°λ„λ‘ ν•˜μž.

package com.company;

public class Main {

    public static void main(String[] args) {
	// write your code here
        System.out.println("μ•ˆλ…•ν•˜μ„Έμš”");
    }
}

참고둜 μžλ°” κΈ°λ³Έ νŒ¨ν‚€μ§€ (java.lang)λŠ” 기본으둜 import λœλ‹€. κ·Έλž˜μ„œ String, System κ³Ό 같은 ν΄λž˜μŠ€λ“€μ€ λ”°λ‘œ import 문을 적지 μ•Šμ•„λ„ λ°”λ‘œ μ‚¬μš© ν•  수 μžˆλ‹€. 


# 데이터 νƒ€μž…

# κΈ°λ³Έ μžλ£Œν˜•(Primitive)

λ³€μˆ˜ 이름 μ§“λŠ” 방법은 μžλ°” 넀이밍 μ»¨λ²€μ…˜μ„ ν•œλ²ˆ μ°Έκ³ ν•˜μž. μžλ£Œν˜• λ©”λͺ¨λ¦¬ν¬κΈ° ν‘œν˜„ κ°€λŠ₯ λ²”μœ„λŠ” λ‹€μŒκ³Ό κ°™λ‹€. 참고둜 λͺ¨λ“  μš΄μ˜μ²΄μ œμ— λ™μΌν•˜κ²Œ μ μš©λœλ‹€.

μžλ£Œν˜• 크기 (κ³ μ •) λ²”μœ„
byte 1 Byte -128 ~ 127
short 2 Byte -32,768 ~ 32,767
int 4 Byte μ •μˆ˜ (-2,147,483,648 ~ 2,147,483,647 )
long 8 Byte 큰 μ •μˆ˜ (-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807)
char 2 Byte μœ λ‹ˆμ½”λ“œ (#u0000~ #uFFFF)
float 4 Byte μ‹€μˆ˜ (1.4E-45 ~ 3.4028235E38)
double 8 Byte μ‹€μˆ˜ (4.9E-324 ~ 1.7976931348623157E308)
boolean 1 Byte 논리 (true, false)

참고둜 float κ³Ό double은 λΆ€λ™μ†Œμˆ˜μ  방식이라 0을 μ •ν™•ν•˜κ²Œ ν‘œν˜„ν•˜μ§€ λͺ»ν•œλ‹€λŠ”κ±Έ κΈ°μ–΅ν•˜μž.

float 4 Byte λΆ€ν˜Έ(1bit) + μ§€μˆ˜(8bit) + κ°€μˆ˜(23bit) = 32 bit = 4 Byte
double 8 Byte λΆ€ν˜Έ(1bit) + μ§€μˆ˜(11bit) + κ°€μˆ˜(52bit) = 64 bit = 8 Byte

// λ³€μˆ˜μ˜ 이름은 의미λ₯Ό λͺ…ν™•ν•˜κ²Œ μ§“μž.
int accountDoumentCount = 10;
int humonResourceDoumentCount = 20;

for (int i = 0; i < 10; i++){
// λ¬Όλ‘  잠깐 μ‚¬μš©ν•˜λŠ” μ§€μ—­λ³€μˆ˜(i,j,k)κΉŒμ§€ 의미λ₯Ό λΆ€μ—¬ ν•  ν•„μš”λŠ” μ—†λ‹€.
}


#μƒμˆ˜μ™€ 리터널(literal)

μƒμˆ˜μ™€ 리터널을 ν—·κ°ˆλ¦΄ 수 μžˆλŠ”λ°, μƒμˆ˜λŠ” 'μ΄ˆκΈ°ν™” 이후 값이 λ³€ν•˜μ§€ μ•ŠλŠ” 수' 이닀. λ³€μˆ˜λ₯Ό μ„ μ–Έ ν•  λ•Œ final ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•΄ μƒμˆ˜λ‘œ λ§Œλ“€ 수 μžˆλ‹€.

final int DAY_OF_WEEK = 7; // μ°Έκ³ ) κ°€λŠ₯ν•˜λ©΄ μƒμˆ˜κ°’μ€ get λ©”μ„œλ“œλ‘œ μ œκ³΅ν•˜λŠ”κ²Œ μ’‹μŠ΅λ‹ˆλ‹€.

리터널은 말 κ·ΈλŒ€λ‘œ 선언없이 λ°”λ‘œ μ‚¬μš©ν•  수 μžˆλŠ”, 문자 κ·ΈλŒ€λ‘œμ˜(=λ¦¬ν„°λ„ν•œ) μƒμˆ˜λ₯Ό μ˜λ―Έν•œλ‹€. immediate value 라고 ν•˜κΈ°λ„ ν•œλ‹€.

3
"HEllO"
3.213
'H'

 

λ³€μˆ˜λ‘œ μ„ μ–Έν•˜μ§€ μ•Šκ³  λ°”λ‘œ μƒμˆ˜λ‘œ μ‚¬μš©ν•˜λŠ” 값듀도 고유의 데이터 νƒ€μž…μ„ 가진닀.

참고둜 리터널 뒀에 (L, F, D)같은 ν‚€μ›Œλ“œλ₯Ό λΆ™μ—¬ λͺ…μ‹œμ μœΌλ‘œ ν•΄λ‹Ή λ¦¬ν„°λ„μ˜ νƒ€μž…μ„ 지정 해쀄 수 μžˆλ‹€.

object.setNumber(3) // 리터널 '3'의 μžλ£Œν˜•μ€ int이닀.
object.setName("Hello") // 리터널 "Hello"의 ν΄λž˜μŠ€λŠ” String이닀.

object.setNumber(3.0) // 리터널 '3.0'의 μžλ£Œν˜•μ€ int..? float..? double..?
object.setNumber(3.0F) // μ΄λ ‡κ²Œ λͺ…μ‹œμ μœΌλ‘œ Floatν˜• 이라고 μ •ν•΄ 쀄 수 μžˆλ‹€.


int a = 1 // μ†Œμˆ˜μ μ΄ μ—†μœΌλ©΄ intν˜• 리터널이닀. λ”°λ‘œ 리터널 ν‘œμ‹œλ₯Ό ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.
boolean b = true // boolean은 값이 true, false 2κ°œλ°–μ— μ—†μ–΄ λ”°λ‘œ 리터널 ν‘œμ‹œλ₯Ό μ•ˆν•΄λ„ λœλ‹€.

// μ‹€μˆ˜ 리터널을 μ‚¬μš©ν•  λ•ŒλŠ” λ°˜λ“œμ‹œ λͺ…μ‹œμ μœΌλ‘œ ν‘œμ‹œν•΄μ£Όμž.
long count = 10000L;
float f1 = 2.3F;
double d1 = 5.6D;

 


# μ°Έμ‘°ν˜•(Reference)

클래슀λ₯Ό μ •μ˜ν•˜κ³  new ν‚€μ›Œλ“œλ₯Ό 톡해 객체λ₯Ό 생성 ν•  수 μžˆλ‹€.

μžλ°”μ—μ„œλŠ” κΈ°λ³Έ μžλ£Œν˜•μ„ μ œμ™Έν•œ λͺ¨λ“  것을 μ°Έμ‘°ν˜•μœΌλ‘œ μ‚¬μš©ν•œλ‹€. μ‰½κ²Œλ§ν•΄ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό 가지고 μžˆμ§€ μ•Šκ³ , 심볼(=이름)만 가지고 μžˆλ‹€ μ‹€ν–‰ν•˜λŠ” μ‹œμ μ— λ©”λͺ¨λ¦¬μ— μ ‘κ·Όν•œλ‹€λŠ” 말.

//ν΄λž˜μŠ€μ΄λ¦„ 레퍼런슀λͺ… = new ν΄λž˜μŠ€μ΄λ¦„();
MadPlay instance = new MadPlay();

 


# String 클래슀

μžλ°”μ—μ„œλŠ” λ¬Έμžμ—΄μ΄ 클래슀둜 μ œκ³΅λ˜μ–΄μ§„λ‹€. ν•˜μ§€λ§Œ String의 경우 μ˜ˆμ™Έμ μœΌλ‘œ κΈ°λ³Έμžλ£Œν˜• 처럼 new ν‚€μ›Œλ“œ 없이 생성할 수 도 μžˆλŠ”λ°, 이λ₯Ό λ¬Έμžμ—΄ 리터널 생성 방식이라고 ν•˜κ³  new ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œ 것과 λ©”λͺ¨λ¦¬μ— 적재 μž₯μ†Œκ°€ 달라진닀.

// λ‹€λ₯Έ 객체와 λ§ˆμ°¬κ°€μ§€λ‘œ Heap μ˜μ—­μ— ν• λ‹Ήλœλ‹€.
String str1 = new String("madplay");

// 슀트링 μƒμˆ˜κ°’μœΌλ‘œ κ΄€λ¦¬λœλ‹€. String Constant Pool μ΄λΌλŠ” μ˜μ—­μ— μ €μž₯λœλ‹€.
String str2 = "madplay";

String str3 = "madplay"; // κΈ°μ‘΄ "madplay" μƒμˆ˜ μž¬ν™œμš©. str 2μ΄λž‘ 같은 λ©”λͺ¨λ¦¬ μ°Έμ‘°
String str4 = new String("madplay"); // μƒˆλ‘œμš΄ 객체λ₯Ό 생성. str1μ΄λž‘ λ‹€λ₯Έ λ©”λͺ¨λ¦¬ μ°Έμ‘°

 

String이 객체가 μ•„λ‹Œ μƒμˆ˜ 값인 건 μ•„λ‹ˆλ‹€. 기쑴의 객체도 str.intern( ) 을 μ΄μš©ν•΄ μƒμˆ˜λ‘œ 등둝 ν•  μˆ˜μžˆλ‹€.

참고둜 String Constant Pool은 κΈ°μ‘΄μ—λŠ” μƒμˆ˜κ°’ μ „μš© λ©”λͺ¨λ¦¬μ— (Perm μ˜μ—­) λ”°λ‘œ μ €μž₯λ˜μ–΄μ‘ŒλŠ”λ°, λŸ°νƒ€μž„μ€‘ λ©”λͺ¨λ¦¬ μ¦κ°€λ‘œ μΈν•œ OutOfMemory μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¬ 수 μžˆμ–΄ Java6 μ΄ν›„λ‘œλŠ” 객체와 ν•¨κ»˜ Heap λ©”λͺ¨λ¦¬μ˜μ—­μ—μ„œ κ΄€λ¦¬ν•˜κ³  μžˆλ‹€.

 

 


# == κ³Ό equal

String은 값이 μ•„λ‹Œ 객체이닀. 객체에 μžˆμ–΄ (==) 연산은 값이 μ•„λ‹Œ μ£Όμ†Œκ°’μ„ λΉ„κ΅ν•˜λŠ” 연산이닀.

λ§Œμ•½ λ¬Έμžμ—΄ λ¦¬ν„°λ„λ‘œ μ„ μ–Έν–ˆλ‹€λ©΄ 같은 μƒμˆ˜ κ°’ μ£Όμ†Œλ₯Ό κ°€λ₯΄ν‚€κΈ°μ— 값을 비ꡐ할 수 μžˆμ§€λ§Œ, 객체 (new String)둜 λ§Œλ“€μ—ˆλ‹€λ©΄ 정상 μž‘λ™ν•˜μ§€ μ•ŠλŠ”λ‹€. 이 경우 String 객체 λ©”μ„œλ“œ equal을 μ΄μš©ν•˜μ—¬ λ¬Έμžμ—΄ 값을 λΉ„κ΅ν•œλ‹€.

public class MadPlay {
    public static void main(String[] args) {
        String someLiteral = "kimtaeng";
        String someObject = new String("kimtaeng");
        
        System.out.println(someLiteral.equals(someObject)); // print 'true'
        System.out.println(someLiteral == someObject); // print 'false'
        
        System.out.println("kimtaeng" == someLiteral); // print 'true'
        System.out.println("kimtaeng" == someObject); // print 'false'
    }
}


# Array와 java.util.ArrayList

μžλ°”μ—λ„ κΈ°λ³Έ λ°°μ—΄ 객체 (Array)κ°€ μ‘΄μž¬ν•˜λ‚˜, λŒ€λΆ€λΆ„μ˜ 경우 Collection Framework에 μžˆλŠ” (ArrayList)λ₯Ό μ‚¬μš©ν•œλ‹€. λ¬Όλ‘  잘 μ‚¬μš©ν•˜μ§€λŠ” μ•Šλ”λΌλ„ 배열을 μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λŠ”μ§€ μ •λ„λŠ” μ•Œμ•„λ†“μž.

// μ•„λž˜ 3μ½”λ“œμ˜ λ™μž‘μ€ λ™μΌν•˜λ‹€.
String[] myStringArray = new String[3]; // { "", "", "" } 빈 슀트링 생성
String[] myStringArray = new String[]{"a", "b", "c"}; // 슀트링 μ΄ˆκΈ°ν™”
String[] myStringArray = {"a", "b", "c"}; // μžλ°”μ—μ„œ μ œκ³΅ν•˜λŠ” μ΄ˆκΈ°ν™” κΈ°λŠ₯.

// = { "a" ... } 라고 μ μ—ˆλ‹€κ³  ν•΄μ„œ {} 뢀뢄이 μƒμˆ˜, 리터널인건 μ•„λ‹ˆλ‹€. μžλ°”μ—μ„œ μ œκ³΅ν•˜λŠ” 편의기λŠ₯일 뿐.
String[] myStrings;
myStrings = {"a", "b", "c"}; // 컴파일 μ—λŸ¬! λΆˆκ°€λŠ₯ν•œ μ½”λ“œ.
// 이 2κ°œλŠ” 같은 μ½”λ“œμ΄λ‹€. λ‹€λ§Œ νƒ€μž…μ„ ꡬ뢄 μ§“λŠ” int[] a1 κ°€ μΌλ°˜μ μ΄λ‹€.
int[] a1; int a2[];

int[] intArr = {1,2,3};
int[] doubleArr = new double[4];
String[] objArr = new String[5]; //object type

int[] myIntArray = new int[3]; // {0,0,0}이 ν• λ‹Ήλœλ‹€.
int[] myIntArray = {1, 2, 3}; // μ•„λž˜μ™€ 같은 μ½”λ“œμ΄λ‹€. μžλ°”μ˜ μ΄ˆκΈ°ν™” 편의기λŠ₯.
int[] myIntArray = new int[]{1, 2, 3}; // new int[]둜 νƒ€μž…μ„ λͺ…ν™•ν•˜κ²Œ λ‚˜νƒ€λ‚΄μ£Όμ—ˆλ‹€.

// ν•΄λ‹Ή μ½”λ“œλŠ” 컴파일 μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚¨λ‹€. 생성할 λ©”λͺ¨λ¦¬ 크기λ₯Ό μ•Œ 수 μ—†λ‹€.
int badArray[] = new int[]; 

// ν•΄λ‹Ή μ½”λ“œλŠ” 컴파일 μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚¨λ‹€. 
// μ•žμ— μ ν˜€μžˆλŠ” new int[]λŠ” μžλ£Œν˜•μ„ μ§€μ •ν•œ 것이지, 객체의 크기λ₯Ό μ λŠ” 곳이 μ•„λ‹ˆλ‹€.
int badArray[] = new int[3] {1, 2, 3} ; 

// Since Java 8. Doc of IntStream: https://docs.oracle.com/javase/8/docs/api/java/util/stream/IntStream.html
int [] myIntArray = IntStream.range(0, 100).toArray(); // From 0 to 99
int [] myIntArray = IntStream.rangeClosed(0, 100).toArray(); // From 0 to 100
int [] myIntArray = IntStream.of(12,25,36,85,28,96,47).toArray(); // The order is preserved(보쑴).
int [] myIntArray = IntStream.of(12,25,36,85,28,96,47).sorted().toArray(); // Sort
 
// Array도 객체이기에 λ‚΄λΆ€ λ©”μ„œλ“œκ°€ μ‘΄μž¬ν•œλ‹€.
int arr[] = new int[3];
for (int i = 0; i < arr.length; i++) { ... } // length 둜 μ ‘κ·Ό
for (int a : arr) { ... } // iter둜 μ ‘κ·Ό

λ‚˜μ€‘μ— μ»¬λ ‰μ…˜κ³Ό μžλ°” API 클래슀λ₯Ό λ‹€μ‹œ λ‹€λ£¨κ² μ§€λ§Œ, μ»¬λ ‰μ…˜ ν”„λ ˆμž„μ›Œν¬μ— μžˆλŠ” ArrayListλŠ” λ‹€μŒκ³Ό 같이 μ‚¬μš©ν•œλ‹€.

참고둜 java.util μ•ˆμ—λŠ” Arrays, Calendar, Date, StringTokenizer, Random λ“± λ§Žμ€ ν΄λž˜μŠ€λ“€μ΄ μ‘΄μž¬ν•œλ‹€.

import java.util.ArrayList; // ArrayListλ₯Ό Importν•΄μ˜¨λ‹€.

public class Main {
    public static void main(String[] args) {
        ArrayList<Integer> integers1 = new ArrayList<Integer>(); // νƒ€μž… 지정
        ArrayList<Integer> integers2 = new ArrayList<>(); // νƒ€μž… μƒλž΅ κ°€λŠ₯
        ArrayList<Integer> integers3 = new ArrayList<>(10); // 초기 μš©λŸ‰(Capacity) μ„€μ •
        ArrayList<Integer> integers4 = new ArrayList<>(integers1); // λ‹€λ₯Έ Collectionκ°’μœΌλ‘œ μ΄ˆκΈ°ν™”
        
        // Arrays.asListλ₯Ό 톡해 μƒμˆ˜κ°’μ„ μ΄μš©ν•œ μ΄ˆκΈ°ν™”
        // ArraysλŠ” java.util에 μžˆλŠ” μžλ°” API 객체이며 배열을 μ‰½κ²Œ μ‘°μž‘ν•˜κΈ° μœ„ν•œ λ©”μ„œλ“œλ“€μ΄ ν¬ν•¨λ˜μ–΄μžˆλ‹€.
        ArrayList<Integer> integers5 = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5)); 
        
        // ArrayList -> Array
        String[] array = arrayList.toArray(new String[arrayList.size()]);
        
        // Array -> ArrayList, λ¬Όλ‘  κ·Έλƒ₯ for λ…Έκ°€λ‹€λ‘œ λ³€ν™˜ν•΄λ„ λœλ‹€.
        ArrayList<String> arrayList = new ArrayList<>(Arrays.asList(array));
        
        // ArrayListλŠ” μ„±λŠ₯이 μ΅œμ ν™”λ˜μ–΄μžˆκ³ , λ‹€μ–‘ν•œ κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.
        ArrayList<String> colors = new ArrayList<>();
        // add() method
        colors.add("Black");
        colors.add("White");
        colors.add(0, "0λ²ˆμ‚½μž…");
        colors.add(2, "2λ²ˆμ‚½μž…");
        colors.add("Red");

        // set() method
        colors.set(3, "Blue");
        
        // [0λ²ˆμ‚½μž…, Black, 2λ²ˆμ‚½μž…, Blue, Red]
        System.out.println(colors);
    }
}

# 쑰건 (if)

if - if else - else

논리연산을 ν•  λ•ŒλŠ” λ‹€λ₯Έμ–Έμ–΄μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ 이미 닡이 κ²°μ •λ‚¬μœΌλ©΄ 더이상 쑰건을 ν‰κ°€ν•˜μ§€ μ•ŠλŠ”λ‹€. μžλ°”μ—μ„œλŠ” ifλ¬Έμ•ˆμ— boolean νƒ€μž…μ΄ μ•„λ‹Œ λ‹€λ₯Ένƒ€μž…은 컴파일 λ˜μ§€ μ•ŠλŠ”λ‹€.

public class Hello {
    public static void main(String[] args) {
        System.out.println("start");
        // isDone() 은 μ‹€ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€. 이미 μ•žμ—μ„œ false둜 닡이 결정났기 λ•Œλ¬Έ.
        if (isNagive() && isDone()){
            System.out.println("it doesn't print(false)");
        }
        // :: start
        // :: IsNagive
    }

    public static boolean isDone(){
        System.out.println("IsDone");
        return true;
    }

    public static boolean isNagive(){
        System.out.println("IsNagive");
        return false;
    }
}

# 쑰건(switch)

break; κ°€ μ—†μœΌλ©΄ μ•„λž˜ μ½”λ“œλ„ 싀행됨을 μœ μ˜ν•˜μž. μžλ°”λ„ 쑰건으둜 String 을 μ§€μ›ν•œλ‹€. 

package Hello;

public class Hello {
    public static void main(String[] args) {
        int month = 8;
        String monthString = "1μ›”";
        switch (monthString) {
            case "1μ›”":
                monthString = "January";
                break;
            case "2μ›”":
                monthString = "February";
                break;
            default:
                monthString = "May";
                break;
        }
        
        System.out.println(monthString);
    }
}

2020λ…„ Java14 λΆ€ν„° Switch문의 κ°œμ„ λœ 문법을 μ§€μ›ν•œλ‹€. ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ˜ νŒ¨ν„΄λ§€μΉ­μ²˜λŸΌ, break 없이 κ°„κ²°ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€.

public class Hello {
    public static void main(String[] args) {
        // 2020λ…„ java14λΆ€ν„° μ§€μ›ν•˜λŠ” κΈ°λŠ₯이라 아직 잘 μ“°μ΄μ§€λŠ” μ•ŠλŠ”λ‹€.
        String monthString = "1μ›”";
        monthString = switch (monthString) {
            case "1μ›”" -> "January";
            case "2μ›”" -> "February";
            case "3μ›”" -> "March";
            case "4μ›”","5μ›”" -> "4,5μ›”";
            default -> "May";
        };
        
        // μ—΄κ±°ν˜•μ„ μ‚¬μš©ν•˜λ©΄ default 없이 switch문을 μ•ˆμ „ν•˜κ²Œ μ‚¬μš© ν•  수 μžˆλ‹€.
        enum Month { January, February, March, April }
        Month value = Month.January;
        monthString = switch (value) {
            case January -> "January";
            case February -> "February";
            case March -> "March";
            case April -> "4,5μ›”";
        };


        System.out.println(monthString);
    }
}

# 반볡문 (for, while, for-each)

νŠΉλ³„ν•œ 점은 μ—†λ‹€. continue와 breakλ₯Ό μ§€μ›ν•˜λ©° for-eachλŠ” μ΄ν„°λ ˆμ΄ν„°μ²˜λŸΌ μˆœνšŒν•œλ‹€.

String[] numbers = {"one", "two", "three"};

// 고전적인 forλ¬Έ
for(int i=0; i<numbers.length; i++) {
    System.out.println(numbers[i]);
}

// μœ„μ™€ 같은 μ½”λ“œμ΄λ‹€.
for(String number: numbers) {
    System.out.println(number);
}