Java
Java์ฉ์ด์ ๋ฆฌ
๐ก์ด๋ฒ ์ฑํฐ์์ ๋์ค๋ ์ฉ์ด ์ ๋ฆฌ- ๋ฐ์ดํฐ๐ข : ์ปดํจํฐ๊ฐ ์ ๋ณด๋ฅผ ๋ด๋ ์๋ฃ๊ฐ
- ๋ฐ์ดํฐ ํ์ ๐ข(์๋ฃํ) : ๋ฐ์ดํฐ์ ์ ํ ex. ์ ์ / ๋ฌธ์ / ๋ถ๋์์(์์ซ์ )
- ์๋ฃ๊ตฌ์กฐ๐ณ๏ธ : ๋ฐ์ดํฐ ์ฌ๋ฌ๊ฐ๋ฅผ ๋ถ๋ฅํด์ ๋ด์ ์ ์๋ ๋ถ๋ฅํต๐ณ๏ธ
- ๋ฌธ๋งฅ๐ย : ๋ฌธ๋งฅ์ด๋ผ ํจ์ ๊ฐ๋ฐ์ธ์ด๋ก ํํํ ํ๋ก๊ทธ๋จ์ ๋์ ํ๋ฆ์ ์๋ฏธํฉ๋๋ค. ์ด์ผ์ ๊ฐ๊ตฌ ์กฐ๋ฆฝ ์ค๋ช ์, ๋ฐํคํธ ์๋ฆฌ ๋ ์ํผ์ ์กฐ๊ฑด์ ๋ฐ๋ฅธ ๋ฌธ๋งฅ์ด ์๋ฏ์ด ํ๋ก๊ทธ๋จ๋ ๋ฌธ๋งฅ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- ๋ฉ์๋๐ : ๋ฐ์ดํฐ๐ข์ ๋ฌธ๋งฅ๐์ ๊ฐ์ธ๋ ํฌ์ฅ์ง๐ ์ ๋๋ค.
- ๊ณตํต ์คํํ๊ฒฝ๐บ๏ธ : ์ฌ๋ฌ ๊ธฐ๊ธฐ์ ์ด์ํ๊ฒฝ์์ ์คํ ํ ์ ์๋๋ก ํ์ ๊น์์ฃผ๋ ์คํํ๊ฒฝ
- ์ด์ ์ฒด์ ๐ฑ: ๊ธฐ๊ธฐ๊ฐ ํ๋ก๊ทธ๋จ์ ์คํ์ํค๋ ์ด์ํ๊ฒฝ (ex. Window, Android, iOS, Linux โฆ)
Mac ์ JDK ์ค์นํ๊ธฐ
- https://brew.sh/index_ko ์ ์ ์ํ์ฌ Homebrew ์ค์นํ๊ธฐ ๋ช
๋ น์ด
๋ณต์ฌํ๊ธฐ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.

- ํฐ๋ฏธ๋์ ์ด์ด์ ๋ณต์ฌํ ๋ช ๋ น์ด๋ฅผ ๋ถ์ฌ๋ฃ๊ธฐํ๊ณ ์ํฐ๋ฅผ ์ณ์ ์คํํด์ค๋๋ค. (Password ๋ฅผ ์์ฒญํ๋ฉด ์ ๊ธ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํด์ค๋๋ค.)

- ์ด๋ ๊ฒ brew ์ค์น๊ฐ ์๋ฃ๋๋ฉด, JDK ๋ฅผ ์ค์นํ ์ ์ฅ์๋ฅผ brew ๋ฑ๋กํด์ฃผ๋ ์๋ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
brew tap homebrew/cask-versions
- ์ ์ฅ์ ๋ฑ๋ก์ด ์๋ฃ๋๋ฉด ์๋ ๋ช ๋ น์ด๋ฅผ ํตํด JDK ๋ฅผ ์ค์นํด์ค๋๋ค.
brew install --cask temurin17
- ์ค์น๊ฐ ์๋ฃ๋๋ฉด java -version ๋ช ๋ น์ด๋ฅผ ์คํํ์๋ ๋ฒ์ ์ด ๋์ค๋ฉด ์ ์ค์น๋๊ฒ ์ ๋๋ค.
java -version- https://brew.sh/index_ko ์ ์ ์ํ์ฌ Homebrew ์ค์นํ๊ธฐ ๋ช
๋ น์ด
Mac ์ IntelliJ ์ค์นํ๊ธฐ
- ํฐ๋ฏธ๋์ ์ผ๊ณ ์๋ ๋ช ๋ น์ด ์คํ
brew install --cask intellij-idea-ce
- ์ค์น๊ฐ ๋ชจ๋ ์๋ฃ๋๋ฉด ๋ฐฐ๊ฒฝํ๋ฉด์์ IntelliJ ์ฑ ์คํ ํ
New Projectํด๋ฆญํฉ๋๋ค.

- New Project ํ์
์์
Name์ ๋ ฅํด์ฃผ๊ณLocation์~โฉDesktop์ผ๋ก ์ค์ ํCreateํด๋ฆญ (๋ฐฐ๊ฒฝํ๋ฉด์ด ์๋ ๋ค๋ฅธ ๊ฒฝ๋ก์ ํ๋ก์ ํธ๋ฅผ ์ ์ฅํ๊ณ ์ถ์ผ๋ฉด ํด๋ ์์ด์ฝ์ ๋๋ฌ์ ์ง์ ํ๋ฉด ๋ฉ๋๋ค.)
- -1.์์ฑ๋ ํ๋ก์ ํธ์ Main ํ์ผ์ ์ด์ด์ -2.main ์ ์ค๊ดํธ({}) ์ฌ์ด์ ์๋ ์ฝ๋ ์ ๋ ฅ ํ -3.์ค๋ฅธ์ชฝ ์ ์ด๋ก์ ์ฌ์๋ฒํผ ํด๋ฆญํ์ฌ Java ํ๋ก๊ทธ๋จ์ ์คํํ๋ค -4.์๋ ์ฝ์์์ Java ํ๋ก๊ทธ๋จ์ด ์ถ๋ ฅํ ๊ฐ์ ํ์ธํฉ๋๋ค.
System.out.println("Hello world!");
- Hello World! ๊ฐ ์ ์์ ์ผ๋ก ์ถ๋ ฅ๋์์ผ๋ฉด IntelliJ ์ค์น๊ฐ ์๋ฃ๋๊ฒ ์ ๋๋ค.
๊ธฐ๋ณธ์ง์
C์ธ์ด๊ธฐ๋ฅ + ๊ณตํต ์คํํ๊ฒฝ,ํด๋์ค,๊ฐ์ฒด
์๋ฐ ์ฅ์ 5๊ฐ์ง 1. ๊ณ ํต ์คํํ๊ฒฝ์ด ์์ด์ ์ฌ๋ฌ ๊ธฐ๊ธฐ์์ ์คํ์ด ๊ฐ๋ฅ 2. ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์ดํด๋ฐ ์ ์ง๋ณด์๊ฐ ์ฌ์ 3. compiler๊ฐ ๋จผ์ ์ค๋ฅ๋ฅผ ์ฒดํฌํ์ฌ ์์ ์ฑ์ด ๋์ // ๋์ ๋ค๋ฅธ ์ธ์ด๋ณด๋ค ๋ฌด๊ฑฐ์ 4. ๋คํธ์ํฌ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋ฐ ํต์ ๋ฑ์ ์์ ์ ์ฒ๋ฆฌํ๋ API๋ฅผ ์ ๊ณต 5. ๋ค์ํ ๊ฐ๋ฐ ๋๊ตฌ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌJVM
Java Virtual Machine ์๋ฐ ๊ฐ์ ๋จธ์ ๊ฐ์์ ๊ธฐ๊ธฐ๋ฅผ ๋ง๋ค์ด ์ฃผ๋๊ฒ => Javaํ๋ก๊ทธ๋จ์ ์คํ์ํฌ ์ ์๋ ๊ฐ์์ ๊ธฐ๊ธฐ๋ฅผ ๋ง๋ค์ด ์ฃผ๋๊ฒ๋ฐ์ดํธ ์ฝ๋
๋ด๊ฐ ์์ฑํ ์ฝ๋๊ฐ ์ด์์ฒด์ ๊ฐ ์ฝ์ ์ ์๋ ์ฝ๋(๋ฐ์ดํธ ์ฝ๋๐ฌ)๋ก Java ์ปดํ์ผ๋ฌ๊ฐ ๋ณํํ ์ฝ๋๐กJava ์ปดํ์ผ๋ฌ๋?๋ด๊ฐ ์์ฑํ Java ์ฝ๋๋ค(.java ํ์ผ)์ ์ด์์ฒด์ ๊ฐ ์ฝ์ ์ ์๋ ๋ฐ์ดํธ ์ฝ๋๐ฌ(.class ํ์ผ)๋ก ๋ณํํ๋ ๋ณํ๊ธฐ
์ธํฐํ๋ฆฌํฐ๐
Java .class ์ฝ๋ ํด์๊ธฐ
- ์ด์์ฒด์ ๊ฐ ์ฝ์ ๋ฐ์ดํธ ์ฝ๋๐ฌ๋ฅผ ๊ธฐ๊ธฐ(๊ธฐ๊ณ)๊ฐ ์คํํ ์ ์๋ ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญ
JIT ์ปดํ์ผ๋ฌ๐
๋น ๋ฅธ Java .class ์ฝ๋ ํด์๊ธฐ
- ์ธํฐํ๋ฆฌํฐ์ ํจ์จ์ ๋์ฌ์ฃผ๋ ์ํฌํฐ ํด์๊ธฐ
๋ฉ๋ชจ๋ฆฌ ์์ญ๐๏ธ
Java ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์์ญ
- ์ด์์ฒด์ ๋ก ๋ถํฐ JVM์ด ํ ๋น๋ฐ์ ๋ฉ๋ชจ๋ฆฌ ์์ญ
ํด๋์ค ๋ก๋๐
Java .class ๋ฐ์ดํธ ์ฝ๋๐ฌ๋ฅผ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ด๋ ์ด๋ฐ๊ธฐ
- JVM์ผ๋ก class(๋ฐ์ดํธ ์ฝ๋๐ฌ)๋ฅผ ๋ถ๋ฌ์์ ๋ฉ๋ชจ๋ฆฌ๐๏ธ์ ์ ์ฅํจ
๊ฐ๋น์ง ์ปฌ๋ ํฐ๐งน
Java ์ฐ๋ ๊ธฐ ์ฒญ์๊ธฐ
- ๋ฉ๋ชจ๋ฆฌ ์์ญ๐๏ธ์์ ์์ฐ๋ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ํก์ํด๊ฐ๋ ์ฒญ์๊ธฐ
๐กJVM ๋์ดํฐ์์ ํ๋ก๊ทธ๋จ์ด ๋์ํ๋ ํ๋ฆ- ๋์ดํฐ ๊ทธ๋ฆผ์ผ๋ก ํํํ์๋ฉด ํ๋ฆ์ ์๋์ ๊ฐ๋ค.
- ์ฌ๊ธฐ์, Runtime ์ โํ๋ก๊ทธ๋จ์ด ์คํ์ค์ธ ์ํโ๋ฅผ ๋งํฉ๋๋ค.
- ๋ฐ๋ผ์, Runtime ์์คํ ์ โํ๋ก๊ทธ๋จ์ด ์คํ์ค์ธ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ์์คํ โ ์ ๋๋ค.

- ์ข๋ ๊ฐ๋ฐ์๐งโ๐ป์ค๋ฝ๊ฒ ๊ทธ๋ฃน์ง์ด์ ์ ๋ฆฌํ์๋ฉด ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ต๋๋ค.

JRE - Java Runtime Environment ์๋ฐ ์คํ ํ๊ฒฝ - Javaํ๋ก๊ทธ๋จ์ ์คํ๋ง ์ํฌ ์ ์์ - .classํ์ผ๋ง ์คํ ๊ฐ๋ฅํ๋ค ์ฐ๋ฆฌ๊ฐ ์์ฑํ๋๊ฒ์ .javaํ์ผ๋ก JRE๋ง์ผ๋ก๋ ๊ธฐ๋ฅ์ ํ ์ ์๋ค JDK - Java Development Kit ์๋ฐ ๊ฐ๋ฐ ํคํธ - javac๋ช ๋ น์ ํตํด .javaํ์ผ์ .classํ์ผ๋ก ๋ณํ - JRE(JVM)๊ธฐ๋ฅ์ ํฌํจ - ์ฝ๋๋ฅผ ๋๋ฒ๊น ํ๋ jdb๋ฑ์ ๊ธฐ๋ฅ๐ก๋๋ฒ๊น = ์ค๋จ์ ์ผ์์ ์ง + ์ฝ๋ ๋ผ์ธ๋จ์ ์ํ
์๋ฐ ๊ธฐ๋ณธ ๊ตฌ์กฐ
import java.util.Arrays; import java.util.Scanner; // import = im(in) + port(ํญ๊ตฌ) -> ๋ฐ๊นฅ์ชฝ์์ ์์ชฝ์ ๊ฐ์ ธ์ค๊ธฐ // ํด๋์ค // public : (์ ๊ทผ)์ ์ด์ -> ์ด๋๊น์ง ์ ๊ทผํ๊ฒ ํด์ค๊ป์ง public class Main { // ํด๋์ค์ ๋ช ์ .javaํ์ผ๊ณผ ๋์ผํ์ฌ์ผ ํ๋ค // JDK ์ญํ // 1. .java ํ์ผ์ .class ํ์ผ๋ก ๋ณํํ๋ compiler // 2. JRE // 3. JDB : ๋๋ฒ๊น (๋ฒ๊ทธ๋ฅผ ์์ ๊ธฐ์ํด ์ฝ๋๋ฅผ ์ดํผ๋ ๊ณผ์ ) // -> ์น๋ธ๋ผ์ฐ์ ์ฒ๋ผ ํด๋น ์์น์ ์๋ฒ์ ํด๋ฆญํ๊ณ ๋ฒ๋ ๋ชจ์์ ๋๋ฒ๊ทธ ๋งํฌ ํด๋ฆญ ์ด์ด์ ์ฌ์ํ๊ณ ์ถ์ผ๋ฉด ํ๋จ์ผ์ชฝ์ ์ฌ์๋ฒํผ ๋๋ฅด๊ธฐ // () : ์๊ดํธ // {} : ์ค๊ดํธ // [] : ๋๊ดํธ // main ๋ฉ์๋ ๋ถ๋ถ // ๋ฌด์กฐ๊ฑด main๋ฉ์๋๊ฐ ์์ด์ผํ๋ค // ์๋ฐ ํ๋ก์ ํธ(์ฑ)์ ์ ์ผ๋จผ์ ํด๋์ค์ main๋ฉ์๋๋ฅผ ์คํ // = JVM์ ์ฝ์ // static : ์ด ํ๋ก๊ทธ๋จ์ด ์์๋ ๋ ๋ฌด์กฐ๊ฑด ์คํ๋๋ค๋ ํํ // input output ํ์ ์ ์ ํ // output // static๋ค์์ ์ค๋๊ณณ์ด ๋ฉ์๋์ ์ถ๋ ฅ ๋ฐ์ดํฐ ํ์ ์ ์ ํจ // void : return์ด ์๋ค // input // String[] args : ๋งค๊ฐ๋ณ์ ์๋ฆฌ // ๋งค๊ฐ๋ณ์ ํ์ ๊ณผ ๋ณ์๋ช ์ ์ง์ // ๋ณ์๋ช ์ ์ ํ์ ์์ public static void main(String[] args) { // ๊ฐ์ฒด : ํน์ง(์์ฑ,๋ณ์), ํ๋(๋ฉ์๋) // ์๋ฐ์์ ํ์ ์์๋ฅผ ํํํ ๋ .์ผ๋ก ๋ค์ด๊ฐ // println -> ์ค๋ฐ๊ฟ // print -> ์ค๋ฐ๊ฟx // ln : line System.out.println("์ผ์ผ์ ์์ด๋ฆฌ ๋๋ ค"); System.out.print("์ฌ๊ธฐ๋ ๋ญ๋"); System.out.println("์ฌ๊ธฐ๋ ๋ญ๋222"); System.out.println(7); System.out.println(3); System.out.println(3.14); System.out.println("์๋นJAVA"); } }
๋ณ์ ์์
// ๋ณ์ : ๋ณํ๋ ๊ฐ // ์์ : ๋ณํ์ง ์๋ ๊ฐ // ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ์ด์ : ์ ์ง๋ณด์๋ฅผ ์ํด // ์ฝ๋๋ฅผ ์์ ํ ๋ ๊ตณ์ด ํ๋ํ๋์ฉ ์์ ํ์ง์๊ณ ๋ณ์ ํ๋๋ง ๋ฐ๊พธ๋ฉด ์๋๊ฐ ๋ณ๊ฒฝ๋๋๋ฑ์ ํธ๋ฆฌ์ฑ๋ ์๋ค // ๋ณ์ int number = 10; System.out.println(number); number = 222; System.out.println(number); // ์์ final int num = 2222; System.out.println(num);
๋ณ์ ํ์ (stack heap)
.png)
๊ธฐ๋ณธํ ๋ณ์ : ๊ฐ์ ์ ์ฅํ๋ ์ ์ฅ๊ณต๊ฐ์ผ๋ก ์ค์ ๊ฐ(๋ฆฌํฐ๋ด)์์ ์ฅ ์ฐธ์กฐํ ๋ณ์ : ์ค์ ๊ฐ์ด ์๋ ์ฃผ์๊ฐ์ ์ ์ฅ ๋ฉ๋ชจ๋ฆฌ๋ ๊ณต๊ฐ๋ง๋ค ์ฃผ์๊ฐ์ ๊ฐ์ง๊ณ ์๋ค - ๊ธฐ๋ณธํ ๋ณ์๋ Stack์์ญ์ ์ ์ธํ ๋ณ์๋งํผ์ ๊ณต๊ฐ์ด ์์ฑ์ด ๋๊ณ ๊ทธ๊ณต๊ฐ ์์ ๊ฐ์ด ๋ค์ด๊ฐ๊ฒ ๋๋ค - ์ฐธ์กฐํ ๋ณ์์ ๊ฒฝ์ฐ ํด๋น ๋ณ์์ ํฌ๊ธฐ๋งํผ ๊ณ ์ ๋ ํฌ๊ธฐ๊ฐ Stack์ ์์ฑ๋๊ณ ์ฃผ์๊ฐ์ด ์ ์ฅ๋๋ค - ๊ทธ๋ฆฌ๊ณ new๋ฅผ ํตํด Heap์์ญ์ ์๋ก์ด ์ ์ฅ๊ณต๊ฐ์ ์์ฑํ๊ฒ ๋๋ค - ๊ณต๊ฐ์ ํฌ๊ธฐ๋ ์ฐ๋ฆฌ๊ฐ ๋ฃ์ผ๋ ค๋ ๊ฐ์ ํฌ๊ธฐ๋งํผ ์์ฑํ๋ค - ์ด ๊ณต๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ์ ํ ๋น๋ฐ๊ฒ๋๋ค ## Heap์์ญ๋ฟ๋ง ์๋๋ผ Stack์์ญ์์ ์์ฑ๋ ๊ณต๊ฐ๋ ์ฃผ์๋ ํ ๋น๋ฐ๋๋ค Stack์ ๊ฒฝ์ฐ์๋ ์ ์ ์ผ๋ก ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ -> ํฌ๊ธฐ๊ฐ ์ ํด์ ธ์๋ ๊ฐ์ ์ ์ฅ Heap์ ๊ฒฝ์ฐ์๋ ๋์ ์ผ๋ก ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ -> ํฌ๊ธฐ๊ฐ ์ ํด์ ธ์์ง ์์ ๊ฐ์ ์ ์ฅ๊ธฐ๋ณธํ ๋ณ์
// boolean boolean flag = true; // 1. ๋ ผ๋ฆฌํ ๋ณ์ boolean ์ผ๋ก ์ ์ธ ๋ฐ True ๊ฐ์ผ๋ก ์ด๊ธฐํ flag = false; // 2. False ๊ฐ์ผ๋ก๋ ์ ์ฅํ ์ ์์ต๋๋ค. // ๋ฌธ์ํ char alphabet = 'A'; // ๋ฌธ์ ํ๋๋ฅผ ์ ์ฅํฉ๋๋ค. ""๋ก ์ ๋ ฅํ๋ฉด ๋ฌธ์์ด๋ก ์ธ์ // ์ ์ํ // ์นด๋ฉ์ผ์ด์ค -> ๋ณ์๋ช ์ค ์ค๊ฐ์ ๋๋ฌธ์๊ฐ ์๋ํํ byte byteNumber = 127; // byte ๋ -128 ~ 127 ๋ฒ์์ ์ซ์๋ง ์ ์ฅ ๊ฐ๋ฅํฉ๋๋ค. 1byte๋ง ํํ ๊ฐ๋ฅ // 1byte = 8bit // bit = 0๊ณผ1์ ํํํ๋ ์ต์๋จ์ // ๋นํธ๋ง๋ค ๋ฆฌ์์ค๋ฅผ ํ์ธํ๋๊ฒ ๋นํจ์จ์ ์ด๋๊น byte๋ฅผ ๋ง๋ฌ // 2์8์ ๊ณฑ -> 256 -> ํํํ ์์๋ ๋ฒ์ -128 ~ 127 short shortNumber = 32767; // short ๋ -32,768~32,767 ๋ฒ์์ ์ซ์๋ง ์ ์ฅ ๊ฐ๋ฅํฉ๋๋ค. int intNumber = 2147483647; // int ๋ -21์ต~21์ต ๋ฒ์์ ์ซ์๋ง ์ ์ฅ ๊ฐ๋ฅํฉ๋๋ค. long longNumber = 2147483647L; // long ์ ์ซ์๋ค์ ์ํ๋ฒณ L ์ ๋ถ์ฌ์ ํ๊ธฐํ๋ฉฐ ๋งค์ฐ ํฐ์๋ฅผ ์ ์ฅ ๊ฐ๋ฅํฉ๋๋ค. // ๋ฐ์ดํฐ๊ฐ(๋ฆฌํฐ๋ด) ๋ค์ ๋ถ์ด๋ ๊ตฌ๋ถ๊ฐ์ โ์ ๋ฏธ์ฌโ๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. // byte -> short(2byte) -> int(4byte) -> long(8bite) // ์ค์ํ float floatNumber = 0.123F; // float ๋ 4byte ๋ก 3.4 * 10^38 ๋ฒ์๋ฅผ ํํํ๋ ์ค์๊ฐ double doubleNumber = 0.123123123; // double ์ 8byte ๋ก 1.7 * 10^308 ๋ฒ์๋ฅผ ํํํ๋ ์ค์๊ฐ
์ฐธ์กฐํ ๋ณ์
// ๊ธฐ๋ณธํ์ ์ ์ธํ ๋๋จธ์ง๋ค ์ด์ธ์๋ ๋ง๋ค // ๋ฌธ์์ด String hello = "์ผ์ผ์ผ์ผ์ผ์ผใ ์ผ์"; System.out.println(hello); // ๋ฐฐ์ด int[] arr = {1,2,3,4,5}; System.out.println(arr[0]); System.out.println(Arrays.toString(arr));
๋ ํผํด๋์ค ๋ณ์
๊ธฐ๋ณธํ ๋ณ์๋ฅผ ํด๋์ค๋ก ๋ฉํํ๋ ๋ณ์ - ํด๋นํ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ฅ์ ๊ธฐ๋ณธ ํ์ ๋ํผ ํด๋์ค byte Byte short Short int Integer long Long float Float double Double char Character boolean Boolean
์์คํค ์ฝ๋

// ์ซ์ -> ๋ฌธ์ import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int asciiNumber = sc.nextInt(); char ch = (char)asciiNumber; // ๋ฌธ์๋ก ํ๋ณํ์ ํด์ฃผ๋ฉด ์ซ์์ ๋ง๋ ๋ฌธ์๋ก ํํ๋ฉ๋๋ค. System.out.println(ch); } } // ์ ๋ ฅ 97 // ์ถ๋ ฅ a// ๋ฌธ์ -> ์ซ์ import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); char letter = sc.nextLine().charAt(0); // ์ฒซ๋ฒ์งธ ๊ธ์๋ง ๋ฐ์์ค๊ธฐ์ํด charAt(0) ๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. int asciiNumber = (int)letter; // ์ซ์๋ก ํ๋ณํ์ ํด์ฃผ๋ฉด ์ ์ฅ๋์ด์๋ ์์คํค ์ซ์๊ฐ์ผ๋ก ํํ๋ฉ๋๋ค. System.out.println(asciiNumber); } } // ์ ๋ ฅ a // ์ถ๋ ฅ 97
๋ฌธ์์ ๋ฌธ์์ด
๋ฌธ์๋ ์ ์ธํ ๋ ''๋ฅผ ์ฌ์ฉํด์ผํ๋ค ๋ฌธ์์ด์ ๊ฒฝ์ฐ ""๋ฅผ ์ฌ์ฉํ๋ค ๋ฌธ์ ๋ค์๋ \0(๋๋ฌธ์)๊ฐ ์๋ค -> 1byte๋ง ์ฐ๊ธฐ ๋๋ฌธ์ ๋์ ์ ์ ์์ด์ ๋ฌธ์์ด์ ๊ฒฝ์ฐ ๋๋ฌธ์์ ํจ๊ป์ ์ฅ๋๋๋ฐ ๋ช๊ฐ์ byte๋ฅผ ์ฌ์ฉํ๊ฒ ๋ ์ง ๋ชจ๋ฅด๊ธฐ๋๋ฌธ์ด๋ค.png)
Scanner ํด๋์ค
- java.util ํจํค์ง ๋ด์์ ์กด์ฌํ๋ ํด๋์ค
- ์ ์,์ค์๋ฑ์ ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํฐ ํ์ ์ ๋ ฅ์ ๋ฐ๊ธฐ์ํ ํด๋์ค
- ๋ฌธ์์ด,ํ์ค(์ํฐํค ๊ธฐ์ค)์ ๋ชจ๋ ์ฝ๊ธฐ ์ํด์๋ nextLine()ํจ์๋ฅผ ์ฌ์ฉ
- ๋จ์ผ ๋ฌธ์(char)๋ฅผ ์ฝ๊ธฐ ์ํด์ next()์ charAt()ํจ์๋ฅผ ํจ๊ป ์ฌ์ฉ ๊ฐ๋ฅ
import java.util.Scanner; public class myScanner { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int i = scanner.nextInt(); char c = scanner.next().charAt(0); long l = scanner.nextLong(); double d = scanner.nextDouble(); String s = scanner.nextLine(); System.out.println("int : " + i); System.out.println("char : " + c); System.out.println("long : " + l); System.out.println("double : " + d); System.out.println("string : " + s); } }- hasNext~()ํจ์๋ฅผ ์ฌ์ฉํ์ฌ, ์ํ๋ ๋งํผ ์ ๋ ฅ์ ๋ฐ์์๋ ์๋ค.
- booleanํ์ ์ผ๋ก ๋ค์์ ๊ฐ์ ธ์ฌ๊ฐ์ด ์์ผ๋ฉด true,์๋๋ฉด false
import java.util.Scanner; public class myScanner { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int i = 0; while(scanner.hasNextInt()) { int num = scanner.nextInt(); i += num; } System.out.println("total : " + i); } }
bit byte
- Bit
- Bit(๋นํธ)๋ 0,1 ํํ์ 2์ง์ ๋ฐ์ดํฐ๋ก์จ ์ปดํจํฐ๊ฐ ์ ์ฅ(ํํ)ํ ์ ์๋ ์ต์ ๋จ์ ์ ๋๋ค.
- ์ ์ํ ๊ฐ์ 10์ง์ ์ซ์(0~10๋ฒ์์ ์ซ์)์ด๋ฉฐ 2์ง์(0~1๋ฒ์)Bit ๋ก ์ ์ฅ(ํํ) ํฉ๋๋ค.
- 4๊ฐ์ Bit๋ก 16์ง์ ์ซ์(0~F(16)๋ฒ์์ ์ซ์)๋ฅผ 2์ง์(0~1๋ฒ์)Bit ๋ก ์ ์ฅ(ํํ) ํฉ๋๋ค.
2์ง์(0~1)๋ฅผ 10์ง์, 16์ง์๋ก ๋ณํ๋ ๊ฐ ์์ ํ
- Byte = 8 Bit
- Byte(๋ฐ์ดํธ)๋ 8๊ฐ์ Bit(๋นํธ)๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
- 1 Byte ๋ด์์ ์ซ์ ๋ณ์๋ Bit 2์ง์๋ฅผ 10์ง์๋ก ์ ์ฅ(ํํ)์ ํฉ๋๋ค.
- 10์ง์๋ก๋ 0~255(2์8์น)๊น์ง ์ ์ฅ(ํํ) ํฉ๋๋ค.
- 1 Byte ๋ด์์ ๋ฌธ์ ๋ณ์์ ๊ฒฝ์ฐ๋ง Bit 2์ง์๋ฅผ 16์ง์๋ก ์ ์ฅ(ํํ)ํฉ๋๋ค
- Bit
ํ๋ณํ
// ํ๋ณํ : ๋ณ์์ ํ์ ์ ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ // ๋ฌธ์์ด -> ์ซ์ // ์ ์ -> ์ค์ // ์ค์ -> ์ ์ double doubleNum = 10.1010101; float floatNum = 10.10101f; int intNum; intNum = (int)doubleNum; System.out.println(intNum); intNum = (int)floatNum; System.out.println(intNum); // ์ ์ -> ์ค์ int intNumber2 = 10; double doubletest = (double) intNumber2; System.out.println(doubletest); float floattest = (float) intNumber2; System.out.println(floattest);// ์์์ ์ธํ๋ณํ : ์๋์ผ๋ก ํ๋ณํ // ๋ณ์ ํ์ ๋ณ ํฌ๊ธฐ ์์ // byte(1) -> short(2) -> int(4) -> long(8) -> float(4) -> double(8) // ํฐํ์ ์ ์์ํ์ ์ ๋ฃ์ด์ฃผ๋ฉด ์๋ํ๋ณํ๊ฐ๋ฅ // byte -> int byte bytenum = 10; int intnum = bytenum; System.out.println("์ฌ๊ธฐ์"+intnum); // char -> int char charalp = 'A'; intnum = charalp; // System.out.println("์ฌ๊ธฐ์"+intnum); // 65 -> ์์คํค์ฝ๋๊ฐ์ถ๋ ฅ // int -> long intnum = 100; long longnum = intnum; System.out.println("์ฌ๊ธฐ์"+intnum); // int -> double intnum = 200; double doublenum = intnum; System.out.println("์ฌ๊ธฐ์"+doublenum); // ์์ ํฌ๊ธฐ์ ํ์ ์ด ํฐ ํฌ๊ธฐ์ ํ์ ๊ณผ ๊ณ์ฐ๋ ๋ // ์๋์ผ๋ก ํฐ ํฌ๊ธฐ์ ํ์ ์ผ๋ก ํ๋ณํ์ด ๋จ intnum = 10; doublenum = 5.5; // double์ด ๋์ปค์ ๋์ค๋ ๊ฐ์ ๋ฐ์ดํฐ ํ์ ์ double๋ก ๋์ด System.out.println(intnum + doublenum); int iresult = intnum/4; System.out.println(iresult); double dresult = intnum/4.0; System.out.println(dresult);
์ฐ์ฐ์
- ์ฐ์ฐ์ : ๋ง์ , ๋บ์ ์ฒ๋ผ ๊ณ์ฐํ ๊ธฐํธ โ
- ํผ์ฐ์ฐ์ : ์ฐ์ฐ์๋ก ์ธํด ๊ณ์ฐ๋๋ ์ซ์ ๐ข
์ฐ์ ์ฐ์ฐ์
- ์ฌ์น ์ฐ์ฐ ๋ฐ ๋นํธ์ฐ์ฐ์ ํฌํจํฉ๋๋ค. (๋นํธ์ฐ์ฐ์ ๋ค๋ฅธ ์ฑํฐ์์ ๋ค๋ค๋ณด์์.)
- ์ฌ์น ์ฐ์ฐ์ ๊ณ์ฐํ ๊ฒฐ๊ณผ๊ฐ์ ์๋ตํฉ๋๋ค.
+(๋ง์ ),-(๋บ์ ),*(๊ณฑ์ ),/(๋๋์ /๋ชซ),%(๋๋์ /๋๋จธ์ง)
// ์ฌ์น ์ฐ์ฐ System.out.println(4 + 2); // 6 System.out.println(4 - 2); // 2 System.out.println(4 * 2); // 8 System.out.println(4 / 2); // 2 System.out.println(5 / 2); // 2 System.out.println(2 / 4); // 0 System.out.println(4 % 2); // 0 System.out.println(5 % 2); // 1 // ์ฐ์ ์์ ์ฐ์ฐ System.out.println(2 + 2 * 2); // 6 System.out.println((2 + 2) * 2); // 8 System.out.println(2 + (2 * 2)); // 6 // ๋ณ์๋ฅผ ์ด์ฉํ ์ฐ์ฐ int a = 20; int b = 10; int c; // ๋ง์ c = a + b; System.out.println(c); // 30 // ๋บ์ c = a - b; System.out.println(c); // 10 // ๊ณฑ์ c = a * b; System.out.println(c); // 200 // ๋๋์ (๋ชซ) c = a / b; System.out.println(c); // 2 // ๋๋์ (๋๋จธ์ง) = ๋๋จธ์ง ์ฐ์ฐ c = a % b; System.out.println(c); // 0
๋น๊ต ์ฐ์ฐ์
- ๊ฐ์ ํฌ๊ณ /์์์ ๋น๊ตํ๊ฑฐ๋ ๊ฐ๊ณ /๋ค๋ฆ ์ ๋น๊ตํ์ฌ ์ฐธ(true)/๊ฑฐ์ง(false) ๊ฐ์ธ boolean ๊ฐ์ ์ถ๋ ฅํฉ๋๋ค.
>(ํฌ๋ค) ,<(์๋ค),>=(ํฌ๊ฑฐ๋ ๊ฐ๋ค),<=(์๊ฑฐ๋ ๊ฐ๋ค),==(๊ฐ๋ค),!=(๋ค๋ฅด๋ค)
// ๋น๊ต ์ฐ์ฐ์ (์ฐธ์ด๋ฉด true, ๊ฑฐ์ง์ด๋ฉด false) System.out.println(10 > 9); // 10 ๋ 9 ๋ณด๋ค ํฌ๋ค (์ฐธ์ด๋ฉด true, ๊ฑฐ์ง์ด๋ฉด false) System.out.println(10 >= 9); // 10 ๋ 9 ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๋ค (true) System.out.println(10 < 9); // 10 ๋ 9 ๋ณด๋ค ์๋ค (false) System.out.println(10 <= 9); // 10 ๋ 9 ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค (false) System.out.println(10 == 10); // 10 ๋ 10 ์ ๊ฐ๋ค (true) System.out.println(10 == 9); // 10 ๋ 9 ๊ณผ ๊ฐ๋ค (false) System.out.println(10 != 10); // 10 ๋ 10 ์ ๊ฐ์ง ์๋ค (false) System.out.println(10 != 9); // 10 ๋ 9 ๊ณผ ๊ฐ์ง ์๋ค (true)
๋ ผ๋ฆฌ ์ฐ์ฐ์
- ๋น๊ต ์ฐ์ฐ์ ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ๋ฐ์ ์ ์๋ boolean ๊ฐ์ ์ฐ๊ฒฐํ๋ ์ฐ์ฐ์ ์ ๋๋ค.
- ์กฐ๊ฑด์ ์ฐ๊ฒฐ ํ์์๋์ boolean ๊ฐ๋ค์ ์กฐํฉํ์ฌ ์ฐธ(true)/๊ฑฐ์ง(false) ๊ฐ์ธ boolean ๊ฐ์ ์ถ๋ ฅํฉ๋๋ค.
&&(AND = ํผ์ฐ์ฐ์ ๋ชจ๋ ์ฐธ),||(OR = ํผ์ฐ์ฐ์ ๋์ค ํ๋๋ผ๋ ์ฐธ),!(ํผ์ฐ์ฐ์์ ๋ฐ๋ boolean ๊ฐ)
// ๋ ผ๋ฆฌ ์ฐ์ฐ์ boolean flag1 = true; boolean flag2 = true; boolean flag3 = false; System.out.println(flag1); // true System.out.println(flag2); // true System.out.println(flag3); // false // ํผ์ฐ์ฐ์ ์ค ํ๋๋ผ๋ true ์ด๋ฉด true System.out.println(flag1 || flag2); // true System.out.println(flag1 || flag2 || flag3); // true // ํผ์ฐ์ฐ์ ๋ชจ๋ true ์ด๋ฉด true System.out.println(flag1 && flag2); // true (flag1, flag2 ๋ชจ๋ true ๋ผ์) System.out.println(flag1 && flag2 && flag3); // false (flag3์ false ๋ผ์) // And ์ฐ์ฐ System.out.println((5 > 3) && (3 > 1)); // 5 ๋ 3 ๋ณด๋ค ํฌ๊ณ , 3 ์ 1 ๋ณด๋ค ํฌ๋ค (true) System.out.println((5 > 3) && (3 < 1)); // 5 ๋ 3 ๋ณด๋ค ํฌ๊ณ , 3 ์ 1 ๋ณด๋ค ์๋ค (false) // Or ์ฐ์ฐ System.out.println((5 > 3) || (3 > 1)); // 5 ๋ 3 ๋ณด๋ค ํฌ๊ฑฐ๋, 3 ์ 1 ๋ณด๋ค ํฌ๋ค (true) System.out.println((5 > 3) || (3 < 1)); // 5 ๋ 3 ๋ณด๋ค ํฌ๊ฑฐ๋, 3 ์ 1 ๋ณด๋ค ์๋ค (true) System.out.println((5 < 3) || (3 < 1)); // 5 ๋ 3 ๋ณด๋ค ์๊ฑฐ๋, 3 ์ 1 ๋ณด๋ค ์๋ค (false) // System.out.println(1 < 3 < 5); // ๋ถ๊ฐ๋ฅํ ์ฝ๋ // ๋ ผ๋ฆฌ ๋ถ์ ์ฐ์ฐ์ System.out.println(!flag1); // false (flag1 ๊ฐ์ ๋ฐ๋) System.out.println(!flag3); // true (flag3 ๊ฐ์ ๋ฐ๋) System.out.println(!(5 == 5)); // false System.out.println(!(5 == 3)); // true
๋์ ์ฐ์ฐ์
- ๋ณ์๋ฅผ ๋ฐ๋ก ์ฐ์ฐํด์ ๊ทธ์๋ฆฌ์์ ์ ์ฅํ๋ ์ฐ์ฐ์
- ๊ธฐ๋ณธ ๋์
์ฐ์ฐ์์ธ
=์ ๋ค๋ฅธ ์ฐ์ฐ์ ํจ๊ป์ฐ๋ ๋ณตํฉ ๋์ ์ฐ์ฐ์๊ฐ ์์ต๋๋ค. (+=,-=,*=โฆ)
- ๋ณตํฉ ๋์ ์ฐ์ฐ์๋ ๊ธฐ๋ณธ ๋์ ์ฐ์ฐ์๋ฅผ ์ฌํํ๊ฒ ์์ฑํ๊ฒ ํด์ฃผ๋๊ฒ์ด์ง ๊ธฐ๋ฅ์ ๊ฐ์ต๋๋ค.
- ์ถ๊ฐ๋ก,
+= 1๋++๊ณผ ๋์ผํฉ๋๋ค. (ํผ์ฐ์ฐ์์ 1 ๋ํด์ฃผ๊ธฐ)
- ๋๊ฐ์ด
-= 1์โ-์ ๋์ผํฉ๋๋ค. (ํผ์ฐ์ฐ์์ 1 ๋นผ์ฃผ๊ธฐ)
// ๋์ ์ฐ์ฐ์ int number = 10; number = number + 2; System.out.println(number); // 12 number = number - 2; System.out.println(number); // 10 number = number * 2; System.out.println(number); // 20 number = number / 2; System.out.println(number); // 10 number = number % 2; System.out.println(number); // 0 number = number++; System.out.println(number); // 2 number = number--; System.out.println(number); // 0 // ๋ณตํฉ ๋์ ์ฐ์ฐ์ number = 10; number += 2; System.out.println(number); // 12 number -= 2; System.out.println(number); // 10 number *= 2; System.out.println(number); // 20 number /= 2; System.out.println(number); // 10 number %= 2; System.out.println(number); // 0๐ฅ๋์ ์ฐ์ฐ์ ์ค์ ์ฆ๊ฐ ์ฐ์ฐ์ ์ธ๋ ์ฃผ์ํ ์ !++๋๋โ-๋ฅผ ๋ถ์ด๋ฉด ํผ์ฐ์ฐ์๊ฐ 1 ๋ํด์ง๊ฑฐ๋ 1 ๋นผ๊ธฐ๊ฐ ๋๋ค๊ณ ๋ง์๋๋ ธ๋๋ฐ์.
- ์ฃผ์ํ ์ ์, ํผ์ฐ์ฐ์ ๋ค์ ๋ถ์ด๋, ์์ ๋ถ์ด๋์ ๋ฐ๋ผ์ ์ฐ์ฐ์์๊ฐ ๋ฌ๋ผ์ง๋๋ค!!
์ฐ์ฐ์ ์ฐ์ฐ์ ์์น ๊ธฐ๋ฅ ์ฐ์ฐ ์ ++ ++{ํผ์ฐ์ฐ์} ์ฐ์ฐ ์ ์ ํผ์ฐ์ฐ์์ 1 ๋ํด์ค๋๋ค. val = ++num; num๊ฐ+1 ํ์ val๋ณ์์ ์ ์ฅ++ {ํผ์ฐ์ฐ์}++ ์ฐ์ฐ ํ์ ํผ์ฐ์ฐ์์ 1 ๋ํด์ค๋๋ค. val = num++; num๊ฐ์ val๋ณ์์ ์ ์ฅ ํ num+1โ โ{ํผ์ฐ์ฐ์} ์ฐ์ฐ ์ ์ ํผ์ฐ์ฐ์์ 1 ๋นผ์ค๋๋ค. val = โnum; num๊ฐ-1 ํ์ val๋ณ์์ ์ ์ฅโ {ํผ์ฐ์ฐ์}โ ์ฐ์ฐ ํ์ ํผ์ฐ์ฐ์์ 1 ๋นผ์ค๋๋ค. val = numโ; num๊ฐ์ val๋ณ์์ ์ ์ฅ ํ num-1- ์ด์ฒ๋ผ ๋์ ์ฐ์ฐํ ๋ ๋ฟ๋ง์๋๋ผ ์ฐ์ฐ์ ์ง์ ํ ๋๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ /ํ์ ์ฉ์ด ๋๋ฉ๋๋ค.
// ๋์ ์ฆ๊ฐ ์ฐ์ฐ์ public class Main { public static void main(String[] args) { int a = 10; int b = 10; int val = ++a + b--; // a ๋ ์ฐ์ฐ์ ์ +1, b ๋ ์ฐ์ฐํ์ -1 System.out.println(a); // 11 System.out.println(b); // 9 System.out.println(val); // 21 // 11 + 9 ๊ฐ ์ 21์ด ๋์ค๋๊ฑฐ์ฃ ?? // ๊ทธ ์ด์ ๋ // a ๋ val ์ฐ์ฐ์ ์ ++ ๊ฐ ์ํ๋์ด์ 11๋ก ์ฐ์ฐ๋์์ง๋ง // b ๋ val ์ฐ์ฐํ์ -- ๊ฐ ์ํ๋์ด์ ๊ธฐ์กด๊ฐ์ด 10์ผ๋ก ์ฐ์ฐ๋ ํ -- ๊ฐ ์ํ๋์์ต๋๋ค. // ๋ฐ๋ผ์ ์ฐ์ฐ๋ a๊ฐ์ธ 11๊ณผ ์ฐ์ฐ๋๊ธฐ์ b๊ฐ์ธ 10์ด ๋ํด์ ธ์ 21์ด ๋๊ฒ๋๋ค! int c = a--; // c ์ a ๊ฐ ๋์ ํ a-1 (์ฆ, a=10, c=11) int d = ++b; // b ๊ฐ +1 ํ์ d ์ ๋์ (์ฆ, b=10, d=10) int val = c-- * ++d; // c ๋ ์ฐ์ฐํ์ -1, d ๋ ์ฐ์ฐ์ ์ +1 System.out.println(a); // 10 System.out.println(b); // 10 System.out.println(c); // 11 System.out.println(d); // 10 System.out.println(val); // 11 * 11 = 121 // 11 * 10 ์ด ์ 121์ด ๋์ค๋๊ฑฐ์ฃ ?? // ๊ทธ ์ด์ ๋ // c ๋ val ์ฐ์ฐํ์ -- ๊ฐ ์ํ๋์ด์ ๊ธฐ์กด๊ฐ์ด 11๋ก ์ฐ์ฐ๋ ํ -- ๊ฐ ์ํ๋์์ง๋ง // d ๋ val ์ฐ์ฐ์ ์ ++ ๊ฐ ์ํ๋์ด์ 11๋ก ์ฐ์ฐ๋์์ต๋๋ค. // ๋ฐ๋ผ์ ์ฐ์ฐ์ a๊ฐ์ธ 11๊ณผ ์ฐ์ฐ๋ b๊ฐ์ธ 11์ด ๊ณฑํด์ ธ์ 121์ด ๋๊ฒ๋๋ค! } }
๊ธฐํ ์ฐ์ฐ์
- ํ๋ณํ ์ฐ์ฐ์
- 1์ผ์ฐจ ๊ฐ์์์ ๋ฐฐ์ด๋ด์ฉ์ผ๋ก ๊ดํธ ์์ ๋ณํํ ํ์ ์ ๋ฃ์ผ๋ฉด ํผ์ฐ์ฐ์์ ํ์ ์ด ๋ณ๊ฒฝ ๋ฉ๋๋ค.
// ํ๋ณํ ์ฐ์ฐ์ int intNumber = 93 + (int) 98.8; // 93 + 98 double doubleNumber = (double) 93 + 98.8; // 93.0 + 98.8
- ์ผํญ ์ฐ์ฐ์
- ๋น๊ต ์ฐ์ฐ์ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐ๋ผ ์๋ตํ ๊ฐ์ ์ง์ ์ง์ ํ ์ ์๋ ์ฐ์ฐ์ ์ ๋๋ค.
- ์ผํญ ์ฐ์ฐ์๋ 3๊ฐ์ง ํผ์ฐ์ฐ์๊ฐ ์กด์ฌํ์ฌ ์ผํญ ์ฐ์ฐ์ ๋ผ๊ณ ํฉ๋๋ค. (
์กฐ๊ฑด/์ฐธ๊ฒฐ๊ณผ/๊ฑฐ์ง๊ฒฐ๊ณผ)
(์กฐ๊ฑด)?(์ฐธ๊ฒฐ๊ณผ):(๊ฑฐ์ง๊ฒฐ๊ณผ)
// ์ผํญ ์ฐ์ฐ์ int x = 1; int y = 9; boolean b = (x == y) ? true : false; System.out.println(b); // false String s = (x != y) ? "์ ๋ต" : "๋ก"; System.out.println(s); // ์ ๋ต int max = (x > y) ? x : y; System.out.println(max); // 9 int min = (x < y) ? x : y; System.out.println(min); // 1
- instance of ์ฐ์ฐ์
(๊ฐ์ฒด๋ช )instance of(ํด๋์ค๋ช )
- ๊ฐ์ฒด ํ์ ์ ํ์ธํ๋ ์ฐ์ฐ์
- ํ๋ณํ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ํ์ธํ์ฌ true/false ๊ฒฐ๊ณผ ๋ฐํ
- ์ฃผ๋ก ์์ ๊ด๊ณ์์ ๋ถ๋ชจ๊ฐ์ฒด์ธ์ง ์์ ๊ฐ์ฒด์ธ์ง ํ์ธํ๋ ๋ฐ ์ฌ์ฉ
class Parent{} class Child extends Parent{} public class InstanceofTest { public static void main(String[] args){ Parent parent = new Parent(); Child child = new Child(); System.out.println( parent instanceof Parent ); // true System.out.println( child instanceof Parent ); // true System.out.println( parent instanceof Child ); // false System.out.println( child instanceof Child ); // true } } // 1๋ฒ์ ๊ฐ์๊ฑฐ๋๊น true // 2๋ฒ์ child๊ฐ Parent๋ฅผ ์์ํ์ผ๋๊น true // 3๋ฒ์ parent๋ ๋ถ๋ชจ ์ด๋๊น Child๊ฐ ๋์ฒ๋ถ๊ฐ๋ฅ false // 4๋ฒ์ ๊ฐ์ผ๋๊น true
- ํ๋ณํ ์ฐ์ฐ์
์ฐ์ฐ์ ์ฐ์ ์์
๐์ฐ์ฐ์ ์ฐ์ ์์ : ์ฐ์ > ๋น๊ต > ๋ ผ๋ฆฌ > ๋์- ์ฐ์ฐ์ ์ฌ๋ฌ๊ฐ๊ฐ ํจ๊ป ์๋ ์ฐ์ฐ์ ๊ณ์ฐํ ๋๋ ์ฐ์ ์์๊ฐ ์์ต๋๋ค.
- ์ ์ฐ์ ์์์ ๋ฐ๋ผ์ ์ต์ข ์ ์ธ ์๋ต๊ฐ์ด ๊ฒฐ์ ๋ฉ๋๋ค.
- ๋จ, ๊ดํธ๋ก ๊ฐ์ธ์ฃผ๋ฉด ๊ดํธ์์ ์ฐ์ฐ์ด ์ต์ฐ์ ์์๋ก ๊ณ์ฐ๋ฉ๋๋ค.
// ์ฐ์ฐ์ ์ฐ์ ์์ int x = 2; int y = 9; int z = 10; boolean result = x < y && y < z; // <,> ๋น๊ต์ฐ์ฐ์ ๊ณ์ฐ ํ && ๋ ผ๋ฆฌ ์ฐ์ฐ์ ๊ณ์ฐ System.out.println(result); // true result = x + 10 < y && y < z; // +10 ์ฐ์ ์ฐ์ฐ์ ๊ณ์ฐ ํ <,> ๋น๊ต์ฐ์ฐ์ ๊ณ์ฐ ํ && ๋ ผ๋ฆฌ ์ฐ์ฐ์ ๊ณ์ฐ System.out.println(result); // false result = x + 2 * 3 > y; // ์ฐ์ ์ฐ์ฐ์ ๊ณฑ์ผ > ๋ง์ ์์ผ๋ก ๊ณ์ฐ ํ > ๋น๊ต์ฐ์ฐ์ ๊ณ์ฐ System.out.println(result); // false (8>9) result = (x + 2) * 3 > y; // ๊ดํธ์ ๋ง์ ์ฐ์ฐ ํ ๊ดํธ ๋ฐ ๊ณฑ์ ๊ณ์ฐ ํ > ๋น๊ต์ฐ์ฐ์ ๊ณ์ฐ System.out.println(result); // true (12>9)
์ฐ์ ๋ณํ
๐์ฐ์ฐ ์ ์ ํผ์ฐ์ฐ์์ ํ์ ์ ์ผ์น์ํค๋ ๊ฒ- ๋ ํผ์ฐ์ฐ์์ ํ์ ์ ๊ฐ๊ฒ ์ผ์น์ํจ๋ค. (๋์ค์ ์ ์ฅ๊ณต๊ฐ ํฌ๊ธฐ๊ฐ ๋ ํฐ ํ์ ์ผ๋ก ์ผ์น
- ํผ์ฐ์ฐ์์ ํ์
์ด
int๋ณด๋ค ์์shortํ์ ์ด๋ฉดint๋ก ๋ณํ
- ํผ์ฐ์ฐ์์ ํ์
์ด
long๋ณด๋ค ์์int,shortํ์ ์ด๋ฉดLong์ผ๋ก ๋ณํ
- ํผ์ฐ์ฐ์์ ํ์
์ด
float๋ณด๋ค ์์long,int,shortํ์ ์ด๋ฉดfloat์ผ๋ก ๋ณํ
- ํผ์ฐ์ฐ์์ ํ์
์ด
double๋ณด๋ค ์์float,long,int,shortํ์ ์ด๋ฉดdouble์ผ๋ก ๋ณํ
- ์ด์ฒ๋ผ, ๋ณ์์ฌ๋ฌ๊ฐ๋ฅผ ์ฐ์ฐํ์๋ ๊ฒฐ๊ณผ๊ฐ์ ํผ์ฐ์ฐ์ ์ค ํํ ๋ฒ์๊ฐ ๊ฐ์ฅ ํฐ ๋ณ์ ํ์ ์ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.
// ์ฐ์ ๋ณํ public class Main { public static void main(String[] args) { short x = 10; int y = 20; int z = x + y; // ๊ฒฐ๊ณผ๊ฐ์ ๋ ํฐ ํํํ์ ์ธ int ํ์ ์ ๋ณ์๋ก๋ง ์ ์ฅํ ์ ์์ต๋๋ค. long lx = 30L; long lz = z + lx; // ๊ฒฐ๊ณผ๊ฐ์ ๋ ํฐ ํํํ์ ์ธ long ํ์ ์ ๋ณ์๋ก๋ง ์ ์ฅํ ์ ์์ต๋๋ค. float fx = x; // ๊ฒฐ๊ณผ๊ฐ์ ๋ ํฐ ํํํ์ ์ธ float ํ์ ์ ๋ณ์๋ก๋ง ์ ์ฅํ ์ ์์ต๋๋ค. float fy = y; // ๊ฒฐ๊ณผ๊ฐ์ ๋ ํฐ ํํํ์ ์ธ float ํ์ ์ ๋ณ์๋ก๋ง ์ ์ฅํ ์ ์์ต๋๋ค. float fz = z; // ๊ฒฐ๊ณผ๊ฐ์ ๋ ํฐ ํํํ์ ์ธ float ํ์ ์ ๋ณ์๋ก๋ง ์ ์ฅํ ์ ์์ต๋๋ค. System.out.println(lz); System.out.println(fx); System.out.println(fy); System.out.println(fz); } }
๋นํธ ์ฐ์ฐ
<<(์ผ์ชฝ์ผ๋ก ์๋ฆฌ์ ์ฎ๊ธฐ๊ธฐ),>>(์ค๋ฅธ์ชฝ์ผ๋ก ์๋ฆฌ์ ์ฎ๊ธฐ๊ธฐ)
- 0,1 ์ 2์ง์ ๊ฐ์ด๊ธฐ ๋๋ฌธ์,
- ์๋ฆฌ์๋ฅผ ์ผ์ชฝ์ผ๋ก ์ฎ๊ธฐ๋ ํ์๋งํผ 2์ ๋ฐฐ์๋ก ๊ณฑ์ ์ด ์ฐ์ฐ๋๋๊ฒ๊ณผ ๋์ผํฉ๋๋ค.
- ์๋ฆฌ์๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ์ฎ๊ธฐ๋ ํ์๋งํผ 2์ ๋ฐฐ์๋ก ๋๋์ ์ด ์ฐ์ฐ๋๋๊ฒ๊ณผ ๋์ผํฉ๋๋ค.
// ๋นํธ ์ฐ์ฐ System.out.println(3 << 2); // 3์ ์ด์ง์๋ 11 11์ ์ผ์ชฝ์ผ๋ก 2๋ฒ์ด๋ 1100 // 2์ ์์น์ 0 2์ 1์น์ 0 2์2์น์ 1 2์3์น์ 1 // 8 + 4 = 12 System.out.println(3 << 1); // 3์ ์ผ์ชฝ์ผ๋ก 1๋งํผ ๋นํธ์ฐ์ฐ ํด๋ฌ๋ผ๋ ์๋ฏธ // 110 // 4 + 2 = 6
์กฐ๊ฑด๋ฌธ
// if if(flag){ System.out.println("์ ๋ต์ ๋๋ค"); } else if (4 > 3) { System.out.println("์ฌ๊ธฐ๋ ์คํํด์ฃผ์ธ์"); }else { System.out.println("์ฌ๊ธฐ๊ฐ ๋ง์ง๋ง์ ๋๋ค!!"); } // switch / case int num = 11; String result; switch (num){ case 1: result = "1์ด์ ๋ต์ด๋"; break; case 2: result = "2๊ฐ์ ๋ต์ด๋"; break; default:result = "๊ฒฐ๊ตญ 11์ด๋"; } System.out.println(result); // ๊ฐ์ ๋ switch๋ฌธ switch (operationInput){ case "+" -> this.calculator.setOperation(new AddOperation()); case "-" -> this.calculator.setOperation(new SubstractOperation()); case "*" -> this.calculator.setOperation(new MultiplyOperation()); case "/" -> this.calculator.setOperation(new DivideOperation()); }
๋ฐ๋ณต๋ฌธ
// for int[] arr = {1,2,3,4,5}; for(int i = 0; i < arr.length; i++){ System.out.println(arr[i]); } // ์ต์ for for(int i : arr){ System.out.println(i); // ์ด๊ธฐ๊ฐ์ด 0์ผ๋ก ์ค์ ๋๊ณ // ๋ฐฐ์ด๋๊น์ง for๋ฌธ์ด ๋์๊ฐ๋ค // for๋ฌธ์ด ๋์๊ฐ ๋๋ง๋ค ์ค์ ํ ๋ณ์์ ๋ฐฐ์ด๊ฐ์ด ํ ๋น๋๋ค } // while boolean answer = true; int i = 1; while (answer){ if(i < arr.length){ System.out.println("i๊ฐ์ด ์์ง์์ : "+i); i++; } } // do-while // ์ฐ์ฐ์ ํ๋ฒ ์ํ ํ ์กฐ๊ฑด๋ฌธ ์ฒดํฌ int num1 = 4; do{ System.out.println(num1 + "์ถ๋ ฅ" ); }while (num1 < 3);// Objects.equals(์ข,์ฐ) : ์ข์ฐ๊ฐ ๊ฐ์๊ฒฝ์ฐ true ,๋ค๋ฅธ๊ฒฝ์ฐ false // Scanner sc = new Scanner(System.in); // // System.out.print("A ์ ๋ ฅ : "); // String aHand = sc.nextLine(); // A ์ ๋ ฅ // // System.out.print("B ์ ๋ ฅ : "); // String bHand = sc.nextLine(); // B ์ ๋ ฅ // // if (Objects.equals(aHand, "๊ฐ์")) { // ๊ฐ์ ๋น๊ตํ๋ Obects.equals() ๋ฉ์๋ ์ฌ์ฉ // if (Objects.equals(bHand, "๊ฐ์")) { // System.out.println("A ์ B ๋ ๋น๊ฒผ์ต๋๋ค."); // A ์ B ์ ์ ๋ ฅ๊ฐ์ ๋น๊ตํด์ ๊ฒฐ๊ณผ ์ถ๋ ฅ // } else if (Objects.equals(bHand, "๋ฐ์")) { // System.out.println("B ๊ฐ ์ด๊ฒผ์ต๋๋ค."); // } else if (Objects.equals(bHand, "๋ณด")) { // System.out.println("A ๊ฐ ์ด๊ฒผ์ต๋๋ค."); // } else { // System.out.println(" B ์ ์ ๊ฐ์ ์๋ชป ์ ๋ ฅํ์ จ์ต๋๋ค."); // } // } else if (Objects.equals(aHand, "๋ฐ์")) { // if (Objects.equals(bHand, "๊ฐ์")) { // System.out.println("A ๊ฐ ์ด๊ฒผ์ต๋๋ค."); // } else if (Objects.equals(bHand, "๋ฐ์")) { // System.out.println("A ์ B ๋ ๋น๊ฒผ์ต๋๋ค."); // } else if (Objects.equals(bHand, "๋ณด")) { // System.out.println("B ๊ฐ ์ด๊ฒผ์ต๋๋ค."); // } // } else if (Objects.equals(aHand, "๋ณด")) { // if (Objects.equals(bHand, "๊ฐ์")) { // System.out.println("B ๊ฐ ์ด๊ฒผ์ต๋๋ค."); // } else if (Objects.equals(bHand, "๋ฐ์")) { // System.out.println("A ๊ฐ ์ด๊ฒผ์ต๋๋ค."); // } else if (Objects.equals(bHand, "๋ณด")) { // System.out.println("A ์ B ๋ ๋น๊ฒผ์ต๋๋ค."); // } // }
break continue
// break ๋ช ๋ น ๋ฒ์ for (int i = 0; i < 10; i++) { System.out.println("i: " + i); if (i == 2) { break; // i ๊ฐ 2์ผ๋ ๊ฐ์ฅ ๋ฐ๊นฅ ๋ฐ๋ณต๋ฌธ์ด ์ข ๋ฃ๋ฉ๋๋ค. } for (int j = 0; j < 10; j++) { System.out.println("j: " + j); if (j == 2) { break; // j ๊ฐ 2์ผ๋ ๊ฐ์ฅ ์์ชฝ ๋ฐ๋ณต๋ฌธ์ด ์ข ๋ฃ๋ฉ๋๋ค. } } } // ์ถ๋ ฅ // i: 0 // ๋ฐ๊นฅ ๋ฐ๋ณต๋ฌธ ๋ถํฐ ์ํ ์์ // j: 0 // ์์ชฝ ๋ฐ๋ณต๋ฌธ 1ํ์ฐจ ์ํ // j: 1 // j: 2 // j ๊ฐ 2์ผ๋ ์์ชฝ ๋ฐ๋ณต๋ฌธ break; // i: 1 // ๋ฐ๊นฅ ๋ฐ๋ณต๋ฌธ์ ์์ง break; ํธ์ถ์ด ์๋ฌ์ผ๋ฏ๋ก ๋ค์ ๋ฐ๋ณต์ํ // j: 0 // ์์ชฝ ๋ฐ๋ณต๋ฌธ 2ํ์ฐจ ์ํ // j: 1 // j: 2 // j ๊ฐ 2์ผ๋ ์์ชฝ ๋ฐ๋ณต๋ฌธ ๋๋ฒ์งธ break; // i: 2 // i ๊ฐ 2์ผ๋ ๋ฐ๊นฅ ๋ฐ๋ณต๋ฌธ๋ break; ํธ์ถ๋์ด ์ข ๋ฃ// continue ๋ช ๋ น int number = 0; while(number < 3) { number++; if (number == 2) { continue; // 2์ผ๋ ๋ฐ๋ณต ํจ์ค // ๋ฐ๊นฅ์ชฝ ๋ถ๋ถ์ด ํจ์ค๋จ // ๋ฐ๋ก ๋ค์ ๋ฐ๋ณต๋ฌธ์ผ๋ก ๋์ด๊ฐ // ํด๋น ๋ถ๋ถ์ ์คํต๋๋ค๋ ์๋ฏธ } System.out.println(number + "์ถ๋ ฅ"); } // ์ถ๋ ฅ // 1์ถ๋ ฅ // 3์ถ๋ ฅ
๋ฐฐ์ด
1์ฐจ์
// ์ ์ธ ๋ฐฉ์ 2๊ฐ์ง int [] num; int num2 []; // ๋ฐฐ์ด์์น๊ฐ์ 0๋ถํฐ์์ // Arrays.fill -> ์ด๊ธฐํ num = new int[5]; // ๋ฐฐ์ด์ ํฌ๊ธฐ ๊ฒฐ์ ์ด๊ธฐ๊ฐ์ผ๋ก 0์ด๋ค์ด๊ฐ for(int i =0; i < num.length; i++){ num[i] = i; System.out.println(num[i]); } for (int i : num){ // mapํจ์ ์ฌ์ฉ๋ฒ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ํธํจ System.out.println(i); } int [] num3 = {1, 2, 3, 4, 5}; // ์ ์ธ๊ณผ ๋์์ ๊ฐ์ง์ด๋ฃ์ Arrays.fill(num3,22); // 22๋ก ์ ๋ถ ๋ณํ for(int i : num3){ System.out.println(i); }
2์ฐจ์ / 3์ฐจ์
// 2์ฐจ์ ๋ฐฐ์ด ์ ์ธ ๋ฐฉ์ // - int[][] array // - int array[][] // - int[] array[] // ์ค๊ดํธ๋ฅผ ์ฌ์ฉํด ์ด๊ธฐํ int[][] array = { {1, 2, 3}, {4, 5, 6} }; // ๋ฐ๋ณต๋ฌธ์ ํตํ ์ด๊ธฐํ int[][] array2 = new int[2][3]; // ์ต์ด ์ ์ธ for (int i = 0; i < array2.length; i++) { for (int j = 0; j < array2[i].length; j++) { System.out.println("ํ์ธ : " + i + "//" + j); array2[i][j] = 0; // i, j ๋ ์ ๋ ธ๋์ ๋ค๋ชจ๋ฐ์ค ์์์๋ ์ซ์๋ฅผ ์๋ฏธํ๋ฉฐ ์ธ๋ฑ์ค ๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. } } // 3์ฐจ์ ๋ฐฐ์ด์ ์ดํด // ์ค๊ดํธ 3๊ฐ๋ฅผ ์จ์ 3์ฐจ์ ๋ฐฐ์ด ์ด๊ธฐํ๋ฅผ ํ ์ ์์ต๋๋ค. int[][][] MultiArray = {{{1, 2}, {3, 4}}, {{5, 6}, {7, 8}}};
๊ฐ๋ณ๋ฐฐ์ด
// ๊ฐ๋ณ๋ฐฐ์ด // 2์ฐจ์ ๋ฐฐ์ด ์์ฑ์ ํ๋ง๋ค ๋ค๋ฅธ ๊ธธ์ด๋ฅผ ์ง์ ํด์ค์ ์๋ค // ์ ์ธ ๋ฐ ์ด๊ธฐํ int[][] array = new int[3][]; // ๋ค๋ฅธ ๊ธธ์ด๋ฅผ ์ฃผ๊ณ ์ถ์๋๋ ์ด๋ ๊ฒ ๊ทธ๊ณต๊ฐ์ ํฌ๊ธฐ๋ ์์ฑํด์ฃผ์ง ์๋๋ค // ๋ฐฐ์ด ์์๋ง๋ค ๊ฐ๊ธฐ๋ค๋ฅธ ํฌ๊ธฐ๋ก ์ง์ ๊ฐ๋ฅ array[0] = new int[2]; array[1] = new int[4]; array[2] = new int[1]; // ์ค๊ดํธ ์ด๊ธฐํํ ๋๋ ์์๋ฐฐ์ด๋ค์ ํฌ๊ธฐ๋ฅผ ๊ฐ๊ธฐ ๋ค๋ฅด๊ฒ ์์ฑ ๊ฐ๋ฅ int[][] array2 = { {10, 20}, {10, 20, 30, 40}, {10} }; // ๊ฐ๋ณ 2์ฐจ์ ๋ฐฐ์ด ์กฐํ int[][] array3 = { {10, 20, 30}, {10, 20, 30, 40}, {10, 20} }; for (int i = 0; i < array3.length; i++) { // 1์ฐจ์ ๊ธธ์ด for (int j = 0; j < array3[i].length; j++) { // 2์ฐจ์ ๊ธธ์ด System.out.println(array3[i][j]); // 2์ค ๋ฐ๋ณต๋ฌธ์ผ๋ก i, j ์ธ๋ฑ์ค ์ํ } } // ์ถ๋ ฅ // 10 // 20 // 30 // 10 // 20 // 30 // 40 // 10 // 20
์ต๋ ์ต์๊ฐ ์์
int [] arr = {21,33,555,2,43}; int max = arr[0]; for(int i : arr){ if(max < i){ max = i; } } System.out.println(max); int min = arr[0]; for(int i : arr){ if(min > i){ min = i; } } System.out.println(min);
๊น์ ๋ณต์ฌ ์์ ๋ณต์ฌ
// ๋ฐ๋ก ํ ๋นํ๋ฉด ํด๋น ๋ถ๋ถ์ ์ฃผ์๋ฅผ ๋ณต์ฌํ๋๊ฒ์ด๊ธฐ๋๋ฌธ์ // ํ ๋นํด์ค ๋ณ์๊ฐ ๋ณํ๋ฉด ๊ฐ์ด ๊ฐ์ด ๋ณํ๋ค // ๋๊ฐ์ ๊ฐ์ ๊ฐ์ง๊ณ ์๋๊ฒ ์๋๋ผ ์ฃผ์๊ฐ์ ๊ฐ์ง๋ค int a [] = {1,2,3,4}; int b [] = a; // ์์ ๋ณต์ฌ b[0] = 55; System.out.println(a[0]); System.out.println(b[0]); // ๋๊ฐ ๋ค ๊ฐ์๊ฐ์ ๊ฐ์ง๋ค // ๋์ผํ ์ฃผ์๋ฅผ ๊ฐ์ง๊ธฐ๋๋ฌธ์ ๊ฐ์ญ์ ๊ฐ์ด ๋ณํ๋๊ฒ์ ํ์ธํ ์ ์๋ค // ๊น์ ๋ณต์ฌ // ํ ๋นํด์ค ๋ณ์์ ๋ณ๊ฐ์ ์ฃผ์๋ฅผ ๊ฐ์ง๊ฒ ๋๋ค. int[] a1 = { 1, 2, 3, 4 }; int[] b1 = new int[a.length]; for (int i = 0; i < a1.length; i++) { b1[i] = a1[i]; // ๊น์ ๋ณต์ฌ } b1[0] = 3; // b ๋ฐฐ์ด์ 0๋ฒ์งธ ์๋ฒ๊ฐ์ 3์ผ๋ก ์์ ํ์ต๋๋ค. (1 -> 3) System.out.println(a1[0]); // ์ถ๋ ฅ 1 <- ๊น์ ๋ณต์ฌ๋ฅผ ํ๊ธฐ๋๋ฌธ์ a ๋ฐฐ์ด์ ๊ทธ๋๋ก ์ ๋๋ค. // ๊น์ ๋ณต์ฌ ๋ฉ์๋ // 1. clone() ๋ฉ์๋ int[] a2 = { 1, 2, 3, 4 }; int[] b2 = a2.clone(); // ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ๋๋ค. // ํ์ง๋ง, clone() ๋ฉ์๋๋ 2์ฐจ์์ด์ ๋ฐฐ์ด์์๋ ์์ ๋ณต์ฌ๋ก ๋์ํฉ๋๋ค!! // 2. Arrays.copyOf() ๋ฉ์๋ int[] a3 = { 1, 2, 3, 4 }; int[] b3 = Arrays.copyOf(a3, a3.length); // ๋ฐฐ์ด๊ณผ ํจ๊ป length๊ฐ๋ ๊ฐ์ด ๋ฃ์ด์ค๋๋ค. for(int i:b3){ System.out.println(i); }
๋ฌธ์ ๋ฌธ์์ด
๋ฉ์๋ ์๋ต๊ฐ ํ์ ์ค๋ช length() int ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ ๋ฐํํ๋ค. charAt(int index) char ๋ฌธ์์ด์์ ํด๋น index์ ๋ฌธ์๋ฅผ ๋ฐํํ๋ค. substring(int from, int to) String ๋ฌธ์์ด์์ ํด๋น ๋ฒ์(from~to)์ ์๋ ๋ฌธ์์ด์ ๋ฐํํ๋ค. (to๋ ๋ฒ์์ ํฌํจ๋์ง ์์) equals(String str) boolean ๋ฌธ์์ด์ ๋ด์ฉ์ด ๊ฐ์์ง ํ์ธํ๋ค. ๊ฐ์ผ๋ฉด ๊ฒฐ๊ณผ๋ true, ๋ค๋ฅด๋ฉด false๊ฐ ๋๋ค. toCharArray() char[] ๋ฌธ์์ด์ ๋ฌธ์๋ฐฐ์ด(char[])๋ก ๋ณํํด์ ๋ฐํํ๋ค. new String(char[] charArr) String ๋ฌธ์๋ฐฐ์ด(char[]) ์ ๋ฐ์์ String์ผ๋ก ๋ณต์ฌํด์ ๋ฐํํ๋ค. // ๋ฌธ์(char / 1byte), ๋ฌธ์์ด(string) // ๊ธฐ๋ณธํ ๋ณ์ vs ์ฐธ์กฐํ ๋ณ์ // 1. ๊ธฐ๋ณธํ ๋ณ์๋ '์๋ฌธ์๋ก ์์ํจ' / ์ฐธ์กฐํ์ '๋๋ฌธ์๋ก ์์ํจ' // - Wrapper class์์ ๊ธฐ๋ณธํ ๋ณ์๋ฅผ ๊ฐ์ธ์ค ๋(boxing), int -> Integer // 2. ๊ธฐ๋ณธํ ๋ณ์๋ ๊ฐ ์์ฒด๋ฅผ ์ ์ฅ, ์ฐธ์กฐํ ๋ณ์๋ ๋ณ๋์ ๊ณต๊ฐ์ ๊ฐ์ ์ ์ฅ ํ ๊ทธ ์ฃผ์๋ฅผ ์ ์ฅํจ(=์ฃผ์ํ ๋ณ์) // char < String // String ๊ฐ์ง๊ณ ์๋ ๊ธฐ๋ฅ์ด ๋๋ฌด ๋ง์์ // Wrapper class์๋ ๋น์ทํจ -> ๊ธฐ๋ณธํ ๋ณ์๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ธฐ๋ฅ์ด ์ ํ -> ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ Wrpper์ ๊ฐ์์ผ๋ก์จ, ์ถ๊ฐ๊ธฐ๋ฅ์ ๋ํจ String str ="abcd"; // length int strLength = str.length(); System.out.println(strLength); // 4 // charAt(int index) char strChar = str.charAt(1); System.out.println(strChar); // b // substring (int fromIndex, int toIndex) -> ๋ฌธ์์ด์ ์๋ผ์ ์๋ก์ด str์ ์์ฑ String strsub = str.substring(0,3); System.out.println(strsub); // abc // equals(String str) ์ ๋ ฅ๋ฐ์ ๋ฌธ์์ด๊ณผ ๊ฐ๋ ๋ฌธ์์ด์ ๊ฒฝ์ฐ์ ๋น๊ต์ฐ์ฐ์ String newstr = "abcd"; boolean strEqual = newstr.equals(str); System.out.println(strEqual); // true // toCharArray() : String์ char[]๋ก ๋ณํ char [] strCharArray = str.toCharArray(); // char[] -> String๋ณํ -> char char [] charArray = {'a','b','c'}; String charArrayString = new String(charArray); System.out.println(charArrayString);
๋๊ธฐํ
- ์ฐ๋ ๋๊ฐ ํ๋์ ์์์ ๋๊ณ ์ธ์ฐ์ง ๋ง๊ณ ๋ฝ์ ๊ฐ์ง ์ฐ๋ ๋๋ถํฐ ์ฐจ๋ก๋๋ก ๊ทธ์์์ ์ฐ๊ณ ๋ค์ ์ฐ๋ ๋์๊ฒ ๋ฝ๊ณผ ํจ๊ป ์์์ ๋ฐ๋จํ๋ผ๋ ์๋ฏธ - ๋๊ธฐํ๋ฅผ ์ํด๋ ๋๋ ๋ถ๋ถ์ ๊ดํ ๋๊ธฐํํ๋ฉด ์ฐ๋ ๋๊ฐ ํ๋๋ฐ์ ์ํ๋์ง ๋ชปํ๋ ์ด์๊ฐ ์์์์์๋ฐฉ๋ฒ ์ค๋ช ์๊ณ์์ญ(critical section) ๊ณต์ ์์์ ๋ํด ๋จ ํ๋์ ์ค๋ ๋๋ง ์ ๊ทผํ๋๋ก ํ๋ค. ย (ํ๋์ ํ๋ก์ธ์ค์ ์ํ ์ค๋ ๋๋ง ๊ฐ๋ฅํ๋ค) ๋ฎคํ ์ค (mutex) ๊ณต์ ์์์ ๋ํด ๋จ ํ๋์ ์ค๋ ๋๋ง ์ ๊ทผํ๋๋ก ํ๋ค. ย (์๋ก ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์ํ ์ค๋ ๋๋ ๊ฐ๋ฅ) ์ด๋ฒคํธ (event) ํน์ ํ ์ฌ๊ฑด์ ๋ฐ์์ ๋ค๋ฅธ ์ค๋ ๋์๊ฒ ์๋ฆฐ๋ค. ์ธ๋งํฌ์ด (Semaphore) ํ์ ๋ ๊ฐ์์ ์์์ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ์ฌ์ฉํ๋ ค๊ณ ํ ๋ ์ ๊ทผ์ ์ ํํ๋ค. ๋๊ธฐ ๊ฐ๋ฅ ํ์ด๋จธ (waitableย timer) ํน์ ์๊ฐ์ด ๋๋ฉด ๋๊ธฐ์ค์ด๋ ์ค๋ ๋๋ฅผ ๊นจ์ด๋ค.
์ปฌ๋ ์ (Collection)
JCF(Java Collections Framework) ๋ฐ์ดํฐ, ์๋ฃ๊ตฌ์กฐ์ธ ์ปฌ๋ ์ ๊ณผ ์ด๋ฅผ ๊ตฌํํ๋ ํด๋์ค๋ฅผ ์ ์ํ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณต ์ฌ์ฉํ ๋๋ ๊ธฐ๋ณธํ ๋ณ์๊ฐ ์๋ ์ฐธ์กฐํ ๋ณ์๋ฅผ ์ฌ์ฉํด์ผํ๋ค ์๋ ์ฌ์ง์ ์์๊ตฌ์กฐ๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ฌ์ง map์ ๊ฒฝ์ฐ์๋ collection ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ๊ณ ์์ง ์์ง๋ง collection์ผ๋ก ๋ถ๋ฅ// Collection์ ์ฌ์ฉํ๋ ์ด์ 1. Collection์ ์ผ๊ด๋ API๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ ํด๋์ค๊ฐ Collection์์ ์์๋ฐ์ ํต์ผ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉ 2. ๊ฐ์ฒด์งํฅํ๋ก๊ทธ๋๋ฐ์ ์ถ์ํ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ๊ตฌํ

โ ย Collection ์ธํฐํ์ด์ค์ ํน์ง
์ธํฐํ์ด์ค ๊ตฌํํด๋์ค ํน์ง Set HashSet TreeSet ์์๋ฅผ ์ ์งํ์ง ์๋ ๋ฐ์ดํฐ์ ์งํฉ์ผ๋ก ๋ฐ์ดํฐ์ ์ค๋ณต์ ํ์ฉํ์ง ์๋๋ค. List LinkedList Vector ArrayList ์์๊ฐ ์๋ ๋ฐ์ดํฐ์ ์งํฉ์ผ๋ก ๋ฐ์ดํฐ์ ์ค๋ณต์ ํ์ฉํ๋ค. Queue LinkedList PriorityQueue FIFO(First in First out) ๋ค์ด๊ฐ ์์๋๋ก ๋์จ๋ค. Map Hashtable HashMap TreeMap ํค(Key), ๊ฐ(Value)์ ์์ผ๋ก ์ด๋ฃจ์ด์ง ๋ฐ์ดํฐ ์งํฉ์ผ๋ก, ์์๋ ์ ์ง๋์ง ์์ผ๋ฉฐย ํค(Key)์ ์ค๋ณต์ ํ์ฉํ์ง ์์ผ๋ ๊ฐ(Value)์ ์ค๋ณต์ ํ์ฉํ๋ค. List
// Vector๋ ๋๊ธฐํ๊ฐ ์ด๋ฏธ๋์ด์๋ ํด๋์ค๋ก ํ๋ฒ์ ํ๋์ ์ฐ๋ ๋๋ง ์ ๊ทผ ๊ฐ๋ฅ // Arraylist๋ ๋๊ธฐํ์ฒ๋ฆฌ๊ฐ ์๋ ํด๋์ค๋ก ๋์์ ์ฌ๋ฌ์ฐ๋ ๋์ ์ ๊ทผ์ด ๊ฐ๋ฅ// ArrayList // List // array์ ๋ค๋ฅธ์ -> ์ฒ์์ ๊ธธ์ด๋ฅผ ๋ชฐ๋ผ๋ ๋ง๋ค์์๋ค // Array -> ์ ์ ๋ฐฐ์ด // List(ArrayList) -> ๋์ ๋ฐฐ์ด(ํฌ๊ธฐ๊ฐ ๊ฐ๋ณ์ ์ผ๋ก ๋์ด๋จ) // - ์์ฑ ์์ ์ ์์ ์ฐ์๋ ๊ณต๊ฐ์ ์์ฒญํด์ ์ฐธ์กฐํ ๋ณ์๋ค์ ๋ด์๋๋๋ค // - ๊ฐ์ด ์ถ๊ฐ๋ ๋ ๋ ํฐ ๊ณต๊ฐ์ด ํ์ํ๋ฉด ๋ ํฐ ๊ณต๊ฐ์ ๋ฐ์์ ์ ์ฅํจ // ํ์ค ๋ฐฐ์ด๋ณด๋ค ๋๋ฆด์๋์์ง๋ง ์์ง์ด์ด ๋ง์ ๋ฐฐ์ด์์ ์ ์ฉ // ArrayList import๋ฅผ ํด์ฃผ์ด์ผํจ ArrayList<Integer> intList = new ArrayList<Integer>(); // ์ ์ธ๊ณผ ์์ฑ intList.add(1); // ๊ฐ ์ถ๊ฐ intList.add(12); // ๊ฐ ์ถ๊ฐ intList.add(123); // ๊ฐ ์ถ๊ฐ System.out.println(intList.get(0)); // ์ฒซ๋ฒ์งธ๋ก ์ง์ด๋ฃ์ ๊ฐ ๊ฐ์ ธ์ค๊ธฐ intList.set(1,22); // 1๋ฒ์งธ index์์น์์๋๊ฐ์ 22๋ก ๋ณํ System.out.println(intList.get(1)); // 22 intList.remove(1); // index๋ฒํธ์ ๊ฐ์ ์ญ์ System.out.println(intList.get(1)); // 123 -> 22๋ฒ๊ฐ์ด ์ญ์ ๋์ด 123๋ฒ์ด 1๋ฒ์งธ index์์น๋ก ๋ ๊ฒจ์ ธ์ด System.out.println(intList.toString()); // list์์๊ฐ ์ ๋ถ ๊ฐ์ ธ์ค๊ธฐ intList.clear(); // ํด๋น list ์ด๊ธฐํ System.out.println(intList.toString()); // list์์๊ฐ ์ ๋ถ ๊ฐ์ ธ์ค๊ธฐ// linked list // ๋ฉ๋ชจ๋ฆฌ์ ๋จ๋ ๊ณต๊ฐ์ ์์ฒญํด์ ์ฌ๊ธฐ ์ ๊ธฐ ๋๋์ด์ ์ค์ ๊ฐ์ ๋ด์๋ // ์ค์ ๊ฐ์ด ์๋ ์ฃผ์๊ฐ์ผ๋ก ๋ชฉ๋ก์ ๊ตฌ์ฑํ๊ณ ์ ์ฅํ๋ ์๋ฃ๊ตฌ์กฐ // ๊ธฐ๋ณธ์ ๊ธฐ๋ฅ -> ArrayList์ ๋์ผ // LinkedList๋ ๊ฐ -> ์ฌ๊ธฐ ์ ๊ธฐ ๋๋์ด์ ๊ฐ์ ๋ฃ์๊ธฐ๋๋ฌธ์ ์กฐํํ๋ ์๋๊ฐ ๋๋ฆฌ๋ค // ๊ฐ์ ์ถ๊ฐ ํ๊ฑฐ๋ ์ญ์ ํ ๋๋ ๋น ๋ฅด๋ค // ์ด์ ๋ก๋ ArrayList์ฒ๋ผ ์์๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ์์ํ๋ํ๋๋ฅผ ํ์ธํ์ง๋ง // Linked List์ ๊ฒฝ์ฐ์๋ ๋น์ด์๋ ๊ฐ์๊ฐ์ ๊ทธ๋ฅ ์ ์ฅ ์ญ์ ๋ฅผ ํ๊ธฐ๋๋ฌธ์ LinkedList<Integer> linkedList = new LinkedList<Integer>(); // LinkedList<Integer> linkedList = new LinkedList<>(); // ์์ฑ์ ํ์ ์๋ต๊ฐ๋ฅ linkedList.add(1); linkedList.add(122); linkedList.add(1333); System.out.println(linkedList.get(0)); System.out.println(linkedList.get(1)); System.out.println(linkedList.get(2)); System.out.println(linkedList.toString()); // arraylist๋ณด๋ค ์๋๊ฐ ๋๋ฆผ // arraylist์ ๋ค๋ฅธ์ // add๋ฅผ ํ ๋ index์์น๋ฅผ ์ง์ ํ ์์๋ค linkedList.add(1,4444); // 1๋ฒ์งธ index์ 4444๊ฐ์ ์ถ๊ฐ System.out.println(linkedList.toString()); // ์ถ๊ฐ ์ญ์ ๋ ๋น ๋ฅด๋ค linkedList.set(2,5555); System.out.println(linkedList.toString()); linkedList.remove(2); System.out.println(linkedList.toString()); linkedList.clear(); System.out.println(linkedList.toString());// Vector // ArrayList์ ์ ์ฌ // ์ฐจ์ด์ ์ผ๋ก๋ Vector๋ ๋๊ธฐํ๊ฐ๋๊ณ , ArrayList๋ ์๋จ // Vector๋ ๋๊ธฐํ๊ฐ ์ด๋ฏธ๋์ด์๋ ํด๋์ค๋ก ํ๋ฒ์ ํ๋์ ์ฐ๋ ๋๋ง ์ ๊ทผ ๊ฐ๋ฅ // Arraylist๋ ๋๊ธฐํ์ฒ๋ฆฌ๊ฐ ์๋ ํด๋์ค๋ก ๋์์ ์ฌ๋ฌ์ฐ๋ ๋์ ์ ๊ทผ์ด ๊ฐ๋ฅ mport java.io.*; import java.util.*; class GFG { public static void main(String[] args) { // Vector ์ ์ธ Vector<Integer> v = new Vector<Integer>(); // ๋ฐ์ดํฐ ์ ๋ ฅ for (int i = 1; i <= 5; i++) v.add(i); // ๊ฒฐ๊ณผ ์ถ๋ ฅ System.out.println(v); // 3๋ฒ ๋ฐ์ดํฐ ์ญ์ v.remove(3); // ๊ฒฐ๊ณผ ์ถ๋ ฅ System.out.println(v); // ํ๋์ฉ ๊ฒฐ๊ณผ ์ถ๋ ฅ for (int i = 0; i < v.size(); i++) System.out.print(v.get(i) + " "); } }
Stack
// Stack // ์์ง์ ๊ฐ์ ์์๋๊ณ , ๋ฃ์๋ค๊ฐ ๋บ๋ค filo // push(๋ฃ๊ธฐ),peek(์กฐํ),pop(์ญ์ ) // ์ต๊ทผ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๋์ดํ๊ฑฐ๋ ๋ฐ์ดํฐ ์ค๋ณต ์ฒ๋ฆฌ๋ฅผ ๋ง๊ณ ์ถ์๋ Stack<Integer> intStack = new Stack<Integer>(); intStack.push(12); intStack.push(1222); intStack.push(124444); // ๋ค ์ง์์ง๋๊น์ง ์ถ๋ ฅ while(!intStack.isEmpty()){ // isEmpty() -> ๊ณต๋ฐฑ์ผ๋ true // ์์ ์กฐ๊ฑด์ !์ด ์์ผ๋๊น ๊ฐ์ด ์์๋ true๋ฐํ System.out.println(intStack.pop()); // ์ ์ผ ์์์๋ ๊ฐ์ด ์กฐํ๋๋ฉด์ ๋น ์ ธ๋์ด // ์ง๊ธ๊ฐ์ด 3๊ฐ๊ฐ ์๋๊ฒฝ์ฐ 3๋ฒ๋์๊ฐ } intStack.push(12333); intStack.push(12); intStack.push(1); System.out.println(intStack.peek()); // ๊ฐ์ฅ ๋ง์ง๋ง์ ๋ค์ด๊ฐ ๊ฐ์ธ 1์ด๋ค์ด๊ฐ / ๋งจ์๊ฐ์์กฐํ System.out.println(intStack.size()); // ๊ธธ์ด // ์คํ ์ธ๋ฑ์ค์ ๊ฐ ํ์ธ // ์คํ.elementAt(์ธ๋ฑ์ค); // ์คํ ํน์ ๊ฐ์ด ์ด๋ ์ธ๋ฑ์ค์ ๋ค์๋ ํ์ธ // ์คํ.indexOf("๊ฐ");
Queue
// Queue : fifo // add, peek, poll // Queue : ์์ฑ์๊ฐ ์๋ ์ธํฐํ์ด์ค Queue<Integer> intQueue = new LinkedList<Integer>(); intQueue.add(1); intQueue.add(12); intQueue.add(31); while (!intQueue.isEmpty()){ System.out.println(intQueue.poll()); // stack๊ณผ ๋ค๋ฅด๊ฒ ๋ค์ด๊ฐ์์๋๋ก ๋์ด } intQueue.add(1); intQueue.add(12); intQueue.add(31); System.out.println(intQueue.peek()); System.out.println(intQueue.size()); intQueue.add(3133); System.out.println(intQueue.size());
Set
- HashSet
- ๊ฐ์ฅ๋น ๋ฅธ ์์ ์ ๊ทผ ์๋์์๋ฅผ ์์ธกํ ์ ์์
- ์์๋ฅผ ์์ธกํ ์ ์์
HashSet์ฌ์ฉ๋ฒ
// set : ์งํฉ ์์ ์๊ณ , ์ค๋ณต ์์ // set -> ๊ทธ๋ฅ ์ฌ์ฉํ ์๋์๊ณ , HashSet,TreeSet๋ฑ์ผ๋ก ์์ฉํด์๋ ์ฌ์ฉ ๊ฐ๋ฅ // set์ ์์ฑ์๊ฐ ์๋ ์ธํฐํ์ด์ค // ๋ฐ๋ก ์์ฑ ๋ถ๊ฐ๋ฅ // HashSet์ ์์ฑ์๊ฐ ์กด์ฌ Set<Integer> intSet = new HashSet<Integer>(); intSet.add(11); intSet.add(112); intSet.add(1133); intSet.add(11); for(Integer value : intSet){ System.out.println(value); // 11์ด ์ค๋ณต๋์ด์ ์ธ๋ฒ๋ง ๋ฐ๋ณต๋จ } // contains // ํด๋น๊ฐ์ ํฌํจ ํ๊ณ ์๋์ง ์ฌ๋ถํ์ธ reture๊ฐ true/false System.out.println(intSet.contains(2)); System.out.println(intSet.contains(233));
- TreeSet
- ์ ๋ ฌ๋ฐฉ๋ฒ์ ์ง์ ํ ์ ์์
TreeSet์ฌ์ฉ๋ฒ
// ์ฒ์์ค์ ์ ์ค๋ฆ์ฐจ์ TreeSet<์๋ฃํ> ๋ณ์๋ช = new TreeSet<>(); // ๋ด๋ฆผ์ฐจ์ TreeSet<์๋ฃํ> ๋ณ์๋ช = new TreeSet<>(Collections.reverseOrder);๋ฉ์๋ (Method)
TreeSet<Integer> tSet = new TreeSet<>();์ฐ์ฐ ์ฝ๋ ๋ฐํ ๊ฐ ์ฝ์ tSet.add(์ฝ์ ํ ย value); ํธ๋ฆฌ์ value๊ฐ ์ ์ฅ๋์ด์๋ ๊ฒฝ์ฐ =ย Falseํธ๋ฆฌ์ value๊ฐ ์ ์ฅ๋์ด์์ง ์๋ ๊ฒฝ์ฐ =ย True ์ญ์ tSet.remove(์ญ์ ํ value); ํธ๋ฆฌ์ value๊ฐ ์ ์ฅ๋์ด์๋ ๊ฒฝ์ฐ =ย Trueํธ๋ฆฌ์ value๊ฐ ์ ์ฅ๋์ด์์ง ์๋ ๊ฒฝ์ฐ =ย False ๋ชจ๋ ๊ฐ ์ญ์ tSet.clear(); - ํฌ๊ธฐ tSet.size(); ํธ๋ฆฌ์ ์ฌ์ด์ฆ ์ ์ฒด ์์ ์งํฉ ์ถ๋ ฅ System.out.println(tSet); [์์1, ์์2, ..., ์์n] ์ ๋ ฌ ์์ ๊ธฐ์ค ๋งจ ์ ์์ tSet.first(); ์ ๋ ฌ ์์ ๊ธฐ์ค ๋งจ ์ ์์ ์ ๋ ฌ ์์ ๊ธฐ์ค ๋งจ ๋ค ์์ tSet.last(); ์ ๋ ฌ ์์ ๊ธฐ์ค ๋งจ ๋ค ์์ value๋ณด๋ค ํฐ ์์๋ค ์ค ์ต์๊ฐ tSet.higher(value); value๋ณด๋ค ํฐ ์์๋ค ์ค ์ต์๊ฐ value๋ณด๋ค ์์ ์์๋ค ์ค ์ต๋๊ฐ tSet.lower(value); value๋ณด๋ค ์์ ์์๋ค ์ค ์ต๋๊ฐ ํธ๋ฆฌ๊ฐ ๋น์ด์๋์ง ํ์ธ tSet.isEmpty(); ํธ๋ฆฌ์ ์ฌ์ด์ฆ๊ฐ 0์ด๋ฉด =ย Trueํธ๋ฆฌ์ ์ฌ์ด์ฆ๊ฐ 0๋ณด๋ค ํฌ๋ฉด =ย False ํธ๋ฆฌ์ value๊ฐ ์ ์ฅ๋์ด ์๋์ง tSet.contains(value); ํธ๋ฆฌ์ value๊ฐ ์ ์ฅ๋์ด์๋ ๊ฒฝ์ฐ =ย Trueํธ๋ฆฌ์ value๊ฐ ์ ์ฅ๋์ด์์ง ์์ ๊ฒฝ์ฐ =ย False
- SortedSet
- ์๋ฆฌ๋ฉํธ๋ค์ ์ ๋ ฌ๋ ์์๋ก ์ ์ฅ
- ์ ์ฅ๋๋ ์๋ฆฌ๋จผํธ๊ฐ Comparable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ ์๋ค๋ฉด compare()๋ฉ์๋์ ๋ก์ง์ ์ด์ฉ
- ๊ตฌํ์ฒด๋ฅผ ์์ฑํ ๋ Comparator ํด๋์ค๋ฅผ ๋๊ฒจ ์๋ฆฌ๋จผํธ๋ค์ ๋์ ๋น๊ต์ ์ฌ์ฉ๊ฐ๋ฅ
SortedSet<String> sortedSet = new TreeSet<>(); // sortedSet.add("Elem5"); // sortedSet.add("Elem3"); // sortedSet.add("Elem1"); // sortedSet.add("Elem3"); // sortedSet.add("Elem1"); // // for (String elem : sortedSet) { // System.out.println(elem); // // ์ค๋ณต๊ฐ์ ์ ๊ฑฐ๋๊ณ 1,3,5์์ผ๋ก ์ ๋ ฌ๋์ ๋์ด // } sortedSet.add("Elem5"); sortedSet.add("Elem2"); sortedSet.add("Elem4"); sortedSet.add("Elem3"); sortedSet.add("Elem1"); // SortedSet<String> headSet = sortedSet.headSet("Elem3"); // System.out.println("Head Set"); // for (String elem : headSet) { // System.out.println(elem); // // Elem3๊ฐ์ ๋ฃ์ด์ฃผ์๊ธฐ๋๋ฌธ์ // // ๋๊ฐ์ธ 3์ ๊น์ง ์ถ๋ ฅ // // 1,2๊ฐ ๋์ด // } // SortedSet<String> tailSet = sortedSet.tailSet("Elem4"); // System.out.println("Tail Set"); // for (String elem : tailSet) { // System.out.println(elem); // // Elem4๋ถํฐ ์ดํ๋ก์ ๊ฐ์ด ๋์ด // } // // SortedSet<String> subSet = sortedSet.subSet("Elem2", "Elem5"); // System.out.println("Sub Set"); // for (String elem : subSet) { // System.out.println(elem); // // 2๋ถํฐ 5์ฌ์ด์ ๊ฐ์ด ๋์ด // // ๋ง์ง๋ง ๊ฐ์ ํฌํจ์๋จ // } System.out.println(sortedSet.first()); // ์ฒซ๋ฒ์งธ ๊ฐ๋ง System.out.println(sortedSet.last()); // ๋ง์ง๋ง ๊ฐ๋ง
- HashSet
Map
- Hashtable
- HashMap๋ณด๋ค๋ ๋๋ฆฌ์ง๋ง ๋๊ธฐํ ์ง์
- null๋ถ๊ฐ
- HashMap
- ์ค๋ณต๊ณผ ์์๊ฐ ํ์ฉ๋์ง ์์ผ๋ฉฐ null๊ฐ์ด ์ฌ ์ ์๋ค.
- TreeMap
- ์ ๋ ฌ๋ ์์๋๋ก ํค(Key)์ ๊ฐ(Value)์ ์ ์ฅํ์ฌ ๊ฒ์์ด ๋น ๋ฆ
// Map : key - value pair -> ์ค์ // key๋ผ๋ ๊ฐ์ผ๋ก uniqueํ๊ฒ ๋ณด์ฅ์ด ๋์ด์ผํจ // Map -> HashMap,TreeMap์ผ๋ก ์์ฉ Map<String,Integer> intmap = new HashMap<>(); // ํค ๊ฐ intmap.put("์ผ",1); intmap.put("์ด",2); intmap.put("์ผ",3); intmap.put("์ฌ",4); intmap.put("์ค",5); intmap.put("์ค",6); for(String key : intmap.keySet()){ // .keySet() : key๊ฐ๋ง ๊ฐ์ ธ์ด System.out.println(key); // ์ค๋ณต๋ key๋ ์๋ต๋์ด์ ํ๋๋ง ๋์ด } for(Integer value : intmap.values()){ // .values() : values๊ฐ๋ง ๊ฐ์ ธ์ด System.out.println(value); // ์ค๋ณต๋ ๊ฐ์ค์์ ๊ฐ์ฅ ๋ง์ง๋ง์ผ๋ก ๋ค์ด๊ฐ ๊ฐ์ด ๋์ด } System.out.println(intmap.get("์ด")); // key๊ฐ์ผ๋ก value๊ฐ ์ฐพ์์ค๊ธฐMap์ถ๋ ฅ๋ฐฉ๋ฒ
Map์ย ๊ฐ์ย ์ ์ฒดย ์ถ๋ ฅํ๊ธฐย ์ํด์๋ย entrySet(),ย keySet()ย ๋ฉ์๋๋ฅผย ์ฌ์ฉํ๋ฉดย ๋๋๋ฐย entrySet()ย ๋ฉ์๋๋ย key์ย value์ย ๊ฐ์ดย ๋ชจ๋ย ํ์ํย ๊ฒฝ์ฐย ์ฌ์ฉํ๊ณ ,ย keySet()ย ๋ฉ์๋๋ย key์ย ๊ฐ๋งย ํ์ํย ๊ฒฝ์ฐย ์ฌ์ฉ
๋ฐฉ๋ฒ 01. entrySet()
Map<String, String> map = new HashMap<>(); map.put("key01", "value01"); map.put("key02", "value02"); map.put("key03", "value03"); map.put("key04", "value04"); map.put("key05", "value05"); // ๋ฐฉ๋ฒ 01 : entrySet() for (Map.Entry<String, String> entry : map.entrySet()) { System.out.println("[key]:" + entry.getKey() + ", [value]:" + entry.getValue()); }๋ฐฉ๋ฒ 02. keySet()
Map<String, String> map = new HashMap<>(); map.put("key01", "value01"); map.put("key02", "value02"); map.put("key03", "value03"); map.put("key04", "value04"); map.put("key05", "value05"); // ๋ฐฉ๋ฒ 02 : keySet() for (String key : map.keySet()) { String value = map.get(key); System.out.println("[key]:" + key + ", [value]:" + value); }๋ฐฉ๋ฒ 03. entrySet().iterator()
Iterator ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ปฌ๋ ์ ์ธ Map์์ Iterator ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ Map์ entrySet(), keySet() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ Set ๊ฐ์ฒด๋ฅผ ๋ฐํ๋ฐ์ ํ Iterator ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉ
Map<String, String> map = new HashMap<>(); map.put("key01", "value01"); map.put("key02", "value02"); map.put("key03", "value03"); map.put("key04", "value04"); map.put("key05", "value05"); // ๋ฐฉ๋ฒ 03 : entrySet().iterator() Iterator<Map.Entry<String, String>> iteratorE = map.entrySet().iterator(); while (iteratorE.hasNext()) { Map.Entry<String, String> entry = (Map.Entry<String, String>) iteratorE.next(); String key = entry.getKey(); String value = entry.getValue(); System.out.println("[key]:" + key + ", [value]:" + value); }๋ฐฉ๋ฒ 04. keySet().iterator()
Map<String, String> map = new HashMap<>(); map.put("key01", "value01"); map.put("key02", "value02"); map.put("key03", "value03"); map.put("key04", "value04"); map.put("key05", "value05"); // ๋ฐฉ๋ฒ 04 : keySet().iterator() Iterator<String> iteratorK = map.keySet().iterator(); while (iteratorK.hasNext()) { String key = iteratorK.next(); String value = map.get(key); System.out.println("[key]:" + key + ", [value]:" + value); }๋ฐฉ๋ฒ 05. Lambda ์ฌ์ฉ
Map<String, String> map = new HashMap<>(); map.put("key01", "value01"); map.put("key02", "value02"); map.put("key03", "value03"); map.put("key04", "value04"); map.put("key05", "value05"); // ๋ฐฉ๋ฒ 05 : Lambda ์ฌ์ฉ map.forEach((key, value) -> { System.out.println("[key]:" + key + ", [value]:" + value); });๋ฐฉ๋ฒ 06. Stream ์ฌ์ฉ
Map<String, String> map = new HashMap<>(); map.put("key01", "value01"); map.put("key02", "value02"); map.put("key03", "value03"); map.put("key04", "value04"); map.put("key05", "value05"); // ๋ฐฉ๋ฒ 06 : Stream ์ฌ์ฉ map.entrySet().stream().forEach(entry-> { System.out.println("[key]:" + entry.getKey() + ", [value]:"+entry.getValue()); }); // Stream ์ฌ์ฉ - ๋ด๋ฆผ์ฐจ์ map.entrySet().stream().sorted(Map.Entry.comparingByKey()).forEach(entry-> { System.out.println("[key]:" + entry.getKey() + ", [value]:"+entry.getValue()); }); // Stream ์ฌ์ฉ - ์ค๋ฆ์ฐจ์ map.entrySet().stream().sorted(Map.Entry.comparingByKey(Comparator.reverseOrder())).forEach(entry-> { System.out.println("[key]:" + entry.getKey() + ", [value]:"+entry.getValue()); });
- Hashtable
Vector
// ArrayList์ ๋์ผํ ๋ด๋ถ๊ตฌ์กฐ // ArrayList์ ๋ค๋ฅด๊ฒ ๋๊ธฐํ๋ ๋ฉ์๋๋ก ๊ตฌ์ฑ // ๋ฉํฐ ์ค๋ ๋๊ฐ ๋์์ ์ด ๋ฉ์๋๋ฅผ ์คํํ ์ ์๊ณ ,ํ๋์ ์ค๋ ๋๊ฐ ์คํ์ ์๋ฃํด์ผ๋ง ๋ค๋ฅธ ์ค๋ ๋๋ค์ด ์คํํ ์ ์๋ค // ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์ ์์ ํ๊ฒ ๊ฐ์ฒด๋ฅผ ์ถ๊ฐ ์ญ์ ๊ฐ ๊ฐ๋ฅ // ํญ์ ๋๊ธฐํ ๋๊ธฐ๋๋ฌธ์ ์ค๋ ๋๊ฐ ํ๋์ฌ๋ ๋๊ธฐํ๋ฅผ ํ๋ค // ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ArrayList๋ณด๋ค ์ฑ๋ฅ์ด ๋จ์ด์ง๋ค // ArrayList๋ ์๋ ๋๊ธฐํ๊ธฐ๋ฅ์ ์๊ณ ์ต์ ์ผ๋ก ์กด์ฌํ๋ค // ๊ทธ๋ฆฌ๊ณ ๋ฒกํฐ๋ณด๋ค ์๋๊ฐ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ ArrayList๋ฅผ ๋๋ง์ด ์ฌ์ฉํ๋ค
// ์ ์ธ // ํ์ ์ ์ง์ ํ์ง ์๊ณ ์์์ ํ์ ์ ๊ฐ์ ๋ฃ๊ณ ์ฌ์ฉํ ์๋ ์์ง๋ง // ๋ฒกํฐ ๋ด๋ถ์ ๊ฐ์ ์ฌ์ฉํ๋ ค๋ฉด ์บ์คํ (Casting)์ฐ์ฐ์ด ํ์ํ๋ฉฐ ์๋ชป๋ ํ์ ์ผ๋ก ์บ์คํ ์ ํ ๊ฒฝ์ฐ์๋ ์๋ฌ๊ฐ ๋ฐ์ํ ์ ๋ ์๋ค // ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์ ํ์ ๋ช ์๋ฅผ ํ๋๊ฒ ์ข๋ค Vector v = new Vector();//ํ์ ๋ฏธ์ค์ Object๋ก ์ ์ธ๋๋ค. Vector<Student> student = new Vector<Student>(); //ํ์ ์ค์ Student๊ฐ์ฒด๋ง ์ฌ์ฉ๊ฐ๋ฅ Vector<Integer> num2 = new Vector<Integer>(); //ํ์ ์ค์ intํ์ ๋ง ์ฌ์ฉ๊ฐ๋ฅ Vector<Integer> num3 = new Vector<>(); //new์์ ํ์ ํ๋ผ๋ฏธํฐ ์๋ต๊ฐ๋ฅ Vector<String> v2 = new Vector<String>(10);//์ด๊ธฐ ์ฉ๋(capacity)์ง์ Vector<Integer> v3 = new Vector<Integer>(Arrays.asList(1,2,3)); //์ด๊ธฐ๊ฐ ์ง์ // ๊ฐ ์ถ๊ฐ // ๊ตฌ์กฐ๋ ArrayList์ LinkedList์ ๊ฐ๋ค // add(index,value) // index๋ฅผ ์ฌ์ฉํ์ง์์ผ๋ฉด ๋งจ๋ค์ ๊ฐ์ด ์ถ๊ฐ๋๋ค Vector<Integer> v = new Vector<Integer>(); v.add(3); //๊ฐ ์ถ๊ฐ v.add(null); //null๊ฐ๋ add๊ฐ๋ฅ v.add(1,10); //index 1๋ค์ 10 ์ฝ์ Vector v = new Vector(); Student student = new Student(name,age); v.add(student); v.add(new Member("ํ๊ธธ๋",15));// ๊ฐ ์ญ์ Vector<Integer> v = new Vector<Integer>(Arrays.asList(1,2,3)); v.remove(1); //index 1 ์ ๊ฑฐ v.removeAllElements(); //๋ชจ๋ ๊ฐ ์ ๊ฑฐ v.clear(); //๋ชจ๋ ๊ฐ ์ ๊ฑฐ// ํฌ๊ธฐ ๊ตฌํ๊ธฐ Vector<Integer> v = new Vector<Integer>(10);//์ด๊ธฐ์ฉ๋ 10 v.add(1); //๊ฐ ์ถ๊ฐ System.out.println(v.size()); //Vector ์๋ฃ ๊ฐ์ : 1 System.out.println(v.capacity()); //Vector ๋ฌผ๋ฆฌ์ ํฌ๊ธฐ : 10// ๊ฐ ์ถ๋ ฅ Vector<Integer> list = new Vector<Integer>(Arrays.asList(1,2,3)); System.out.println(list.get(0));//0๋ฒ์งธ index ์ถ๋ ฅ for(Integer i : list) { //for๋ฌธ์ ํตํ ์ ์ฒด์ถ๋ ฅ System.out.println(i); } Iterator iter = list.iterator(); //Iterator ์ ์ธ while(iter.hasNext()){//๋ค์๊ฐ์ด ์๋์ง ์ฒดํฌ System.out.println(iter.next()); //๊ฐ ์ถ๋ ฅ }
Iterator
// ์ปฌ๋ ์ ํ๋ ์์ํฌ์์ ๊ฐ์ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ญ์ ํ ๋ ์ฌ์ฉ // ์ปฌ๋ ์ ํ๋ ์์ํฌ๋ฅผ ์์ฑํ ๋ค // Iterator<๋ฐ์ดํฐํ์ > ๋ณ์๋ช = ์ปฌ๋ ์ .iterator(); // ์ฅ์ // 1. Iterator๋ ๋ชจ๋ ์ปฌ๋ ์ ํ๋ ์์ํฌ์ ๊ณตํต์ผ๋ก ์ฌ์ฉ๊ฐ๋ฅ // 2. ์ปฌ๋ ์ ํ๋ ์์ํฌ์์ ์ฝ๊ฒ ๊ฐ์ ๊ฐ์ ธ์ค๊ณ ์ ๊ฑฐํ ์ ์์ // 3. 3๊ฐ์ ๋ฉ์๋๋ง ์๋ฉด ๋์ด์ ์ฌ์ฉํ๊ธฐ ์ฌ์ // ๋จ์ // 1. ์ฒ์๋ถํฐ ๋๊น์ง์ ๋จ๋ฐฉํฅ ๋ฐ๋ณต๋ง ๊ฐ๋ฅ // 2. ๊ฐ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ถ๊ฐํ๋๊ฒ ์๋จ // 3. ๋๋์ ๋ฐ์ดํฐ๋ฅผ ์ ์ดํ ๋ ์๋๊ฐ ๋๋ฆผIterator.hasNext()
- Iterator ์์ ๋ค์ ๊ฐ์ด ๋ค์ด์๋์ง ํ์ธ
- ๋ค์์ผ๋ฉด true, ์๋ค์์ false
Iterator.next()
- iterator์ ๋ค์ ๊ฐ ๊ฐ์ ธ์ค๊ธฐ
Iterator.remove()
- iterator์์ next() ์์ ๊ฐ์ ธ์๋ ๊ฐ์
- ์ปฌ๋ ์ (List, Set, Map) ๋ฑ์์ ์ญ์
- ๋ฐ๋์ next() ํ์ ์ฌ์ฉํด์ผ ํจ
Collections(Collection๊ณผ๋ค๋ฆ!!!)
// ์ด ํด๋์ค๋ ์ปฌ๋ ์ ์์ ์๋ํ๊ฑฐ๋ ๋ฐํํ๋ ์ ์ ๋ฉ์๋๋ก๋ง ๊ตฌ์ฑ๋จ // ์ปฌ๋ ์ ์์ ์๋ํ๋ ๋คํ์ฑ ์๊ณ ๋ฆฌ์ฆ์ด ํฌํจ๋จ // Collection๊ณผ Colletions๋ ๋ค๋ฅธ๊ฒ์ด๋ค // ์ ์ (static)๋ฉ์๋์ด๋ฏ๋ก ์ธ์คํด์คํ ๋ถํ์ // Collections๋ ํด๋์ค์ด๋ค!! // Collection์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค์ ๋ํ ๊ฐ์ฒด์์ฑ,์ ๋ ฌ,๋ณํฉ๋ฑ์ ๊ธฐ๋ฅ์ ์์ ์ ์ผ๋ก ์ํํ๋๋ก ๋์์ฃผ๋ ์ญํ์ฃผ์ method()
๋ฉ์๋ ์ค๋ช ์ฐ๋๋ฒ max ์ง์ ๋ ์ปฌ๋ ์ ์์ ์ต๋ ์์๋ฅผ ๋ฐํํ๋ค. (์ธ๋ฑ์ค X) min ์ง์ ๋ ์ปฌ๋ ์ ์์ ์ด์ ์์๋ฅผ ๋ฐํํ๋ค. (์ธ๋ฑ์ค X) sort ์ง์ ๋ ์ปฌ๋ ์ ์ ์ ๋ ฌ์ํจ๋ค.์ค๋ฒ๋ก๋ ๋ฉ์๋๋ค์ด ์กด์ฌํ๋ฉฐ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฉ์๋๋ ์์ฐ์์์ ๋ฐ๋ผ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ๋๋ค. Collections.sort(list) shuffle ์ง์ ๋ ์ปฌ๋ ์ ์ ์์๋ค์ ์์๋ฅผ ๋ฌด์์๋ก ์๋๋ค. Collections.shuffle(list) synchronizedCollection ์ง์ ๋ ์ปฌ๋ ์ ์ ์ํด ์ง์๋๋ ๋๊ธฐํ ๋ ์ปฌ๋ ์ ์ ์ฌ์์ฑํด ๋ฐํํ๋ค. binarySearch ์ง์ ๋ ์ปฌ๋ ์ ์์ ์ด์ง ํ์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด ์ง์ ๋ ๊ฐ์ฒด๋ฅผ ๊ฒ์ํด ์ธ๋ฑ์ค๋ฅผ ๋ฐํํ๋ค. Collections.binarySearch(list,element(ํ์ํ ์์)) disjoint 2๊ฐ์ ์ง์ ๋ ์ปฌ๋ ์ ๋ค์์ ๊ณตํต๋ ์์๊ฐ ํ๋๋ ์๋ ๊ฒฝ์ฐ true ๋ฅผ ๋ฐํํ๋ค. copy ์ง์ ๋ ์ผ๋ ์ ์ ๋ชจ๋ ์์๋ฅผ ์๋ก์ด ์ปฌ๋ ์ ์ผ๋ก ๋ณต์ฌํด ๋ฐํํ๋ค. reverse ์ง์ ๋ ์ปฌ๋ ์ ์ ์๋ ์์๋ฅผ ์ญ์ผ๋ก ๋ณ๊ฒฝํ๋ค. reverseOrder Comparable์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๊ฐ์ฒด ์ปฌ๋ ์ ์ ์์ฐ์์(natural ordering)์ ์ญ์์ ์ ์ฉํ๋ comparator๋ฅผ ๋ฐํ Sort()
- List์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ์ปฌ๋ ์ ์ ๋ํ์ฌ ์ ๋ ฌ์ ์ํ
- Collections.sort()๋ list / Arrays.sort()๋ array์ ์ฌ์ฉ๋๋ค
- ๋ค์ด๊ฐ๋ ๊ฐ์ด Dateํ์
์ด๋ฉด ์๊ฐ์ ์ธ ์์๋ก ์ ๋ ฌ
- Stringํด๋์ค์ Dateํด๋์ค ๋ชจ๋ Comparable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ธฐ ๋๋ฌธ์
- ์ ๋ ฌ์ Comparable ์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํ์ฌ ์ด๋ฃจ์ด์ง๋ค
- List์ธํฐํ์ด์ค๋ Comparable์ธํฐํ์ด์ค๋ฅผ ์์ํ๋ฏ๋ก ์ ๋ ฌ์ด ๊ฐ๋ฅํ๋ค
- comparaTo()๋ฉ์๋๋ ๋งค๊ฐ๋ณ์ ๊ฐ์ฒด๋ฅผ ํ์ฌ์ ๊ฐ์ฒด์ ๋น๊ตํ์ฌ ์์,๊ฐ์ผ๋ฉด0,ํฌ๋ฉด ์์๋ฅผ ๋ฐํ
shuffle()
- list์ ์กด์ฌํ๋ ์ ๋ ฌ์ ํ๊ดดํ์ฌ์ ์์๋ค์ ์์๋ฅผ ๋๋คํ๊ฒ ๋ง๋ ๋ค
- ์ ๋ ฌ๊ณผ ๋ฐ๋ ๋์์ ํ๋ค
binarySearch()
- Collectionsํด๋์ค๋ ์ ๋ ฌ๋ ๋ฆฌ์คํธ์์ ์ง์ ๋ ์์๋ฅผ ์ด์ง ํ์
- โ์ ๋ ฌ๋ ๋ฆฌ์คํธโ ์ ํํด์ ํ์์ ์งํํ๋ค๋ ์ ์ ๋ช
์ฌ!!!
- ์ ํ ํ์ : ์ฒ์๋ถํฐ ๋ชจ๋ ์์๋ฅผ ๋ฐฉ๋ฌธํ๋ ํ์ ๋ฐฉ๋ฒ์ผ๋ก, ๋ฆฌ์คํธ๊ฐ ์ ๋ ฌ๋์ด ์์ง์์ ๊ฒฝ์ฐ ์ฌ์ฉ๋จ
- ์ด์ง ํ์ :
- ๋ฆฌ์คํธ๊ฐ ์ ๋ ฌ๋์ด ์๋ ๊ฒฝ์ฐ ์ค๊ฐ์ ์๋ ์์(n)์ ๋จผ์ ๋น๊ตํ์ฌ, ํฌ๋ฉด ๊ทธ ๋ค์๋ถํฐ(n+1)๋๊น์ง ๋น๊ตํ๊ณ ,
- ์์ผ๋ฉด ์ฒ์๋ถํฐ ๊ทธ ์ (n-1)๊น์ง์ ์์๋ค๊ณผ ๋น๊ตํ์ฌ ๋ฐฉ์์ ๋ฐ๋ณตํ์ฌ ํ๋์ ๋ฆฌ์คํธ๋ฅผ ๊ณ์ํด์ ๋ ๊ฐ์ ๋ฆฌ์คํธ๋ก ๋ถํ
- ๋ฆฌ์คํธ์ ํ๋์ ์์๊ฐ ๋จ์ ๋๊น์ง ๋ฐ๋ณต๋๋ค
- ์ด์งํ์์ ๋ฌธ์ ์ ํฌ๊ธฐ๋ฅผ ๋ฐ์ผ๋ก ์ค์ผ ์ ์๊ธฐ ๋๋ฌธ์ ์ ํ ํ์๋ณด๋ค ํจ์จ์
- ๋ฐํ๊ฐ์ด ์์์ด๋ฉด ์ฐพ๊ณ ์ ํ๋ ์์์ ์ธ๋ฑ์ค๊ฐ์ ์ถ๋ ฅ
- ์์์ด๋ฉด ํ์์ด ์คํจํ์ฌ ์์๋ฅผ ์ฐพ์ง ๋ชปํ์์ ์๋ฏธ
- ๋จ, ์คํจํ๋๋ผ๋ ๋์์ด ๋๋ ์ ๋ณด๋ฅผ ๋ฐํํ๋ค
- ๋ฐํ๊ฐ์๋ ํ์ฌ์ ๋ฐ์ดํฐ๊ฐ ์ฝ์ ๋ ์ ์๋ ์์น์ ๋ณด๊ฐ ๋ค์ด์๋ค
- ๋ฐํ๊ฐ์ดย pos๋ผ๊ณ ํ๋ค๋ฉด, (-pos-1)์ด ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ ์ ์๋ ์์น์ด๋ค.
// -pos-1์ด ๋ฐ์ดํฐ ์ฝ์ ๊ฐ๋ฅ index์ด๋ค. int pos = Collections.binarySearch(list, key); if(pos < 0) list.add(-pos-1);
length vs length() vs size()
๐กlength vs length() vs size() - ๊ธธ์ด๊ฐ ๊ฐ์ ธ์ค๊ธฐ1. length
- arrays(int[], double[], String[])
length๋ย ๋ฐฐ์ด์ ๊ธธ์ด๋ฅผ ์กฐํํด์ค๋๋ค.
2. length()
- String related Object(String, StringBuilder etc)
length()๋ย ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ ์กฐํํด์ค๋๋ค. (ex. โABCDโ.length() == 4)
3. size()
- Collection Object(ArrayList, Set etc)
size()๋ย ์ปฌ๋ ์ ํ์ ๋ชฉ๋ก์ ๊ธธ์ด๋ฅผ ์กฐํํด์ค๋๋ค.
๋๋ค๊ฐ ๋ง๋ค๊ธฐ
System.out.println("0.0 ~ 1.0 ์ฌ์ด์ ๋์ 1๊ฐ ๋ฐ์ : " + Math.random()); System.out.println("0 ~ 10 ์ฌ์ด์ ๋์ 1๊ฐ ๋ฐ์ : " + (int)((Math.random()*10000)%10)); System.out.println("0 ~ 100 ์ฌ์ด์ ๋์ 1๊ฐ ๋ฐ์ : " + (int)(Math.random()*100));Random random = new Random(); //๋๋ค ๊ฐ์ฒด ์์ฑ(๋ํดํธ ์๋๊ฐ : ํ์ฌ์๊ฐ) random.setSeed(System.currentTimeMillis()); //์๋๊ฐ ์ค์ ์ ๋ฐ๋ก ํ ์๋ ์์ System.out.println("n ๋ฏธ๋ง์ ๋๋ค ์ ์ ๋ฆฌํด : " + random.nextInt(10)); System.out.println("๋ฌด์์ boolean ๊ฐ : " + random.nextBoolean()); System.out.println("๋ฌด์์ long ๊ฐ : " + random.nextLong()); System.out.println("๋ฌด์์ float ๊ฐ : " + random.nextFloat()); System.out.println("๋ฌด์์ double ๊ฐ : " + random.nextDouble()); System.out.println("๋ฌด์์ ์ ๊ท ๋ถํฌ์ ๋์ ๊ฐ :" + random.nextGaussian());
์ซ์์ผ๊ตฌ๋ง๋ค๊ธฐ
// ์ด์ int ํ์ ์ ์ซ์๊ฐ์ scanner๋ก ์ ๋ ฅํ ๊ฐ์ ๋ฐ์์ค๊ณ ๊ทธ๋ค์ ์๋ผ์ ๋ฐฐ์ด์ ๋ฃ์ด์ฃผ์ด์ผํ๋ ์์ ์ด ์์๋ค String์ผ๋ก ๋ณํํ๋ ๊ณผ์ ์์ ์ฒซ๋ฒ์งธ ์ซ์๊ฐ์ด 0์ด๋ฉด ์ธ์์ ๋ชปํ๊ณ ๋์ค์ ๋ฐฐ์ด์ ๊ฐ์ ๋ฃ์ด์ค๋ ๊ฐ์ฅ ๋ง์ง๋ง index๋ก ๊ฐ์ด ๋ค์ด๊ฐ๋ ์ด์๊ฐ ๋ฐ์ ํ์ ๋ณํ์ผ๋ก ์ฌ์ฉํ ๋ฉ์๋๋ 1. String.valueof() 2. Integer.toString() 3. int [] answer = Stream.of(String.valueOf(result).split("")).mapToInt(Integer::parseInt).toArray(); ํด๊ฒฐ๋ฒ์ผ๋ก๋ ๋ฐ์์ค๋ ๊ฐ์ String์ผ๋ก ํ์ฌ ๋์ค์ ๋ฐฐ์ด๋ก ์ง์ด๋ฃ์๋ Integer๋ก ํ๋ณํ ํด์ฃผ์๋ค. ํ์ง๋ง ์ ์ฒซ๋ฒ์งธ์๋ฆฌ๊ฐ 0์ด๋ฉด ์ธ์์ ๋ชปํ๋์ง์ ์ด์๋ ์ฐพ์๋ณด๋ฉด์ ํด๊ฒฐํด์ผํ๋ค. // ํด๊ฒฐ int typing = sc.nextInt(); System.out.print("๋ฐ์์จ ์ซ์๊ฐ : "); System.out.println(typing); String str = String.valueOf(typing); System.out.print("๋ฌธ์์ด๋ก ํ๋ณํ : "); System.out.println(str); String [] strarr = str.split(""); System.out.print("split์งํ : "); System.out.println(Arrays.toString(strarr)); ์์์์ผ๋ก ํ ์คํธํด๋ณธ๊ฒฐ๊ณผ ์ ๋ ฅํ ๋ ์ซ์๋ฅผ 023์ผ๋ก ํ์์ง๋ง ์ถ๋ ฅํ์๋๋ ์ ๋ถ๋ค23์ผ๋ก๋์๋ค ์ฌ๊ธฐ์ ์ ์ถํด๋ณผ์์๋๊ฒ์ ์ซ์๋ ์ฒซ์ซ์๊ฐ 0์ด๋ฉด ์๋ตํ๊ณ 023๊ณผ 23์ด ๊ฐ๋ค๊ณ ์ธ์ํ์ฌ 23์ผ๋ก ๋์ค๊ฒํ๋ค. ๊ทธ๋์ ๋ฐ์ดํฐ๋ฅผ ๋ณํํ๋ ๊ณผ์ ์์ 0์ด๊ณ์ํด์ ์ฌ๋ผ์ง๋๊ฒ์ ํ์ธํ ์์์๋ค. ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ 0์ด๋ค์ด๊ฐ ์ด์ ๋ก๋ ์ด๋ฏธ ๋ฐฐ์ด์ 3๊ฐ์๊ณต๊ฐ์ ์์ฑํ๋๋ฐ ๋ฐ์์์ง๋ ๊ฐ์ด ๋๊ฐ ๋ฐ์์์ผ๋๊น ๋ง์ง๋ง๊ฐ์ ์์ฑํ ๋์ 0์ธ์ํ๋ก ๋จ์์์๋ ๊ฒ์ด๋ค.import java.util.Random; import java.util.Scanner; public class Main { public static void main(String[] args) { Random rd = new Random(); Scanner sc = new Scanner(System.in); int [] arr = new int[3]; for(int i = 0; i < arr.length; i++){ arr[i] = rd.nextInt(10); for(int j = 0; j < i; j++){ if(arr[i] == arr[j]){ arr[i] = rd.nextInt(10); i--; } } } // System.out.println(Arrays.toString(arr)); int cnt = 0; while (true){ cnt++; System.out.print(cnt+"๋ฒ์งธ ์๋ : "); String result = sc.nextLine(); String [] result2 = result.split(""); int [] arr2 = new int[3]; for(int i =0; i < result2.length; i++){ arr2[i] = Integer.parseInt(result2[i]); // (int)๋ก๋ ๊ธฐ๋ณธํ๋ณ์ํ์ ์ด๊ธฐ๋๋ฌธ์ ์ฐธ์กฐํ๋ณ์์ธ string์ด ๋ณํ์ด ์๋์ด ํ๋ฒ wrapper class๋ฅผ ์ฌ์ฉํ์ฌ ๋ณํ } int strikes = 0; int balls = 0; for(int i = 0; i < arr.length; i++){ if(arr[i] == arr2[i]){ strikes++; } for(int j = 0; j < arr.length; j++){ if(arr[i] == arr2[j] && j != i){ balls++; } } } String strikeresult = strikes+"S"; String ballsresult = balls+"B"; if(strikes == 0){ strikeresult =""; } if(balls == 0){ ballsresult = ""; } if(strikes == 3){ System.out.println(strikeresult); System.out.println(cnt+"๋ฒ๋ง์ ๋งํ์ จ์ต๋๋ค."); break; } System.out.println(ballsresult + strikeresult); } } }
๊ฐ์ฒด
// ์์ฑ = ํ๋ // ๋ฉ์๋ = ํ์ // ๊ฐ์ฒด = ์ธ์คํด์ค(ํด๋์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก) ์ธ์คํด์คํ // ํด๋์ค : ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ธฐ ์ํ ์ค๊ณ๋// ์บก์ํ // ํ๋์ ๋ฉ์๋๋ฅผ ํ๋๋ก ๋ฌถ์ด ๊ฐ์ฒด๋ก ๋ง๋ ํ ์ธ๋ถ์์ ์ ์ ์๊ฒ ๊ฐ์ถ๊ฒ // ์ธ๋ถ์์๋ ๋ด๋ถ๋ฅผ ์ ์ ์๊ธฐ๋๋ฌธ์ ์ ๊ทผํ ์ ์๋ ํ๋๋ ๋ฉ์๋๋ฅผ ํตํด ์ ๊ทผ // ์ธ๋ถ์์ ์๋ชป์ฌ์ฉํ์ฌ ๊ฐ์ฒด๊ฐ ๋ณํํ์ง์๋ ๊ฒ์ ๋ง๊ธฐ์ํด // ์ ๊ทผ์ ์ด์๋ฅผ ํตํด์ ํ์ฉ๋ฒ์๋ฅผ ์ ํจ // ์์ // ๋ถ๋ชจ๊ฐ์ฒด์ ํ๋์ ๋ฉ์๋๋ฅผ ์์๊ฐ์ฒด์๊ฒ ๋ฌผ๋ ค์ค์ ์ฌ์ฉํ ์ ์๊ฒํจ // ๊ฐ์ฒด๊ฐ์ ๊ตฌ์กฐํ์ ์ด ์ฌ์์ง // ํ๋ ๋ฉ์๋ ๋ณ๊ฒฝ์ ๋ถ๋ชจ๊ฐ์ฒด์ ์๋ ๊ฒ๋ง์ ๋ถ๋ชจ๊ฐ์ฒด์์ ์์ ํ๋ฉด ์์๊ฐ์ฒด์์ ์ ๋ถ์ ๋ฐ์๋๋ฏ๋ก ์ผ๊ด์ฑ์ด ์ข์ // ์ฝ๋ ์ค๋ณต์ด์ค๊ณ ์ฌ์ฌ์ฉ์ฑ์ด ์ข๋ค // ๋คํ์ฑ // ๊ฐ์ฒด๊ฐ ์ฐ์ฐ์ ์ํํ ๋ ํ๋์ ํ์์ ๋ํด ๊ฐ ๊ฐ์ฒด๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ณ ์ ํ ํน์ฑ์ ๋ฐ๋ผ ๋ค๋ฅธ ์ฌ๋ฌ๊ฐ์ง ํํ๋ก ์ฌ๊ตฌ์ฑ๋๋๊ฒ // ์ถ์ํ // ๊ฐ์ฒด์์ ๊ณตํต๋๋ ๋ถ๋ถ๋ค์ ๋ชจ์ ์์ ๊ฐ๋ ์ผ๋ก ์๋กญ๊ฒ ์ ์ธํ๋๊ฒ // ๊ณตํต์ ์ด๊ณ ์ค์ํ ๊ฒ๋ค์ ๋ชจ์ ๊ฐ์ฒด๋ฅผ ๋ชจ๋ธ๋ง์ ๋ฐ์ ์ธ ํ๋ง๋ค๊ธฐ ๋ฐ ์ฌ์ฉ๋ฒ ์์
Car car1 = new Car(); // new ํค์๋๋ฅผ ์ฌ์ฉํด์ ์์ฑ์ ํธ์ถ Car car2 = new Car(); // ์ธ์คํด์ค ์์ฑ System.out.println(car1); // ์ฃผ์๊ฐ : week03.chap07.Car@7a81197d car1.horn(); Car [] carArray = new Car[3]; char p = car1.changeGear('P'); System.out.println(p); carArray[0] = car1; car2.changeGear('N'); carArray[1] = car2; Car car3 = new Car(); car3.changeGear('D'); carArray[2] = car3; for(Car car : carArray){ System.out.println("car.gear = " + car.gear); // .(๋ํธ)์ฐ์ฐ์๋ก ์ ๊ทผ ์์์ changeGear()๋ฉ์๋๋ฅผ ํตํด์ ๊ฐ์ ๋ณ๊ฒฝํ๊ณ ํด๋น๊ฐ์ด ๋ค์ด๊ฐ ํ๋๋ฅผ ๋ถ๋ฌ์์ ๋ณด์ฌ์ค }Car car = new Car(); ์ด๊ธฐ๊ฐ ๊ธฐ๋ณธ ๊ฐ ํ์ธ : ์ด๊ธฐ๊ฐ์ ์ค ๊ฒ์ ๊ทธ ๊ฐ์ด ๋ค์ด๊ฐ๊ณ , ์๋๊ฐ์ default value๊ฐ ๋ค์ด์์ System.out.println("car.model = "+car.model); System.out.println("car.color = "+car.color); System.out.println("car.speed = "+car.speed); System.out.println("car.gear = " + car.gear); System.out.println("car.lights = "+car.lights); System.out.println("car.tire = "+car.tire); System.out.println("car.door = "+car.door); // ํ๋ ์ฌ์ฉ car.color = "blue"; car.speed = 100; car.lights = false; System.out.println("car.color = "+car.color); System.out.println("car.speed = "+car.speed); System.out.println("car.lights = "+car.lights);System.out.println("car.gear = "+ car.gear); double speed = car.gasPedal(100,'D'); System.out.println("speed : " + speed); boolean lights = car.onOffLight(); System.out.println("lights : " + lights); System.out.println(); System.out.println("car.gear = "+ car.gear); System.out.println(""); car.carSpeed(100,80,22); System.out.println(""); car.carSpeed(100,80,22,2222,44);package week03.chap07; // ํด๋์ค ๋ง๋ค๋์ 4๊ฐ์ง ์คํ // 1. ํด๋์ค ์ ์ธ // 2. ์์ฑ ์ ์ // 3. ์์ฑ์ -> constructor(์ ์ํ๋๋ฐฉ์) // 4. ๋ฉ์๋ ์ ์ public class Car {// 1. ํด๋์ค ์ ์ธ // 2. ์์ฑ ์ ์ // ํ๋ ์์ญ // ์ ์ธ๋งํ ์ํ // ๊ณ ์ ๋ฐ์ดํฐ ์์ญ String company; String model = "Gv80"; String color; double price; // ์ํ ๋ฐ์ดํฐ ์์ญ double speed; char gear = 'P'; boolean lights = true; // ๊ฐ์ฒด ๋ฐ์ดํฐ ์์ญ Tire tire = new Tire(); Door door; Handle handle; // 3. ์์ฑ์(ํด๋์ค ์ด๋ฆ๊ณผ ๋์ผํด์ผํจ) : ์ฒ์ ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋(instanceํ) ์ด๋ค ๋ก์ง์ ์ํํด์ผํ๋ฉฐ, ์ด๋ค๊ฐ์ด ํ์๋ก ๋ค์ด์์ผ ํ๋์ง ์ ์ public Car (){ // ๊ธฐ๋ณธ์์ฑ์ : ์๋ต์ด ๊ฐ๋ฅ์ถ System.out.println("Car ์์ฑ์ ํธ์ถ"); } // 4. ๋ฉ์๋ // gasPedal // input : kmh // output : spped double gasPedal(double kmh, char type){ // ๋ฆฌํดํ์ ์ ์์ฑ changeGear(type); speed = kmh; return speed; } // brakePedal // input : none // output : speed double brakePedal(){ speed = 0; return speed; } // changeGear // input : gear(char type) // output : gear char changeGear(char type){ gear = type; return gear; } // onOffLight // input : none // output : boolean boolean onOffLight(){ lights = !lights; return lights; } // horn // input : x // output : x void horn(){ // return๊ฐ์ด ํ์๊ฐ ์๋๋ค System.out.println("๋์!!!!!"); } // ์๋์ฐจ์ ์๋ .. ๊ฐ๋ณ๊ธธ์ด ๋ฉ์๋ void carSpeed(double ... speeds){ // ... : ์คํ๋ ๋ ๋งค๊ฐ ๋ณ์ / ๋ฐฐ์ด๋ก ๋ค์ด์ด for(double v : speeds){ System.out.println("v = "+v); } } }package week03.chap07; public class Door { public Door(){ System.out.println("๋ฌธ ๊ฐ์ฒด ์์ฑ"); } } package week03.chap07; public class Handle { public Handle (){ System.out.println("ํธ๋๊ฐ์ฒด ๋ง๋ค์ด์ง"); } } package week03.chap07; public class Tire { public Tire(){ System.out.println("ํ์ด์ด ์์ฑ"); } }
- ํ๋ ํ์
๋ณ ๊ธฐ๋ณธ๊ฐ
๋ฐ์ดํฐ ํ์ ๊ธฐ๋ณธ๊ฐ byte 0 char \u0000 (๊ณต๋ฐฑ) short 0 int 0 long 0L float 0.0F double 0.0 boolean false ๋ฐฐ์ด null ํด๋์ค null ์ธํฐํ์ด์ค null
์ค๋ฒ๋ก๋ฉ
// ์ค๋ฒ๋ก๋ฉ // ๋ฉ์๋์ ์ด๋ฆ์ ๊ฐ์ง๋ง ๋งค๊ฐ๋ณ์์ ํ์ ์ด๋ ์์๋ ๊ฐ์๊ฐ ๋ค๋ฅธ๊ฒ // ์๋ต๊ฐ๋ง ๋ค๋ฅธ๊ฒ์ ์๋๋ค // ์ ๊ทผ ์ ์ด์๋ง ๋ค๋ฅธ๊ฒ๋ ์ค๋ฒ๋ก๋ฉ์ด๋ผ๊ณ ํ ์ ์๋ค // ๋งค๊ฐ๋ณ์์ ์ฐจ์ด๋ก๋ง ๊ตฌํ๊ฐ๋ฅ // ์ฅ์ // 1. ๋ฉ์๋๋ช ์ ์ ์ฝํ ์์๋ค -> ๊ฐ์ ์ด๋ฆ์์ ํ์ ๋ง ๋ณ๊ฒฝํด์ ์ธ์์๊ธฐ๋๋ฌธ์ // 2. ๊ฐ์์ด๋ฆ์ผ๋ก ๋ค๋ฅธ ๋์์ ๊ฐ๋ณ ์ ์๊ฐ ๊ฐ๋ฅํ๋ค // ๊ธฐ๋ณธํ ๋งค๊ฐ๋ณ์๋ ๊ฐ์์ฒด๊ฐ ๋ณต์ฌ๋์ด ๋์ด๊ฐ๊ธฐ๋๋ฌธ์ ๋งค๊ฐ๊ฐ์ผ๋ก ์ง์ ๋ ๋ณ์์ ์๋ณธ๊ฐ์ด ๋ณ๊ฒฝ์๋จ // ์ฐธ์กฐํ ๋งค๊ฐ๋ณ์๋ ์ง์ ํ ๊ฐ์ ์ฃผ์๋ฅผ ๋งค๊ฐ๋ณ์์ ๋ณต์ฌํด์ ์ ๋ฌํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ ์ฝ๊ฑฐ๋ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ๊ฐ๋ฅ- ์์
public class PrintStream extends FilterOutputStream implements Appendable, Closeable { ... public void println() { newLine(); } public void println(boolean x) { if (getClass() == PrintStream.class) { writeln(String.valueOf(x)); } else { synchronized (this) { print(x); newLine(); } } } public void println(char x) { if (getClass() == PrintStream.class) { writeln(String.valueOf(x)); } else { synchronized (this) { print(x); newLine(); } } } public void println(int x) { if (getClass() == PrintStream.class) { writeln(String.valueOf(x)); } else { synchronized (this) { print(x); newLine(); } } } public void println(long x) { if (getClass() == PrintStream.class) { writeln(String.valueOf(x)); } else { synchronized (this) { print(x); newLine(); } } } public void println(float x) { if (getClass() == PrintStream.class) { writeln(String.valueOf(x)); } else { synchronized (this) { print(x); newLine(); } } } public void println(double x) { if (getClass() == PrintStream.class) { writeln(String.valueOf(x)); } else { synchronized (this) { print(x); newLine(); } } } public void println(char[] x) { if (getClass() == PrintStream.class) { writeln(x); } else { synchronized (this) { print(x); newLine(); } } } public void println(String x) { if (getClass() == PrintStream.class) { writeln(String.valueOf(x)); } else { synchronized (this) { print(x); newLine(); } } } public void println(Object x) { String s = String.valueOf(x); if (getClass() == PrintStream.class) { // need to apply String.valueOf again since first invocation // might return null writeln(String.valueOf(s)); } else { synchronized (this) { print(s); newLine(); } } } ... }
๊ธฐ๋ณธํ๊ณผ ์ฐธ์กฐํ ๋งค๊ฐ๋ณ์์ ์ฐจ์ด
// ๊ธฐ๋ณธํ ๋งค๊ฐ๋ณ์๋ ๋งค๊ฐ๊ฐ ์์ฒด๊ฐ ๋ณต์ฌ๋์ด ๋์ด๊ฐ๊ธฐ๋๋ฌธ์ ์๋ณธ์๋ ์ํฅ์ ์๋ฏธ์น๋ค // ์ฐธ์กฐํ ๋งค๊ฐ๋ณ์์ ๊ฒฝ์ฐ์๋ ์ฃผ์๊ฐ์ด ๋์ด๊ฐ๊ธฐ ๋๋ฌธ์ ์๋ณธ์ด ๋ฐ๋๋๋ฑ ์ํฅ์ ๋ฏธ์น๋คpackage week03.parameter; public class Main { public static void main(String[] args) { Car car = new Car(); // ๊ฐ์ฒด ์์ฑ // ๊ธฐ๋ณธํ ๋งค๊ฐ๋ณ์ char type = 'D'; car.brakePedal(type); // ๋ฉ์๋ ์คํ ์๋ฃ ํ ์ ๋ฌํ ๋งค๊ฐ๊ฐ์ผ๋ก ์ง์ ๋ type ๊ฐ ํ์ธ System.out.println("type = " + type); // ๊ธฐ์กด์ ์ ์ธํ ๊ฐ 'D' ์ถ๋ ฅ, ์๋ณธ ๊ฐ ๋ณ๊ฒฝ๋์ง ์์ // ๋ฉ์๋ ์คํ ์๋ฃ ํ ๋ฐํ๋ car ์ธ์คํด์ค์ gear ํ์ ํ์ธ System.out.println("gear = " + car.gear); // ๊ฐ์ฒด ๋ด๋ถ์์ type์ ๋ณ๊ฒฝํ์ฌ ์์ ํ๊ธฐ ๋๋ฌธ์ 'P' ์ถ๋ ฅ System.out.println(); // ์ฐธ์กฐํ ๋งค๊ฐ๋ณ์ Tire tire = new Tire(); tire.company = "๊ธํธ"; // ๊ธํธ ํ์ด์ด ๊ฐ์ฒด ์์ฑ // ์ฐจ ๊ฐ์ฒด์ ํ์ด์ด๋ฅผ ๋ฑ๋กํ๋ ๋ฉ์๋ ํธ์ถํ ํ ๋ฐํ๊ฐ์ผ๋ก ์ฐจ ๊ฐ์ฒด์ ํ์ด์ด ๊ฐ์ฒด ๋ฐํ Tire carInstanceTire = car.setTire(tire); // ๋ฉ์๋ ์คํ ์๋ฃ ํ ์ ๋ฌํ ๋งค๊ฐ๊ฐ์ผ๋ก ์ง์ ๋ ์ฐธ์กฐํ ๋ณ์ tire์ company ๊ฐ ํ์ธ System.out.println("tire.company = " + tire.company); // "KIA" ์ถ๋ ฅ // ์ ๋ฌํ ๋งค๊ฐ๊ฐ์ผ๋ก ์ง์ ๋ tire ์ธ์คํด์ค์ ์ฃผ์๊ฐ์ด ์ ๋ฌ๋์๊ธฐ ๋๋ฌธ์ ํธ์ถ๋ ๋ฉ์๋์ ์ํด ๊ฐ์ด ๋ณ๊ฒฝ๋จ. // ๋ฉ์๋ ์คํ ์๋ฃ ํ ๋ฐํ๋ car ์ธ์คํด์ค์ tire ๊ฐ์ฒด ๊ฐ์ด ๋ฐํ๋์ด ์ ์ฅ๋ ์ฐธ์กฐํ ๋ณ์ carInstanceTire์ company ๊ฐ ํ์ธ System.out.println("carInstanceTire.company = " + carInstanceTire.company); // "KIA" ์ถ๋ ฅ } }package week03.parameter; public class Tire { String company; // ํ์ด์ด ํ์ฌ public Tire() {} }package week03.parameter; public class Car { String company; // ์๋์ฐจ ํ์ฌ String model; // ์๋์ฐจ ๋ชจ๋ธ String color; // ์๋์ฐจ ์์ double price; // ์๋์ฐจ ๊ฐ๊ฒฉ double speed; // ์๋์ฐจ ์๋ , km/h char gear; // ๊ธฐ์ด์ ์ํ, P,R,N,D boolean lights; // ์๋์ฐจ ์กฐ๋ช ์ ์ํ Tire tire; Door door = new Door(); Handle handle = new Handle(); public Car() {} // ๊ธฐ๋ณธ ์์ฑ์ double gasPedal(double kmh, char type) { changeGear(type); speed = kmh; return speed; } double brakePedal(char type) { speed = 0; type = 'P'; // ์ ์ง ํ ๋งค๊ฐ๋ณ์ type์ ์ด๋ค ํ์ ์ผ๋ก ์ ๋ฌ ๋ฐ์๋์ง ์๊ด์์ด 'P'๋ก ๊ณ ์ ์ํค๊ธฐ changeGear(type); return speed; } char changeGear(char type) { gear = type; return gear; } boolean onOffLights() { lights = !lights; return lights; } void horn() { System.out.println("๋นต๋นต"); } Tire setTire(Tire tireCompany) { tireCompany.company = "KIA"; // ๊ธํธ ํ์ด์ด๋ฅผ ์ ๋ฌ ๋ฐ์์ง๋ง ๊ฐ์ ๋ก KIA ํ์ด์ด๋ก ๊ต์ฒด tire = tireCompany; return tire; } }
์ธ์คํด์ค ๋ฉค๋ฒ์ ํด๋์ค ๋ฉค๋ฒ
๐ก๋ฉค๋ฒ = ํ๋ + ๋ฉ์๋- ์ธ์คํด์ค ๋ฉค๋ฒ = ์ธ์คํด์ค ํ๋ + ์ธ์คํด์ค ๋ฉ์๋
- ํด๋์ค ๋ฉค๋ฒ(์ ์ ๋ฉค๋ฒ) = ํด๋์ค ํ๋ + ํด๋์ค ๋ฉ์๋
์ ์ธํ๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ์ ์ธ์คํด์ค ๋ฉค๋ฒ์ ํด๋์ค ๋ฉค๋ฒ๋ก ๊ตฌ๋ถํ ์ ์๋ค
์ธ์คํด์ค ๋ฉค๋ฒ๋ ๊ฐ์ฒด ์์ฑ ํ์๋ง ์ฌ์ฉํ ์ ์๊ณ , ํด๋์ค ๋ฉค๋ฒ์ ๊ฒฝ์ฐ์๋ ๊ทธ๋ด ํ์๊ฐ ์๋ค
์ธ์คํด์ค ๋ฉค๋ฒ์ ๊ฒฝ์ฐ ์ง๊ธ๊น์ง new๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ฒด์์ฑํด์ค๊ฒ๋ค ํด๋์ค๋ Java์ ํด๋์ค ๋ก๋์ ์ํด ๋ฉ์๋ ์์ญ์ ์ ์ฅ๋๊ณ ์ฌ์ฉ๋จ ํด๋์ค ๋ฉค๋ฒ๋ ๋ฉ์๋ ์์ญ์ ํด๋์ค์ ๊ฐ์ ์์น์ ๊ณ ์ ์ ์ผ๋ก ์์นํ๋ ๋ฉค๋ฒ ๊ฐ์ฒด์์ฑ์ด ๋ถํ์// ํด๋์ค ๋ฉค๋ฒ ์ ์ธ ํ๋์ ๋ฉ์๋์์ staticํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฅ static์ ์ ์ ์ธ ๋ฉ์๋๋ฅผ ์๋ฏธํ๋ค Static์์ญ์ ํ ๋น๋๋ฉฐ, Static์์ญ์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ ๋ชจ๋ ๊ฐ์ฒด๊ฐ ๊ณต์ ํ์ฌ ํ๋์ ๋ฉค๋ฒ๋ฅผ ์ด๋์๋ ์ง ์ฐธ์กฐํ ์ ์๋ ์ฅ์ ์ ๊ฐ์ง์ง๋ง Garbage Collector์ ๊ด๋ฆฌ ์์ญ ๋ฐ์ ์กด์ฌํ๋ฏ๋ก Static์์ญ์ ์๋ ๋ฉค๋ฒ๋ค์ ํ๋ก๊ทธ๋จ์ ์ข ๋ฃ์๊น์ง ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋ ์ฑ๋ก ์กด์ฌ ๊ทธ๋ฌ๋ฏ๋ก ๋๋ฌด ๋จ๋ฐํ๋ฉด ์์คํ ์ฑ๋ฅ์ ์ ์ํฅ์ ์ค ์ ์๋ค. // ์ฌ์ฉํ๋ ๊ฒฝ์ฐ 1. ์ธ์คํด์ค๋ง๋ค ๋ชจ๋ ๊ฐ์ง๊ณ ์์ ํ์๊ฐ ์๋ ๊ณต์ฉ์ ์ธ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ํ๋์ ๊ฒฝ์ฐ 2. ์ธ์คํด์ค ํ๋๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์คํ๋๋ ๋ฉ์๋์ ๊ฒฝ์ฐ ํด๋์ค ๋ฉค๋ฒ๋ก ์ ์ธ๋ ๋ฉ์๋๋ ์ธ์คํด์ค ๋ฉค๋ฒ๋ฅผ ์ฌ์ฉํ ์ ์๋ค ์ธ์คํด์ค ๋ฉค๋ฒ๋ก ์ ์ธ๋ ๋ฉ์๋๋ ํด๋์ค ๋ฉค๋ฒ๋ฅผ ์ฌ์ฉํ ์ ์๋ค - ํด๋์ค ๋ฉค๋ฒ๋ ๊ฐ์ฒด ์์ฑ์์ด ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด๊ฐ ์์ฑ๋์ด์ผ ์กด์ฌํ ์ ์๋ ์ธ์คํด์ค ๋ฉค๋ฒ๋ฅผ ์ฌ์ฉํ ์ ์๋ค ํด๋์ค ํ๋๋ก ๊ณต์ ํ๊ฒ ๋ง๋ ๋ค๋ฉด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค// ์ธ์คํด์ค ๋ณ์๋ ์ธ์คํด์ค๊ฐ ์์ฑ๋ ๋๋ง๋ค ์์ฑ๋๋ฏ๋ก ์ธ์คํด์ค๋ง๋ค ๊ฐ๊ธฐ ๋ค๋ฅธ ๊ฐ์ ๊ฐ์ง์ง๋ง // ์ ์ ๋ณ์(ํด๋์ค ํ๋)๋ ๋ชจ๋ ์ธ์คํด์ค๊ฐ ํ๋์ ์ ์ฅ๊ณต๊ฐ์ ๊ณต์ ํ๊ธฐ์ ํญ์ ๊ฐ์ ๊ฐ์ ๊ฐ์ง๋ค // ์๋์์์ ์ฒซ๋ฒ์งธ println์ num์ด ์ ์ ๋ณ์์ด๊ธฐ์ new๋ก ๊ฐ์ฒด์์ฑ์ ํด๋ number1๊ณผnumber2์ ๋์ผํ ์ ์ฅ๊ณต๊ฐ์ ๊ณต์ ํ๊ธฐ๋๋ฌธ์ ๊ฐ์ด1๋ก ์ฌ๋ผ๊ฐ๊ฒ์ ํ์ธํ ์์๋ค. // ํ์ง๋ง ๋๋ฒ์งธ println์ ๊ฒฝ์ฐ ์ธ์คํด์ค ํ๋๋ก ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋ ๋ง๋ค ๋ณ๋์ ๊ฐ์ ์์ฑํด์ ์ฌ์ฉํ๊ธฐ๋๋ฌธ์ number2.num2๋ 0์ธ์ํ์ด๊ณ number1.num2๋ง 1๋ก์ฌ๋ผ๊ฐ๊ฒ์ ํ์ธํ ์์๋ค. class Number{ static int num = 0; //ํด๋์ค ํ๋ int num2 = 0; //์ธ์คํด์ค ํ๋ } public class Static_ex { public static void main(String[] args) { Number number1 = new Number(); //์ฒซ๋ฒ์งธ number Number number2 = new Number(); //๋๋ฒ์จฐ number number1.num++; //ํด๋์ค ํ๋ num์ 1์ฆ๊ฐ์ํด number1.num2++; //์ธ์คํด์ค ํ๋ num์ 1์ฆ๊ฐ์ํด System.out.println(number2.num); //๋๋ฒ์งธ number์ ํด๋์ค ํ๋ ์ถ๋ ฅ System.out.println(number2.num2); //๋๋ฒ์งธ number์ ์ธ์คํด์ค ํ๋ ์ถ๋ ฅ } }- ์์ ์ฝ๋
public class Car { static String company = "GENESIS"; // ์๋์ฐจ ํ์ฌ : GENESIS String model; // ์๋์ฐจ ๋ชจ๋ธ String color; // ์๋์ฐจ ์์ double price; // ์๋์ฐจ ๊ฐ๊ฒฉ double speed; // ์๋์ฐจ ์๋ , km/h char gear; // ๊ธฐ์ด์ ์ํ, P,R,N,D boolean lights; // ์๋์ฐจ ์กฐ๋ช ์ ์ํ public Car() {} // ๊ธฐ๋ณธ ์์ฑ์ double gasPedal(double kmh, char type) { changeGear(type); speed = kmh; return speed; } double brakePedal() { speed = 0; return speed; } char changeGear(char type) { gear = type; return gear; } boolean onOffLights() { lights = !lights; return lights; } void horn() { System.out.println("๋นต๋นต"); } String getCompany() { return "(์ฃผ)" + company; } static String setCompany(String companyName) { // System.out.println("์๋์ฐจ ๋ชจ๋ธ ํ์ธ: " + model); // ์ธ์คํด์ค ํ๋ ์ฌ์ฉ ๋ถ๊ฐ company = companyName; return company; } }public class Main { public static void main(String[] args) { // ํด๋์ค ํ๋ company ํ์ธ System.out.println(Car.company + "\n"); // ํด๋์ค ํ๋ ๋ณ๊ฒฝ ๋ฐ ํ์ธ Car.company = "Audi"; System.out.println(Car.company + "\n"); // ํด๋์ค ๋ฉ์๋ ํธ์ถ String companyName = Car.setCompany("Benz"); System.out.println("companyName = " + companyName); System.out.println(); // ์ฐธ์กฐํ ๋ณ์ ์ฌ์ฉ Car car = new Car(); // ๊ฐ์ฒด ์์ฑ car.company = "Ferrari"; System.out.println(car.company + "\n"); String companyName2 = car.setCompany("Lamborghini"); System.out.println("companyName2 = " + companyName2); } }
์ง์ญ ๋ณ์ finalํ๋ ์์
// ์ง์ญ ๋ณ์ <-> ์ ์ญ ๋ณ์ // ํด๋น ๋ฉ์๋๊ฐ ์คํ๋ ๋ ๋ง๋ค ๋ ๋ฆฝ์ ์ธ ๊ฐ์ ์ ์ฅํ๊ณ ๊ด๋ฆฌ // ์ด ์ง์ญ๋ณ์๊ฐ ๋ฉ์๋ ๋ด๋ถ์์ ์ ์๋ ๋ ์์ฑ // ์ด ๋ฉ์๋๊ฐ ์ข ๋ฃ๋ ๋ ์๋ฉธ // final // final ํ๋๋ ์ด๊ธฐ๊ฐ์ด ์ ์ฅ๋๋ฉด ํด๋น๊ฐ์ ํ๋ก๊ทธ๋จ์ด ์คํํ๋ ๋์ค์๋ ์ ๋๋ก ์์ ํ ์ ์์ต๋๋ค. // ๋ํ final ํ๋๋ ๋ฐ๋์ ์ด๊ธฐ๊ฐ์ ์ง์ ํด์ผ ํฉ๋๋ค. // ์์ // ์ ์ฒด๊ฐ ๋๋ฌธ์์ธ ๋ณ์๋ ์์ // ์์์ ํน์ง์ ๊ฐ์ด ๋ฐ๋์ ํ๊ฐ์ด๋ฉฐ ๋ถ๋ณ์ ๊ฐ // ์คํด์ค๋ง๋ค ์์๋ฅผ ์ ์ฅํ ํ์๊ฐ ์๋ค // final ์์ static ํค์๋๋ฅผ ์ถ๊ฐํ์ฌ ๋ชจ๋ ์ธ์คํด์ค๊ฐ ๊ณต์ ํ ์ ์๋ ๊ฐ์ด ํ๊ฐ์ด๋ฉฐ ๋ถ๋ณ์ธ ์์๋ฅผ ์ ์ธstatic final String COMPANY = "GENESIS"; ... System.out.println(Car.COMPANY);
์์ฑ์
// ๊ธฐ๋ณธ ์์ฑ์๋ ๋งค๊ฐ๋ณ์๊ฐ ์๋๊ฒ์ ์๋ฏธํ๋ค // ๋ชจ๋ ํด๋์ค์๋ ๋งค๊ฐ๋ณ์๊ฐ ํ๋์ด์ ์กด์ฌํด์ผ์ง๋ง ๋งค๊ฐ๋ณ์๋ ์๋ต์ด ๊ฐ๋ฅํ๊ธฐ๋๋ฌธ์ // ๋ฐ๋ก ๋ง๋ค์ง ์์๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋๊ฒ์ด๋ค // ํ์ง๋ง ์์ฑ์๊ฐ ์๋๊ฒฝ์ฐ์๋ ์๋์ผ๋ก ๊ธฐ๋ณธ ์์ฑ์๋ ์์ฑ๋์ง์๋๋ค // ์์ฑ์๋ ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํ ํ๋ ์ญํ ์ ์ํ // ์์ฑ์์ ๋งค๊ฐ๋ณ์์ ๋ง์ถ์ด์ ์ธ์คํด์คํํด์ผํ๋ค. // ์์ฑ์ ์ค๋ฒ๋ก๋ฉ๋ ๊ฐ๋ฅํ๋ค // ๊ฐ์,ํ์ ,์์๊ฐ ๋์ผํ๋ฐ ๋งค๊ฐ๋ณ์๋ช ๋ง ๋ค๋ฅธ๊ฒฝ์ฐ์๋ ๋ถ๊ฐ๋ฅpackage week03.constructor; import java.util.stream.StreamSupport; public class Car { static final String COMPANY = "GENESIS"; // ์๋์ฐจ ํ์ฌ : GENESIS String model; // ์๋์ฐจ ๋ชจ๋ธ String color; // ์๋์ฐจ ์์ double price; // ์๋์ฐจ ๊ฐ๊ฒฉ double speed; // ์๋์ฐจ ์๋ , km/h char gear = 'P'; // ๊ธฐ์ด์ ์ํ, P,R,N,D boolean lights; // ์๋์ฐจ ์กฐ๋ช ์ ์ํ // constructor // ์ค๋ฒ๋ก๋ฉ ์์ฑ์ public Car(String modelName) { model = modelName; System.out.println("์ฒซ๋ฒ์งธ ์์ฑ์"); } public Car(String modelName, String colorName) { model = modelName; color = colorName; System.out.println("๋๋ฒ์งธ ์์ฑ์"); } public Car(String modelName, String colorName, double priceValue) { model = modelName; color = colorName; price = priceValue; System.out.println("์ธ๋ฒ์งธ ์์ฑ์"); } double gasPedal(double kmh, char type) { changeGear(type); speed = kmh; return speed; } double brakePedal() { speed = 0; return speed; } char changeGear(char type) { gear = type; return gear; } boolean onOffLights() { lights = !lights; return lights; } void horn() { System.out.println("๋นต๋นต"); } }package week03.constructor; public class Main { public static void main(String[] args) { // ๊ธฐ๋ณธ ์์ฑ์ ํธ์ถ ์ค๋ฅ ํ์ธ // Car car1 = new Car(); // ์ค๋ฅ ๋ฐ์ // ์์ฑ์ ์ค๋ฒ๋ก๋ฉ์ ํตํด ์ฌ๋ฌ ์ํฉ์์ ์๋์ฐจ ์์ฐ // ์ ๋ค์์ค ์๋์ฐจ๋ฅผ ์์ฐ : static final String COMPANY = "GENESIS"; ์์ ๊ณ ์ // ๋ชจ๋ ์๋์ฐจ๋ ์์ฐ์ ๊ธฐ์ด์ ์ต์ด ์ํ 'P' ๋ก ๊ณ ์ : char gear = 'P'; ์ง์ ๋์ ํ์ฌ ์ด๊ธฐํ // GV60 ๋ชจ๋ธ๋ง ๊ธฐ๋ณธ์ผ๋ก ์ ํ Car car2 = new Car("GV60"); System.out.println("car2.model = " + car2.model); System.out.println("car2.gear = " + car2.gear + "\n"); // GV70 ๋ชจ๋ธ, ์์ Blue ๋ง ๊ธฐ๋ณธ์ผ๋ก ์ ํ Car car3 = new Car("GV70", "Blue"); System.out.println("car3.model = " + car3.model); System.out.println("car3.color = " + car3.color); System.out.println("car3.gear = " + car3.gear + "\n"); // GV80 ๋ชจ๋ธ, ์์ Black, ๊ฐ๊ฒฉ 50000000 ์ผ๋ก ์์ ํ๊ฒ ๊ณ ์ ๋ ๊ฒฝ์ฐ Car car4 = new Car("GV80", "Black", 50000000); System.out.println("car4.model = " + car4.model); System.out.println("car4.color = " + car4.color); System.out.println("car4.price = " + car4.price); System.out.println("car4.gear = " + car4.gear + "\n"); } }
this this()
// this๋ ๊ฐ์ฒด(์ธ์คํด์ค) ์์ ์ ํํ // ๋งค๊ฐ๋ณ์๋ช ๊ณผ ์ฌ์ฉํ๋ ํ๋์ด๋ฆ์ด ๊ฐ์ ๊ฒฝ์ฐ // ์ค๋ฅ๋ ๋ฐ์ํ์ง์์ง๋ง ํ๋๊ฐ ์๋ ๊ฐ์ฅ ๊ฐ๊น์ด ๋งค๊ฐ๋ณ์๋ช ์ ๊ฐ๋ฆฌํค๊ฒ ๋จ์ผ๋ก ์๊ธฐ ์์ ์๊ฒ ๊ฐ์ ๋์ ํ๋ ์ํฉ์ด ๋๋ค. // ๊ทธ๋์ this ํค์๋๋ฅผ ์ฌ์ฉํด์ ํด๊ฒฐํด์ค์์๋ค // this๋ ์ธ์คํด์ค ์์ ์ ๋ปํ๊ธฐ๋ํ๋๊น ๊ฐ์ฒด์ ๋ฉ์๋์์ ๋ฆฌํดํ์ ์ด ์ธ์คํด์ค ์์ ์ ํด๋์ค ํ์ ์ด๋ผ๋ฉด // this๋ฅด ์ฌ์ฉํ์ฌ ์ธ์คํด์ค ์์ ์ ์ฃผ์ ๋ฐํ ๊ฐ๋ฅ Car returnInstance() { return this; }// this() // ์ธ์คํด์ค ์์ ์ ์์ฑ์๋ฅผ ํธ์ถ // this()ํค์๋๋ฅผ ์ฌ์ฉํด์ ๋ค๋ฅธ ์์ฑ์๋ฅผ ํธ์ถํ ๋๋ ๋ฐ๋์ ์ฒซ๋ฒ์งธ์ค์ ์์ฑํด์ผํ๋คpublic class Car { static final String COMPANY = "GENESIS"; // ์๋์ฐจ ํ์ฌ : GENESIS String model; // ์๋์ฐจ ๋ชจ๋ธ String color; // ์๋์ฐจ ์์ double price; // ์๋์ฐจ ๊ฐ๊ฒฉ double speed; // ์๋์ฐจ ์๋ , km/h char gear = 'P'; // ๊ธฐ์ด์ ์ํ, P,R,N,D boolean lights; // ์๋์ฐจ ์กฐ๋ช ์ ์ํ // ๊ฒฐ๋ก ์ ์ธ๋ฒ์งธ์ ์์ฑ์๋ก ๋ง๋ค์ด์ง๊ฒ ๋๋ค. public Car(String model) { this(model, "Blue", 50000000); } public Car(String model, String color) { this(model, color, 100000000); } public Car(String model, String color, double price) { this.model = model; this.color = color; this.price = price; } double gasPedal(double kmh, char type) { changeGear(type); speed = kmh; return speed; } double brakePedal() { speed = 0; return speed; } char changeGear(char type) { gear = type; return gear; } boolean onOffLights() { lights = !lights; return lights; } void horn() { System.out.println("๋นต๋นต"); } Car returnInstance() { return this; } }public class Main { public static void main(String[] args) { // ์์ฑ์ ์ค๋ฒ๋ก๋ฉ์ ํตํด ์ฌ๋ฌ ์ํฉ์์ ์๋์ฐจ ์์ฐ // ์ ๋ค์์ค ์๋์ฐจ๋ฅผ ์์ฐ : static final String COMPANY = "GENESIS"; ์์ ๊ณ ์ // ๋ชจ๋ ์๋์ฐจ๋ ์์ฐ์ ๊ธฐ์ด์ ์ต์ด ์ํ 'P' ๋ก ๊ณ ์ : char gear = 'P'; ์ง์ ๋์ ํ์ฌ ์ด๊ธฐํ // ๋ชจ๋ธ์ ๋ณ๊ฒฝํ๋ฉด์ ๋ง๋ค ์ ์๊ณ ์์ : Blue, ๊ฐ๊ฒฉ 50000000 ๊ณ ์ Car car1 = new Car("GV60"); System.out.println("car1.model = " + car1.model); System.out.println("car1.color = " + car1.color); System.out.println("car1.price = " + car1.price); System.out.println("car1.gear = " + car1.gear + "\n"); // ๋ชจ๋ธ, ์์์ ๋ณ๊ฒฝํ๋ฉด์ ๋ง๋ค ์ ์๊ณ ๊ฐ๊ฒฉ 100000000 ๊ณ ์ Car car2 = new Car("GV70", "Red"); System.out.println("car2.model = " + car2.model); System.out.println("car2.color = " + car2.color); System.out.println("car2.price = " + car2.price); System.out.println("car2.gear = " + car2.gear + "\n"); // GV80 ๋ชจ๋ธ, ์์ Black, ๊ฐ๊ฒฉ 120000000 ์ผ๋ก ์์ ํ๊ฒ ๊ณ ์ ๋ ๊ฒฝ์ฐ Car car3 = new Car("GV80", "Black", 120000000); System.out.println("car3.model = " + car3.model); System.out.println("car3.color = " + car3.color); System.out.println("car3.price = " + car3.price); System.out.println("car3.gear = " + car3.gear + "\n"); // this ํค์๋๋ฅผ ํตํด car3 ์ธ์คํด์ค ์์ ์ ๋ฐํ : car3.returnInstance() = ์ธ์คํด์ค์ ์ฃผ์ System.out.println(car3.returnInstance().model); // car3์ model System.out.println(car3.returnInstance().color); // car3์ color System.out.println(car3.returnInstance().price); // car3์ price } }
super super()
// super -> ๋ถ๋ชจ ํด๋์ค์ ๋ฉค๋ฒ๋ฅผ ์ฐธ์กฐ / ์์ํด๋์ค์ ์์น์์ ์ฌ์ฉ // ์์ํด๋์ค์ ๋ด๋ถ์ ๋ถ๋ชจํด๋์ค์์ ์์๋ฐ์ ๋ฉค๋ฒ์ ์ด๋ฆ์ด ๊ฐ์๊ฒฝ์ฐ์ ๊ตฌ๋ถํ๊ธฐ์ํด์ // super.ํ๋ -> ๋ถ๋ชจํด๋์ค์ ํ๋๊ฐ์ ๋ค์ด๊ฐpublic class Car { String company; // ์๋์ฐจ ํ์ฌ String model; // ์๋์ฐจ ๋ชจ๋ธ String color; // ์๋์ฐจ ์์ double price; // ์๋์ฐจ ๊ฐ๊ฒฉ double speed; // ์๋์ฐจ ์๋ , km/h char gear = 'P'; // ๊ธฐ์ด์ ์ํ, P,R,N,D boolean lights; // ์๋์ฐจ ์กฐ๋ช ์ ์ํ public String getModel() { return model; } public String getColor() { return color; } public double gasPedal(double kmh, char type) { changeGear(type); speed = kmh; return speed; } public double brakePedal() { speed = 0; return speed; } public char changeGear(char type) { gear = type; return gear; } public boolean onOffLights() { lights = !lights; return lights; } public void horn() { System.out.println("๋นต๋นต"); } }public class SportsCar extends Car{ String engine; String model = "Ferrari"; // ์๋์ฐจ ๋ชจ๋ธ String color = "Red"; // ์๋์ฐจ ์์ double price = 300000000; // ์๋์ฐจ ๊ฐ๊ฒฉ public SportsCar(String engine) { this.engine = engine; } public void booster() { System.out.println("์์ง " + engine + " ๋ถ์~\n"); } public void setCarInfo(String model, String color, double price) { super.model = model; // model์ ๋ถ๋ชจ ํ๋์ set super.color = color; // color๋ ๋ถ๋ชจ ํ๋์ set this.price = price; // price๋ ์์ ํ๋์ set } @Override public double brakePedal() { speed = 100; System.out.println("์คํฌ์ธ ์นด์ ๋ธ๋ ์ดํฌ๋ ์๋ค"); return speed; } @Override public void horn() { booster(); } }public class Main { public static void main(String[] args) { // ์์ ํด๋์ค ์คํฌ์ธ ์นด ๊ฐ์ฒด ์์ฑ SportsCar sportsCar = new SportsCar("Orion"); // ์์ ๊ฐ์ฒด์ model, color, price ์ด๊ธฐ๊ฐ ํ์ธ System.out.println("sportsCar.model = " + sportsCar.model); // Ferrari System.out.println("sportsCar.color = " + sportsCar.color); // Red System.out.println("sportsCar.price = " + sportsCar.price); // 3.0E8 System.out.println(); // setCarInfo ๋ฉ์๋ ํธ์ถํด์ ๋ถ๋ชจ ๋ฐ ์์ ํ๋ ๊ฐ ์ ์ฅ sportsCar.setCarInfo("GV80", "Black", 50000000); // this.price = price; ๊ฒฐ๊ณผ ํ์ธ System.out.println("sportsCar.price = " + sportsCar.price); // 5.0E7 System.out.println(); // super.model = model; super.color = color; // ๊ฒฐ๊ณผ ํ์ธ์ ์ํด ์์ ํด๋์ค ํ๋ model, color ํ์ธ & ๋ถ๋ชจ ํด๋์ค ๋ฉ์๋์ธ getModel(), getColor() ํธ์ถ // ์์ ํด๋์ค ํ๋ ๊ฐ์ ๋ณํ ์์. System.out.println("sportsCar.model = " + sportsCar.model); // Ferrari System.out.println("sportsCar.color = " + sportsCar.color); // Red System.out.println(); // ๋ถ๋ชจ ํด๋์ค ํ๋ ๊ฐ ์ ์ฅ๋จ. System.out.println("sportsCar.getModel() = " + sportsCar.getModel()); // GV80 System.out.println("sportsCar.getColor() = " + sportsCar.getColor()); // Black } }// super() -> ๋ถ๋ชจํด๋์ค์ ์์ฑ์๋ฅผ ํธ์ถ // ๊ธฐ๋ณธ ์์ฑ์์ ๋ถ๋ชจํด๋์ค๋ ์๋์ ์ผ๋ก ์์์์ฑ์์์๋ ์์ฑ// ๋ถ๋ชจ ํด๋์ค Car ์์ฑ์ public Car(String model, String color, double price) { this.model = model; this.color = color; this.price = price; } // ์์ ํด๋์ค SportsCar ์์ฑ์ public SportsCar(String model, String color, double price, String engine) { // this.engine = engine; // ์ค๋ฅ ๋ฐ์ super(model, color, price); this.engine = engine; }
์ ๊ทผ์ ์ด์
๐ก์ ์ด์๋ ํด๋์ค, ๋ณ์, ๋ฉ์๋์ ์ ์ธ๋ถ์ ์ฌ์ฉ๋์ด ๋ถ๊ฐ์ ์ธ ์๋ฏธ๋ฅผ ๋ถ์ฌํด ์ค๋๋ค.- ์ ๊ทผ ์ ์ด์ :
public,protected,default,private
- ๊ทธ ์ธย ์ ์ด์ :
static,final,abstract
โ๏ธย ํ๋์ ๋์์ ์ฌ๋ฌ ๊ฐ์ ์ ์ด์๋ฅผ ์กฐํฉํด์ ์ฌ์ฉํ ์ ์์ผ๋, ์ ๊ทผ ์ ์ด์๋ ๋จ ํ๋๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
private < default < protected < public ์์ผ๋ก ๋ง์ ์ ๊ทผ์ ํ์ฉ 1. private - ํด๋น ํด๋์ค ์์์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅ - ๋ค๋ฅธ ํด๋์ค์์๋ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅ 2. default - ๋ฐ๋ก ์ค์ ํ์ง์์ผ๋ฉด default๋ก ์๋์ค์ ๋จ - ๋์ผํ ํจํค์ง ์์์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅ 3. protected - ๋์ผ ํจํค์ง์ ํด๋์ค ๋๋ ํด๋น ํด๋์ค๋ฅผ ์์๋ฐ์ ํด๋์ค์์๋ง ์ ๊ทผ ๊ฐ๋ฅ 4. public - ์ด๋ค ํด๋์ค์์๋ ์ ๊ทผ ๊ฐ๋ฅ์ฌ์ฉ๊ฐ๋ฅํ ์ ๊ทผ ์ ์ด์
- ํด๋์ค :
public,default
- ๋ฉ์๋ & ๋ฉค๋ฒ๋ณ์ :
public,protected,default,private
- ์ง์ญ๋ณ์ : ์์
- ํด๋์ค :
์ ๊ทผ ์ ์ด์๋ฅผ ์ด์ฉํ ์บก์ํ (์๋์ฑ)
- ์ ๊ทผ์ ์ด์๋ย ํด๋์ค ๋ด๋ถ์ ์ ์ธ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณดํธํ๊ธฐ ์ํด์ ์ฌ์ฉํฉ๋๋ค.
- ์ ํจํ ๊ฐ์ ์ ์งํ๋๋ก, ํจ๋ถ๋ก ๋ณ๊ฒฝํ์ง ๋ชปํ๋๋ก ์ ๊ทผ์ ์ ํํ๋ ๊ฒ์ด ํ์ํฉ๋๋ค.
์์ฑ์์ ์ ๊ทผ ์ ์ด์
- ์์ฑ์์ ์ ๊ทผ ์ ์ด์๋ฅผ ์ฌ์ฉํจ์ผ๋กย ์ธ์คํด์ค์ ์์ฑ์ ์ ํํ ์ ์์ต๋๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ์์ฑ์์ ์ ๊ทผ ์ ์ด์๋ ํด๋์ค์ ์ ๊ทผ ์ ์ด์์ ์ผ์นํฉ๋๋ค.
- ์ ๊ทผ ์ ์ด์ :
Getter Setter
๊ฐ์ฒด์ ๋ฌด๊ฒฐ์ฑ(๋ณ๊ฒฝ์ด ์๋ ์ํ๋ฅผ ์ ์งํ๊ธฐ ์ํด ์ ๊ทผ์ ์ด์๋ฅผ ์ฌ์ฉ) - ์ธ๋ถ์์ ํ๋์ ์ง์ ์ ๊ทผ์ ๋ง๊ธฐ์ํด private default๋ฑ ์ฌ์ฉGetter
๐์ธ๋ถ์์ ๊ฐ์ฒด์ private ํ ํ๋๋ฅผ ์ฝ์ ํ์๊ฐ ์์ ๋ Getter ๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.private double speed; // ์๋์ฐจ ์๋ , km/h private char gear = 'P'; // ๊ธฐ์ด์ ์ํ, P,R,N,D private boolean lights; // ์๋์ฐจ ์กฐ๋ช ์ ์ํ- ์๋์ฐจ ํด๋์ค์ ํ๋์ ์ด์ฒ๋ผ private ์ ๊ทผ ์ ์ด์๋ก ์ง์ ํ ํ๋๊ฐ ์์ ๋ Getter ๋ฉ์๋๋ฅผ ํตํด ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
public String getModel() { return model; } public String getColor() { return color; } public double getPrice() { return price; }- ๋ฉ์๋ ์ด๋ฆ์ ๊ท์น์ : get + ํ๋์ด๋ฆ(์ฒซ ๊ธ์ ๋๋ฌธ์) ์ ๋๋ค.
- ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ธ์คํด์ค ๋ฉ์๋ ํธ์ถ๊ณผ ๋์ผํฉ๋๋ค.
Setter
๐ก์ธ๋ถ์์ ๊ฐ์ฒด์ private ํ ํ๋๋ฅผ ์ฝ์ ํ์๊ฐ ์์ ๋ Getter ๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.private double speed; // ์๋์ฐจ ์๋ , km/h private char gear = 'P'; // ๊ธฐ์ด์ ์ํ, P,R,N,D private boolean lights; // ์๋์ฐจ ์กฐ๋ช ์ ์ํ- ์๋์ฐจ ํด๋์ค์ ํ๋์ ์ด์ฒ๋ผ private ์ ๊ทผ ์ ์ด์๋ก ์ง์ ํ ํ๋๊ฐ ์์ ๋ Getter ๋ฉ์๋๋ฅผ ํตํด ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
public String getModel() { return model; } public String getColor() { return color; } public double getPrice() { return price; }- ๋ฉ์๋ ์ด๋ฆ์ ๊ท์น์ : get + ํ๋์ด๋ฆ(์ฒซ ๊ธ์ ๋๋ฌธ์) ์ ๋๋ค.
- ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ธ์คํด์ค ๋ฉ์๋ ํธ์ถ๊ณผ ๋์ผํฉ๋๋ค.
์ ์ด์์ ์กฐํฉ
- ์ฌ์ฉ๊ฐ๋ฅํ ์ ์ด์
- ํด๋์ค :
public,default,final,abstract
- ๋ฉ์๋ :ย
public,protected,default,private,final,abstract,static
- ๋ฉค๋ฒ๋ณ์ :ย
public,protected,default,private,final,static
- ์ง์ญ๋ณ์ :
final
- ํด๋์ค :
โ ๏ธ์ ์ด์ ์ฌ์ฉ์ ์ฃผ์ ์ฌํญ- ๋ฉ์๋์
static๊ณผabstract๋ฅผ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค.
- ํด๋์ค์
abstract์final์ ๋์์ ์ฌ์ฉํ ์ ์๋ค.
abstract๋ฉ์๋์ ์ ๊ทผ ์ ์ด์๊ฐprivate์ผ ์ ์๋ค.
- ๋ฉ์๋์
private์final์ ๊ฐ์ด ์ฌ์ฉํ ํ์๋ ์๋ค.
- ์ฌ์ฉ๊ฐ๋ฅํ ์ ์ด์
ํจํค์ง
- ์๋ฐ ํด๋์ค๋ฅผ ๋ชจ์๋์ ๋๋ ํ ๋ฆฌ(ํด๋) - ํด๋์ค ๋๋ ์ธํฐํ์ด์ค๋ฅผ ํฌํจ ์ํฌ ์ ์๋ค. - ์๋ก ๊ด๋ จ๋ ํด๋์ค๋ค๋ผ๋ฆฌ ๊ทธ๋ฃน ๋จ์๋ก ๋ฌถ์ด ๋์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ค - ์๋ก ๊ด๋ จ๋ ํด๋์ค์ ๋ฌถ์ - rt.jar -> java9์ดํ๋ก๋ ๋ฌด๊ฑฐ์์ module๋ก ์ชผ๊ฐ์ ๋ฃ์ - ํด๋์คํจ์ค(classpath) : ํด๋์คํ์ผ์ ์์น๋ฅผ ์๋ ค์ฃผ๋ ๊ฒฝ๋ก - classpath๋ผ๋ ํ๊ฒฝ๋ณ์์์ ๊ด๋ฆฌํ๊ณ , ๊ฒฝ๋ก๊ฐ์ ๊ตฌ๋ถ์์ ;์ผ๋ก ๊ตฌ๋ถ - classpath(ํ๊ฒฝ๋ณ์)์ ํจํค์ง์ ๋ฃจํธ๋ฅผ ๋ฑ๋กํด์ฃผ์ด์ผํจ// ์ ์ธ ๋ฐฉ์ // ์์คํ์ผ์ ์ฒซ๋ฒ์งธ ๋ฌธ์ฅ์ผ๋ก ๋จ ํ๋ฒ ์ ์ธ // ๊ฐ์ ์์ ํ์ผ์ ํด๋์ค๋ค์ ๋ชจ๋ ๊ฐ์ ํจํค์ง์ ์ํ๊ฒ ๋๋ค // ํจํค์ง ์ ์ธ์ด ์์๋ ์ด๋ฆ์๋(unnamed)ํจํค์ง = default packge์ ์ํ๊ฒ๋๋ค package {ํจํค์ง, ์ฆ ํด๋น ์์ค๊ฐ ์ํ ํด๋ ์ด๋ฆ}; // ๊ตณ์ด ์ด ํค์๋๋ฅผ ์ ์ธํด์ผํ๋ ์ด์ // ์๋ฐ์์ ํด๋์ค๋ฅผ ์ ์ธํ ๋ package๋ฅผ ์ง์ ํด์ฃผ์ง ์์ผ๋ฉด default unnamed package๋ก ์ฌ๊ฒจ์ง๋ค // ์ด๋ ๊ฒ ์์ฑ๋ ํด๋์ค๋ ๋ค๋ฅธ package์ ์๋ ์๋ฐํ์ผ์์ import ํ ์ ์๋ค // ๊ฐ์ default package์ ์กด์ฌํ๋ฉด ๊ฐ๋ฅํ๋ค // import import {ํจํค์ง๋ช }[.{ํ์ ํจํค์ง๋ช }].ํด๋์ค(๋๋ *); // ./java/lang/Function ํด๋์ค๋ฅผ ๋ถ๋ฌ์ค๊ณ ์ถ๋ค๋ฉด import java.lang.Function; // ํด๋น ํจํค์ง ๋ด ๋ชจ๋ ํด๋์ค๋ฅผ ๋ถ๋ฌ์ด // ํน์ ํด๋์ค๋ง import ์ ๊ตฌ๋ฌธ๊ณผ ์ฑ๋ฅ์ ์ฐจ์ด๋ ์ ํ ์๋ค import java.lang.*;// ํจํค์ง๋ ๋ค์ค์ ์ธ์ด ๋ถ๊ฐ๋ฅ ํ๋ค // ํ๋์ ์์ค ํ์ผ์ ์ค์ง ํ๋์ packge๋ง ์ ์ธ์ด ๊ฐ๋ฅํ๋ค // ํจํค์ง๋ ์ปดํ์ผ ์์ ์ ๊ณ์ธต ๊ตฌ์ฑ์ ์ ์ // ๊ทธ๋ฌ๋ฏ๋ก ํจํค์ง๋ฅผ ๋ค์ค ์ ์ธํ๊ฒ๋๋ฉด ํด๋น ์์ค ํ์ผ์ ๋ค์์ ํด๋์ ์กด์ฌํ๋ค๋ ์๋ฏธ // ๊ฐ์ ๋ด์ฉ๊ณผ ์ด๋ฆ์ ์กด์ฌํ ์ ์์ง๋ง ๊ทธํ์ผ ์์ฒด๊ฐ ์ฌ๋ฟ ์กด์ฌํ ์ ์๋ค // ํจํค์ง์ ๊ฒฝ๋ก๋ฅผ ์ผ์น์ํค๋๊ฒ์ด ์ข์ // ํจํค์ง ๊ณ์ธต ๊ตฌ์ฑ๊ณผ ์ค์ ํด๋ ๊ฒฝ๋ก๋ฅผ ๋ค๋ฅด๊ฒ ํ๋ฉด ๊ฒฐ๊ณผ๊ฐ ๊ธฐ์กด ๊ตฌ์ฑ๊ณผ ๋ค๋ฅด๊ฒ ๋์ด// ํด๋์ค ์ด๋ฆ์ด ๊ฐ์๋ ์กด์ฌํ ์์๋ ์ด์ // ์๋ฐ๋ ์ด๋ฆ์ด ๊ฐ๋๋ผ๋ ํด๋์ค์ ์ค์ ์ด๋ฆ์ ํจํค์ง ๋ช ๋ ํฌํจ๋์ด ๊ตฌ๋ถ๋๋ค // ๊ทธ๋์ ํด๋์ค ์ด๋ฆ์ด ๊ฐ์๋ ํจํค์ง๋ช ์ด ๋ค๋ฅด๋ฉด ๊ฐ๋ฅํ๋คpackageํน์ฑ
- ๊ณ์ธต ๊ตฌ์กฐ๋ก ํด๋์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ์ปดํ์ผ๋ฌ ๋จ์์ ์ ์ํ๊ธฐ ์ํ ๊ณ์ธต ๊ตฌ์กฐ ์ ์ ํค์๋
- ์์ค ๋น ํ๋๋ง ์ ์ธ ๊ฐ๋ฅ ์ด์ ๋ก๋ ํ์ผ์ ์ค์ง ํ๋์ ๊ณ์ธต๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ธฐ ๋๋ฌธ์
- ์ ์ง๋ณด์๋ฅผ ์ํด์๋ผ๋ packge์ ์ธ ์ ์ค์ ํด๋๊ตฌ์ฑ๊ฒฝ๋ก์ ์ผ์น์ํค๋๊ฒ์ด ์ข๋ค
- ํด๋์ค์ ์ค์ ์ด๋ฆ์ {package ๊ตฌ์ฑ}.{ํด๋์ค์ด๋ฆ}
import
// ๊ฐ์ ํจํค์ง๋ฉด ๊ทธ๋ฅ ๊ฐ์ ธ์ฌ์์๋ค // import๋ฅผ ํ์ง์์ผ๋ฉด ์ด๋ ๊ฒ ํธ์ถ ํด์จ๋ค // ํด๋์ค์ ์ผ๋ถ๋ถ์ด๋ฉด์, ํ์ ํจํค์ง๋ฅผ ๋ํธ(.)๋ก ๊ตฌ๋ถํ๋ค week03.packgeExam.pk1.Car car = new week03.packgeExam.pk1.Car(); week03.packgeExam.pk2.Car car2 = new week03.packgeExam.pk2.Car(); car.horn(); car2.horn(); // ์ด๋ฆ์ด ๊ฐ๊ธฐ๋๋ฌธ์ ๋์์ import๊ฐ ๋ถ๊ฐ๋ฅํ๋ค Car car = new Car(); car.horn(); week03.packgeExam.pk2.Car car2 = new week03.packgeExam.pk2.Car(); car2.horn(); // ํด๋์ค๋ฅผ ์ฌ์ฉํ ๋ import๋ฅผ ์ฌ์ฉํ๋ฉด ํจํค์ง์ด๋ฆ์ ์๋ตํ ์ ์๋ค // ์ปดํ์ผ๋ฌ์๊ฒ ํด๋์ค๊ฐ ์ํ ํจํค์ง๋ฅผ ์๋ ค์ค๋ค // java.langํจํค์ง์ ํด๋์ค๋ importํ์ง ์๊ณ ๋ ์ฌ์ฉํ ์ ์๋ค // import ํจํค์ง๋ช .ํด๋์ค๋ช ; or import ํจํค์ง๋ช .*; // import๋ฌธ์ ํจํค์ง๋ฌธ๊ณผ ํด๋์ค์ ์ธ์ ์ฌ์ด์ ์ ์ธํ๋ค // import ํจํค์ง.*์ ์ฌ์ฉํด๋ ์ฑ๋ฅ์ ์ํฅ์ ์๋ค // import๋ฌธ์ ์ปดํ์ผ ์์ ์ฒ๋ฆฌ๋๋ฏ๋ก ์ฑ๋ฅ์ ์ํฅ์ ์๋ค // *์ ๋ชจ๋ ํด๋์ค๋ง์ ์๋ฏธํ์ง ํจํค์ง๋ ํฌํจ์ด ์๋๋ค // ํด๋์ค์ด๋ฆ์ด ๊ฐ์๊ฒฝ์ฐ์๋ ํจํค์ง์ด๋ฆ์ ์์์ ์ด์ ๊ตฌ๋ถํด์ผํ๋ค // static import // static๋ฉค๋ฒ๋ฅผ ์ฌ์ฉํ ๋ ํด๋์ค ์ด๋ฆ์ ์๋ตํ ์ ์๋ค // static๋ฉค๋ฒ๋(static๋ณ์ + static๋ฉ์๋)

์ ์ด์(modifier)
- ํด๋์ค์ ํด๋์ค์ ๋ฉค๋ฒ(๋ฉค๋ฒ๋ณ์,๋ฉ์๋)์ ๋ถ๊ฐ์ ์ธ ์๋ฏธ ๋ถ์ฌ - ์ ๊ทผ์ ์ด์ : public,protected,(default ์๋ฌด๊ฒ๋ ์๋ถ์ผ๋),private => ์ค๋ณตํด์ ์ฌ์ฉ๋ถ๊ฐ - ๊ทธ์ธ : static,final,abstract,native,transient,synchronized,volatile,strictfp - ํ๋์ ๋์์ ์ฌ๋ฌ ์ ์ด์๋ฅผ ๊ฐ์ด ์ฌ์ฉ๊ฐ๋ฅ(์ ๊ทผ ์ ์ด์๋ ํ๋๋ง ๊ฐ๋ฅ) - ์์๋ ์๊ด์๋ค ๋๋ถ๋ถ ์ ๊ทผ ์ ์ด์๋ฅผ ๋งจ์์ ์ด๋ค - static : ํด๋์ค์,๊ณตํต์ ์ธ

final - ๋ง์ง๋ง์,๋ณ๊ฒฝ๋ ์ ์๋ ์์์ ์ํฌ ์๊ฐ ์๋ค๋ ์๋ฏธ = ์์๊ณ์ธต๋์ ๋ง์ง๋ง ๊ณ์ธต String,Math๊ฐ ๋ํ์ ์ธ finalํด๋์ค
abstract - ์ถ์์,๋ฏธ์์ฑ์ ์์๋ฐ์์ ๊ตฌํํํ์ง์์ผ๋ฉด ์ฌ์ฉํ ์๊ฐ ์๋ค = ์ธ์คํฐ์คํ ๋ถ๊ฐ

์์
// ์ค๋ณต๋๋ ๊ฐ๋ค์ ๋ถ๋ชจํด๋์ค์ ์์ฑํ๊ณ ๋๋จธ์ง ์ถ๊ฐํ๊ณ ์ถ์ ๊ฒฝ์ฐ์ extends๋ฅผ ์ฌ์ฉํ์ฌ ์์ํด๋์ค์ // ์์ํ ์ ์๋ค // ์ด๋ด ๊ฒฝ์ฐ ์ฝ๋์ค๋ณต์ ์ ์ฝํ ์ ์๊ณ ์ฌ์์ฉ์ฑ์ด ๋์์ ธ์ ์ ์ง๋ณด์๋ฐ ์์ฐ์ฑ์ด์ข๋ค public class ์์ํด๋์ค extends ๋ถ๋ชจํด๋์ค { }// ๋ค์ค์์์ ํด๋์ค๊ฐ์ ๊ด๊ณ๊ฐ ๋ณต์กํด์ง์ผ๋ก ๋ถ๊ฐ๋ฅํ๋ค // finalํด๋์ค๋ก ์ ์๋๋ฉด ์์์ด ๋ถ๊ฐ๋ฅํ๋ค -> ์ค๋ฒ๋ผ์ด๋ฉ๊ณผ ์ฐ๊ด๋จ // ์์์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ์์ค๋ฉด ์ฌ์ ์ํ๋๊ฒ์ผ๋ก ์ฌ์ฉ๋๊ธฐ๋๋ฌธ์ ์์ ์ด ๋ถ๊ฐ๋ฅํ final์ ์๋๋ค // object๋ ์ต์์ ๊ฐ์ฒด๋ก ์ต์์ ๋ถ๋ชจ ํด๋์ค // -> ๋ชจ๋ ํด๋์ค์์ ์ฌ์ฉ์ด ๊ฐ๋ฅ / ๋ถ๋ชจํด๋์ค๊ฐ ์๋๋ผ๋ ์๋์ผ๋ก compiler์ ์ํด ์์๋ฐ์public class Car { String company; // ์๋์ฐจ ํ์ฌ private String model; // ์๋์ฐจ ๋ชจ๋ธ private String color; // ์๋์ฐจ ์์ private double price; // ์๋์ฐจ ๊ฐ๊ฒฉ double speed; // ์๋์ฐจ ์๋ , km/h char gear = 'P'; // ๊ธฐ์ด์ ์ํ, P,R,N,D boolean lights; // ์๋์ฐจ ์กฐ๋ช ์ ์ํ public String getModel() { return model; } public void setModel(String model) { this.model = model; } public double gasPedal(double kmh, char type) { changeGear(type); speed = kmh; return speed; } public double brakePedal() { speed = 0; return speed; } public char changeGear(char type) { gear = type; return gear; } public boolean onOffLights() { lights = !lights; return lights; } public void horn() { System.out.println("๋นต๋นต"); } }public class SportsCar extends Car{ String engine; public void booster() { System.out.println("์์ง " + engine + " ๋ถ์~\n"); } }public class Main { public static void main(String[] args) { // ๋ถ๋ชจ ํด๋์ค ๊ฐ์ฒด์์ ์์ ํด๋์ค ๋ฉค๋ฒ ์ฌ์ฉ Car car = new Car(); // car.engine = "Orion"; // ์ค๋ฅ // car.booster(); // ์ค๋ฅ // ์์ ํด๋์ค ๊ฐ์ฒด ์์ฑ SportsCar sportsCar = new SportsCar(); sportsCar.engine = "Orion"; sportsCar.booster(); // ์์ ํด๋์ค ๊ฐ์ฒด์์ ๋ถ๋ชจ ํด๋์ค ๋ฉค๋ฒ ์ฌ์ฉ // ์์ ํด๋์ค์ ์์ด๋ ์์๋ฐ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ ธ์์ ์ฌ์ฉ์ด ๊ฐ๋ฅ // ์์ ํด๋์ค์ ์์ฑ๋์ด์์ง ์์ง๋ง ๋ณ๋๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅ sportsCar.company = "GENESIS"; sportsCar.setModel("GV80"); System.out.println("sportsCar.company = " + sportsCar.company); System.out.println("sportsCar.getModel() = " + sportsCar.getModel()); System.out.println(); sportsCar.horn(); System.out.println(sportsCar.changeGear('D')); } }
ํฌํจ๊ด๊ณ
// ์์๊ณผ ๋ค๋ฅด๊ฒ ๊ณตํต๋ ํด๋์ค์์ ๋ฌผ๋ ค๋ฐ์ ํ์ฅํ๋๊ฒ ์๋๋ผ // ์ฌ๋ ค๊ฐ์ง์ ํํธ ํด๋์ค๋ฅผ ํฌํจ์์ผ์ ํ๋์ ํฐํด๋์ค๋ฅผ ๋ง๋ค์ด์ฃผ๋ ๋ฐฉ์public class Tire { String company; // ํ์ด์ด ํ์ฌ double price; // ํ์ด์ด ๊ฐ๊ฒฉ public Tire(String company, double price) { this.company = company; this.price = price; } }public class Door { String company; // ์ฐจ๋ฌธ ํ์ฌ String location; // ์ฐจ๋ฌธ ์์น, FL, FR, BL, BR public Door(String company, String location) { this.company = company; this.location = location; } }public class Handle { String company; // ํธ๋ค ํ์ฌ String type; // ํธ๋ค ํ์ public Handle(String company, String type) { this.company = company; this.type = type; } public void turnHandle(String direction) { System.out.println(direction + " ๋ฐฉํฅ์ผ๋ก ํธ๋ค์ ๋๋ฆฝ๋๋ค."); } }public class Car { static final String company = "GENESIS"; // ์๋์ฐจ ํ์ฌ String model; // ์๋์ฐจ ๋ชจ๋ธ String color; // ์๋์ฐจ ์์ double price; // ์๋์ฐจ ๊ฐ๊ฒฉ double speed; // ์๋์ฐจ ์๋ , km/h char gear = 'P'; // ๊ธฐ์ด์ ์ํ, P,R,N,D boolean lights; // ์๋์ฐจ ์กฐ๋ช ์ ์ํ Tire[] tire; Door[] door; Handle handle; public Car(String model, String color, double price) { this.model = model; this.color = color; this.price = price; } public void setTire(Tire ... tire) { this.tire = tire; } public void setDoor(Door ... door) { this.door = door; } public void setHandle(Handle handle) { this.handle = handle; } public double gasPedal(double kmh, char type) { changeGear(type); speed = kmh; return speed; } public double brakePedal() { speed = 0; return speed; } public char changeGear(char type) { gear = type; return gear; } public boolean onOffLights() { lights = !lights; return lights; } public void horn() { System.out.println("๋นต๋นต"); } }public class Main { public static void main(String[] args) { // ์๋์ฐจ ๊ฐ์ฒด ์์ฑ Car car = new Car("GV80", "Black", 50000000); // ์๋์ฐจ ๋ถํ : ํ์ด์ด, ์ฐจ๋ฌธ, ํธ๋ค ์ ์ธ Tire[] tires = new Tire[]{ new Tire("KIA", 150000), new Tire("๊ธํธ", 150000), new Tire("Samsung", 150000), new Tire("LG", 150000) }; Door[] doors = new Door[]{ new Door("LG", "FL"), new Door("KIA", "FR"), new Door("Samsung", "BL"), new Door("LG", "BR") }; Handle handle = new Handle("Samsung", "S"); // ์๋์ฐจ ๊ฐ์ฒด์ ๋ถํ ๋ฑ๋ก car.setTire(tires); car.setDoor(doors); car.setHandle(handle); // ๋ฑ๋ก๋ ๋ถํ ํ์ธํ๊ธฐ for (Tire tire : car.tire) { System.out.println("tire.company = " + tire.company); } System.out.println(); for (Door door : car.door) { System.out.println("door.company = " + door.company); System.out.println("door.location = " + door.location); System.out.println(); } System.out.println(); // ์๋์ฐจ ํธ๋ค ์ธ์คํด์ค ์ฐธ์กฐํ ๋ณ์์ ์ ์ฅ Handle carHandle = car.handle; System.out.println("carHandle.company = " + carHandle.company); System.out.println("carHandle.type = " + carHandle.type + "\n"); // ์๋์ฐจ ํธ๋ค ์กฐ์ํด๋ณด๊ธฐ carHandle.turnHandle("Right"); carHandle.turnHandle("Left"); } }
Overriding(์ค๋ฒ๋ผ์ด๋ฉ)
// ๋ถ๋ชจํด๋์ค๋ก๋ถํฐ ์์๋ฐ์ ๋ฉ์๋์ ๋ด์ฉ์ ์ฌ์ ์ ํ๋๊ฒ // ์์๋ฐ์ ๋ฉ์๋๋ฅผ ์ํฉ์ ๋ง๊ฒ ์์ ํ๊ณ ์ถ์ ๋ ์ฌ์ฉ // ์กฐ๊ฑด // 1. ์ ์ธ๋ถ๊ฐ ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋์ ์ผ์น // 2. ์ ๊ทผ ์ ์ด์๊ฐ ๋ถ๋ชจํด๋์ค์ ๋ฉ์๋๋ณด๋ค ์ข์ ๋ฒ์๋ก ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅ // 3. ๋ถ๋ชจํด๋์ค์ ๋ฉ์๋ ๋ณด๋ค ๋ง์ด ์ ์ธํ ์ ์๋คpublic class Car { String company; // ์๋์ฐจ ํ์ฌ private String model; // ์๋์ฐจ ๋ชจ๋ธ private String color; // ์๋์ฐจ ์์ private double price; // ์๋์ฐจ ๊ฐ๊ฒฉ double speed; // ์๋์ฐจ ์๋ , km/h char gear = 'P'; // ๊ธฐ์ด์ ์ํ, P,R,N,D boolean lights; // ์๋์ฐจ ์กฐ๋ช ์ ์ํ public String getModel() { return model; } public void setModel(String model) { this.model = model; } public double gasPedal(double kmh, char type) { changeGear(type); speed = kmh; return speed; } public double brakePedal() { speed = 0; return speed; } public char changeGear(char type) { gear = type; return gear; } public boolean onOffLights() { lights = !lights; return lights; } public void horn() { System.out.println("๋นต๋นต"); } }public class SportsCar extends Car{ String engine; public void booster() { System.out.println("์์ง " + engine + " ๋ถ์~\n"); } public SportsCar(String engine) { this.engine = engine; } // @ : ์๋ ธํ ์ด์ (annotaion) @Override public double brakePedal() { speed = 100; System.out.println("์คํฌ์ธ ์นด์ ๋ธ๋ ์ดํฌ๋ ์๋ค"); return speed; } @Override public void horn() { booster(); } }public class Main { public static void main(String[] args) { // ๋ถ๋ชจ ํด๋์ค ์๋์ฐจ ๊ฐ์ฒด ์์ฑ Car car = new Car(); car.horn(); // ๊ฒฝ์ System.out.println(); // ์์ ํด๋์ค ์คํฌ์ธ ์นด ๊ฐ์ฒด ์์ฑ SportsCar sportsCar = new SportsCar("Orion"); // ์ค๋ฒ๋ผ์ด๋ฉํ brakePedal(), horn() ๋ฉ์๋ ํธ์ถ sportsCar.brakePedal(); sportsCar.horn(); } }
๋คํ์ฑ(polymorphism)
- ์ฌ๋ฌ ๊ฐ์ง ํํ๋ฅผ ๊ฐ์ง ์ ์๋ ๋ฅ๋ ฅ - ๋ถ๋ชจ(์กฐ์) ํ์ ์ฐธ์กฐ ๋ณ์๋ก ์์ ํ์ ๊ฐ์ฒด๋ฅด ๋ค๋ฃจ๋ ๊ฒ
- ๊ฐ์ฒด์ ์ฐธ์กฐ๋ณ์์ ํ์ ์ด ์ผ์นํ ๋์ ์ผ์นํ์ง ์์๋์ ์ฐจ์ด - ์ฐธ์กฐ๋ณ์์ ์ธ์คํด์ค์ ํ์ ์ด ์ผ์นํ ๋๋ ๋ชจ๋ ๋ฉค๋ฒ๋ฅผ ์ฌ์ฉํ ์ ์๋ค - ๋ค๋ฅผ๊ฒฝ์ฐ์๋ ํ์ ํด๋์ค์ ๋ฉค๋ฒ๋ง ์ฌ์ฉํ ์ ์๋ค
- ์์ ํ์ ์ ์ฐธ์กฐ๋ณ์๋ก ์กฐ์ ํ์ ์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํฌ ์ ์๋ค
์ฐธ์กฐ๋ณ์ ํ์ ๋ณํ(ํ๋ณํ)
- ์ฌ์ฉํ ์ ์๋ ๋ฉค๋ฒ์ ๊ฐฏ์๋ฅผ ์กฐ์ - ๊ฐ์ด๋ ์ฃผ์๊ฐ ๋ฐ๋๋ ๊ฒ์ด ์๋๋ค - ๋ถ๋ชจ ์์ ๊ด๊ณ์ ์ฐธ์กฐ๋ณ์์ผ ๊ฒฝ์ฐ ์๋ก ํ๋ณํ์ด ๊ฐ๋ฅ - ํ์ ๊ด๊ณ๋ ์๋ค - ๋ถ๋ชจ ์์์ผ๋ก ๋ณํํ๋๊ฒ ์ ์บ์คํ , ๋ค์ด์บ์คํ - f์ ๊ฒฝ์ฐ 5๊ฐ์ ๋ถ๋ค ๊ฐ๋ฅํ์ง๋ง c๋ ๋ถ๋ชจ๊ฐ์ฒด์ ์๋ ๋ฉ์๋๋ง ๊ฐ๋ฅํ๊ณ - f2๋ ๋ค์ ์์๊ฐ์ฒด๋ก ๋ณํํ์ผ๋ 5๊ฐ๋ฅผ ๋ค์ ๋ค์ธ์์๋ค - ์ฌ์ฉํ ์ ์๋ ๊ฐ์๋ฅผ ์ค์ด๋ ๊ฒ์ ์์ ์ฆ๊ฐํ ๊ฒฝ์ฐ์๋ ์์ ํ์ง ์๋ค๊ณ ๋งํ๋ค - ์ค์ ์ฐธ์กฐ๋ณ์๊ฐ ๊ฐ๋ฅดํค๊ณ ์๋๊ฒ ๋ญ์ง์๋ชจ๋ฅด๋๊น ์ฆ๊ฐํ ๋๋ ์ํํ ๋ณํ์ด๋ผ ํ๋ณํ์๋ต ๋ถ๊ฐ - ์ฐธ์กฐ๋ณ์๋ฅผ ๋ณ๊ฒฝํจ์ผ๋ก์จ ์ฌ์ฉํ ์ ์๋ ๋ฉค๋ฒ์ ๊ฐฏ์๋ฅผ ์กฐ์ ํ๊ธฐ์ํด์ ์ฌ์ฉ
์๋ ํ์ ๋ณํ
// ๋ถ๋ชจํ์ ๋ณ์ = ์์ํ์ ๊ฐ์ฒด;๋ ์๋์ผ๋ก ๋ถ๋ชจํ์ ์ผ๋ก ๋ณํ์ด ์ผ์ด๋๋ค // ์์ ๊ฐ์ฒด๋ ๋ถ๋ชจ ๊ฐ์ฒด์ ๋ฉค๋ฒ๋ฅผ ์์๋ฐ๊ธฐ ๋๋ฌธ์ ๋ถ๋ชจ์ ๋์ผํ๊ฒ ์ทจ๊ธ๋ ์ ์๋ค // ๋ถ๋ชจํ์ ๋ณ์๋ก ์์๊ฐ์ฒด์ ๋ฉค๋ฒ์ ์ ๊ธํ ๋ ์์๋ฐ์ ๋ฉค๋ฒ๋ง ์ ๊ทผํ ์์๋คclass Mammal { // ํฌ์ ๋ฅ๋ ์๋ผ๋ฅผ ๋ณ๊ณ ๋ชจ์ ์์ ๋ฅผ ํ๋ค. public void feeding() { System.out.println("๋ชจ์ ์์ ๋ฅผ ํฉ๋๋ค."); } }class Whale extends Mammal { // ๊ณ ๋๋ ํฌ์ ๋ฅ ์ด๋ฉด์ ๋ฐ๋ค์ ์ด๋ฉฐ ์์์ด ๊ฐ๋ฅํ๋ค. public void swimming() { System.out.println("์์ํ๋ค."); } @Override public void feeding() { System.out.println("๊ณ ๋๋ ๋ชจ์ ์์ ๋ฅผ ํฉ๋๋ค."); } }public class Main { public static void main(String[] args) { // Mammal์ ์์๋ฐ์๊ธฐ ๋๋ฌธ์ ์๋ํ๋ณํ ๊ฐ๋ฅ Mammal mammal = new Whale(); // ๋ถ๋ชจ ํด๋์ค์ swimming์ด ์ ์ธ๋์ด์์ง ์์์ ์ฌ์ฉ ๋ถ๊ฐ๋ฅํฉ๋๋ค. // mammal.swimming(); // ์ค๋ฅ ๋ฐ์ // ๋ถ๋ชจํ์ ์ ๊ฐ์ฒด๋ ์์ํ์ ์ ๋ณ์๋ก ๋ณํ๋ ์ ์์ต๋๋ค. // Whale whale = new Mammal(); // ์ค๋ฅ ๋ฐ์ mammal.feeding(); } }
๊ฐ์ ํ์ ๋ณํ
// ๋ถ๋ชจํ์ ๊ฐ์ฒด๋ ์์ํ์ ๋ณ์๋ก ์๋์ผ๋ก ํ์ ๋ณํ๋์ง ์๋๋ค // ์์ํ์ ๋ณ์ = (์์ํ์ ) ๋ถ๋ชจํ์ ๊ฐ์ฒด; // ์กฐ๊ฑด // 1. ์์ํ์ ๊ฐ์ฒด๊ฐ ๋ถ๋ชจํ์ ์ผ๋ก ์๋ ํ์ ๋ณํ์ด๋ ํ ๋ค์ ์์ํ์ ์ผ๋ก ๋ณํ๋ ๋๋ง ๊ฐ๋ฅ // ์์ํ์ ๊ฐ์ฒด๊ฐ ์๋ ํ์ ๋ณํ๋ ๋ถ๋ชจํ์ ์ ๋ณ์ Mammal mammal = new Whale(); mammal.feeding(); // ์์๊ฐ์ฒด ๊ณ ๋์ ์์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด // ๋ค์ ์์ํ์ ์ผ๋ก ๊ฐ์ ํ์ ๋ณํ์ ํ๋ฉด๋๋ค. Whale whale = (Whale) mammal; whale.swimming(); // 2. ๋ถ๋ชจํ์ ๋ณ์๋ก๋ ์์ํ์ ๊ฐ์ฒด์ ๊ณ ์ ํ ๋ฉค๋ฒ๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์ด ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๊ฒผ์ ๋ ๊ฐ์ ํ์ ๋ณํclass Mammal { // ํฌ์ ๋ฅ๋ ์๋ผ๋ฅผ ๋ณ๊ณ ๋ชจ์ ์์ ๋ฅผ ํ๋ค. public void feeding() { System.out.println("๋ชจ์ ์์ ๋ฅผ ํฉ๋๋ค."); } }class Whale extends Mammal { // ๊ณ ๋๋ ํฌ์ ๋ฅ ์ด๋ฉด์ ๋ฐ๋ค์ ์ด๋ฉฐ ์์์ด ๊ฐ๋ฅํ๋ค. public void swimming() { System.out.println("์์ํ๋ค."); } @Override public void feeding() { System.out.println("๊ณ ๋๋ ๋ชจ์ ์์ ๋ฅผ ํฉ๋๋ค."); } }public class Main { public static void main(String[] args) { // ์๋ ํ์ ๋ณํ๋ ๋ถ๋ชจํ์ ์ ๋ณ์์ ์์ ๊ฐ์ฒด Mammal mammal = new Whale(); mammal.feeding(); // ์์๊ฐ์ฒด ๊ณ ๋์ ์์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด // ๋ค์ ์์ํ์ ์ผ๋ก ๊ฐ์ ํ์ ๋ณํ์ ํ๋ฉด๋๋ค. Whale whale = (Whale) mammal; whale.swimming(); Mammal newMammal = new Mammal(); // Whale newWhale = (Whale) newMammal; } }
์์
- ์ฌ๋ ค๊ฐ์ง ํํ๋ฅผ ๊ฐ์ง ์ ์๋ ๋ฅ๋ ฅ = ํ๋์ ํ์ ์ ์ฌ๋ฌ ๊ฐ์ฒด๋ฅผ ๋์ ํ ์ ์๋ ์ฑ์ง -> ๊ธฐ๋ฅํ์ฅ, ํ์ ๋ณ๊ฒฝ์์ด ๊ฐ์ฒด์ฃผ์ ๋ง์ผ๋ก ๊ฐ์ฒด ํ์ ๋ณ๊ฒฝ๊ฐ๋ฅ // ๋งค๊ฐ๋ณ์ ๋ฐํํ์ ์๋ ๋คํ์ฑ์ด ์ ์ฉ๋ ์ ์๋ค// ๋ถ๋ชจ ํด๋์ค public class Tire { String company; // ํ์ด์ด ํ์ฌ public Tire(String company) { this.company = company; } public void rideComfort() { System.out.println(company + " ํ์ด์ด ์น์ฐจ๊ฐ์?"); } }// ์์ ํด๋์ค public class KiaTire extends Tire{ public KiaTire(String company) { super(company); } @Override public void rideComfort() { System.out.println(super.company + " ํ์ด์ด ์น์ฐจ๊ฐ์ " + 60); } }// ์์ ํด๋์ค public class HankookTire extends Tire { public HankookTire(String company) { super(company); } @Override public void rideComfort() { System.out.println(super.company + " ํ์ด์ด ์น์ฐจ๊ฐ์ " + 100); } }public class Car { Tire tire; public Car(Tire tire) { this.tire = tire; } Tire getHankookTire() { return new HankookTire("HANKOOK"); } Tire getKiaTire() { return new KiaTire("KIA"); } }public class Main { public static void main(String[] args) { // ๋ถ๋ชจํด๋์ค๋ก ๊ฐ์ ํ๋ณํ Tire KiaSampleTire = new KiaTire("KIA"); Tire HankookSampleTire = new HankookTire("HANKOOK"); // ๋งค๊ฐ๋ณ์ ๋คํ์ฑ ํ์ธ! Car car1 = new Car(KiaSampleTire); Car car2 = new Car(HankookSampleTire); // ๋ฐํํ์ ๋คํ์ฑ ํ์ธ! Tire hankookTire = car1.getHankookTire(); KiaTire kiaTire = (KiaTire) car2.getKiaTire(); // ์ค๋ฒ๋ผ์ด๋ฉ๋ ๋ฉ์๋ ํธ์ถ car1.tire.rideComfort(); // KIA ํ์ด์ด ์น์ฐจ๊ฐ์ 60 car2.tire.rideComfort(); // HANKOOK ํ์ด์ด ์น์ฐจ๊ฐ์ 100 } }
instanceof ์ฐ์ฐ์
๋์๊ฐ์ฒด instance of ํด๋์ค ์ด๋ฆ - ์ฐธ์กฐ๋ณ์์ ํ๋ณํ ๊ฐ๋ฅ์ฌ๋ถ ํ์ธ์ ์ฌ์ฉ, ๊ฐ๋ฅํ๋ฉด true ๋ฐํ(๋ถ๋ชจ์์๊ด๊ณ๋ง๊ฐ๋ฅ) - 1. ์ฐ์ฐ์๋ก ํ๋ณํ ํด๋ ๋๋์ง ํ์ธ(์ด๊ฒฝ์ฐ์ ์ฌ์ฉ) - 2. ํ๋ณํ - ํ๋ณํ ์ ์ ๋ฐ๋์ instanceof๋ก ํ์ธํด์ผํ๋ค
// ๋คํ์ฑ class Parent { } class Child extends Parent { } class Brother extends Parent { } public class Main { public static void main(String[] args) { Parent pc = new Child(); // ๋คํ์ฑ ํ์ฉ (์์ -> ๋ถ๋ชจ) Parent p = new Parent(); System.out.println(p instanceof Object); // true ์ถ๋ ฅ System.out.println(p instanceof Parent); // true ์ถ๋ ฅ System.out.println(p instanceof Child); // false ์ถ๋ ฅ Parent c = new Child(); System.out.println(c instanceof Object); // true ์ถ๋ ฅ System.out.println(c instanceof Parent); // true ์ถ๋ ฅ System.out.println(c instanceof Child); // true ์ถ๋ ฅ ์๋ํ๋ณํ์ ํ์ง๋ง ์์ฑ์์๋ Child์๊ธฐ๋๋ฌธ์ } }
๋งค๊ฐ๋ณ์์ ๋คํ์ฑ(์ฅ์ )
- ์ฅ์ - 1. ๋คํ์ ๋งค๊ฐ๋ณ์ - ์ฐธ์กฐํ ๋งค๊ฐ๋ณ์๋ ๋ฉ์๋ ํธ์ถ์, ์์ ๊ณผ ๊ฐ์ ํ์ ๋๋ ์์ํ์ ์ ์ธ์คํด์ค๋ฅผ ๋๊ฒจ์ค ์ ์๋ค - ์ค๋ฒ๋ก๋ฉ ๊ฐฏ์๊ฐ ๋์ด๋๋ฉด ๊ด๋ฆฌ๋ ์ฝ๋์ค๋ณต์ค๋ฅ๋ฑ ์ ์ง๋ณด์๊ฐ ์ด๋ ค์์ง๋ค - ํ์ ์ ์กฐ์ ํ์ ์ผ๋ก ๋ฐ๊พธ๋๊ฑธ๋ก ์ค๋ฒ๋ก๋ฉ์ ํ์ง ์์๋ ๋๋ค


- 2. ํ๋์ ๋ฐฐ์ด๋ก ์ฌ๋ฌ์ข ๋ฅ ๊ฐ์ฒด ๋ค๋ฃจ๊ธฐ - ์กฐ์ํ์ ์ ๋ฐฐ์ด์ ์์๋ค์ ๊ฐ์ฒด๋ฅด ๋ด์ ์ ์๋ค


์ถ์ ํด๋์ค
// ๊ทธ๋ฅ overrideํ ๋๋ ๋ถ๋ชจํด๋์ค์์ ์ ์ํ๊ณ ์คํ๋๋๊ฒ์์ ํ๋ํ๋ค๋ณด๋ ์คํ๋๋๊ฒ์์์ ํ๋๋ง ๊ฐ๋ฅํ๋ค // ํ๋ง๋๋ก ์ด๋์ ๋ ์ผ์ ํ ํ์ด ์กด์ฌํ๋ค // ์ถ์ํด๋์ค์ ๊ฒฝ์ฐ ์ ์๋ง ๋์ด์์ด ์คํ๋ด์ฉ์ด ์๊ธฐ๋๋ฌธ์ ์์๋ฐ์์ ์์ ๋กญ๊ฒ ์ฌ์ ์ ํ ์ ์๋ค // ๋ณธ์ธ ์ค์ค๋ก๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๊ณ ์์ํด๋์ค๊ฐ ๊ฐ๋ฅํ๋ค // 1. ์์ ๋ฐ์ ํด๋์ค๋ ์ถ์ ๋ฉ์๋๋ฅผ ๋ฌด์กฐ๊ฑด ์ค๋ฒ๋ผ์ด๋ฉํด์ผํ๋ค. // 2. ์ ์๋ง ํ์ ๋ฟ ์คํ ๋ด์ฉ์ด ์๊ธฐ ๋๋ฌธ์ {}๊ฐ ์๋ค // 3. ์ถ์๋ฉ์๋๋ ์ถ์ํด๋์ค์์๋ง ์ ์๊ฐ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ํด๋น ํด๋์ค์๋ abstract๋ฅผ ๋ถ์ฌ์ค์ผํ๋ค // 4. ์ถ์ ๋ฉ์๋๋ ๋ฏธ์์ฑ ๋ฉ์๋์ด๊ธฐ ๋๋ฌธ์ ์์๋ฐ์ override๋ฅผ ํด์ผ ์คํํ ์ ์๊ฒ๋๋ค.- ์์
public class BenzCar extends Car { @Override public void horn() { System.out.println("Benz ๋นต๋นต"); } }public class AudiCar extends Car { @Override public void horn() { System.out.println("Audi ๋นต๋นต"); } }public class ZenesisCar extends Car { @Override public void horn() { System.out.println("Zenesis ๋นต๋นต"); } }public abstract class Car { String company; // ์๋์ฐจ ํ์ฌ String color; // ์๋์ฐจ ์์ double speed; // ์๋์ฐจ ์๋ , km/h public double gasPedal(double kmh) { speed = kmh; return speed; } public double brakePedal() { speed = 0; return speed; } public abstract void horn(); }public class Main { public static void main(String[] args) { Car car1 = new BenzCar(); car1.horn(); System.out.println(); Car car2 = new AudiCar(); car2.horn(); System.out.println(); Car car3 = new ZenesisCar(); car3.horn(); } }
์ธํฐํ์ด์ค
// ์ธํฐํ์ด์ค์ ๊ฒฝ์ฐ ๋ด๋ถ๊ฐ ์ถ์๋ฉ์๋๋ก๋ง ์ด๋ฃจ์ด์ ธ์๋ค(์๋ฐ8์ดํ๋ก๋ ์ผ๋ฐ๋ฉ์๋๋ ๊ฐ๋ฅ) // ๊ทธ๋ฌ๋ฏ๋ก implementํ๊ฒฝ์ฐ์๋ ํด๋น ์ธํฐํ์ด์ค๋ฅผ ์ ๋ถ ์ค๋ฐ๋ผ์ด๋ฉํด์ฃผ์ด์ผํ๋ค // ์ ์ธ public interface ์ธํฐํ์ด์ค๋ช { // ํด๋์ค์ ๋์ผ public, default ์ ๊ทผ ์ ์ด์ ์ง์ ๊ฐ๋ฅ } // ๊ตฌ์ฑ // ๋ชจ๋ ๋ฉค๋ฒ ๋ณ์๋ public static final์ด์ด์ผํ๋ค // - ์ธํฐํ์ด์ค๋ ํด๋์ค ๋ฉค๋ฒ๋ณ์๋ฐ์ ์์ฑํ์ง ๋ชปํ๋ค // - ์ธํฐํ์ด์ค๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง์๊ณ ๊ฐ์ฒด ๋ฉค๋ฒ ๋ณ์๊ฐ์๋ค(๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์๊ธฐ๋๋ฌธ์ ์์ฑ์๋ ์๋ค) // ๋ชจ๋ ๋ฉ์๋๋ public abstract์ด์ด์ผํ๋ค (์๋ต๊ฐ๋ฅ static๋ฉ์๋์ default๋ฉ์๋ ์์ธ) // - ๋ชจ๋ ๋ฉ์๋๊ฐ ์ถ์๋ฉ์๋์ด๊ธฐ ๋๋ฌธ์ // - ์ค๋ฒ๋ผ์ด๋ฉ์ ํด์ผํ๊ธฐ๋๋ฌธ์ private๋ฉ์๋๋ ์๋ฏธ๊ฐ ์๋ค // ์๋ต๋๋ ์ ์ด์๋ ์ปดํ์ผ๋ฌ๊ฐ ์๋ ์ถ๊ฐ public interface ์ธํฐํ์ด์ค๋ช { public static final char A = 'A'; static char B = 'B'; final char C = 'C'; char D = 'D'; void turnOn(); // public abstract void turnOn(); } // ๊ตฌํ // ์ถ์ํด๋์ค์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ง์ ์ธ์คํด์ค ์์ฑ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ํด๋์ค์ ๊ตฌํ๋์ด ์์ฑ // implements ํค์๋ ์ฌ์ฉ // ์ถ์๋ฉ์๋๋ฅผ ์ผ๋ถ๋ง ๊ตฌํ ํด์ผํ๋๊ฒฝ์ฐ์๋ ์ถ์ํด๋์ค๋ก ๋ณ๊ฒฝํด์ ์ฌ์ฉ public class ํด๋์ค๋ช implements ์ธํฐํ์ด์ค๋ช { // ์ถ์ ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ @Override public ๋ฆฌํดํ์ ๋ฉ์๋์ด๋ฆ(๋งค๊ฐ๋ณ์, ...) { // ์คํ๋ฌธ } } // ์ธํฐํ์ด์ค๊ฐ์ ์์ // ์ธํฐํ์ด์ค๊ฐ์ ์์์์๋ extends์ฌ์ฉ // ์ธํฐํ์ด์ค๊ฐ์ ์์์์๋ ๋ค์ค ์์์ด ๊ฐ๋ฅ // ์๋์ฝ๋ ํด์์ ํด๋ณด๋ฉด // Mainํด๋์ค๋ ๋จผ์ D๋ผ๋ ํด๋์ค๋ฅผ ์์๋ฐ์๋ค. // ๊ทธ๋ฌ๋ฏ๋ก ์ธ์คํด์คํ์ D์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค. // ๊ทธ๋ฆฌ๊ณ implements๋ฅผ ๋ณด์ C๋ผ๋ interface๋ ์์๋ฐ์๋ค. // C๋ผ๋ interface๋ A,B๋ผ๋ interface๋ฅผ ๋ค์ค์์๋ฐ์๊ธฐ๋๋ฌธ์ C๋ A,B๋ฅผ ํฉ์น interface๋ก ํด์ํ ์ ์๋ค. // ๊ทธ๋ฌ๋ฏ๋ก Main์ A,B์ ์ค๋ฒ๋ผ์ด๋ฉ์ ์งํํด์ฃผ์ด์ผํ๋ค. // ๊ทธ๋ฌ๋ฏ๋ก main์์ฑ์์์ ์คํํ ๋ Mainํ์ ์ผ๋ก ์ ์์์ฑ๋main์ a,b,c์ ๋ฉ์๋๋ฅผ ์ ๋ถ์ฌ์ฉํ๋๊ฒ์ ๋ณผ ์ ์๋ค. public class Main extends D implements C { @Override public void a() { System.out.println("A"); } @Override public void b() { System.out.println("B"); } @Override void d() { super.d(); } public static void main(String[] args) { Main main = new Main(); main.a(); main.b(); main.d(); } } interface A { void a(); } interface B { void b(); } interface C extends A, B { } class D { void d() { System.out.println("D"); } }
๋ํดํธ ๋ฉ์๋ static๋ฉ์๋
๋ํดํธ ๋ฉ์๋
// ์ถ์๋ฉ์๋์ ๊ธฐ๋ณธ์ ์ธ ๊ตฌํ์ ์ ๊ณต // ๋ฉ์๋์์ default๋ฅผ ๋ถ์ด๊ณ {}๊ฐ ์กด์ฌ // default ๋ฉ์๋ ์ญ์ ์ ๊ทผ์ ์ด์๊ฐ public์ด๋ฉฐ ์๋ต ๊ฐ๋ฅ // ์ถ์๋ฉ์๋๊ฐ ์๋๋ฏ๋ก ์ฌ์ ์ํ ํ์๊ฐ ์์ public class Main implements A { @Override public void a() { System.out.println("A"); } public static void main(String[] args) { Main main = new Main(); main.a(); // ๋ํดํธ ๋ฉ์๋ ์ฌ์ ์ ์์ด ๋ฐ๋ก ์ฌ์ฉ๊ฐ๋ฅํฉ๋๋ค. main.aa(); } } interface A { void a(); default void aa() { System.out.println("AA"); } }
static ๋ฉ์๋
// ์ธํฐํ์ด์ค์์ static ๋ฉ์๋ ์ ์ธ๊ฐ๋ฅ // static์ ํน์ฑ ๊ทธ๋๋ก ์ธํฐํ์ด์ค์ static๋ฉ์๋ ๋ํ ๊ฐ์ฒด์์ด ํธ์ถ ๊ฐ๋ฅ // ์ ์ธ ํธ์ถ ๋ฐฉ์์ ํด๋์ค์ static๋ฉ์๋์ ๋์ผ // - ์ ๊ทผ ์ ์ด์๋ฅผ ์๋ตํ๋ฉด ์ปดํ์ผ๋ฌ๊ฐ public ์ถ๊ฐ public class Main implements A { @Override public void a() { System.out.println("A"); } public static void main(String[] args) { Main main = new Main(); main.a(); main.aa(); System.out.println(); // static ๋ฉ์๋ aaa() ํธ์ถ A.aaa(); } } interface A { void a(); default void aa() { System.out.println("AA"); } static void aaa() { System.out.println("static method"); } }
ํ์ ๋ณํ ๋คํ์ฑ ์ธํฐํ์ด์ค ๋คํ์ฑ
ํ์ ๋ณํ
// ์๋ ํ์ ๋ณํ // ์ธํฐํ์ด์ค ๋ณ์ = ๊ตฌํ๊ฐ์ฒด๋ ์๋์ผ๋ก ํ์ ๋ณํ // ์ธํฐํ์ด์ค์ ๊ฒฝ์ฐ๊ฐ ์์์ด๊ธฐ ๋๋ฌธ์ public class Main { public static void main(String[] args) { // A ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด B ๋์ A a1 = new B(); // A ์ธํฐํ์ด์ค์ ๊ตฌํธ์ฒด B๋ฅผ ์์๋ฐ์ C ๋์ A a2 = new C(); } } interface A { } class B implements A {} class C extends B {}// ๊ฐ์ ํ์ ๋ณํ // ๊ตฌํ๊ฐ์ฒดํ์ ๋ณ์ = (๊ตฌํ๊ฐ์ฒดํ์ ) ์ธํฐํ์ด์ค๋ณ์ public class Main { public static void main(String[] args) { // ์๋ํ๋ณํ // A ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด B ๋์ A a1 = new B(); a1.a(); // B.a()๊ฐ ์ถ๋ ฅ // a1.b(); // ๋ถ๊ฐ๋ฅ -> A์ธํฐํ์ด์ค๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ฉ์๋๊ฐ ์๋ // ์์ ์ธํฐํ์ด์ค๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ฉ์๋์ ๊ฒฝ์ฐ์๋ง ๊ฐ๋ฅ // ๊ฐ์ ํ๋ณํ System.out.println("\nB ๊ฐ์ ํ์ ๋ณํ"); B b = (B) a1; b.a(); b.b(); // ๊ฐ์ ํ์ ๋ณํ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ System.out.println(); // A ์ธํฐํ์ด์ค์ ๊ตฌํธ์ฒด B๋ฅผ ์์๋ฐ์ C ๋์ A a2 = new C(); a2.a(); //a2.b(); // ๋ถ๊ฐ๋ฅ //a2.c(); // ๋ถ๊ฐ๋ฅ System.out.println("\nC ๊ฐ์ ํ์ ๋ณํ"); C c = (C) a2; c.a(); c.b(); // ๊ฐ์ ํ์ ๋ณํ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ c.c(); // ๊ฐ์ ํ์ ๋ณํ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ } } interface A { void a(); } class B implements A { @Override public void a() { System.out.println("B.a()"); } public void b() { System.out.println("B.b()"); } } class C extends B { public void c() { System.out.println("C.c()"); } }
์ธํฐํ์ด์ค์ ๋คํ์ฑ
public abstract class Tv { private String company; // ํฐ๋น ํ์ฌ private int channel = 1; // ํ์ฌ ์ฑ๋ ์ํ private int volume = 0; // ํ์ฌ ๋ณผ๋ฅจ ์ํ private boolean power = false; // ํ์ฌ ์ ์ ์ํ public Tv(String company) { this.company = company; } public void displayPower(String company, boolean power) { if(power) { System.out.println(company + " Tv ์ ์์ด ์ผ์ก์ต๋๋ค."); } else { System.out.println(company + " Tv ์ ์์ด ์ข ๋ฃ๋์์ต๋๋ค."); } } public void displayChannel(int channel) { System.out.println("ํ์ฌ ์ฑ๋์ " + channel); } public void displayVolume(int volume) { System.out.println("ํ์ฌ ๋ณผ๋ฅจ์ " + volume); } public String getCompany() { return company; } public int getChannel() { return channel; } public int getVolume() { return volume; } public boolean isPower() { return power; } public void setChannel(int channel) { this.channel = Math.max(channel, 0); } public void setVolume(int volume) { this.volume = Math.max(volume, 0); } public void setPower(boolean power) { this.power = power; } }public class SamsungTv extends Tv implements MultiRemoteController{ public SamsungTv(String company) { super(company); } @Override public void turnOnOff() { setPower(!isPower()); displayPower(getCompany(), isPower()); } @Override public void channelUp() { setChannel(getChannel() + 1); displayChannel(getChannel()); } @Override public void channelDown() { setChannel(getChannel() - 1); displayChannel(getChannel()); } @Override public void volumeUp() { setVolume(getVolume() + 1); displayVolume(getVolume()); } @Override public void volumeDown() { setVolume(getVolume() - 1); displayVolume(getVolume()); } }public class LgTv extends Tv implements MultiRemoteController { public LgTv(String company) { super(company); } @Override public void turnOnOff() { setPower(!isPower()); displayPower(getCompany(), isPower()); } @Override public void channelUp() { setChannel(getChannel() + 1); displayChannel(getChannel()); } @Override public void channelDown() { setChannel(getChannel() - 1); displayChannel(getChannel()); } @Override public void volumeUp() { setVolume(getVolume() + 1); displayVolume(getVolume()); } @Override public void volumeDown() { setVolume(getVolume() - 1); displayVolume(getVolume()); } }public interface MultiRemoteController { void turnOnOff(); void channelUp(); void channelDown(); void volumeUp(); void volumeDown(); // ๋งค๊ฐ๋ณ์์ ๋ฐํํ์ ๋คํ์ฑ ํ์ธ ๋ฉ์๋ default MultiRemoteController getTV(Tv tv) { if(tv instanceof SamsungTv) { return (SamsungTv) tv; } else if(tv instanceof LgTv){ return (LgTv) tv; } else { throw new NullPointerException("์ผ์นํ๋ Tv ์์"); } } }public class Main { public static void main(String[] args) { // LG TV ๊ตฌํ์ฒด๋ฅผ ์กฐ์ // ์๋ ํ๋ณํ // LgTvํด๋์ค๋ฅผ ์ธ์คํด์คํ์ฌ๋ ์๋์ ํ๋ค // ํ์ง๋ง MultiRemoteController ์ธํฐํ์ด์ค๋ฅผ ์ธ์คํด์คํ ์ด์ ๋ // ์๋mrc์์ ์ผ์ฑํ์ ์ผ๋ก๋ ๋ณ๊ฒฝํด์ ์์ฑํ๊ธฐ ์ํด์์ด๋ค // LgTv๋ SamsungTv์ด๋ MultiRemoteController๋ฅผ implementsํ๊ธฐ๋๋ฌธ์ // ์๋์์ ์๋ํ๋ณํํ๊ณ ๋ณ๊ฒฝ๋ ๊ฐ๋ฅํ๊ฒ์ด๋ค MultiRemoteController mrc = new LgTv("LG"); mrc.turnOnOff(); mrc.volumeUp(); mrc.channelDown(); mrc.channelUp(); mrc.turnOnOff(); // ์กฐ์ ๋์์ Samsung TV๋ก ๊ต์ฒด // ๊ฐ์ mrc์์ ์์ฑ๋ง ๋ค๋ฅด๊ฒ ํด์ค๊ฒ์ด๊ธฐ๋๋ฌธ์ ๊ณ์ํด์ ๊ฐ์ ์ด์ด์ ธ์ค๊ณ ์๋ค. System.out.println("\n<Samsung TV๋ก ๊ต์ฒด>"); mrc = new SamsungTv("Samsung"); mrc.turnOnOff(); mrc.channelUp(); mrc.volumeDown(); mrc.volumeUp(); mrc.turnOnOff(); // ๋งค๊ฐ๋ณ์, ๋ฐํํ์ ๋คํ์ฑ ์ฒดํฌ System.out.println("\n<๋งค๊ฐ๋ณ์, ๋ฐํํ์ ๋คํ์ฑ ์ฒดํฌ>"); MultiRemoteController samsung = mrc.getTV(new SamsungTv("Samsung")); // ์๋์ผ๋ก Tvํ๋ณํ์ด๋ฃจ์ด์ ธ์ ๋งค๊ฐ๋ณ์๋ก ๋ค์ด๊ฐ samsung.turnOnOff(); SamsungTv samsungTv = (SamsungTv) samsung; samsungTv.turnOnOff(); System.out.println(); MultiRemoteController lg = mrc.getTV(new LgTv("LG")); lg.turnOnOff(); LgTv lgTv = (LgTv) lg; lgTv.turnOnOff(); } }
์ค๋ฅ์ ์์ธ
// ์ค๋ฅ // - ์ผ๋ฐ์ ์ผ๋ก ํ๋ณต์ด ๋ถ๊ฐ๋ฅํ ๋ฌธ์ // ์์ธ // - ์ผ๋ฐ์ ์ผ๋ก ํ๋ณต์ด ๊ฐ๋ฅํ ๋ฌธ์ // ์ปดํ์ผ // - .javaํ์ผ์ .class๋ก ๋ณํ(์ปดํจํฐ๊ฐ ์ดํดํ ์์๋ ์ฝ๋๋ก ๋ฒ์ญ) // - ์ปดํ์ผ ์๋ฌ์ ๊ฒฝ์ฐ ์ฌ์ฉ๋ฐฉ๋ฒ์ ๋ฌธ์ ๊ฐ ๋๋ถ๋ถ // ๋ฐํ์ ์๋ฌ // ์คํ๋์ค์ ์ด๋ฌ๋๋ ์์ธกํ ์ ์๋ ์๋ฌ // Runtime -> ํ๋ก๊ทธ๋จ์ด ๋๊ณ ์๋ ์๊ฐ // ์์ธ์ฒ๋ฆฌ์ ์ข ๋ฅ // 1. ํ์ธ๋ ์์ธ(Checked Exception) // ์ปดํ์ผ ์์ ์์ ํ์ธ๋๋ ์์ธ // ๋ฐ๋์ ์์ธ์ฒ๋ฆฌ๋ฅด ํด์ฃผ์ด์ผํ๋ ์์ธ // 2. ๋ฏธํ์ธ๋ ์์ธ(Unchecked Exception) // ๋ฐํ์ ์์ ์์ ํ์ธ๋๋ ์์ธ // ์์ธ์ฒ๋ฆฌ๊ฐ ๋ฐ๋์ ํ์ํ์ง ์๋คtry - catch finally
// ์์ธ ํด๋์ค๋ฅผ ๋ง๋ค์ด์ ์์ธ๋ฅผ ์ ์ public class OurBadException extends Exception{ public OurBadException(){ super("์ํํ ํ๋์ ํ๋ฉด ์์ธ์ฒ๋ฆฌ๋ฅผ ๊ผญ ํด์ผํจ!!!"); // Exception์ ๊ฐ์ ์ง์ด๋ฃ์ } }public class OurClass { private final boolean just = true; // throws : ์์ธ๋ฅผ ๋์ง๋ค public void thisMethodIsDangerous () throws OurBadException{ // Exception์ด์ด๋ ๊ฐ๋ฅ // custom logic if(just){ throw new OurBadException(); // throws๋ฅผ ์์ฑํ์ผ๋๊น ๋ฏธ๋ฆฌ ์ธ์งํ๊ณ ์๋ ์ํฉ } } }public class StudyException { public static void main(String[] args) { OurClass ourClass = new OurClass(); // ourClass.thisMethodIsDangerous(); // ์ด๋ฏธ throw๋ก ์์ธ๋ฐ์์ ์๊ฒฌํ๊ณ ํ์ํ๊ธฐ๋๋ฌธ์ ๊ทธ๋ฅ ํธ์ถํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค // try ~ catch ~ finally // try : ์ผ๋จ ์๋ํ๋๋ถ๋ถ // catch : ์์ธ๋ฐ์์ // finally : ์์ธ๋ ์ ์์๋์ด๋ ์ํํด์ผ๋๋ ๋ก์ง ์ํ try { // ์ผ๋จ ์คํ ourClass.thisMethodIsDangerous(); }catch (OurBadException e){ // ๋ฌด์จ์ข ๋ฅ์ ์์ธ์ํฉ์ catchํ ๊ฒ์ธ์ง ๋ช ์ํด์ผํจ // ์ธ์คํด์คํ ์งํํด์ฃผ์ด์ผํจ System.out.println(e.getMessage()); // ํด๋น ์ค๋ฅ๋ฉ์์ง ์ถ๋ ฅ }finally { // ๋ฌด์กฐ๊ฑด ๋ง์ง๋ง์ ์คํ๋จ System.out.println("์์ธ handling์๋. ๋ฌด์จ์ํฉ์ด๋ ์คํ๋๋ finally๋ถ๋ถ"); } } }throws throw ๋ฉ์๋ ์ด๋ฆ ๋ค์ ๋ถ์ด ์ด ๋ฉ์๋๊ฐ ์ด๋ ํ ์์ธ์ฌํญ์ ๋์ง ์ ์๋์ง ์๋ ค์ฃผ๋ ์์ฝ์ด ์ ๋๋ค. ๋ฉ์๋ ์์์, ์ค์ ๋ก ์์ธ ๊ฐ์ฒด๋ฅผ ๋์ง ๋ ์ฌ์ฉํ๋ ์์ฝ์ด ์ ๋๋ค. ์ฌ๋ฌ ์ข ๋ฅ์ ์์ธ์ฌํญ์ ์ ์ ์ ์์ต๋๋ค. ์ค์ ๋ก ๋์ง๋ ์์ธ ๊ฐ์ฒด ํ๋์ ๊ฐ์ด ์จ์ผ ํฉ๋๋ค. ์ผ๋ฐ ๋ฉ์๋์ return ํค์๋์ฒ๋ผ throw ์๋์ ๊ตฌ๋ฌธ๋ค์ ์คํ๋์ง ์๊ณ , throw๋ฌธ๊ณผ ํจ๊ป ๋ฉ์๋๊ฐ ์ข ๋ฃ๋ฉ๋๋ค. ์๋ฐ์ Thrwoable ํด๋์ค

- Checked Exception์ IOException์ ์์๋ฐ๊ณ
- Unchecked Exception์ RuntimeException์ ์์๋ฐ๋๋ค
%201.png)
%201.png)
// ์ถ์ฒ : https://programming.guide/java/list-of-java-exceptions.html java.io IOException CharConversionException EOFException FileNotFoundException InterruptedIOException ObjectStreamException InvalidClassException InvalidObjectException NotActiveException NotSerializableException OptionalDataException StreamCorruptedException WriteAbortedException SyncFailedException UnsupportedEncodingException UTFDataFormatException UncheckedIOException java.lang ReflectiveOperationException ClassNotFoundException InstantiationException IllegalAccessException InvocationTargetException NoSuchFieldException NoSuchMethodException CloneNotSupportedException InterruptedException ์ฐ์ ์์ธ IndexOutOfBoundsException ArrayIndexOutOfBoundsException StringIndexOutOfBoundsException ArrayStoreException ClassCastException EnumConstantNotPresentException IllegalArgumentException IllegalThreadStateException NumberFormatException IllegalMonitorStateException IllegalStateException NegativeArraySizeException NullPointerException SecurityException TypeNotPresentException UnsupportedOperationException java.net HttpRetryException SocketTimeoutException MalformedURLException ProtocolException SocketException BindException ConnectException NoRouteToHostException PortUnreachableException UnknownHostException UnknownServiceException URISyntaxException java.text ParseException java.time DateTimeException java.time.zone ZoneRulesExceptionChained Exception(์ฐ๊ฒฐ๋ ์์ธ)
- ์์ธ๊ฐ ๊ผญ ํ๋์ผ๊บผ๋ผ๋ ๋ณด์ฅ์ ์๋ค
- ์ฌ๋ฌ๊ฐ์ง ์์ธ๋ฅผ ํ๋์ ํฐ ๋ถ๋ฅ์ ์์ธ๋ก ๋ฌถ์ด์ ๋ค๋ฃจ๊ธฐ ์ํด
- ์์ธ ์์ธ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํ ๋ฉ์๋
- initCause()
- ์ง์ ํ ์์ธ๋ฅผ ์์ธ ์์ธ๋ก ๋ฑ๋ก
- getCause()
- ์์ธ ์์ธ๋ฅผ ๋ฐํ
// ์ฐ๊ฒฐ๋ ์์ธ public class main { public static void main(String[] args) { try { // ์์ธ ์์ฑ NumberFormatException ex = new NumberFormatException("๊ฐ์ง ์์ธ์ด์ "); // ์์ธ ์์ธ ์ค์ (์ง์ ํ ์์ธ๋ฅผ ์์ธ ์์ธ๋ก ๋ฑ๋ก) ex.initCause(new NullPointerException("์ง์ง ์์ธ์ด์ ")); // ์์ธ๋ฅผ ์ง์ ๋์ง๋๋ค. throw ex; } catch (NumberFormatException ex) { // ์์ธ ๋ก๊ทธ ์ถ๋ ฅ ex.printStackTrace(); // ์์ธ ์์ธ ์กฐํ ํ ์ถ๋ ฅ ex.getCause().printStackTrace(); } // checked exception ์ ๊ฐ์ธ์ unchecked exception ์์ ๋ฃ์ต๋๋ค. throw new RuntimeException(new Exception("์ด๊ฒ์ด ์ง์ง ์์ธ ์ด์ ์ ๋๋ค.")); } } // ์ถ๋ ฅ Caused by: java.lang.NullPointerException: ์ง์ง ์์ธ์ด์์ค์ ์์ธ ์ฒ๋ฆฌ
- ์์ธ๋ณต๊ตฌ
- ์์ธ์ฒ๋ฆฌํํผ
- ์์ธ์ ํ
- ์์ธ ๋ณต๊ตฌ
public String getDataFromAnotherServer(String dataPath) { try { return anotherServerClient.getData(dataPath).toString(); } catch (GetDataException e) { return defaultData; } } // try catch๋ก ์์ธ๋ฅผ ์ฒ๋ฆฌํ๊ณ ํ๋ก๊ทธ๋จ์ ์ ์์ํ๋ก ๋ณต๊ตฌํ๋ ๋ฐฉ๋ฒ // try๋ฌธ์์ ์๋ฌ๋ฐ์์ ๊ธฐ๋ณธ๊ฐ๋ฐํ // ๊ฐ์ฅ๊ธฐ๋ณธ์ ์ด์ง๋ง ๋ง์ด์ฌ์ฉ์๋จ- ์์ธ ์ฒ๋ฆฌ ํํผ
public void someMethod() throws Exception { ... } public void someIrresponsibleMethod() throws Exception { this.someMethod(); } // throws๋ฅผ ํตํ์ฌ ๋ฏธ๋ฆฌ ์์ธ ์ธ์ง // someMethod์์ ๋ฐ์ํ ์๋ฌ๋ฅผ someIrresponsibleMethod์์๋ throwsํด์ ํํผ // ๊ฐ์ ๊ฐ์ฒด๋ด์์๋ ์ฌ์ฉํ์ง ์์ ๋จ์์์- ์์ธ ์ ํ
public void someMethod() throws IOException { ... } public void someResponsibleMethod() throws MoreSpecificException { try { this.someMethod(); } catch (IOException e) { throw new MoreSpecificException(e.getMessage()); } } // MoreSpecificException ๋ถ๋ถ์์ ์กฐ๊ธ๋ ์์ธํ๊ฒ ์๋ฌํ์ธ - initCause()
์ ๋ค๋ฆญ <>
// object๋ก ๋ฐ์ดํฐ ํ์ ์ ์ค์ ํ๋ฉด ํด๋น๋ก์ง์์ ๋ค์ํ ๊ฒฝ์ฐ์ ์๋ฅผ ๋๋นํด์ผํ๋ ์ด์๋ฐ์ // ์ฌ์ฉ ์ด์ // 1. ์ค๋ณต๋ฐ ํ์์๋ ์ฝ๋๋ฅผ ์ค์ฌ์ค๋ค // 2. ํ์ ์์ ์ฑ์ ํด์น์ง์๋๋ค// 1. ์ ๋ค๋ฆญ์ ํด๋์ค ๋๋ ๋ฉ์๋์ ์ฌ์ฉ ๊ฐ๋ฅ // <>์์ ๋ค์ด๊ฐ์ผํ ํ์ ๋ช ์ public class Generic<T> { // ์ ๋ค๋ฆญ ํด๋์ค = ์์ํ์ / T -> ํ์ ๋ณ์ // static์์๋ ์ ๋ค๋ฆญ ์ฌ์ฉ๋ถ๊ฐ -> ํ์ ๋ณ์๊ฐ ์ธ์คํด์ค๋ก ๊ฐ์ฃผ๋๊ธฐ๋๋ฌธ์ // static์ ์ธ์คํด์คํ ํ์ง์์๋ ์ฌ์ฉํ ์์๊ธฐ๋๋ฌธ์ // ์ ๋ค๋ฆญ ๋ฐฐ์ด์์ฑ ๋ถ๊ฐ // 2. ๋ด๋ถ ํ๋์ String private T t; // 3. method์ return ํ์ ๋ String public T get() { return this.t; } public void set(T t) { this.t = t; } public static void main(String[] args) { // 4. ์ด ๊ตฌ๋ฌธ์์ String์ ์ง์ด๋ฃ์์ผ๋๊น T๊ฐ String์ผ๋ก ๋จ Generic<String> stringGeneric = new Generic<>(); // 5. ๊ทธ๋ ๊ธฐ๋๋ฌธ์ Stringํ์ ์คํ ๊ฐ๋ฅ stringGeneric.set("Hello World"); String tValueTurnOutWithString = stringGeneric.get(); System.out.println(tValueTurnOutWithString); } }// ๋ค์์ ํ์ ๋ณ์๋ก ์ฌ์ฉ ๊ฐ๋ฅ public class Generic<T, U, E> { public E multiTypeMethod(T t, U u) { ... } } Generic<Long, Integer, String> instance = new Generic(); instance.multiTypeMethod(longVal, intVal); // ์์๊ณผ ํ์ ๊ด๊ณ๋ ๊ทธ๋๋ก ์ ์ฉ // -> ๋ถ๋ชจํด๋์ค๋ก ์ ๋ค๋ฆญํ์ ๋ณ์๋ฅผ ์ง์ ํ๊ณ , ์์ํด๋์ค๋ก ๋๊ธฐ๋๊ฒ์ด ๊ฐ๋ฅ// ์์ผ๋ ์นด๋๋ฅผ ํตํด ์ ๋ค๋ฆญ์ ์ ํ์ ๊ตฌ์ฒด์ ์ผ๋ก ์ ํ ์ ์๋ค // 1. <? extends T> : T์ ๊ทธ ์์๋ค๋ง ์ฌ์ฉ ๊ฐ๋ฅ // 2. <? super T> : T์ ๊ทธ ์กฐ์๋ค๋ง ๊ฐ๋ฅ // 3. <?> : ์ ํ ์์ public class ParkingLot<T extends Car> { ... } ParkingLot<BMW> bmwParkingLot = new ParkingLot(); ParkingLot<Iphone> iphoneParkingLot = new ParkingLog(); // error!// ๋ฉ์๋๋ฅผ ์ค์ฝํ๋ก ์ ๋ค๋ฆญ์ ๋ณ๋ ์ ์ธ ๊ฐ๋ฅ // ์ค์ฝํ -> ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๋ ๋ฒ์({}์์์ ๋ณ์๋ฅผ ์ ์ธํ์๋ ์์ญ์ด ๋๋๊ธฐ์ ๊น์ง๋ ์ด๋์๋ ์ฌ์ฉ๊ฐ๋ฅ)
// ๋๋ .. static <T> void sort(List<T> list, Comparator<? super T> c) { ... } // ๋ฐํ ํ์ ์์ ์ ๋ค๋ฆญ์ ์ฌ์ฉํ ๊ฒฝ์ฐ, ํด๋น ๋ฉ์๋์๋ง ์ ์ฉ๋๋ ์ ๋ค๋ฆญ ํ์ ๋ณ์๋ฅผ ์ ์ธ ๊ฐ๋ฅ // ์ ๋ค๋ฆญ ํด๋์ค์ ํ์ ๋ณ์๋ฅผ static๋ฉ์๋์๋ ์ฌ์ฉํ ์ ์์ง๋ง ์ ๋ค๋ฆญ ๋ฉ์๋์ ์ ๋ค๋ฆญ ํ์ ๋ณ์๋ ๊ฐ๋ฅ // ์ด์ ๋ก๋ ํ์ ๋ณ์๋ฅผ ํด๋์ค ๋ด๋ถ์ ์ธ์คํด์ค ๋ณ์๋ก ์ทจ๊ธํ๊ธฐ ๋๋ฌธ์ ์ ๋ค๋ฆญ ํด๋์ค๋ ์๋๋ค // ํ์ง๋ง ์ ๋ค๋ฆญ ๋ฉ์๋์ ์ ๋ค๋ฆญ ํ์ ๋ณ์๋ ํด๋น ๋ฉ์๋์๋ง ์ ์ฉ๋๊ธฐ ๋๋ฌธ์ ๋ฉ์๋ ํ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ์ธํ๊ณ ์ฌ์ฉ ๊ฐ๋ฅ // ๊ฐ์ ์ด๋ฆ์ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํด๋ ์ ๋ค๋ฆญ ๋ฉ์๋์ ํ์ ๋ณ์๋ ์ ๋ค๋ฆญ ํด๋์ค์ ํ์ ๋ณ์์ ๋ค๋ฅด๋ค public class Generic<T, U, E> { // Generic<T,U,E> ์ T์ ์๋์ T๋ ์ด๋ฆ๋ง ๊ฐ์๋ฟ ๋ค๋ฅธ ๋ณ์ static <T> void sort(List<T> list, Comparator<? super T> c) { ... } }
Wrapper ๊ฐ์ฒด ์ฌํ
%202.png)
1. ์์ํ์ ์ ๊ฐ์ด์์ ์๋ฏธ๋ฅผ ๊ฐ์ง์ง์๋ ๊ฒฝ์ฐ๊ฐ ๋ง๊ธฐ๋๋ฌธ์ ๊ฐ์ฒด๋ก ์ฌ์ฉํ๋ ๋์ ์ ์์ํ์ ๊ฐ ๊ทธ๋๋ ์ฌ์ฉ 2. ํ์ง๋ง ๊ทธ์ธ์ ๊ฒฝ์ฐ๊ฐ ์์์๋์๊ธฐ๋๋ฌธ์ ์ถ์ํํด์ Wrapper Class๋ก ์ธ์คํด์คํํจ 3. ํ์ง๋ง ์ฑ๋ฅ์ ์ด๋ฉด์์๋ ์์ํ์ ๊ฐ ๊ทธ๋๋ก ์ฌ์ฉํ๋๊ฒ์ด ์ข๊ธฐ๋๋ฌธ์ ๊ฐ์ด์์ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ผ๋ฉด ์์ํ์ ์ ์ฌ์ฉํจ Integer num = new Integer(17); // Boxing int n = num.intValue(); // UnBoxing Character ch = 'X'; // AutoBoxing char c = ch; // AutoUnBoxing // AutoUnBoxing์ ๊ฒฝ์ฐ๋ JDK 1.5์ด์๋ถํฐ ์ง์
์ ๊ทํํ์(Regular Expression)
- ํน์ ํ ๊ท์น์ ๊ฐ์ง ๋ฌธ์์ด์ ์งํฉ์ ํํํ๋๋ฐ ์ฌ์ฉ
์์ฃผ์ฌ์ฉ๋๋ ์ ๊ท ํํ์
์ ๊ท ํํ์ ์ค๋ช ^[0-9]*$ ์ซ์ ^[a-zA-Z]*$ ์๋ฌธ์ ^[๊ฐ-ํฃ]*$ ํ๊ธ \\w+@\\w+\\.\\w+(\\.\\w+)? E-Mail ^\d{2,3}-\d{3,4}-\d{4}$ ์ ํ๋ฒํธ ^01(?:0|1|[6-9])-(?:\d{3}|\d{4})-\d{4}$ ํด๋์ ํ๋ฒํธ \d{6} \- [1-4]\d{6} ์ฃผ๋ฏผ๋ฑ๋ก๋ฒํธ ^\d{3}-\d{2}$ ์ฐํธ๋ฒํธ Pattern ํด๋์ค
import java.util.regex.Pattern; Pattern.matches(๊ฒ์ฆํ ํจํดํ์, ๊ฒ์ฆํ ๊ฐ) // true ,false๋ก ๋ฐํ // Pattern ํด๋์ค ์ฃผ์ ๋ฉ์๋ compile(String regex) : ์ฃผ์ด์ง ์ ๊ทํํ์์ผ๋ก๋ถํฐ ํจํด์ ๋ง๋ญ๋๋ค. matcher(CharSequence input) : ๋์ ๋ฌธ์์ด์ด ํจํด๊ณผ ์ผ์นํ ๊ฒฝ์ฐ true๋ฅผ ๋ฐํํฉ๋๋ค. asPredicate() : ๋ฌธ์์ด์ ์ผ์น์ํค๋ ๋ฐ ์ฌ์ฉํ ์์๋ ์ ์ด๋ฅผ ์์ฑํฉ๋๋ค. pattern() : ์ปดํ์ผ๋ ์ ๊ทํํ์์ String ํํ๋ก ๋ฐํํฉ๋๋ค. split(CharSequence input) : ๋ฌธ์์ด์ ์ฃผ์ด์ง ์ธ์๊ฐ CharSequence ํจํด์ ๋ฐ๋ผ ๋ถ๋ฆฌํฉ๋๋ค. // Parttern ํ๋๊ทธ ๊ฐ ์ฌ์ฉ(์์) Pattern.CANON_EQ : Noneํ์คํ๋ ๋งค์นญ ๋ชจ๋๋ฅผ ํ์ฑํํฉ๋๋ค. Pattern.CASE_INSENSITIVE : ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์์ต๋๋ค. Pattern.COMMENTS : ๊ณต๋ฐฑ๊ณผ #์ผ๋ก ์์ํ๋ ์ฃผ์์ด ๋ฌด์๋ฉ๋๋ค. (๋ผ์ธ์ ๋๊น์ง). Pattern.MULTILINE : ์์ โ^โ ๋ ๋ผ์ธ์ ์์๊ณผ, โ$โ ๋ ๋ผ์ธ์ ๋๊ณผ match ๋ฉ๋๋ค. Pattern.DOTALL : ์์ โ.โ๊ณผ ๋ชจ๋ ๋ฌธ์์ match ๋๊ณ โ\nโ ๋ match ์ ํฌํจ๋ฉ๋๋ค. Pattern.UNICODE_CASE : ์ ๋์ฝ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ๋์๋ฌธ์ ๊ตฌ๋ถ ์์ด match ์ํต๋๋ค. Pattert.UNIX_LINES : ์์ โ.โ ๊ณผ โ^โ ๋ฐ โ$โ์ match์์ ํ ๋ผ์ธ์ ๋์ ์๋ฏธํ๋ โ\nโ๋ง ์ธ์๋ฉ๋๋ค.Matcher ํด๋์ค
// ๋์ ๋ฌธ์์ด์ ํจํด์ ํด์ํ๊ณ ์ฃผ์ด์ง ํจํด๊ณผ ์ผ์นํ๋์ง ํ๋ณํ ๋ ์ฃผ๋ก ์ฌ์ฉ๋จ // Matcher ํด๋์ค์ ์ ๋ ฅ๊ฐ์ผ๋ก๋ CharSequence๋ผ๋ ์ธํฐํ์ด์ค๊ฐ ์ฌ์ฉ๋จ // ์ด๋ฅผ ํตํด ๋ค์ํ ํํ์ ์ ๋ ฅ๋ฐ์ดํฐ๋ก๋ถํฐ ๋ฌธ์ ๋จ์์ ๋งค์นญ๊ธฐ๋ฅ์ ์ง์ ๋ฐ๋๋ค // Matcher๊ฐ์ฒด๋ Pattern๊ฐ์ฒด์ matcher()๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ๋ฐ์์ฌ ์ ์๋ค import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexExample { public static void main(String[] args) { Pattern pattern = Pattern.compile("^[a-zA-Z]*$"); //์๋ฌธ์๋ง String val = "abcdef"; //๋์๋ฌธ์์ด Matcher matcher = pattern.matcher(val); System.out.println(matcher.find()); } }Matcher ํด๋์ค ์ฃผ์ ๋ฉ์๋ matches() : ๋์ ๋ฌธ์์ด๊ณผ ํจํด์ด ์ผ์นํ ๊ฒฝ์ฐ true ๋ฐํํฉ๋๋ค. find() : ๋์ ๋ฌธ์์ด๊ณผ ํจํด์ด ์ผ์นํ๋ ๊ฒฝ์ฐ true๋ฅผ ๋ฐํํ๊ณ , ๊ทธ ์์น๋ก ์ด๋ํฉ๋๋ค. find(int start) : start์์น ์ดํ๋ถํฐ ๋งค์นญ๊ฒ์์ ์ํํฉ๋๋ค. start() : ๋งค์นญ๋๋ ๋ฌธ์์ด ์์์์น ๋ฐํํฉ๋๋ค. start(int group) : ์ง์ ๋ ๊ทธ๋ฃน์ด ๋งค์นญ๋๋ ์์์์น ๋ฐํํฉ๋๋ค. end() : ๋งค์นญ๋๋ ๋ฌธ์์ด ๋ ๋ค์ ๋ฌธ์์์น ๋ฐํํฉ๋๋ค. end(int group) : ์ง์ ๋ ๊ทธ๋ฃน์ด ๋งค์นญ๋๋ ๋ ๋ค์ ๋ฌธ์์์น ๋ฐํํฉ๋๋ค. group() : ๋งค์นญ๋ ๋ถ๋ถ์ ๋ฐํํฉ๋๋ค. group(int group) : ๋งค์นญ๋ ๋ถ๋ถ์ค group๋ฒ ๊ทธ๋ฃนํ ๋งค์นญ๋ถ๋ถ ๋ฐํํฉ๋๋ค. groupCount() : ํจํด๋ด ๊ทธ๋ฃนํํ(๊ดํธ์ง์ ) ์ ์ฒด ๊ฐฏ์๋ฅผ ๋ฐํํฉ๋๋ค.์ ๊ทํํ์ ๋ฌธ๋ฒ
์ ๊ท ํํ์ ์ค๋ช ^ ๋ฌธ์์ด ์์ $ ๋ฌธ์์ด ์ข ๋ฃ . ์์์ ํ ๋ฌธ์(๋จ \์ ๋ฃ์ ์ ์์) * ์ ๋ฌธ์๊ฐ ์์ ์๋ ๋ฌดํ์ ๋ง์ ์๋ ์์ + ์ ๋ฌธ์๊ฐ ํ๋ ์ด์ ? ์ ๋ฌธ์๊ฐ ์๊ฑฐ๋ ํ๋ ์์ [ ] ๋ฌธ์์ ์งํฉ์ด๋ ๋ฒ์๋ฅผ ๋ํ๋ด๋ฉฐ ๋ ๋ฌธ์ ์ฌ์ด๋ - ๊ธฐํธ๋ก ๋ฒ์๋ฅผ ๋ํ๋ ๋๋ค. [] ๋ด์์ ^ ๊ฐ ์ ํํ์ฌ ์กด์ฌํ๋ฉด not์ ๋ํ๋ธ๋ค. { } ํ์ ๋๋ ๋ฒ์๋ฅผ ๋ํ๋ ๋๋ค. ( ) ์๊ดํธ ์์ ๋ฌธ์๋ฅผ ํ๋์ ๋ฌธ์๋ก ์ธ์ | ํจํด ์์์ or ์ฐ์ฐ์ ์ํํ ๋ ์ฌ์ฉ \ ์ ๊ท ํํ์ ์ญ์ฌ๋์(\)๋ ํ์ฅ๋ฌธ์ (์ญ์ฌ๋์ ๋ค์์ ์ผ๋ฐ ๋ฌธ์๊ฐ ์ค๋ฉด ํน์๋ฌธ์๋ก ์ทจ๊ธํ๊ณ ์ญ์ฌ๋์ ๋ค์์ ํน์๋ฌธ์๊ฐ ์ค๋ฉด ๊ทธ ๋ฌธ์ ์์ฒด๋ฅผ ์๋ฏธ) \b ๋จ์ด์ ๊ฒฝ๊ณ \B ๋จ์ด๊ฐ ์๋๊ฒ์ ๋ํ ๊ฒฝ๊ณ \A ์ ๋ ฅ์ ์์ ๋ถ๋ถ \G ์ด์ ๋งค์น์ ๋ \Z ์ ๋ ฅ์ ๋์ด์ง๋ง ์ข ๊ฒฐ์๊ฐ ์๋ ๊ฒฝ์ฐ \z ์ ๋ ฅ์ ๋ \s ๊ณต๋ฐฑ ๋ฌธ์ \S ๊ณต๋ฐฑ ๋ฌธ์๊ฐ ์๋ ๋๋จธ์ง ๋ฌธ์ \w ์ํ๋ฒณ์ด๋ ์ซ์ \W ์ํ๋ฒณ์ด๋ ์ซ์๋ฅผ ์ ์ธํ ๋ฌธ์ \d ์ซ์ [0-9]์ ๋์ผ \D ์ซ์๋ฅผ ์ ์ธํ ๋ชจ๋ ๋ฌธ์ (?i) ์ ๋ถ๋ถ์ (?!)๋ผ๋ ์ต์ ์ ๋ฃ์ด์ฃผ๊ฒ ๋๋ฉด ๋์๋ฌธ์๋ ๊ตฌ๋ถํ์ง ์์ต๋๋ค. ์ ํจ์ฑ ๊ฒ์ฌ
์ ๊ท ํํ์์ ์ ํจ์ฑ ๊ฒ์ฌ ์ฝ๋ ์์ฑ ์ ๊ฐ์ฅ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ๋๋ค.
import java.util.regex.Pattern; public class RegexExample { public static void main(String[] args) { String name = "ํ๊ธธ๋"; String tel = "010-1234-5678"; String email = "[email protected]"; //์ ํจ์ฑ ๊ฒ์ฌ boolean name_check = Pattern.matches("^[๊ฐ-ํฃ]*$", name); boolean tel_check = Pattern.matches("^01(?:0|1|[6-9])-(?:\\d{3}|\\d{4})-\\d{4}$", tel); boolean email_check = Pattern.matches("\\w+@\\w+\\.\\w+(\\.\\w+)?", email); //์ถ๋ ฅ System.out.println("์ด๋ฆ : " + name_check); System.out.println("์ ํ๋ฒํธ : " + tel_check); System.out.println("์ด๋ฉ์ผ : " + email_check); } }
๋ฌธ์์ด โ ์ซ์ ํ์ ๋ณํ
// String -> int Integer.parseInt() // ๋ฆฌํดํ์ ์ด int Integer.valueOf() // ๋ฆฌํดํ์ ์ด Integer // Integer.valueOf(str1).intValue(); -> int๋ก ๋ฐ์ดํฐํ์ ๋ณํ // ๊ตณ์ด ํ์์์ด ์๋ํ๋ณํ์ด ๋๋ค // int -> String Integer.toString() String.valueOf() +๋ฌธ์์ด
long โ String
// Wrapper class๋ก ๋ณํํ ๋ String.valueOf() Long.toString() // ๊ธฐ๋ณธํ์ผ๋ก ๋ณํํ ๋ Long.parseLong()
์์ธ์ฒ๋ฆฌ ์์
public class Calculator { private int firstNumber; private int secondNumber; private AbstractOperation operation; public Calculator(AbstractOperation operation) { this.operation = operation; } public Calculator() { } public void setOperation(AbstractOperation operation) { this.operation = operation; } public void setFirstNumber(int firstNumber) { this.firstNumber = firstNumber; } public void setSecondNumber(int secondNumber) { this.secondNumber = secondNumber; } public double calculate() { double answer = 0; answer = operation.operate(this.firstNumber, this.secondNumber); return answer; } }import java.util.regex.Pattern; public class Parser { // parsingํ๋ค๋์๋ฏธ๋ ํ์ ๋ณํ์ํ๋ค๊ณ ์๊ณ ์์ผ๋ฉด๋๋ค. private static final String OPERATION_REG = "[+\\-*/]"; private static final String NUMBER_REG = "^[0-9]*$"; private final Calculator calculator = new Calculator(); public Parser parseFirstNum(String firstInput) throws BadInputException{ // ๊ตฌํ 1. boolean check = Pattern.matches(NUMBER_REG,firstInput); if(!check){ throw new BadInputException("์ ์๊ฐ"); } this.calculator.setFirstNumber(Integer.parseInt(firstInput)); return this; // Parser์ ์์ฑ์๋ฅผ ๋ฆฌํด // ์์์์ธ this.calculator.setFirstNumber(Integer.parseInt(firstInput)); ์ด๋ถ๋ถ์์ ์ธ์คํด์ค์ ๋ํ ์ค์ ์ ๋ฐ๊พธ์ด ์ฃผ์๊ธฐ๋๋ฌธ์? } public Parser parseSecondNum(String secondInput) throws BadInputException{ // ๊ตฌํ 1. boolean check = Pattern.matches(NUMBER_REG,secondInput); if(!check){ throw new BadInputException("์ ์๊ฐ"); } this.calculator.setSecondNumber(Integer.parseInt(secondInput)); return this; } public Parser parseOperator(String operationInput) throws BadInputException{ // ๊ตฌํ 1. boolean check = Pattern.matches(OPERATION_REG,operationInput); if(!check){ throw new BadInputException("์ฌ์น์ฐ์ฌ์์ ์ฐ์ฐ์"); } switch (operationInput){ case "+" -> this.calculator.setOperation(new AddOperation()); case "-" -> this.calculator.setOperation(new SubstractOperation()); case "*" -> this.calculator.setOperation(new MultiplyOperation()); case "/" -> this.calculator.setOperation(new DivideOperation()); } return this; } public double executeCalculator() { return calculator.calculate(); } }import java.util.Scanner; public class CalculatorApp { public static boolean start() throws Exception{ // static์ด๋ฏ๋ก ๋ณ๋์ ์ธ์คํด์คํ ํ์์์ Parser parser = new Parser(); Scanner scanner = new Scanner(System.in); System.out.println("์ฒซ๋ฒ์งธ ์ซ์๋ฅผ ์ ๋ ฅํด์ฃผ์ธ์!"); String firstInput = scanner.nextLine(); parser.parseFirstNum(firstInput); System.out.println("์ฐ์ฐ์๋ฅผ ์ ๋ ฅํด์ฃผ์ธ์!"); String operator = scanner.nextLine(); parser.parseOperator(operator); System.out.println("๋๋ฒ์งธ ์ซ์๋ฅผ ์ ๋ ฅํด์ฃผ์ธ์!"); String secondInput = scanner.nextLine(); parser.parseSecondNum(secondInput); System.out.println("์ฐ์ฐ ๊ฒฐ๊ณผ : " + parser.executeCalculator()); return true; } }public abstract class AbstractOperation { public abstract double operate(int num1,int num2); }public class AddOperation extends AbstractOperation{ @Override public double operate(int num1,int num2){ return num1+num2; } }public class DivideOperation extends AbstractOperation{ @Override public double operate(int num1,int num2){ return num1 / num2; } }public class MultiplyOperation extends AbstractOperation{ @Override public double operate(int num1, int num2){ return num1 * num2; } }public class SubstractOperation extends AbstractOperation { @Override public double operate(int num1,int num2){ return num1 - num2; } } public class BadInputException extends Exception{ public BadInputException(String type){ super("์๋ชป๋ ์ ๋ ฅ : "+type+"์ ์ ๋ ฅํด์ฃผ์ธ์"); } }public class Main { public static void main(String[] args) { boolean calculateEnded = false; while (!calculateEnded){ try { calculateEnded = CalculatorApp.start(); // throws Exception์ด ๋์ด์์ผ๋๊น try catch๋ฌธ์ ์ฌ์ฉํ์ง์์ผ๋ฉด ์๋ฌ๋ฐ์ }catch (Exception e){ System.out.println(e.getMessage()); } } } }
ํ๋ก์ธ์ค์ ์ฐ๋ ๋
// ํ๋ก๊ทธ๋จ -> ์ด๋ค ์์ ์ ์ํด ์คํํ ์ ์๋ ํ์ผ // ํ๋ก์ธ์ค -> ์คํ ์ค์ธ ํ๋ก๊ทธ๋จ // ์) Javaํ๋ก๊ทธ๋จ์ ์คํ์ํค๋ฉด OS์์ ํ๋ก์ธ์ค์์ ์คํ๋จ
๐กํ๋ก์ธ์ค ์ํ- ํ๋ก์ธ์ค๋ ์คํ์ค์ธ ํ๋ก๊ทธ๋จ์ผ ์๋ ์๊ณ ์๋์๋์๋ค
- ํ๋ก์ธ์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋ก๊ทธ๋จ์ด ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ๋์ด์๋ ์ํ
- ์ต์ด์ ํ๋ก์ธ์ค๋ ์ด์์ฒด์ ๊ฐ ์์คํ ๋ถํ ์ ์์ฑํด์ฃผ๋ฉฐ, ์๋ก์ด ํ๋ก์ธ์ค๋ ์์ฉํ๋ก๊ทธ๋จ์ ์คํ์ํค๊ฑฐ๋ ํ๋ก๊ทธ๋จ ์์์ ์์คํ ํธ์ถ์ ํตํด ์์ฑ๋ ์ ์๋ค.
- ์์ฑ๋ ํ๋ก์ธ์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ค๋น์ํ์ ๋ค์ด๊ฐ๋ค
- ์ค๋น ์ํ์ ํ๋ก์ธ์ค๋ ์ธ์ ๋ผ๋ CPU๋ก๋ถํฐ ์ ํ๋์ด ์คํ๋ ์ ์๋ ์ํ
- CPU๊ฐ ํด๋น ํ๋ก์ธ์ค๋ฅผ ์ ํํ๋ฉด(ํด๋น ํ๋ก์ธ์ค์ CPU๊ฐ ํ ๋น์ด ๋๋ฉด) ํ๋ก์ธ์ค๋ ์คํ ์ํ๋ก ๋ค์ด๊ฐ๋ค
- ์คํ๋์ค ์ ์ถ๋ ฅ์ฒ๋ผ CPU๊ฐ ๊ณ์ํด์ ์ผ์ ํ ์ ์๋ ์ฌ๊ฑด์ ์์ฒญ๋ฐ์ผ๋ฉด ๋๊ธฐ ์ํ๋ก ๋ค์ด๊ฐ๋ค
- ๊ทธ๋ฌ๋ค๊ฐ ์ ์ถ๋ ฅ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋๋ฉด, ์คํ์ํ๊ฐ ์๋ ์ค๋น์ํ๋ก ๋์๊ฐ ๋ค์CPU๊ฐ ํ ๋น๋๋๊ฒ์ ๊ธฐ๋ค๋ฆฐ๋ค
- ํ๋์ ํ๋ก์ธ์ค๊ฐ CPU๋ฅผ ๋ ์ ํ๋๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๊ฐ ํ๋ก์ธ์ค๋ง๋ค CPU๋ฅผ ์ ์ ํ ์ ์๋ ์๊ฐ์ด ์ ํด์ ธ์๋ค = CPUํ ๋น์๊ฐ(time quantum)
- ์คํ ์ํ์ ํ๋ก์ธ์ค๊ฐ ํ ๋น๋ ์๊ฐ๋ด์ ์์ ์ ์๋ฃํ์ง ๋ชปํ๋ฉด ์ค๋น์ํ๋ก ๋์๊ฐ ๋ค์ ์ฐจ๋ก๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค. ์๊ฐ๋ด์ ์์ํ๋ฉด ํด๋น ํ๋ก์ธ์ค๋ ์ข ๋ฃ
๐กํ๋ก์ธ์ค ๊ตฌ์กฐ- OS๊ฐ ํ๋ก๊ทธ๋จ ์คํ์ ์ํ ํ๋ก์ธ์ค๋ฅผ ํ ๋นํ ๋ ํ๋ก์ธ์ค์์๋ Code, Data , ๋ฉ๋ชจ๋ฆฌ์์ญ(Stack,Heap)์ ํฌํจํด์ ํ ๋น
- Code : Java main ๋ฉ์๋์ ๊ฐ์ ์ฝ๋
- Data : ํ๋ก๊ทธ๋จ ์คํ์ค ์ ์ฅ ํ ์ ์๋ ์ ์ฅ๊ณต๊ฐ( ์ ์ญ๋ณ์,์ ์ ๋ณ์,๋ฐฐ์ด๋ฑ ์ด๊ธฐํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ณต๊ฐ)
- ๋ฉ๋ชจ๋ฆฌ ์์ญ
- Stack : ์ง์ญ๋ณ์,๋งค๊ฐ๋ณ์ ๋ฆฌํด๋ณ์๋ฅผ ์ ์ฅํ๋ ๊ณต๊ฐ
- Heap : ํ๋ก๊ทธ๋จ์ด ๋์ ์ผ๋ก ํ์ํ ๋ณ์๋ฅผ ์ ์ฅํ๋ ๊ณต๊ฐ ( new(), mallock() )
%203.png)
์ฐ๋ ๋
๐กํ๋ก์ธ์ค ๋ด์์ ์คํ๋๋ ์ฌ๋ฌํ๋ฆ์ ๋จ์ํ๋ก์ธ์ค์ ํน์ ํ ์ํ ๊ฒฝ๋ก
ํ๋ก์ธ์ค๊ฐ ํ ๋น๋ฐ์ ์์์ ์ด์ฉํ๋ ์คํ์ ๋จ์
์์ฑ : ํ๋ก์ธ์ค๊ฐ ์์ ์ค์ธ ํ๋ก๊ทธ๋จ์์ ์คํ์์ฒญ์ด ๋ค๋ฌ์ค๋ฉด ์ฐ๋ ๋๋ฅผ ๋ง๋ค์ด ๋ช ๋ น์ ์ฒ๋ฆฌํ๋๋ก ํจ

- ์ฐ๋ ๋๋ ํ๋ก์ธ์ค ๋ด์์ ๊ฐ๊ฐ Stack๋ง ๋ฐ๋ก ํ ๋น๋ฐ๊ณ Code,Data,Heap์์ญ์ ๊ณต์ ํ๋ค
- ์ฐ๋ ๋๋ ํ ํ๋ก์ธ์ค ๋ด์์ ๋์๋๋ ์ฌ๋ฌ ์คํ์ ํ๋ฆ์ผ๋ก, ํ๋ก์ธ์ค ๋ด์ ์ฃผ์๊ณต๊ฐ์ด๋ ์์๋ค์ ๊ฐ์ ํ๋ก์ธ์ค ๋ด์ ์ฐ๋ ๋๋ผ๋ฆฌ ๊ณต์ ํ๋ฉด์ ์คํํ๋ค.
- ํ๋ก์ธ์ค๋ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ์ ์ง์ ์ ๊ทผํ ์ ์๋ค
- ์ฐ๋ ๋๋ ๋ณ๋์ ๋ ์ง์คํฐ์ ์คํ์ ๊ฐ๊ณ ์์ง๋ง, ํ๋ฉ๋ชจ๋ฆฌ๋ ์๋ก ์ฝ๊ณ ์ธ ์ ์๋ค
- ํ ์ฐ๋ ๋๊ฐ ํ๋ก์ธ์ค ์์์ ๋ณ๊ฒฝํ๋ฉด, ๋ค๋ฅธ ์ด์ ์ฐ๋ ๋(sibling thread)๋ ๊ทธ ๋ณ๊ฒฝ ๊ฒฐ๊ณผ๋ฅผ ์ฆ์ ๋ณผ ์ ์๋ค
๐กJava์ฐ๋ ๋๋ ์ผ๋ฐ ์ฐ๋ ๋์ ๋์ผํ๋ฉดJVMํ๋ก์ธ์ค ์์์ ์คํ๋๋ค- JVM์ด ์ด์์ฒด์ ์ ์ญํ ์ ํ๋ค
- ์๋ฐ์๋ ํ๋ก์ธ์ค๊ฐ ์กด์ฌํ์ง์๊ณ ์ฐ๋ ๋๋ง ์กด์ฌํ๋ฉฐ, ์๋ฐ ์ฐ๋ ๋๋ JVM์ ์ํด ์ค์ผ์ค๋๋ ์คํ ๋จ์ ์ฝ๋ ๋ธ๋ก
์ฑ๊ธ ์ฐ๋ ๋์ ๋ฉํฐ ์ฐ๋ ๋
๐ก์๋ฐ๋ ๋ฉ์ธ์ฐ๋ ๋๊ฐ main()๋ฉ์๋๋ฅผ ์คํ์ํค๋ฉด ์์๋๋ค- ๋ฉ์ธ ์ฐ๋ ๋๋ ํ์์ ๋ฐ๋ผ์ ์์ ์ฐ๋ ๋๋ฅผ ์์ฑํด์ ๋ณ๋ ฌ๋ก ์ฝ๋๋ฅผ ์คํ ์ํฌ ์ ์๋ค
- Java๋ ๋ฉํฐ ์ฐ๋ ๋๋ฅผ ์ง์ํ๋ค
- ์ฑ๊ธ ์ฐ๋ ๋
- ํ๋ก์ธ์ค ์์์ ํ๋์ ์ฐ๋ ๋๋ง์ด ์คํ๋๋ ๊ฒ
- Java ํ๋ก๊ทธ๋จ์ ๊ฒฝ์ฐ main() ๋ฉ์๋๋ง ์คํ์์ผฐ์๋๋ฅผ ๋งํจ
- main()๋ฉ์๋์ ์ฐ๋ ๋๋ฅผ ๋ฉ์ธ ์ฐ๋ ๋๋ผ๊ณ ๋ถ๋ฅธ๋ค
- JVM์ ๋ฉ์ธ ์ฐ๋ ๋๊ฐ ์ข ๋ฃ๋๋ฉด, JVM๋ ๊ฐ์ด ์ข ๋ฃ๋๋ค
public class Main { public static void main(String[] args) { // ์ฑ๊ธ ์ฐ๋ ๋ Runnable task = () -> { System.out.println("2๋ฒ : "+Thread.currentThread().getName()); // thread1 / setName๊ฐ์ด ๋์ด for (int i = 0; i < 100; i++) { System.out.print("$"); } }; System.out.println("1๋ฒ : "+Thread.currentThread().getName()); // ํ์ฌ์คํ์ค์ธ ์ฐ๋ ๋ ๋ฉ์๋ ์ด๋ฆ ํ์ธ / main Thread thread1 = new Thread(task); thread1.setName("thread1"); thread1.start(); } }- ๋ฉํฐ ์ฐ๋ ๋
- ํ๋ก์ธ์ค์์์ ์ฌ๋ฌ๊ฐ์ ์ฐ๋ ๋๊ฐ ์คํ๋๋ ๊ฒ
- ํ๋์ ํ๋ก์ธ์ค ์์์ ์ฌ๋ฌ๊ฐ์ ์คํ๋จ์(์ฐ๋ ๋)๋ฅผ ๊ฐ์ง ์ ์์ผ๋ฉฐ ์์์ ๊ณต์
- ๋ฉ์ธ์ฐ๋ ๋์ธ์๋ ๋ค๋ฅธ ์์
์ฐ๋ ๋๋ฅผ ์์ฑํด์ ์ฌ๋ฌํ๋ฆ์ ๋ง๋ค์์๋ค
- ์ฅ์
- ์ฌ๋ฌ๊ฐ์ ์ฐ๋ ๋๋ฅผ ํตํด ์ฌ๋ฌ๊ฐ์ ์์ ์ ๋์์ ํ ์ ์๋ค
- ์คํ์ ์ ์ธํ ๋ชจ๋ ์์ญ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ๊ธฐ๋๋ฌธ์ ์์์ ๋ณด๋ค ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค
- ์๋ต ์ฐ๋ ๋์ ์์ ์ฐ๋ ๋๋ฅผ ๋ถ๋ฆฌํ์ฌ ๋น ๋ฅด๊ฒ ์๋ตํ ์ ์๋ค(๋น๋๊ธฐ)
- ๋จ์
- ๋๊ธฐํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค
- ํ๋ก์ธ์ค์ ์์์ ๊ณต์ ํ๋ค๋ณด๋ ์์์ ์๋ก ์ฌ์ฉํ๋ ค๊ณ ํ๋ ์ถฉ๋์ ํจ
- ๊ต์ฐฉ ์ํ(๋ฐ๋๋ฝ)์ด ๋ฐ์ํ ์ ์๋ค
- ๋ ์ด์์ ์ฐ๋ ๋๊ฐ ์๋ก์ ์์์ ์ํ๋ ์ํ๊ฐ ๋์์ ๋ ์๋ฌ ์์ ์ด ์ข ๋ฃ๋๊ธฐ๋ง์ ๊ธฐ๋ค๋ฆฌ๋ฉด ์์ ์ ๋ ์ด์ ์งํํ์ง ๋ชปํ๊ฒ ๋๋ ์ํ
- ๋๊ธฐํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค
- ์ฅ์
public class Main { public static void main(String[] args) { // ์์ฐจ์ ์ธ ์คํ์ด ์๋ ์ฐ๋ ๋๋ฅผ ์ฌ์ฉํ ๋ณ๋ ฌ์ ์ธ ์คํ์ ์ํจ // ํ๋ง๋๋ก ๋น๋๊ธฐ๋ก ๋์?์ ์คํํ๊ธฐ ์ํด์ // ์์๊ฐ ์์ฐจ์ ์ด์ง ์์ผ๋๊น ์์๊ฐ ๋ณด์ฅ๋์ด์์ง์๋๋ค // ๊ฐ์ด ์์ฌ์ ๋์ฌ์๋์๋ค. // ๊ฑธ๋ฆฌ๋ ์๊ฐ์ด๋, ๋์์ ์์ธกํ ์๊ฐ ์๋ค. // ๋งค๋ฒ ์คํํ ๋๋ง๋ค ๊ฒฐ๊ณผ๊ฐ์ด ๋ค๋ฅด๊ฒ ๋์จ๋ค = ์ด์์ฒด์ ์ ์ํฉ์๋ฐ๋ผ ๊ฐ๋ณ์ ์ผ๋ก ๋ณํ๋ค. // 1st Runnable task = () -> { for (int i = 0; i < 100; i++) { System.out.print("$"); } }; // 2st Runnable task2 = () -> { for (int i = 0; i < 100; i++) { System.out.print("*"); } }; Thread thread1 = new Thread(task); thread1.setName("thread1"); Thread thread2 = new Thread(task2); thread2.setName("thread2"); thread1.start(); thread2.start(); } }
Thread ์ Runnable
๐ก์๋ Main class์์ Thread์ Runnable๊ณผ ๋๋ค์ ์คํThread
// Thread // 1. Thread Class๋ฅผ ์ด์ฉ(์์) public class testThread extends Thread{ @Override public void run(){ // ์ฐ๋ ๋ ์ํ ์์ System.out.println("ํ ์คํธ ์ฐ๋ ๋"); for(int i = 0; i < 100; i++){ System.out.print("*"); } } } // TestThread thread = new TestThread(); // ์ฐ๋ ๋ ์์ฑ // thread.start() // ์ฐ๋ ๋ ์คํRunnable
// Runnable public class testRunnable implements Runnable{ @Override public void run() { // ์ฐ๋ ๋์์ ์ํํ ์์ ์ ์ for(int i = 0; i < 100; i++){ System.out.print("*"); } } }๋๋ค์
public static void main(String[] args) { // testThread test = new testThread(); -> Thread class ์์๋ฐ์ // test.start(); // Runnable interface๋ก ๊ตฌํํ๊ณ Thread์๋ค ๋งค๊ฐ๋ณ์๋ก ๋ฃ์ด์ ์คํํ๋ ๋ฐฉ์ // Runnable run = new testRunnable(); // Thread thread = new Thread(run); // thread.start(); // ๋๋ค์ Runnable task = () -> { int sum = 0; for (int i = 0; i < 50; i++) { sum += i; System.out.println(sum); } System.out.println(Thread.currentThread().getName() + " ์ต์ข ํฉ : " + sum); }; // ์ฐ๋ ๋ ๋๊ฐ๊ฐ ๋ณ๋ ฌ์ ์ ์คํ์ค // ์๋์์ ์คํํ๋ฉด ํ๋์ ์์ด ๋จผ์ ๊ณ์ฐ๋๋ ๊ณผ์ ์์ ์ด๋๊ตฌ๊ฐ์์ ๊ฐ์ด ๋ค์ ์ฒ์๋ถํฐ ์คํ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค Thread thread1 = new Thread(task); thread1.setName("thread1"); Thread thread2 = new Thread(task); thread2.setName("thread2"); thread1.start(); thread2.start(); }
๋ฐ๋ชฌ ์ฐ๋ ๋์ ์ฌ์ฉ์ ์ฐ๋ ๋
- ๋ฐ๋ชฌ ์ฐ๋ ๋
๐ก๋ณด์ด์ง ์๋๊ณณ(background)์์ ์คํ๋๋ ๋ฎ์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง ์ฐ๋ ๋- ๋ณด์กฐ์ ์ธ ์ญํ ์ ๋ด๋นํ๋ฉฐ ๋ํ์ ์ธ๊ฒ์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ ๋ฆฌํด์ฃผ๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ(GC)๊ฐ ์๋ค
public class Main { public static void main(String[] args) { Runnable demon = () -> { for (int i = 0; i < 1000000; i++) { System.out.println(i+"๋ฒ์งธ demon"); } }; Thread thread = new Thread(demon); thread.setDaemon(true); // true๋ก ์ค์ ์ ๋ฐ๋ชฌ์ค๋ ๋(์ฐ์ ์์๊ฐ ๋ฎ์)๋ก ์คํ๋จ // ์ฐ์ ์์๊ฐ ๋ฎ๋ค -> ์๋์ ์ผ๋ก ๋ค๋ฅธ ์ฐ๋ ๋์ ๋นํด ๋ฆฌ์์ค๋ฅผ ์ ๊ฒ ํ ๋น๋ฐ๋๋ค -> ๊ทธ๋ฌ๋ค๋ณด๋๊น ์๋์ ์ผ๋ก ๋๋ฆฌ๊ฒ ์คํ๋ ์์๋ค. thread.start(); // ์ด for๋ฌธ์ด ์คํ๋๊ณ ์๋ฃ๋๋ฉด deamon ์ฐ๋ ๋๊ฐ ์ข ๋ฃ๋๋ ๊ฒ์ ๊ธฐ๋ค๋ฆฌ์ง์๊ณ main ๋ฉ์๋ ์ข ๋ฃ // setDaemon์ ํ์ง์์ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ์์ฐ๋ ๋์ด๋ฉฐ, ๋ฐ๋ชฌ ์ฐ๋ ๋๋ฅผ ๊ธฐ๋ฌ๋ ค์ฃผ์ง์๋๋ค for (int i = 0; i < 100; i++) { System.out.println(i+"๋ฒ์งธ task"); } } }- ์ฌ์ฉ์ ์ฐ๋ ๋
๐ก๋ณด์ด๋ ๊ณณ(foreground)์์ ์คํ๋๋ ๋์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง ์ฐ๋ ๋ํ๋ก๊ทธ๋จ ๊ธฐ๋ฅ์ ๋ด๋นํ๋ฉฐ, ๋ํ์ ์ผ๋ก๋ ๋ฉ์ธ์ฐ๋ ๋๊ฐ ์๋ค
๊ธฐ์กด์ ๋ง๋ค์ด์ ์ฌ์ฉํ๊ณ ์๋ ์ฐ๋ ๋๊ฐ ์ฌ์ฉ์ ์ฐ๋ ๋์ด๋ค
JVM์ ์ฌ์ฉ์ ์ฐ๋ ๋์ ์์ ์ด ๋๋๋ฉด ๋ฐ๋ชฌ ์ฐ๋ ๋๋ ์๋์ผ๋ก ์ข ๋ฃ ์ํจ๋ค
์ฐ๋ ๋ ์ฐ์ ์์์ ๊ทธ๋ฃน
- ์์ ์ ์ค์๋๊ฐ ๋์ ๋ ์ฐ์ ์์๋ฅผ ๋๊ฒ ์ง์ ํ์ฌ ๋๋ง์ ์์ ์๊ฐ๊ณผ ๋ฆฌ์์ค๋ฅผ ์ ๊ณตํด์ค์์๋ค
- ์ฐ๋ ๋๊ฐ ์์ฑ์ ์ฐ์ ์์๊ฐ ์ ํด์ง๋๋ฐ JVM์ ์ํด์๋ ๊ฐ๋ฅํ๊ณ ์ง์ ์ง์ ๋ ๊ฐ๋ฅํ๋ค
- ์ฐ์ ์์๊ฐ ๋๋ค๊ณ ์ฐ๋ ๋๊ฐ ๋ฌด์กฐ๊ฑด์ ์ผ๋ก ์ข ๋ฃ๋๋๊ฒ์ด์๋ ์ข ๋ฃ๋ ๊ฐ๋ฅ์ฑ์ด ๋๋ค๋ ๊ฒ์ด๋ค
public class Main { public static void main(String[] args) { Runnable task1 = () -> { for (int i = 0; i < 100; i++) { System.out.print("$"); } }; Runnable task2 = () -> { for (int i = 0; i < 100; i++) { System.out.print("*"); } }; Thread thread1 = new Thread(task1); thread1.setPriority(8); // ์ฐ์ ์์ ์ง์ / ์ซ์๊ฐ ๋์์๋ก ์ฐ์ ์์๊ฐ ๋๋ค-> ์๋์ ์ผ๋ก ๋ฆฌ์์ค๋ฅผ ๋ง์ด๋ฐ์์ ๋นจ๋ฆฌ๋๋ ๊ฐ๋ฅ์ฑ์ด ๋๋ค // ๋ฌด๊ฑฐ์ด ์์ ์ ํ ๋ ์ฐจ์ด๋ฅผ ์ ์ ์๋ค int threadPriority = thread1.getPriority(); // ์ฐ์ ์์ ๊ฐ ๊ฐ์ ธ์ค๊ธฐ System.out.println("threadPriority = " + threadPriority); Thread thread2 = new Thread(task2); thread2.setPriority(2); thread1.start(); thread2.start(); } }- ๊ทธ๋ฃน
- ์ฐ๋ ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ทธ๋ฃน์ ํฌํจ๋์ด์๋ค
- JVM์ด ์์๋๋ฉด system ๊ทธ๋ฃน์ด ์์ฑ๋๊ณ ์ฐ๋ ๋๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก system ๊ทธ๋ฃน์ ํฌํจ
- ๋ฉ์ธ ์ฐ๋ ๋๋ system ๊ทธ๋ฃน ํ์์ ์๋ main ๊ทธ๋ฃน์ ํฌํจ
- ๋ชจ๋ ์ฐ๋ ๋๋ค์ ๋ฐ๋์ ํ๋์ ๊ทธ๋ฃน์ ํฌํจ๋์ด ์์ด์ผํ๋ค
- ์ฐ๋ ๋ ๊ทธ๋ฃน์ ์ง์ ๋ฐ์ง ๋ชปํ ์ฐ๋ ๋๋ ์์ ์ ์์ฑํ ๋ถ๋ชจ ์ฐ๋ ๋์ ๊ทธ๋ฃน๊ณผ ์ฐ์ ์์๋ฅผ ์์๋ฐ๊ฒ๋๋๋ฐ ์ฐ๋ฆฌ๊ฐ ์์ฑํ๋ ์ฐ๋ ๋๋ค์ main ์ฐ๋ ๋ ํ์์ ํฌํจ
- ์ฐ๋ ๋ ๊ทธ๋ฃน์ ์ง์ ํ์ง์์ผ๋ฉด ํด๋น ์ฐ๋ ๋๋ ์๋์ผ๋ก main๊ทธ๋ฃน์ ํฌํจ
- ์ฐ๋ ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ทธ๋ฃน์ ํฌํจ๋์ด์๋ค
public class Main { public static void main(String[] args) { Runnable task = () -> { while (!Thread.currentThread().isInterrupted()) { System.out.println("์ฌ๊ธฐ ๋ญ๋์ค๋ : "+Thread.currentThread().isInterrupted()); try { Thread.sleep(1000); System.out.println(Thread.currentThread().getName()); } catch (InterruptedException e) { break; } } System.out.println(Thread.currentThread().getName() + " Interrupted"); }; // ThreadGroup ํด๋์ค๋ก ๊ฐ์ฒด๋ฅผ ๋ง๋ญ๋๋ค. ThreadGroup group1 = new ThreadGroup("Group1"); // Thread ๊ฐ์ฒด ์์ฑ์ ์ฒซ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก ๋ฃ์ด์ค๋๋ค. // Thread(ThreadGroup group, Runnable target, String name) // Thread์ ์์ฑ์๊ฐ ์ฌ๋ฌ๊ฐ์ด๊ธฐ๋๋ฌธ์ ๊ฐ๋ฅ Thread thread1 = new Thread(group1, task, "Thread 1"); Thread thread2 = new Thread(group1, task, "Thread 2"); // Thread์ ThreadGroup ์ด ํ ๋น๋๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. System.out.println("Group of thread1 : " + thread1.getThreadGroup().getName()); System.out.println("Group of thread2 : " + thread2.getThreadGroup().getName()); thread1.start(); thread2.start(); try { // ํ์ฌ ์ฐ๋ ๋๋ฅผ ์ง์ ๋ ์๊ฐ๋์ ๋ฉ์ถ๊ฒ ํฉ๋๋ค. Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } // interrupt()๋ ์ผ์์ ์ง ์ํ์ธ ์ฐ๋ ๋๋ฅผ ์คํ๋๊ธฐ ์ํ๋ก ๋ง๋ญ๋๋ค. group1.interrupt(); } }
์ฐ๋ ๋ ์ํ์ ์ ์ด
.png)
๐ก์ฐ๋ ๋ ์ํ ์ ๋ฆฌ ํ์ํ Enum(์์) ์ค๋ช ๊ฐ์ฒด์์ฑ NEW ์ฐ๋ ๋ ๊ฐ์ฒด ์์ฑ, ์์ง start()๋ฉ์๋ ํธ์ถ ์ ์ ์ํ ์คํ๋๊ธฐ RUNNABLE ์คํ ์ํ๋ก ์ธ์ ๋ ์ง ๊ฐ ์ ์๋ ์ํ ์ผ์์ ์ง WAITING ๋ค๋ฅธ ์ฐ๋ ๋๊ฐ ํต์ง(notify)ํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ์ํ ์ผ์์ ์ง TIMED_WAITING ์ฃผ์ด์ง ์๊ฐ ๋์ ๊ธฐ๋ค๋ฆฌ๋ ์ํ ์ผ์์ ์ง BLOCKED ์ฌ์ฉํ๊ณ ์ ํ๋ ๊ฐ์ฒด์ Lock์ด ํ๋ฆด ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ์ํ ์ข ๋ฃ TERMINATED ์ฐ๋ ๋์ ์์ ์ด ์ข ๋ฃ๋ ์ํ - ์ฐ๋ ๋ ์ ์ด
.png)
sleep(), interrupt()
sleep()
๐ก์ฐ๋ ๋ ์๊ธฐ์์ ์ ๋ํด์๋ง ๋ฉ์ถ๊ฒ ํ ์ ์๋ค์์ธ์ฒ๋ฆฌ๋ฅผ ๋ฐ๋์ ํด์ผ ์ฌ์ฉํ ์ ์๋ค
sleep์ํ์์ interrupt()๋ฅผ ๋ง๋๋ฉด ๋ค์ ์คํ๋๊ธฐ ๋๋ฌธ์ InterruptedException์ด ๋ฐ์
public class Main { public static void main(String[] args) { Runnable task = () -> { try { // throws๋ก InterruptedException ์์ธ์ฒ๋ฆฌ๋ฅผ ์ด๋ ค์ฃผ๊ณ ์์ด์ ์์ธ์ฒ๋ฆฌ๋ฅผ ํ์๋ก ํด์ผํ๋ค. // InterruptedException : // sleep์ํ์์ Interrupt์ด ํธ์ถ๋๋ฉด ์คํ๋๊ธฐ์ํ๋ก ๋ฌด์กฐ๊ฑด ๋ณด๋ด์ sleep์ด ๊นจ์ง๋ ์ํฉ์ด ๋ฐ์ํ๋ค // ๊ทธ๊ฒฝ์ฐ์ ์๋ฌ๋ฅผ ์๋ ค์ค๋ ์ฌ์ฉ Thread.sleep(2000); // Thread.sleep์ ํด๋์ค.๋ฉ์๋๋ก static ๋ฉ์๋ ๋ผ๋๊ฒ์ ์์ธกํด๋ณผ์์๋ค // sleep : ์ด๋ค ๊ฐ์ฒด๋ฅผ ์ง์นญํ๋๊ฒ ์๋๋ผ ํด๋น ํด๋์ค ์์ฒด๋ฅผ ์ ์ง์ํจ๋ค // ๊ฐ์ฒด.๋ฉ์๋() -> ์ผ๋ฐ์ ์ธ๊ฒฝ์ฐ } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("task : " + Thread.currentThread().getName()); }; Thread thread = new Thread(task, "Thread"); // NEW thread.start(); // startํ๋ ์๊ฐ NEW -> RUNNABLE๋ก ๋ณ๊ฒฝ try { thread.sleep(1000); // ๊ฐ์ฒด๋ก ๋ง๋ thread // ๋ ธ๋์ค์ด ๋์ค๋ ์ด์ ๋ static๋ฉ์๋์ด๊ธฐ ๋๋ฌธ์ ์ธ์คํด์คํ๊ฐ ๋ถํ์ํด์ // Thread.sleep(1000)๊ณผ ๊ฐ๊ธฐ๋๋ฌธ์ // ์๋์๋ ๋ฉ์ธ์ฐ๋ ๋๊ฐ ๋์ด System.out.println("sleep(1000) : " + Thread.currentThread().getName()); } catch (InterruptedException e) { e.printStackTrace(); } } }
interrupt()
๐ก์ผ์์ ์ง ์ํ์ธ ์ฐ๋ ๋๋ฅผ ์คํ๋๊ธฐ ์ํ๋ก ๋ง๋ฌpublic class Main { public static void main(String[] args) { // ์ค๋ฅ ๋ฐ์๋ถ๋ถ Runnable task = () -> { try { Thread.sleep(1000); System.out.println(Thread.currentThread().getName()); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("task : " + Thread.currentThread().getName()); }; Thread thread = new Thread(task, "Thread"); // NEW thread.start(); // NEW -> RUNNABLE thread.interrupt(); // sleep์์ interrupt๋ฅผ ์คํํ๋ฉด catch๋ฌธ์ชฝ์ผ๋ก ๋์ด๊ฐ System.out.println("thread.isInterrupted() = " + thread.isInterrupted()); // ํ์ฌ Interrupt์ํ์ธ์ง boolean์ผ๋ก ์๋ ค์ค } } // ์ค๋ฅ ํด๊ฒฐ๋ถ๋ถ //public class Main { // public static void main(String[] args) { // Runnable task = () -> { // while (!Thread.currentThread().isInterrupted()) { // try { // Thread.sleep(1000); // System.out.println(Thread.currentThread().getName()); // } catch (InterruptedException e) { // break; // } // } // System.out.println("task : " + Thread.currentThread().getName()); // }; // // Thread thread = new Thread(task, "Thread"); // thread.start(); // // thread.interrupt(); // // System.out.println("thread.isInterrupted() = " + thread.isInterrupted()); // // } //}
join(),yield()
join()
๐ก์ ํด์ง ์๊ฐ๋์ ์ง์ ํ ์ฐ๋ ๋๊ฐ ์์ ํ๋๊ฒ์ ๊ธฐ๋ค๋ฆผ- ์๊ฐ์ ์ง์ ํ์ง ์์๋์๋ ์ง์ ํ ์ฐ๋ ๋์ ์์ ์ด ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆผ
// ์ฌ์ฉ๋ฐฉ๋ฒ Thread thread = new Thread(task, "thread"); thread.start(); try { thread.join(); } catch (InterruptedException e) { e.printStackTrace(); } // interrupt()๋ฅผ ๋ง๋๋ฉด ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ ๋ฉ์ถ๊ธฐ๋๋ฌธ์ InterruptException ์์ธ์ฒ๋ฆฌ ํด์ฃผ์ด์ผํจpublic class Main { public static void main(String[] args) { Runnable task = () -> { try { Thread.sleep(5000); // 5์ด } catch (InterruptedException e) { e.printStackTrace(); } }; Thread thread = new Thread(task, "thread"); thread.start(); long start = System.currentTimeMillis(); try { thread.join(); } catch (InterruptedException e) { e.printStackTrace(); } // thread ์ ์์์๊ฐ์ธ 5000ms ๋์ main ์ฐ๋ ๋๊ฐ ๊ธฐ๋ค๋ ธ๊ธฐ ๋๋ฌธ์ 5000์ด์์ด ์ถ๋ ฅ๋ฉ๋๋ค. System.out.println("์์์๊ฐ = " + (System.currentTimeMillis() - start)); // join์ ์ฌ์ฉํ์ง์์ ๊ฒฝ์ฐ : 0 // ์ฌ์ฉ์ : 5000 } }
yield()
๐ก๋จ์ ์๊ฐ์ ๋ค์ ์ฐ๋ ๋์๊ฒ ์๋ณดํ๊ณ ์ฐ๋ ๋ ์์ ์ ์คํ๋๊ธฐ ์ํpublic class Main { public static void main(String[] args) { Runnable task = () -> { try { for (int i = 0; i < 10; i++) { Thread.sleep(1000); System.out.println(Thread.currentThread().getName()); } } catch (InterruptedException e) { Thread.yield(); // ์์ ์ ๋จ์ ์๊ฐ์ ๋ค์์ฐ๋ ๋์๊ฒ ์๋ณดํ๊ณ ์ฐ๋ ๋์์ ์ ์คํ๋๊ธฐ๋ก ๊ฐ // thread1์์ interrupt๊ฐ ๋ฐ์ํ์ฌ Thread.yield()๊ฐ ์คํ๋๊ณ // thread1์ ์คํ๋๊ธฐ๋ก ๊ฐ๊ณ ๋จ์์๊ฐ์ thread2์๊ฒ ๋ฆฌ์์ค๊ฐ ์๋ณด๋จ } }; Thread thread1 = new Thread(task, "thread1"); Thread thread2 = new Thread(task, "thread2"); thread1.start(); thread2.start(); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } thread1.interrupt(); // ์คํ์ค์ธ ์ํ์ธ๊ฒ์ ์คํ๋๊ธฐ์ํ๋ก ๋ณ๊ฒฝํ๋ค } }
synchronized
๐ก๋ฉํฐ ์ฐ๋ ๋์ผ ๊ฒฝ์ฐ ์ฌ๋ฌ์ฐ๋ ๋๊ฐ ์์์ ๊ณต์ ํ๊ธฐ๋๋ฌธ์ ์ฅ์ ๋ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ ์ ์๋ค์ด๊ฒ์ ๋ฐฉ์งํ๊ธฐ์ํด ํ๋์ ์ฐ๋ ๋๊ฐ ์งํ์ค์ธ ์์ ์ ๋ค๋ฅธ์ฐ๋ ๋๊ฐ ์นจ๋ฒํ์ง ๋ชปํ๋๋ก ๋ง๋๊ฒ์ด
์ฐ๋ ๋ ๋๊ธฐํ(Synchronization)์ด๋ค
- ๋๊ธฐํ๋ฅผ ํ๋ ค๋ฉด ์๊ณ์์ญ์ ์ค์ ํ์ฌ์ผํ๋ค
- ์๊ณ์์ญ์ Lock์ ๊ฐ์ง ๋จ ํ๋์ ์ฐ๋ ๋๋ง ์ถ์
์ด ๊ฐ๋ฅํ๋ค
- ์๊ณ์์ญ์ ํ๋ฒ์ ํ๋์ ์ฐ๋ ๋๋ง ์ฌ์ฉ์ด ๊ฐ๋ฅ
์๊ณ์์ญ ์ง์ ๋ฐฉ์
- ๋ฉ์๋ ์ ์ฒด๋ฅผ ์๊ณ์์ญ์ผ๋ก ์ง์
public synchronized void asyncSum() { ...์นจ๋ฒ์ ๋ง์์ผํ๋ ์ฝ๋... }- ํน์ ์์ญ์ ์๊ณ์์ญ์ผ๋ก ์ง์
synchronized(ํด๋น ๊ฐ์ฒด์ ์ฐธ์กฐ๋ณ์) { ...์นจ๋ฒ์ ๋ง์์ผํ๋ ์ฝ๋... }- ์ฝ๋ ์ค์ ์์
public class Main { public static void main(String[] args) { AppleStore appleStore = new AppleStore(); Runnable task = () -> { while (appleStore.getStoredApple() > 0) { // sync๋ฅผ ํด์ฃผ์ง์์ผ๋๊น ์กฐ๊ฑด์ ์ฒดํฌํ ๋๋ 0๋ณด๋ค ์ปธ๋๋ฐ // ์๋์์ eatApple๋ฉ์๋๋ฅผ ์คํํ ๋ // 1์ด๊ธฐ๋ฌ๋ ธ๋ค๊ณ ๋จ๊ฒจ์ ธ์๋ ์ฌ๊ณผ๋ฅผ ๊ธฐ๋ฌ๋ ธ๋๋ฐ ๋์์ // 3๊ฐ์ ์ฐ๋ ๋๊ฐ ์ ๊ทผํด์ 1๊ฐ๋จ์ ์ํฉ์์๋ // 1๊ฐ์ ์ฐ๋ ๋๋ ๋จน๊ณ ๋๋จธ์ง ๋์ฐ๋ ๋๋ 0๊ฐ์์ -1,-2๊ฐ๋๋ ์ํฉ์ด๋๋ค // ํ์ง๋ง sync๋ฅผ ํด์ฃผ๋ฉด ํ๋์์ฐ๋ ๋๊ฐ ์ ๊ทผํด์ ๋ก์ง์ด๋๋ ๋๊น์ง // ๋๋จธ์ง ์ฐ๋ ๋๋ ์ ๊ทผํ์ง๋ชปํ๊ฒํ ์ ์๋ค appleStore.eatApple(); System.out.println("๋จ์ ์ฌ๊ณผ์ ์ = " + appleStore.getStoredApple()); } }; // 3๊ฐ์ thread๋ฅผ ํ๊บผ๋ฒ์ ๋ง๋ค์ด์ start // ์์ฑ๊ณผ ๋์์ start(NEW -> RUNNABLE) for (int i = 0; i < 3; i++) { new Thread(task).start(); } } } class AppleStore { private int storedApple = 10; public int getStoredApple() { return storedApple; } public void eatApple() { synchronized (this) { if(storedApple > 0) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } storedApple -= 1; } } } }
wait(),notify()
๐์นจ๋ฒ์ ๋ง์ ์ฝ๋๋ฅผ ์ํํ๋ค๊ฐ ์์ ์ ๋ ์ด์ ์งํํ ์ํฉ์ด ์๋๋ฉด, wait()์ ํธ์ถํ์ฌ ์ฐ๋ ๋๊ฐ Lock์ ๋ฐ๋ฉํ๊ณ ๊ธฐ๋ค๋ฆฌ๊ฒ ํ ์ ์๋ค- ๊ทธ๋ฌ๋ฉด ๋ค๋ฅธ ์ฐ๋ ๋๊ฐ Lock์ ์ป์ด ํด๋น ๊ฐ์ฒด์ ๋ํ ์์ ์ ์ํํ ์ ์๊ฒ ๋๋ค
- ์ถํ์ ์์ ์ ์งํํ ์ ์๋ ์ํฉ์ด ๋๋ฉด notify()๋ฅผ ํธ์ถํด์, ์์ ์ ์ค๋จํ๋ ์ฐ๋ ๋๊ฐ ๋ค์ Lock์ ์ป์ด ์งํํ ์ ์๊ฒ ๋๋ค.

wait()
- ์คํ์ค์ด๋ ์ฐ๋ ๋๋ ํด๋น ๊ฐ์ฒด์ ๋๊ธฐ์ค(waiting pool)์์ ํต์ง๋ฅผ ๊ธฐ๋ค๋ฆผ
- ๊ฐ์ง๊ณ ์๋ ๊ณ ์ ๋ฝ์ ํด์ ํ๊ณ , ์ฐ๋ ๋๋ฅด ์ ๋ค๊ฒํ๋ค
- ํธ์ถํ๋ ์ฐ๋ ๋๊ฐ ๋ฐ๋์ ๊ณ ์ ๋ฝ์ ๊ฐ๊ณ ์์ด์ผ ํ๊ธฐ๋๋ฌธ์ synchronized ๋ธ๋ก๋ด์์ ํธ์ถ๋์ด์ผํ๋ค
notify()
- ํด๋น ๊ฐ์ฒด์ ๋๊ธฐ์ค(waiting pool)์ ์๋ ๋ชจ๋ ์ฐ๋ ๋ ์ค์์ ์์์ ์ฐ๋ ๋๋ง ํต์ง๋ฅผ ๋ฐ์
notifyAll
- ํธ์ถ๋ก ์ ๋ค์ด ์๋ ์ฐ๋ ๋ ๋ชจ๋ ๊นจ์ด๋ค
// ์๋์ฝ๋๋ ์ด์๊ฐ ์๋ค // ์ํ๋ ์ฌ๊ณ ๊ฐ ์์ด์ ์๋น์๋ ๊ธฐ๋ฌ๋ฆฌ๊ณ ์ ์์ ๋๋ค์์ ๋ฌผ๊ฑด์ ๋ฃ์๋๋ฐ ์ด๋ฏธ๊ณต๊ฐ์ด ๋ค์ฐฌ์ํ์ด๋ฉด // ๋๋ค ๋๊ธฐ์ํ์ ๋ค์ด๊ฐ๊ฒ๋์ด while๋ฌธ์ ๋ฉ์ถ๋ ์กฐ๊ฑด์ด ์๋๋ฐ๋ ์๋ฌด๊ฒ๋ ์ํ๋ ์ํ๊ฐ ๋ฐ์ํ๊ฒ๋๋ค // ํ๋ง๋๋ก ๋ณ๋ชฉํ์์ด ๋ฐ์๋๋ค // ๋ณ๋ชฉํ์ : ์ฐ๋ ๋๊ฐ ์๋ก ๊ธฐ๋ค๋ ค์ ์๋ฌด๊ฒ๋ ์ํ๊ณ ๋๊ธฐํ๋ ํ์ import java.util.*; public class Main { public static String[] itemList = { "MacBook", "IPhone", "AirPods", "iMac", "Mac mini" }; public static AppleStore appleStore = new AppleStore(); public static final int MAX_ITEM = 5; public static void main(String[] args) { // ๊ฐ๊ฒ ์ ์ Runnable StoreClerk = () -> { while (true) { // 0 ~ 4์ฌ์ด์ ์ ์์ค ๋๋คํ ๊ฐ์ ๋ฝ์๋ด๊ธฐ ์ํจ int randomItem = (int) (Math.random() * MAX_ITEM); // restock : ์ฌ๊ณ ๋ฅผ ๋ฃ๋ ๋ฉ์๋ appleStore.restock(itemList[randomItem]); try { Thread.sleep(50); } catch (InterruptedException ignored) { } } }; // ๊ณ ๊ฐ Runnable Customer = () -> { while (true) { try { Thread.sleep(77); } catch (InterruptedException ignored) { } int randomItem = (int) (Math.random() * MAX_ITEM); // sale : ํ๋งคํ๋ ๋ฉ์๋ appleStore.sale(itemList[randomItem]); System.out.println(Thread.currentThread().getName() + " Purchase Item " + itemList[randomItem]); } }; new Thread(StoreClerk, "StoreClerk").start(); new Thread(Customer, "Customer1").start(); new Thread(Customer, "Customer2").start(); } } class AppleStore { private List<String> inventory = new ArrayList<>(); public void restock(String item) { synchronized (this) { while (inventory.size() >= Main.MAX_ITEM) { System.out.println(Thread.currentThread().getName() + " Waiting!"); try { wait(); // ์ฌ๊ณ ๊ฐ ๊ฝ ์ฐจ์์ด์ ์ฌ์ ๊ณ ํ์ง ์๊ณ ๊ธฐ๋ค๋ฆฌ๋ ์ค! Thread.sleep(333); } catch (InterruptedException e) { e.printStackTrace(); } } // ์ฌ์ ๊ณ inventory.add(item); notify(); // ์ฌ์ ๊ณ ๋์์์ ๊ณ ๊ฐ์๊ฒ ์๋ ค์ฃผ๊ธฐ System.out.println("Inventory ํํฉ: " + inventory.toString()); } } public synchronized void sale(String itemName) { while (inventory.size() == 0) { System.out.println(Thread.currentThread().getName() + " Waiting!"); try { wait(); // ์ฌ๊ณ ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๊ณ ๊ฐ ๋๊ธฐ์ค Thread.sleep(333); } catch (InterruptedException e) { e.printStackTrace(); } } while (true) { // ๊ณ ๊ฐ์ด ์ฃผ๋ฌธํ ์ ํ์ด ์๋์ง ํ์ธ for (int i = 0; i < inventory.size(); i++) { if (itemName.equals(inventory.get(i))) { inventory.remove(itemName); notify(); // ์ ํ ํ๋ ํ๋ ธ์ผ๋ ์ฌ์ ๊ณ ํ๋ผ๊ณ ์๋ ค์ฃผ๊ธฐ return; // ๋ฉ์๋ ์ข ๋ฃ } } // ๊ณ ๊ฐ์ด ์ฐพ๋ ์ ํ์ด ์์ ๊ฒฝ์ฐ try { System.out.println(Thread.currentThread().getName() + " Waiting!"); wait(); Thread.sleep(333); } catch (InterruptedException e) { e.printStackTrace(); } } } }
lock ์ธํฐํ์ด์ค
๐JDK1.5๋ถํฐ ์ถ๊ฐ๋ ๋๊ธฐํ ๋ฐฉ๋ฒsynchronized๋ธ๋ญ์ ์ด์ฉํ ๋๊ธฐํ๋ ์๋์ ์ผ๋ก lock์ด ๊ฑธ๋ฆฌ๊ณ ํ๋ฆฌ๊ธฐ ๋๋ฌธ์ synchronized๋ธ๋ญ ๋ด์์ ์์ธ๊ฐ ๋ฐ์ํด๋ lock์ด ์๋์ ๋ถ๋ฆฐ๋ค
๊ฐ์ ๋ฉ์๋๋ด์์๋ง lock์ ๊ฑธ ์ ์๋ค. ์ด๋ฐ ์ ์ฝ์ ์์ ๊ธฐ ์ํจ
java.util.concurrent.locksํจํค์ง์์ ์ ๊ณต
- ์ข
๋ฅ
- ReentrantLock
- ์ฝ๊ธฐ,์ฐ๊ธฐ์ ๋ํด ๋์์ lock์ ์ ์ดํ๋ ํด๋์ค
- lock์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ฉฐ lock์ธํฐํ์ด์ค์ ์ถ์๋ฉ์๋์ธ lock(),unlock(),tryLock()๋ฉ์๋๋ฅผ ๊ตฌ์ฒด์ ์ผ๋ก ์ ์
- ReentrantReadWriteLock
- ์ฝ๊ธฐ,์ฐ๊ธฐ์ ๋ํด ๋ณ๋๋ก lock์ ์ ์ดํ๋ ํด๋์ค
- ํด๋์ค ๊ธฐ๋ฅ ํน์ฑ์, lock()๋ฉ์๋๊ฐ ์กด์ฌํ์ง์๊ณ readLock(). writeLock()์ผ๋ก ๋ถํ๋ ๋ฉ์๋๊ฐ ์กด์ฌ
- StampedLock
- ์ฝ๊ธฐ,์ฐ๊ธฐ ์ด์ธ์๋ ๋๊ด์ ์ฝ๊ธฐ(Optimistic Read)์ ๋ํ lock์ ์ ์ดํ๋ ํด๋์ค
- ์ฝ๊ธฐ Lock์ด ๊ฑธ๋ ค์์ผ๋ฉด ๋ค๋ฅธ ์ฐ๋ ๋๋ค๋ ์ฝ๊ธฐ Lock์ ์ค๋ณต์ผ๋ก ๊ฑธ๊ณ ์ฝ๊ธฐ๋ฅผ ์ํํ ์ ์๋ค(read-only)
- ์ฝ๊ธฐ Lock์ด ๊ฑธ๋ ค์๋ ์ํ์์ ์ฐ๊ธฐ Lock์ ๊ฑฐ๋ ๊ฒ์ ํ์ฉ๋์ง ์๋๋ค (๋ฐ์ดํฐ ๋ณ๊ฒฝ ๋ฐฉ์ง)
- ReentrantLock
ReentrantLock ํด๋์ค
- synchronized ์ ์ด์๊ฐ์์ ์๋์ lockํด์ ์ ์ฌ์ง์ ์ ์งํํด์ฃผ๋๊ฒ๊ณผ ๋ฌ๋ฆฌ, ์๋์ผ๋ก lockํด์ ์ ์ฌ์ง์ ์ด ๊ฐ๋ฅ
- Thread์ lock์ ๊ฑฐ๋ lock(), ํ์ฌ Thread์ lock์ ํด์ ํ๋ unlock(), ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฒฝ์ฐ์ lock์ ํ๋ํ๋ tryLock()๋ฉ์๋ ๋ฑ์ด ์ ์๋์ด ์๋ค.
- ์ข
๋ฅ
Condition
๐wait()์notify()์์ waiting pool๋ด ์ฐ๋ ๋๋ฅผ ๊ตฌ๋ถํ์ง ๋ชปํด์ ์๊ธฐ๋ ๋ณ๋ชฉํ์์ ํด๊ฒฐํ๊ธฐ ์ํจJDK 5์์ java.util.concurrent.locks ํจํค์ง์์ Condition ์ธํฐํ์ด์ค ์ ๊ณต
waiting pool๋ด์ ์ค๋ ๋๋ฅผ ๋ถ๋ฆฌํ์ฌ ํน์ ์กฐ๊ฑด์ด ๋ง์กฑ๋ ๋๋ง ๊นจ์ฐ๋๋ก ํ ์ ์๋ค
ReentrantLockํด๋์ค์ ํจ๊ป ์ฌ์ฉ๋๋ค
Condition์์๋ await()&signal()์ด ์ฌ์ฉ๋จ
import java.util.ArrayList; import java.util.concurrent.locks.*; public class Main { public static final int MAX_TASK = 5; private ReentrantLock lock = new ReentrantLock(); // lock์ผ๋ก condition ์์ฑ private Condition condition1 = lock.newCondition(); private Condition condition2 = lock.newCondition(); private ArrayList<String> tasks = new ArrayList<>(); // ์์ ๋ฉ์๋ public void addMethod(String task) { lock.lock(); // ์๊ณ์์ญ ์์ try { while(tasks.size() >= MAX_TASK) { String name = Thread.currentThread().getName(); System.out.println(name+" is waiting."); try { condition1.await(); // wait(); condition1 ์ฐ๋ ๋๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ฒ ํฉ๋๋ค. Thread.sleep(500); } catch(InterruptedException e) {} } tasks.add(task); condition2.signal(); // notify(); ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ condition2๋ฅผ ๊นจ์์ค๋๋ค. System.out.println("Tasks:" + tasks.toString()); } finally { lock.unlock(); // ์๊ณ์์ญ ๋ } } }
- ์ฐ๋ ๋ ์ ์ด
์ผ๊ธ๊ฐ์ฒด์ ์ด๊ธ๊ฐ์ฒด
- ์ผ๊ธ ๊ฐ์ฒด
- ๊ฐ์ฒด์ ์ธ์๋ก ๋๊ธธ ์ ์์ด์ผ ํ๋ค
- ๊ฐ์ฒด์ ๋ฆฌํด๊ฐ์ผ๋ก ๋ฆฌํด์ ํ ์ ์์ด์ผ ํ๋ค
- ๋ณ์๋ ๋ฐ์ดํฐ์ ํ ๋น ํ ์ ์์ด์ผ ํ๋ค
๐์๋ฐ์์๋ ์์ ์กฐ๊ฑด์ ํด๋นํ์ง ์๋๋คLanbda๋ ๋ฉ์๋๊ฐ 1๊ฐ๋ง ์กด์ฌํ๋ ์ธํฐํ์ด์ค๋ฅผ ํตํด, ๋ง์น ํจ์๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ฒ๋ผ ์ฌ๊ฒจ์, ํจ์๋ฅผ 1๊ธ๊ฐ์ฒด๋ก ์ทจ๊ธํ์ง ์๋ ์๋ฐ์ ๋จ์ ์ ์ด๋์ ๋ ํด๊ฒฐํ๊ณ ์๋ค
- ์ผ๊ธ ๊ฐ์ฒด
๋๋ค(Lambda) ํจ์ํ ์ธํฐํ์ด์ค ์คํธ๋ฆผ(Stream)
- ๋๋ค
- ์ต๋ช ํจ์(์ด๋ฆ์ด ์๊ณ ์ผ๊ธ ๊ฐ์ฒด๋ก ์ทจ๊ธ)
- ํจ์๋ฅผ ๊ฐ์ผ๋ก ์ฌ์ฉ ํ ์๋ ์์ผ๋ฉฐ ํ๋ผ๋ฏธํฐ์ ์ ๋ฌ
- ๋ณ์์ ๋์ ํ๊ธฐ์ ๊ฐ์ ์ฐ์ฐ๋ค์ด ๊ฐ๋ฅ
- ์ฅ์
- ์ฝ๋์ ๊ฐ๊ฒฐ์ฑ
- ์ง์ฐ์ฐ์ฐ ์ํ โ ์ง์ฐ์ฐ์์ ์ํ ํจ์ผ๋ก์จ ๋ถํ์ํ ์ฐ์ฐ์ ์ต์ํ ํ ์ ์๋ค
- ๋ณ๋ ฌ์ฒ๋ฆฌ ๊ฐ๋ฅ
- ๋จ์
- ํธ์ถ์ด ๊น๋ค๋กญ๋ค
- ๋๋ค stream ์ฌ์ฉ์ ๋จ์ for๋ฌธ ๋๋ while๋ฌธ ์ฌ์ฉ์ ์ฑ๋ฅ์ด ๋จ์ด์ง
- ๋ถํ์ํ๊ฒ ๋ง์ด ์ฐ๋ฉด ์คํ๋ ค ๊ฐ๋ ์ฑ์ด ์์ข์ ์๋ ์๋ค
// ๋๋ค ํจ์ ๋ฌธ๋ฒ // ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฌธ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. (ํ๋ผ๋ฏธํฐ ๊ฐ, ...) -> { ํจ์ ๋ชธ์ฒด } // ์๋์ ํจ์ ๋๊ฐ๋ ๊ฐ์ ํจ์์ ๋๋ค. // ์ด๋ฆ ๋ฐํํ์ , return๋ฌธ ์ฌ๋ถ์ ๋ฐ๋ผ {}๊น์ง๋ ์๋ต์ด ๊ฐ๋ฅํฉ๋๋ค. public int toLambdaMethod(int x, int y) { return x + y; } (x, y) -> x + y // ์ด๋ฐ ํจ์๋ ๊ฐ๋ฅํ๊ฒ ์ฃ ? public int toLambdaMethod2() { return 100; } () -> 100 // ๋ชจ๋ ์ ํ์ ํจ์์ ๊ฐ๋ฅํฉ๋๋ค. public void toLambdaMethod3() { System.out.println("Hello World"); } () -> System.out.println("Hello World")- ํจ์ํ ์ธํฐํ์ด์ค
- ์ถ์๋ฉ์๋๋ฅผ ํ๋๋ง ๊ฐ์ง๊ณ ์๋ ์ธํฐํ์ด์ค
- @FunctionalInterface ์ด๋ ธํ ์ด์ ์ผ๋ก ๊ฒ์ฆ ๊ฐ๋ฅ
@FunctionalInterface
- Functional Interface๋ ์ผ๋ฐ์ ์ผ๋ก '๊ตฌํํด์ผ ํ ์ถ์ ๋ฉ์๋๊ฐ ํ๋๋ง ์ ์๋ ์ธํฐํ์ด์ค'๋ฅผ ๊ฐ๋ฆฌํจ๋ค
- ์๋ฐ ์ปดํ์ผ๋ฌ๋ ์ด๋ ๊ฒ ๋ช ์๋ ํจ์ํ ์ธํฐํ์ด์ค์ ๋ ๊ฐ ์ด์์ ๋ฉ์๋๊ฐ ์ ์ธ๋๋ฉด ์ค๋ฅ๋ฅผ ๋ฐ์์ํจ๋ค
//๊ตฌํํด์ผ ํ ๋ฉ์๋๊ฐ ํ๊ฐ์ด๋ฏ๋ก Functional Interface์ด๋ค. @FunctionalInterface public interface Math { public int Calc(int first, int second); } //๊ตฌํํด์ผ ํ ๋ฉ์๋๊ฐ ๋๊ฐ์ด๋ฏ๋ก Functional Interface๊ฐ ์๋๋ค. (์ค๋ฅ ์ฌํญ) @FunctionalInterface public interface Math { public int Calc(int first, int second); public int Calc2(int first, int second); }ํจ์ํ Interface ์ ์ธ
@FunctionalInterface interface Math { public int Calc(int first, int second); }์ถ์ ๋ฉ์๋ ๊ตฌํ ๋ฐ ํจ์ํ ์ธํฐํ์ด์ค ์ฌ์ฉ
public static void main(String[] args){ Math plusLambda = (first, second) -> first + second; System.out.println(plusLambda.Calc(4, 2)); Math minusLambda = (first, second) -> first - second; System.out.println(minusLambda.Calc(4, 2)); }์คํ๊ฒฐ๊ณผ
6 2Java์์ ์ง์ํ๋ย java.util.functionย ์ธํฐํ์ด์ค
- IntFunction<R>
- int ๊ฐ์ ์ธ์๋ฅผ ๋ฐ์๋ค์ด๊ณ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๋ ํจ์๋ฅผ ๋ํ๋
์ฌ์ฉ ์์
IntFunction intSum = (x) -> x+1; System.out.println(intSum.apply(1));์คํ๊ฒฐ๊ณผ
2- BinaryOperator<T>
- ๋์ผํ ์ ํ์ ๋ ํผ์ฐ์ฐ์์ ๋ํ ์ฐ์ฐ์ ๋ํ๋ด๋ฉฐ ํผ์ฐ์ฐ์์ ๋์ผํ ์ ํ์ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํฉ๋๋ค.
์ฌ์ฉ ์์
BinaryOperator stringSum=(x, y)->x+" "+y; System.out.println(stringSum.apply("Welcome","Heejin blog"));์คํ๊ฒฐ๊ณผ
Welcome Heejin blog๊ทธ์ธ ๋ค์ํย Interface ๋ชฉ๋ก
https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html
- Stream
- ๋ค์ํ ๋ฐ์ดํฐ๋ฅผ ํ์คํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๋ค๋ฃจ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ํน์ง
- ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์๋๋ค โ ์๋ฐ ์ปฌ๋ ์ ์ผ๋ก๋ถํฐ ์คํธ๋ฆผ(ํด๋น ์ปฌ๋ ์ ์ ํ๋ฆ)์ ๋ฐ์์ ํ ๋ฒ ์ฌ์ฉ
- 1ํ์ฑ์ด๋ค(ํ๋ฐ์ฑ)
- ์ง์ฐ ์ฐ์ฐ์ ์ํํ๋ค
- ๋ณ๋ ฌ ์คํ์ด ๊ฐ๋ฅํ๋ค
- collection์ ์ ์๋์ด์๊ธฐ ๋๋ฌธ์,๋ชจ๋ ์ปฌ๋ ์ ์ ์์ํ๋ ๊ตฌํ์ฒด๋ค์ ์คํธ๋ฆผ์ ๋ฐํ ํ ์ ์๋ค
- ๋๊ฐ์ ์ฝ๋๋ ๊ฐ์ ์ญํ ์ ํ๊ณ ์๋ค
List<Car> benzParkingLot = // carsWantToPark์ ์คํธ๋ฆผ๊ฐ์ ๋ฐ์์์ carsWantToPark.stream() // ๊ฑฐ๊ธฐ ๊ตฌํ๋์ด ์๋ filter()๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. // filter๋ฉ์๋๋ ํจ์๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ฐ์ต๋๋ค. // ์ฌ๊ธฐ์ ํจ์๋ ์ ์กฐ์ฌ๊ฐ ๋ฒค์ธ ๋ฉด true๋ฅผ ๋ฐํํ๋ ํจ์๋ค์. // ํํฐ ๋ฉ์๋๋ ์ด๋ฆ์ฒ๋ผ false๋ฅผ ๋ฐํํ ์คํธ๋ฆผ์ ์์๋ค์ ์ ๊ฑฐํฉ๋๋ค. .filter((Car car) -> car.getCompany().equals("Benz")) // ์ด ๊ฒฐ๊ณผ๋ ๋ฐํ์ ๋ฐ์์ ๋ค์ ๋ฆฌ์คํธ๋ก ๋ฌถ์ด์ค๋๋ค. // equals๋ ํด๋น๊ฐ์ด ๊ฐ์์ง ์ฌ๋ถํ๋จ // contains๋ ํฌํจ๋์ด์๋์ง ์ฌ๋ถํ๋จ .toList();ArrayList<Car> benzParkingLotWithoutStream = new ArrayList<>(); for (Car car : carsWantToPark) { if (car.getCompany().equals("Benz")) { benzParkingLotWithoutStream.add(car); } }์คํธ๋ฆผ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
- ์คํธ๋ฆผ์ ๋ฐ์์ค๊ธฐ (.stream())
carsWantToPark.stream()
- ์คํธ๋ฆผ ๊ฐ๊ณตํ๊ธฐ
.filter((Car car) -> car.getCompany().equals("Benz"))
- ์คํธ๋ฆผ ๊ฒฐ๊ณผ ๋ง๋ค๊ธฐ
.toList();
- ์คํธ๋ฆผ์ ๋ฐ์์ค๊ธฐ (.stream())
map(),forEach(),filter()
- forEach()
List<String> carNames = Arrays.asList("Series 6", "A9", "Ionic 6"); carNames.stream() .forEach(System.out::println); // ๊ฒฐ๊ณผ // Series 6 // A9 // Ionic 6- ๊ฐ๊ฐ์ ์์์ ๋๊ฒจ๋ฐ์ ํจ์๋ฅผ ์คํํด์ค๋๋ค.
- ํ์ง๋ง ๋๊ฒจ๋ฐ์ ๋ฐํ๊ฐ์ ๊ฐ์ง๊ณ ๋ญ ํ์ง๋ ์์ผ๋ฉฐ, ์๋ค๊ณ ํด๋ ๋ฌด์๋ฉ๋๋ค.
- map()
carNames.stream() .map(name -> name.toUpperCase()).toList(); // ๊ฒฐ๊ณผ // ["SERIES 6", "A9", "IONIC 6"]- forEach์๋ ๋ฐ๋๋ก ๋๊ฒจ๋ฐ์ ํ ๋๋ก ๊ฐ์ ๋ณํ์ํค๋๋ฐ ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
- forEach()
Stream์ ์ข ๋ฅ
Stream <T> ๋ฒ์ฉ Stream IntStream ๊ฐ ํ์ ์ด Int์ธย Stream LongStream ๊ฐ ํ์ ์ดย Long์ธ Stream DoubleStream ๊ฐ ํ์ ์ดย Double์ธ Stream Stream์ ์ค๊ฐ ์ฐ์ฐ ๋ช ๋ น์ด
Stream < T > distinct() Stream์ ์์ ์ค๋ณต ์ ๊ฑฐ Stream < T > sorted() Stream ์์ ์ ๋ ฌ Stream < T > filter(Predicate < T > predicate) ์กฐ๊ฑด์ ์ถฉ์กฑํ๋ ์์๋ฅผ Stream์ผ๋ก ์์ฑ Stream < T > limit(long maxSize) maxSize ๊น์ง์ ์์๋ฅผ Stream์ผ๋ก ์์ฑ Stream < T > skip(ling n) ์ฒ์ n๊ฐ์ ์์๋ฅผ ์ ์ธํ๋ stream ์์ฑ Stream < T > peek(Consumer< T > action) Tํ์ ์์์ ๋ง๋ ์์ ์ํ Stream < R > flatMap(Function<ย T, stream<? extends R>> Tmapper) Tํ์ ์์๋ฅผ 1:N์ Rํ์ ์์๋ก ๋ณํํ์ฌ ์คํธ๋ฆผ ์์ฑ Stream < R > map(Function<? super T, ? extends R> mapper) ์ ๋ ฅ Tํ์ ์ Rํ์ ์์๋ก ๋ณํํ ์คํธ๋ฆผ ์์ฑ Stream mapToInt(),mapToLong(),mapToDobule() ๋ง์ฝ map Type์ด ์ซ์๊ฐ ์๋ ๊ฒฝ์ฐ ๋ณํํ์ฌ ์ฌ์ฉ Stream์ ์ต์ข ์ฐ์ฐ ๋ช ๋ น์ด
void forEach(Consumer <? super T> action) Stream ์ ๊ฐ ์์์ ์ง์ ๋ ์์ ์ํ long count() Stream ์ ์์ ๊ฐ์ Optional < T > sumย (Comparator <? super T> comparator) Stream ์ ์์ ํฉ Optional < T > max (Comparator <? super T> comparator) Stream ์์์ ์ต๋ ๊ฐ Optional < T > min (Comparator <? super T> comparator) Stream ์์์ ์ต์ ๊ฐ Optional < T > findAny() Stream ์์์ ๋๋ค ์์ Optional < T > findFirst() Stream ์ ์ฒซ ๋ฒ์งธ ์์ boolean allMatch(Pradicate < T > p) Stream ์ ๊ฐ์ด ๋ชจ๋ ๋ง์กฑํ๋์ง boolean ๋ฐํ boolean anyMatch(Pradicate < T > p) Stream ์ ๊ฐ์ด ํ๋๋ผ๋ ๋ง์กฑํ๋์ง boolean ๋ฐํ boolean noneMatch(Pradicate < T > p) Stream ์ ๊ฐ์ด ํ๋๋ผ๋ ๋ง์กฑํ์ง์๋์ง boolean ๋ฐํ Object[] toArray() Stream ์ ๋ชจ๋ ์์๋ฅผ ๋ฐฐ์ด๋ก ๋ฐํ reduce ์ฐ์ฐ Stream ์ ์์๋ฅผ ํ๋์ฉ ์ค์ฌ๊ฐ๋ฉฐ ๊ณ์ฐํ๋ค. - Optional < T > reduce(Binary Operator<T> accumulator) ย - T reduce ( T identity, BinaryOperator<T> accumulator) ย - <U> U reduce (U indentity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner) - .reduce((x,y) -> x > y ? x : y ); ย - .reduce(1, (x,y) -> x * y); ย - .reduce(0.0, ย ย (val1, val2) -> Double.valueOf(val1 + val2 / 10), ย ย (val1, val2) -> val1 + val2); collector ์ฐ์ฐ Stream์ ์์๋ฅผ ์์งํ์ฌ ์์๋ฅผ ๊ทธ๋ฃนํ ํ๊ฑฐ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ด์ ๋ฐํํ๋๋ฐ ์ฌ์ฉํ๋ค. - Collectors.toList() ย - Collectors.toSet() ย - Collectors.toMap() ย - Collectors.groupingBy ย - Collectors.partioningBy ย - Collectors.summarizingInt() ๊ทธ์ธ์ ์คํธ๋ฆผ๊ด๋ จ์ ๋ณด
์์
// ์ฒซ๋ฒ์งธ๋ฅผ ์ค๋ช ํ์๋ฉด // Car๋ผ๋ ํด๋์ค์์ ์๋์ฐจํ์ฌ์ ๋ชจ๋ธ ํฐ์ผ์ฌ๋ถ ๊ทธ๋ฆฌ๊ณ ๊ธ์ก์ฌ๋ถ๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์์ // ์ฃผ์ฐจ๋ฅผ ํ ์ ์๋์ง๋ฅผ ํ์ธํด์ค๋ค // ์ค๊ฐ์ฏค์ ๋ณด๋ฉด parkingCarWithTicket์ด๋ parkingCarWithMoney๋ฉ์๋์ ์๋์ฐจ ์ฃผ์ฐจ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ๊ธฐ๋ฅ๊ตฌํ์ด // ๋น์ทํ๊ฒ ๋์ด์๋ค // ์ด๋ถ๋ถ์ ์ต๋ช ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ตํ๊ฒ ์ถ์ํ ์ ์๋ค // ๋๋ฒ์งธ ์ชฝ์ ๋ณด๋ฉด parkCars๋ผ๋ ๋ฉ์๋์ ๋งค๊ฐ๋ณ์๋ก ์ฒซ๋ฒ์งธ์๋ ์๋์ฐจ ๊ฐ์ฒด๋ฅผ ๋๋ฒ์งธ๋ก๋ Predicate๋ผ๋ interfaceํ์ ์ ํจ์๋ฅผ // ๋งค๊ฐ๋ณ์๋ก ๋ฐ์์จ๋ค // ๊ทธ๋ฆฌ๊ณ ํด๋น ํจ์๋ฅผ ๋ฉ์๋ ์์์ ์คํํ๋ฉด์ Carํ์ ์ผ๋ก ๋ง๋ค์ด์ง cars List๋ฅผ ๋งค๊ฐ๋ณ์๋ก ์ง์ด ๋ฃ์๋ค // ๊ทธ๋ฌ๋ฉด ํด๋น ๊ฒฐ๊ณผ๊ฐ์ true false๋ก ๋ฐํํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ์๋ค // ๊ทธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ฒ ์์ชฝ์ addAll๋ถ๋ถ์ด๋ค // parkingLot์ addAll๋ก ์ ๋ถ์ถ๊ฐํ๋๋ฐ parkCars ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ณ ๊ทธ์์ ๊ฐ์ฒดํ์ ์ ๋งค๊ฐ๋ณ์1๋ฒ์ ์ง์ด๋ฃ๊ณ , // 2๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก Carํด๋์ค์์์๋ ๋ฉ์๋์ธ hasTicket์ ๋ถ๋ฌ์ ์ฌ์ฉํ์๋ค // hasTicket๋ฉ์๋ ๋ด๋ถ๋ฅผ๋ณด๋ฉด ํด๋น๊ฐ์ด์๋์ง ์ฌ๋ถ๋ฅผ true,false๋ก ๋ฐํํด์ฃผ๊ฒ ๋์ด์๋ค // ์ด๋ ๊ฒ ๋์ด์๋ ๋๊ฐ์ ๋ฉ์๋์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๋ // ์๋กญ๊ฒ ๋ฉ์๋๋ฅผ ๋ง๋๋๊ฒ ํจ์จ์ ์ด์ง ๋ชปํ๋ค๊ณ ๋๋๋ ์ต๋ช ํจ์๋ฅผ ์ฌ์ฉํด ๋ณผ ์ ์๋ค.import java.util.ArrayList; import java.util.List; public class LambdaAndStream { public static void main(String[] args) { ArrayList<Car> carsWantToPark = new ArrayList<>(); ArrayList<Car> parkingLot = new ArrayList<>(); Car car1 = new Car("Benz", "Class E", true, 0); Car car2 = new Car("BMW", "Series 7", false, 100); Car car3 = new Car("BMW", "X9", false, 0); Car car4 = new Car("Audi", "A7", true, 0); Car car5 = new Car("Hyundai", "Ionic 6", false, 10000); carsWantToPark.add(car1); carsWantToPark.add(car2); carsWantToPark.add(car3); carsWantToPark.add(car4); carsWantToPark.add(car5); parkingLot.addAll(parkingCarWithTicket(carsWantToPark)); parkingLot.addAll(parkingCarWithMoney(carsWantToPark)); for (Car car : parkingLot) { System.out.println("Parked Car : " + car.getCompany() + "-" + car.getModel()); } } public static List<Car> parkingCarWithTicket(List<Car> carsWantToPark) { ArrayList<Car> cars = new ArrayList<>(); for (Car car : carsWantToPark) { if (car.hasParkingTicket()) { cars.add(car); } } return cars; } public static List<Car> parkingCarWithMoney(List<Car> carsWantToPark) { ArrayList<Car> cars = new ArrayList<>(); for (Car car : carsWantToPark) { if (!car.hasParkingTicket() && car.getParkingMoney() > 1000) { cars.add(car); } } return cars; } } class Car { private final String company; // ์๋์ฐจ ํ์ฌ private final String model; // ์๋์ฐจ ๋ชจ๋ธ private final boolean hasParkingTicket; private final int parkingMoney; public Car(String company, String model, boolean hasParkingTicket, int parkingMoney) { this.company = company; this.model = model; this.hasParkingTicket = hasParkingTicket; this.parkingMoney = parkingMoney; } public String getCompany() { return company; } public String getModel() { return model; } public boolean hasParkingTicket() { return hasParkingTicket; } public int getParkingMoney() { return parkingMoney; } }import java.util.ArrayList; import java.util.List; // ์ฃผ์ฐจ์ฅ ์์ // ํฐ์ผ, ํํน๋จธ๋ -> ์ฃผ์ฐจํ๊ฒ ํ๋ public class LambdaAndStream { public static void main(String[] args) { // ์ฃผ์ฐจ๋์ ์ฐจ๋ ArrayList<Car> carsWantToPark = new ArrayList<>(); // ์ฃผ์ฐจ์ฅ ArrayList<Car> parkingLot = new ArrayList<>(); // ์ฃผ๋ง ์ฃผ์ฐจ์ฅ ArrayList<Car> weekendParkingLot = new ArrayList<>(); // 5๊ฐ์ car instance Car car1 = new Car("Benz", "Class E", true, 0); Car car2 = new Car("BMW", "Series 7", false, 100); Car car3 = new Car("BMW", "X9", false, 0); Car car4 = new Car("Audi", "A7", true, 0); Car car5 = new Car("Hyundai", "Ionic 6", false, 10000); carsWantToPark.add(car1); carsWantToPark.add(car2); carsWantToPark.add(car3); carsWantToPark.add(car4); carsWantToPark.add(car5); parkingLot.addAll(parkCars(carsWantToPark,Car::hasTicket)); // ๋งค๊ฐ๋ณ์๋ก ๋ฉ์๋ ๋๊ฒจ์ฃผ๋ ๋ฐฉ๋ฒ parkingLot.addAll(parkCars(carsWantToPark,Car::noTicketButMoney)); // ์ต๋ช ํจ์ ์ ์ฉ // ๋๋ค๋ฌธ๋ฒ // ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํ๊ณ // return์ด ํ์ค์ผ๋๋ {}์ return์ ์๋ตํ ์์๋ค parkingLot.addAll(parkCars(carsWantToPark, (Car car)-> car.hasParkingTicket() && car.getParkingMoney() > 1000)); for (Car car : parkingLot) { System.out.println("Parked Car : " + car.getCompany() + "-" + car.getModel()); } // ๋งค๊ฐ๋ณ์๋ก ๋๊ฒจ์ฃผ๋ ํจ์์ ๋ฐ์ดํฐํ์ // (ํจ์ํ)์ธํฐํ์ด์ค๋ก ๊ฐ๋ฅ // ์ธํฐํ์ด์ค๊ฐ ํ์ ์ญํ ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ // ํจ์ํ ์ธํฐํ์ด์ค -> ์ถ์๋ฉ์๋๋ฅผ ๋ฑ ํ๋๋ง ๊ฐ์ง๊ณ ์์ } // ์์ ๋ ๋ฉ์๋๋ฅผ ํ๋๋ก : ๋ด๋ถ ์ฃผ์ ๋ก์ง์ ํจ์๋ก ์ ๋ฌ public static List<Car> parkCars(List<Car> carsWantToPark, Predicate<Car> function){ List<Car> cars = new ArrayList<>(); for (Car car : carsWantToPark){ // ์ ๋ฌ๋ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ if(function.test(car)){ cars.add(car); } } return cars; } } class Car { private final String company; // ์๋์ฐจ ํ์ฌ private final String model; // ์๋์ฐจ ๋ชจ๋ธ private final boolean hasParkingTicket; private final int parkingMoney; public Car(String company, String model, boolean hasParkingTicket, int parkingMoney) { this.company = company; this.model = model; this.hasParkingTicket = hasParkingTicket; this.parkingMoney = parkingMoney; } public String getCompany() { return company; } public String getModel() { return model; } public boolean hasParkingTicket() { return hasParkingTicket; } public int getParkingMoney() { return parkingMoney; } public static boolean hasTicket(Car car){ return car.hasParkingTicket; } public static boolean noTicketButMoney(Car car){ return !car.hasParkingTicket && car.getParkingMoney() > 1000; } } interface Predicate<T>{ boolean test(T t); }
์คํธ๋ฆผ ์ฌ์ฉ ์์ ๋ค
int [] solution = {4,3,2,1}; int min = Arrays.stream(solution).min().getAsInt(); System.out.println(min); int[] result = Arrays.stream(solution).filter(list -> list != min).toArray(); System.out.println(Arrays.toString(result)); // stream()์ ๋ฐฐ์ด์ ๋งค๊ฐ๋ณ์๋ก ๋ฃ๊ณ min()์ผ๋ก ์ต์๊ฐ์ ๊ตฌํ๋ค์ .getAsInt()๋ก intํ์ ์ผ๋ก ๋ณํ // filter์ ํตํด ์ต์๊ฐ์ด ์๋๊ฒ๋ค๋ง ๋ฐฐ์ด๋ก ๋ฐํclass Solution { public int solution(int[] a, int[] b) { return IntStream.range(0, a.length).map(index -> a[index] * b[index]).sum(); } } // Intํ์ ์คํธ๋ฆผ์ 0๋ถํฐ a๋ฐฐ์ด์ ๊ธธ์ด์ฌ์ด์ ์ซ์๋ค // map์์ ๊ทธ ์ซ์๋ค์ ์์น์ ๋ฐฐ์ด๊ฐ๋ค์ ๊ณฑํ๊ณ ํฉ์น๋คString s = "Zbcdefg"; String[] strArr = s.split(""); String sortedStr = Arrays.stream(strArr) .sorted(Comparator.reverseOrder()) .collect(Collectors.joining()); System.out.println("sortedStr = " + sortedStr); // ๋ฌธ์์ด์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ // Comparator.reverseOrder๋ก ๋ด๋ฆผ์ฐจ์ default๋ ์ค๋ฆ์ฐจ์ // Collectors.joining()์ผ๋ก ๋ฌธ์์ด ํ๋๋ก ์กฐํฉScanner sc = new Scanner(System.in); int a = sc.nextInt(); int b = sc.nextInt(); StringBuilder sb = new StringBuilder(); IntStream.range(0, a).forEach(s -> sb.append("*")); IntStream.range(0, b).forEach(s -> System.out.println(sb.toString())); // sb์ range๋ฒ์๋งํผ์ *์ ๋ฃ์๋ค์ // ๋๋ฒ์งธ์์๋ ๋ฐ์ด์ฐ๊ธฐ๋ฅผ ๋ํ๋คimport java.util.stream.IntStream; class Solution { public int solution(int n) { return IntStream.range(2, n).filter(i -> n % i == 1).findFirst().orElse(0); // findFirst : ์กฐ๊ฑด์ ์ผ์นํ๋ ์์๋ค์ค์ stream์์ ์์๊ฐ ๊ฐ์ฅ ์์ ์๋ ์์ ๋ฆฌํด // findAny : Stream์์ ๊ฐ์ฅ ๋จผ์ ํ์๋๋ ์์ ๋ฆฌํด // ๋๊ฐ๋ค ์กฐ๊ฑด์ ์ผ์นํ๋ ๊ฐ์ด ์์ผ๋ฉด empty๋ฆฌํด // ์กฐ๊ฑด์ ์ผ์นํ๋ ํ๋์ ๊ฐ๋ง ๋ฆฌํด // ์ฐจ์ด์ // ๋ณ๋ ฌ์ฒ๋ฆฌ์ findFrist๋ ์์์ ๋ง๊ฒ ๊ฐ์ฅ ์์ ๊ฐ์ ๋ฆฌํด // ํ์ง๋ง findAny๋ Multi thread์์ Stream์ ์ฒ๋ฆฌํ ๋ // ๊ฐ์ฅ ๋จผ์ ์ฐพ์ ์์๋ฅผ ๋ฆฌํดํ๊ธฐ๋๋ฌธ์ ์ํฉ์ ๋ฐ๋ผ ๋ค์ชฝ์ element๊ฐ ๋ฆฌํด๋ ์๋ ์๋ค } }
Optional
- null์ด๋ผ๋ โ๊ฐ๋ โ์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์, ๊ฑฐ์ ๋ชจ๋ ์ํฉ์ null์ด ๋ฐ์ ํ ์ ์์์ ๊ฒฝ๊ณํด์ผ ํฉ๋๋ค.
- ์ด์์ ์ด๋ผ๋ฉด ๋ชจ๋๊ฐ ๋ฉ์๋ ์ด๋ฆ์ โfindWhateverAndIfNoExistReturnNull()โ ์ฒ๋ผ ์์ฑํ๊ณ
- ํด๋น๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋๋ null ์ฒดํฌ๋ฅผ ํด์ค์ผ๊ฒ ์ฃ
- ํ์ง๋ง ๊ทธ๋ฐ์ผ์ ์ผ์ด๋์ง ์์๊ณ , ์ด๊ฒ์ ๊ฐ๋ฆฌ์ผ 10์ต ๋ฌ๋ฌ์ง๋ฆฌ ์ค์๋ผ๊ณ ๋ฐํ์ต๋๋ค.
https://zorba91.tistory.com/339
public class NullIsDanger { public static void main(String[] args) { SomeDBClient myDB = new SomeDBClient(); String userId = myDB.findUserIdByUsername("HelloWorldMan"); System.out.println("HelloWorldMan's user Id is : " + userId); } } class SomeDBClient { public String findUserIdByUsername(String username) { // ... db์์ ์ฐพ์์ค๋ ๋ก์ง String data = "DB Connection Result"; if (data != null) { return data; } else { return null; } } }๊ฐ์ 1 : ์ ์ฝ๋์ ๋ฌธ์ ์
- ๋ ผ๋ฆฌ์ ์ผ๋ก๋, ํ๊ฒฝ์ ์ผ๋ก๋ null์ด ๋ฐํ๋ ์ฌ์ง๊ฐ ์์์๋, null์ด ๋ฐํ๋ ์ ์์์ ๋ช ์ํ์ง ์์์ต๋๋ค.
- ๋ฉ์ธํจ์์ชฝ์์, ์ฌ์ฉ ํ ๋ null์ฒดํฌ๋ฅผ ํ์ง ์์, ๋ง์ฝ null์ด ๋ฐํ๋๋ค๋ฉด, nullPointerException์ด ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
๊ฐ์ 1 : null์ด ๋ฐํ๋ ์ฌ์ง๋ฅผ ๋ช ์ํ๊ณ , ๊ทธ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋์ด ์กฐ์ฌํ๊ธฐ
public class NullIsDanger { public static void main(String[] args) { SomeDBClient myDB = new SomeDBClient(); String userId = myDB.findUserIdByUsernameOrThrowNull("HelloWorldMan"); // ๊ฐ์ 1: null์ด ๋ฐํ ๋ ์ ์์์ ์ธ์งํ ๋ฉ์๋ ์ฌ์ฉ์๋, null์ ๋๋นํฉ๋๋ค. if (userId != null) { System.out.println("HelloWorldMan's user Id is : " + userId); } } } class SomeDBClient { // ๊ฐ์ 1: ์ด ๋ฉ์๋๋ null์ด ๋ฐํ ๋ ์ ์์์ ๋ช ์ํฉ๋๋ค. public String findUserIdByUsernameOrThrowNull(String username) { // ... db์์ ์ฐพ์์ค๋ ๋ก์ง String data = "DB Connection Result"; if (data != null) { return data; } else { return null; } } }
๊ฐ์ 2 : ๊ฐ์ 1์ ๋ฌธ์ ์
๐ค์ฝ์์ ๊นจ์ง๋ผ๊ณ ์๋ ๊ฒ์ด๊ณ , ์ฌ๋์ ์ค์ํ๊ฒ ๋์ด ์์ต๋๋ค. ๋๊ตฐ๊ฐ๋ ๋ฐ๋น ์, ํน์ ์ต์ํ์ง ์์์ null์ฒดํฌ๋ฅผ ํ์ง ์๋๋ค๋ฉด ์์คํ ์ ์ํ์ ๋น ์ง๋๋ค.๊ฐ์ 2 : ๊ฐ์ฒด๋ฅผ ๊ฐ์ธ์ ๋ฐํํ๊ธฐ
// ๊ฐ์ 2: ๊ฒฐ๊ณผ๊ฐ์ ๊ฐ์ผ ๊ฐ์ฒด๋ฅผ ๋ง๋ญ๋๋ค. class SomeObjectForNullableReturn { private final String returnValue; private final Boolean isSuccess; SomeObjectForNullableReturn(String returnValue, Boolean isSuccess) { this.returnValue = returnValue; this.isSuccess = isSuccess; } public String getReturnValue() { return returnValue; } public Boolean isSuccess() { return isSuccess; } } public class NullIsDanger { public static void main(String[] args) { SomeDBClient myDB = new SomeDBClient(); // ๊ฐ์ 2 : ์ด์ ํด๋น ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ์ ์ ๋, ๊ฐ์ฒด๋ฅผ ๋ฆฌํด๋ฐ๊ธฐ ๋๋ฌธ์ ๋ ์์ฐ์ค๋ฝ๊ฒ ์ฑ๊ณต์ฌ๋ถ๋ฅผ ์ฒดํฌํ๊ฒ ๋ฉ๋๋ค. SomeObjectForNullableReturn getData = myDB.findUserIdByUsername("HelloWorldMan"); if (getData.isSuccess()) { System.out.println("HelloWorldMan's user Id is : " + getData.getReturnValue()); } } } class SomeDBClient { // ๊ฐ์ 2 : ๊ฒฐ๊ณผ๊ฐ์ ๊ฐ์ผ ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํฉ๋๋ค. public SomeObjectForNullableReturn findUserIdByUsername(String username) { // ... db์์ ์ฐพ์์ค๋ ๋ก์ง String data = "DB Connection Result"; if (data != null) { return new SomeObjectForNullableReturn(data, true); } else { return new SomeObjectForNullableReturn(null, false); } } }- ์ด์ ํด๋น ๋ฉ์๋๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ผ ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํ๊ณ
- ๊ฐ์ผ ๊ฐ์ฒด๋ฅผ ๋ฆฌํด๋ฐ์ ์ ์ ๋ ์ด ๋ฉ์๋๊ฐ ์ํํ ์ ์๋ค๋ ๊ฒ์ ๋ ์ฝ๊ฒ ์ธ์ง ํ ์ ์์ต๋๋ค.
๊ฐ์ 3 : ๊ฐ์ 2์ ์์ด๋์ด ๋ฐ์ ์ํค๊ธฐ
class SomeObjectForNullableReturn<T> { private final T returnValue; private final Boolean isSuccess; SomeObjectForNullableReturn(T returnValue, Boolean isSuccess) { this.returnValue = returnValue; this.isSuccess = isSuccess; } public T getReturnValue() { return returnValue; } public Boolean isSuccess() { return isSuccess; } }- โ๊ฐ์ธ๋ ๊ฐ์ฒดโ๋ฅผ ์กฐ๊ธ ์์ ํ๋ฉด, ์ด์ ์ํ ํ ์ ์๋ ๋ชจ๋ ๋ฉ์๋์ ์ฌ์ฉ ํ ์ ์๊ฒ ๋ฉ๋๋ค.
์ง๊ธ๋ถํฐ๋ผ๋ ์ํ์! Optional<T>
Optional ๊ธฐ๋ณธ ์ ๋ฆฌ
- Java8์์๋ Optional<T> ํด๋์ค๋ฅผ ์ฌ์ฉํด Null Pointer Exception์ ๋ฐฉ์งํ ์ ์๋๋ก ๋์์ค๋๋ค.
- Optional<T>๋ null์ด ์ฌ ์ ์๋ ๊ฐ์ ๊ฐ์ธ๋ Wrapper ํด๋์ค์ ๋๋ค.
- Optional์ด ๋น์ด์๋๋ผ๋, ์ฐธ์กฐํด๋ Null Pointer Exception๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
Optional ๊ฐ๋จ ์ฌ์ฉ๋ฒ
- ๊ฐ์ด null ์ธ Optional ์์ฑํ๊ธฐ
Optional<Car> emptyOptional = Optional.empty();
- ๊ฐ์ด ์๋ Optional ์์ฑํ๊ธฐ
Optional<Car> hasDataOptional = Optional.of(new Car());
- ๊ฐ์ด ์์์๋ ์์์๋ ์๋ Optional ์์ฑํ๊ธฐ
Optional<Car> hasDataOptional = Optional.ofNullable(getCarFromDB());
- Optional ๊ฐ์ฒด ์ฌ์ฉํ๊ธฐ (๊ฐ ๋ฐ์์ค๊ธฐ)
Optional<String> carName = getCarNameFromDB(); // orElse() ๋ฅผ ํตํด ๊ฐ์ ๋ฐ์์ต๋๋ค, ํ๋ผ๋ฏธํฐ๋ก๋ null์ธ ๊ฒฝ์ฐ ๋ฐํํ ๊ฐ์ ์ ์ต๋๋ค. String realCarName = carName.orElse("NoCar"); // ์๋ ์์์ฝ๋๊ณ ์ค์ ๋ ๋ณดํต ์๋์ ๊ฐ์ด ์ฌ์ฉํ๊ฒ ์ฃ ? String carName = getCarNameFromDB().orElse("NoCar"); // orElseGet()์ด๋ผ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ ๋ฐ์์ฌ ์ ์์ต๋๋ค. // ํ๋ผ๋ฏธํฐ๋ก๋ ์๋ ๊ฒฝ์ฐ ์คํ๋ ํจ์๋ฅผ ์ ๋ฌํฉ๋๋ค. Car car = getCarNameFromDB().orElseGet(Car::new); // ๊ฐ์ด ์์ผ๋ฉด, ๊ทธ ์๋ ๋ก์ง์ ์ํํ๋๋ฐ ํฐ ์ฅ์ ๊ฐ ๋๋๊ฒฝ์ฐ ์๋ฌ๋ฅผ ๋ฐ์์ํฌ์๋ ์์ต๋๋ค. Car car = getCarNameFromDB() .orElseThrow(() -> new CarNotFoundException("NO CAR!)
- ๊ฐ์ด null ์ธ Optional ์์ฑํ๊ธฐ
Optional์ถ๊ฐ
๐Optional<T>ํด๋์ค๋ฅผ ์ฌ์ฉํด NPE(NullPointException)๋ฐฉ์ง๋ฅผ ํ ์ ์๋๋ก ๋์์ค๋คnull์ด ์ฌ ์ ์๋ ๊ฐ์ ๊ฐ์ธ๋ Wrapperํด๋์ค
์ฐธ์กฐํ๋๋ผ๋ NPE๊ฐ ๋ฐ์ํ์ง ์๋๋ก ๋์์ค๋ค
์๋์ ๊ฐ์ value์ ๊ฐ์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ด null์ด๋๋ผ๋ ๋ฐ๋ก NPE๊ฐ ๋ฐ์ํ์ง ์์ผ๋ฉฐ, ํด๋์ค์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ข ๋ฉ์๋๋ฅผ ์ ๊ณต
public final class Optional<T> { // If non-null, the value; if null, indicates no value is present private final T value; ... }- ์์ฑ ํ๊ธฐ
Optional.empty() -ย ๊ฐ์ด Null์ธ ๊ฒฝ์ฐ
Optional์ Wrapper ํด๋์ค์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ด ์์ ์๋ ์๋๋ฐ, ์ด๋๋ Optional.empty()๋ก ์์ฑํ ์ ์๋ค.
Optional<String> optional = Optional.empty(); System.out.println(optional);// Optional.empty System.out.println(optional.isPresent());// falseOptional ํด๋์ค๋ ๋ด๋ถ์์ static ๋ณ์๋ก EMPTY ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ์์ฑํด์ ๊ฐ์ง๊ณ ์๋ค. ์ด๋ฌํ ์ด์ ๋ก ๋น ๊ฐ์ฒด๋ฅผ ์ฌ๋ฌ ๋ฒ ์์ฑํด์ค์ผ ํ๋ ๊ฒฝ์ฐ์๋ 1๊ฐ์ EMPTY ๊ฐ์ฒด๋ฅผ ๊ณต์ ํจ์ผ๋ก์จ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ๊ณ ์๋ค.
public final class Optional<T> { private static final Optional<?> EMPTY = new Optional<>(); private final T value; private Optional() { this.value = null; } ... }Optional.of() -ย ๊ฐ์ด Null์ด ์๋ ๊ฒฝ์ฐ
๋ง์ฝ ์ด๋ค ๋ฐ์ดํฐ๊ฐ ์ ๋ย null์ดย ์๋๋ผ๋ฉด Optional.of()๋ก ์์ฑํ ์ ์๋ค. ๋ง์ฝ Optional.of()๋ก Null์ ์ ์ฅํ๋ ค๊ณ ํ๋ฉดย NullPointerException์ด ๋ฐ์ํ๋ค.
// Optional์ value๋ ์ ๋ null์ด ์๋๋ค. Optional<String> optional = Optional.of("MyName");Optional.ofNullbale() -ย ๊ฐ์ด Null์ผ์๋, ์๋์๋ ์๋ ๊ฒฝ์ฐ
๋ง์ฝ ์ด๋ค ๋ฐ์ดํฐ๊ฐ null์ด ์ฌ ์๋ ์๊ณ ์๋ ์๋ ์๋ ๊ฒฝ์ฐ์๋ Optional.ofNullbale๋ก ์์ฑํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ดํ์ orElse ๋๋ orElseGet ๋ฉ์๋๋ฅผ ์ด์ฉํด์ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ๋ผ๋ ์์ ํ๊ฒ ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์๋ค.
// Optional์ value๋ ๊ฐ์ด ์์ ์๋ ์๊ณ null ์ผ ์๋ ์๋ค. Optional<String> optional = Optional.ofNullable(getName()); String name = optional.orElse("anonymous");// ๊ฐ์ด ์๋ค๋ฉด "anonymous" ๋ฅผ ๋ฆฌํด[ย Optionalย ์ฌ์ฉ๋ฒย ์์ย ์ฝ๋ย ]
Optional ์ฌ์ฉ๋ฒ ์์ (1)
๊ธฐ์กด์๋ ์๋์ ๊ฐ์ด null ๊ฒ์ฌ๋ฅผ ํ ํ์ null์ผ ๊ฒฝ์ฐ์๋ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํด์ฃผ์ด์ผ ํ๋ค. ์ด๋ฌํ ๊ณผ์ ์ ์ฝ๋๋ก ๋ํ๋ด๋ฉด ๋ค์ ๋ฒ์กํด๋ณด์ด๋๋ฐ, Optional<T>์ Lambda๋ฅผ ์ด์ฉํ๋ฉด ํด๋น ๊ณผ์ ์ ๋ณด๋ค ๊ฐ๋จํ๊ฒ ํํํ ์ ์๋ค.
// Java8 ์ด์ List<String> names = getNames(); List<String> tempNames = list != null ? list : new ArrayList<>(); // Java8 ์ดํ List<String> nameList = Optional.ofNullable(getNames()) .orElseGet(() -> new ArrayList<>());Optional ์ฌ์ฉ๋ฒ ์์ (2)
์๋ฅผ ๋ค์ด ์๋์ ๊ฐ์ ์ฐํธ๋ฒํธ๋ฅผ ๊บผ๋ด๋ null ๊ฒ์ฌ ์ฝ๋๊ฐ ์๋ค๊ณ ํ์. ์ด ์ฝ๋๋ null ๊ฒ์ฌ ๋๋ฌธ์ ์๋นํ ๋ณต์กํ๋ค.
public String findPostCode() { UserVO userVO = getUser(); if (userVO != null) { Address address = user.getAddress(); if (address != null) { String postCode = address.getPostCode(); if (postCode != null) { return postCode; } } } return "์ฐํธ๋ฒํธ ์์"; }ํ์ง๋ง Optional์ ์ฌ์ฉํ๋ฉดย ์ด๋ฌํ ์ฝ๋๋ฅผย ์๋์ ๊ฐ์ด ํํํ ์ ์๋ค.
public String findPostCode() { // ์์ ์ฝ๋๋ฅผ Optional๋ก ํผ์ณ๋์ผ๋ฉด ์๋์ ๊ฐ๋ค. Optional<UserVO> userVO = Optional.ofNullable(getUser()); Optional<Address> address = userVO.map(UserVO::getAddress); Optional<String> postCode = address.map(Address::getPostCode); String result = postCode.orElse("์ฐํธ๋ฒํธ ์์"); // ๊ทธ๋ฆฌ๊ณ ์์ ์ฝ๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ถ์ฝํด์ ์ธ ์ ์๋ค. String result = user.map(UserVO::getAddress) .map(Address::getPostCode) .orElse("์ฐํธ๋ฒํธ ์์"); }Optional ์ฌ์ฉ๋ฒ ์์ (3)
์๋ฅผ ๋ค์ด ์๋์ ๊ฐ์ด ์ด๋ฆ์ ๋๋ฌธ์๋ก ๋ณ๊ฒฝํ๋ ์ฝ๋์์ NPE ์ฒ๋ฆฌ๋ฅผ ํด์ค๋ค๊ณ ํ์.
String name = getName(); String result = ""; try { result = name.toUpperCase(); } catch (NullPointerException e) { throw new CustomUpperCaseException(); }์์ ์ฝ๋๋ ๋ค์ ๋ฒ์กํ๊ณ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๋๋ฐ ์ด๋ฅผ Optional๋ฅผ ํ์ฉํ๋ฉด ์๋์ ๊ฐ์ด ํํํ ์ ์๋ค.
Optional<String> nameOpt = Optional.ofNullable(getName()); String result = nameOpt.orElseThrow(CustomUpperCaseExcpetion::new) .toUpperCase();[ย Optionalย ์ ๋ฆฌย ]
Optional์ null ๋๋ ๊ฐ์ ๊ฐ์ธ์ NPE(NullPointerException)๋ก๋ถํฐ ๋ถ๋ด์ ์ค์ด๊ธฐ ์ํด ๋ฑ์ฅํ Wrapper ํด๋์ค์ด๋ค.ย Optional์ ๊ฐ์ Wrappingํ๊ณ ๋ค์ ํ๊ณ , null ์ผ ๊ฒฝ์ฐ์๋ ๋์ฒดํ๋ ํจ์๋ฅผ ํธ์ถํ๋ ๋ฑ์ ์ค๋ฒํค๋๊ฐ ์์ผ๋ฏ๋ก ์๋ชป ์ฌ์ฉํ๋ฉด ์์คํ ์ฑ๋ฅ์ด ์ ํ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ฉ์๋์ ๋ฐํ ๊ฐ์ด ์ ๋ null์ด ์๋๋ผ๋ฉด Optional์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข๋ค. ์ฆ, Optional์ ๋ฉ์๋์ย ๊ฒฐ๊ณผ๊ฐ null์ด ๋ ์ ์์ผ๋ฉฐ, null์ ์ํด ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋์ ๋ ๋ฐํ๊ฐ์ผ๋ก๋ง ์ฌ์ฉ๋์ด์ผ ํ๋ค. ๋ํ Optional์ ํ๋ผ๋ฏธํฐ๋ก ๋์ด๊ฐ๋ ๋ฑ์ด ์๋๋ผ ๋ฐํ ํ์ ์ผ๋ก์จ ์ ํ์ ์ผ๋ก ์ฌ์ฉ๋๋๋ก ์ค๊ณ๋์๋๋ฐ, ์ด๊ฒ์ ์ด์ด์ง๋ ํฌ์คํ ์์ ์ดํด๋ณด๋๋ก ํ์.3. Optional์ orElse์ orElseGet ์ฐจ์ด ๋ฐ ์์ ์ฝ๋
[ Optional์ orElse์ orElseGet ์ฐจ์ด ๋ฐ ์์ ์ฝ๋ ]
orElse์ orElseGet์ ์ฐจ์ด
Optional API์ ๋จ๋ง ์ฐ์ฐ์๋ orElse์ orElseGet ํจ์๊ฐ ์๋ค. ๋น์ทํด ๋ณด์ด๋ ๋ ํจ์๋ ์์ฒญ๋ ์ฐจ์ด๊ฐ ์๋ค.
- orElse: ํ๋ผ๋ฏธํฐ๋ก ๊ฐ์ ๋ฐ๋๋ค.
- orElseGet: ํ๋ผ๋ฏธํฐ๋ก ํจ์ํ ์ธํฐํ์ด์ค(ํจ์)๋ฅผ ๋ฐ๋๋ค.
์ค์ ๋ก Optional ์ฝ๋๋ฅผ ๋ณด๋ฉด ๋ค์๊ณผ orElse์ orElseGet์ด ๊ฐ๊ฐ ๊ตฌํ๋์ด ์์์ ํ์ธํ ์ ์๋ค.
public final class Optional<T> { ...// ์๋ตpublic T orElse(T other) { return value != null ? value : other; } public T orElseGet(Supplier<? extends T> other) { return value != null ? value : other.get(); } }orElse๋ก๋ ๊ฐ์ด, orElseGet๋ก๋ ํจ์๊ฐ ๋์ด๊ฐ๋ค๋ ๊ฒ์ ์๋นํ ํฐ ์ฐจ์ด๊ฐ ์๋ค. ์ด๋ก ์ธํด ํธ์ถ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง ์ ์๊ธฐ ๋๋ฌธ์ธ๋ฐ, ๊ด๋ จ๋ ๋ด์ฉ์ ์ฝ๋๋ก ์ดํด๋ณด๋๋ก ํ์.
orElse์ orElseGet์ ์ฐจ์ด ์์ ์ฝ๋
์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ ์์ ์ฝ๋๊ฐ ์๋ค๊ณ ํ์. ์ฒซ ๋ฒ์งธ ํจ์๋ ๊ฐ์ด ๋น์ด์์ ๋ orElse๋ฅผ ํธ์ถํ๋๋ก ๋์ด์๊ณ , ๋ ๋ฒ์งธ ํจ์๋ orElseGet์ ํธ์ถํ๋๋ก ๋์ด์๋ค. ๋ฐ๋ก ์๋๋ก ๋ด๋ ค๊ฐ์ง ์๊ณ , ๊ฐ๊ฐ์ ์ํ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ์์ํด๋ณด๋๋ก ํ์.
public void findUserEmailOrElse() { String userEmail = "Empty"; String result = Optional.ofNullable(userEmail) .orElse(getUserEmail()); System.out.println(result); } public void findUserEmailOrElseGet() { String userEmail = "Empty"; String result = Optional.ofNullable(userEmail) .orElseGet(this::getUserEmail); System.out.println(result); } private String getUserEmail() { System.out.println("getUserEmail() Called"); return "[email protected]"; }์์ ํจ์๋ฅผ ๊ฐ๊ฐ ์คํํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์๋ฐ, ์ด๋ฌํ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ ์ด์ ๋ฅผ ์์ธํ ์ดํด๋ณด๋๋ก ํ์.
// 1. orElse์ธ ๊ฒฝ์ฐ getUserEmail() Called Empty // 2. orElseGet์ธ ๊ฒฝ์ฐ Empty๋จผ์ OrElse์ธ ๊ฒฝ์ฐ์๋ ๋ค์๊ณผ ๊ฐ์ ์์๋ก ์ฒ๋ฆฌ๊ฐ ๋๋ค.
- Optional.ofNullable๋ก "EMPTY"๋ฅผ ๊ฐ๋ Optional ๊ฐ์ฒด ์์ฑ
- getUserEmail()๊ฐ ์คํ๋์ด ๋ฐํ๊ฐ์ orElse ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ
- orElse๊ฐ ํธ์ถ๋จ, "EMPTY"๊ฐ Null์ด ์๋๋ฏ๋ก "EMPTY"๋ฅผ ๊ทธ๋๋ก ๊ฐ์ง
์์ ๊ฐ์ด ๋์ํ๋ ์ด์ ๋ Optional.orElse()๊ฐ ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๊ณ , orElse ํ๋ผ๋ฏธํฐ๋ก ๊ฐ์ ๋๊ฒจ์ฃผ๊ธฐ ์ํด getUserEmail()์ด ํธ์ถ๋์๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ง๋ง ํจ์ํ ์ธํฐํ์ด์ค(ํจ์)๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋ orElseGet์์๋ ๋์์ด ๋ฌ๋ผ์ง๋ค.
- Optional.ofNullable๋ก "EMPTY"๋ฅผ ๊ฐ๋ Optional ๊ฐ์ฒด ์์ฑ
- getUserEmail() ํจ์ ์์ฒด๋ฅผ orElseGet ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ
- orElseGet์ด ํธ์ถ๋จ, "EMPTY"๊ฐ Null์ด ์๋๋ฏ๋ก "EMPTY"๋ฅผ ๊ทธ๋๋ก ๊ฐ์ง๋ฉฐย getUserEmail()์ด ํธ์ถ๋์ง ์์
orElseGet์์๋ ํ๋ผ๋ฏธํฐ๋ก ๋์ด๊ฐ ๊ฐ์ธ getUserEmail ํจ์๊ฐ Null์ด ์๋๋ฏ๋ก .get์ ์ํด ํจ์๊ฐ ํธ์ถ๋์ง ์๋๋ค. ๋ง์ฝ Optional์ ๊ฐ์ผ๋ก null์ด ์๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ ํ๋ฆ์ ์ํด orElseGet์ ํ๋ผ๋ฏธํฐ๋ก ๋์ด์จ getUserEmail()์ด ์คํ๋ ๊ฒ์ด๋ค.
public void findUserEmailOrElseGet() { String result = Optional.ofNullable(null) .orElseGet(this::getUserEmail); System.out.println(result); } private String getUserEmail() { System.out.println("getUserEmail() Called"); return "[email protected]"; }- Optional.ofNullable๋ก null๋ฅผ ๊ฐ๋ Optional ๊ฐ์ฒด ์์ฑ
- getUserEmail() ์์ฒด๋ฅผ orElseGet ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ
- orElseGet์ด ํธ์ถ๋จ, ๊ฐ์ด Null์ด๋ฏ๋ก other.get()์ด ํธ์ถ๋์ด getUserEmail()๊ฐ ํธ์ถ๋จ
orElse์ ์ํ ๋ฐ์๊ฐ๋ฅํย ์ฅ์ ย ์์
์์์ ์ดํด๋ณด์๋ฏ orElse์ orElseGet์ ๋ช ํํ๊ณ ์ค์ํ ์ฐจ์ด๊ฐ ์๋๋ฐ, ์ด๋ฅผ ์ ํํ ์ธ์ํ์ง ๋ชปํ๋ฉด ์ฅ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์๋ฅผ ๋ค์ด userEmail์ Uniqueํ ๊ฐ์ผ๋ก ๊ฐ๋ ์์คํ ์์ ์๋์ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ์๋ค๊ณ ํ์.
public void findByUserEmail(String userEmail) { // orElse์ ์ํด userEmail์ด ์ด๋ฏธ ์กด์ฌํด๋ ์ ์ ์์ฑ ํจ์๊ฐ ํธ์ถ๋์ด ์๋ฌ ๋ฐ์return userRepository.findByUserEmail(userEmail) .orElse(createUserWithEmail(userEmail)); } private String createUserWithEmail(String userEmail) { User newUser = new User(userEmail); return userRepository.save(newUser); }์์ ์์ ๋ Optional์ ๋จ๋ง ์ฐ์ฐ์ผ๋กย orElse๋ฅผ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์, ์กฐํ ๊ฒฐ๊ณผ์ ๋ฌด๊ดํ๊ฒย createUserWithEmail ํจ์๊ฐ ๋ฐ๋์ ์คํ๋๋ค. ํ์ง๋ง Database์์๋ userEmail์ด Unique๋ก ์ค์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์์ ๊ฐ์ ๊ฒฝ์ฐ์๋ ๋ค์๊ณผ ๊ฐ์ด ํด๋น ์ฝ๋๋ฅผย orElseGet์ผ๋ก ์์ ํด์ผ ํ๋ค. ์ด๋ ๊ฒ ์ฝ๋๋ฅผ ์์ ํ์๋ค๋ฉด ํ๋ผ๋ฏธํฐ๋ก createUserWithEmail ํจ์ ์์ฒด๊ฐ ๋์ด๊ฐ๋ฏ๋ก, ์กฐํ ๊ฒฐ๊ณผ๊ฐ ์์ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉ์๋ฅผ ์์ฑํ๋ ๋ก์ง์ด ํธ์ถ ๋ ๊ฒ์ด๋ค.
public void findByUserEmail(String userEmail) { // orElseGet์ ์ํด ํ๋ผ๋ฏธํฐ๋ก ํจ์๋ฅผ ๋๊ฒจ์ฃผ๋ฏ๋ก Null์ด ์๋๋ฉด ์ ์ ์์ฑ ํจ์๊ฐ ํธ์ถ๋์ง ์์return userRepository.findByUserEmail(userEmail) .orElseGet(this::createUserWithEmail(userEmail)); } private String createUserWithEmail(String userEmail) { User newUser = new User(userEmail); return userRepository.save(newUser); }์ค์ ์๋น์ค์์ ์์ ๊ฐ์ ์ค๋ฅ๋ฅผ ๋ฒํ๋ค๋ฉด ํฐ ์์คํ ์ฅ์ ๋ก ๋์์ค๊ฒ ๋๋ค. ์ค๋ น ๋ฌธ์ ๊ฐ ์๋ค๊ณ ํ๋๋ผ๋ย orElse๋ ๊ฐ์ ์์ฑํ์ฌ orElseGet๋ณด๋ค ๋น์ฉ์ด ํฌ๋ฏ๋ก ์ต๋ํ ์ฌ์ฉ์ ํผํด์ผ ํ๋ค.ย ๊ทธ๋ฌ๋ฏ๋ก orElse์ orElseGet์ ์ฐจ์ด์ ์ ์ ํํ ์ดํดํ๊ณ ์ฌ์ฉํ๋๋ก ํ์.
orElse์ orElseGet์ ์ฐจ์ด์ ๋ฐ ์ฌ์ฉ๋ฒ ์ ๋ฆฌ
- orElse
- ํ๋ผ๋ฏธํฐ๋ก ๊ฐ์ ํ์๋กํ๋ค.
- ๊ฐ์ด ๋ฏธ๋ฆฌ ์กด์ฌํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค.
- orElseGet
- ํ๋ผ๋ฏธํฐ๋ก ํจ์(ํจ์ํ ์ธํฐํ์ด์ค)๋ฅผ ํ์๋ก ํ๋ค.
- ๊ฐ์ด ๋ฏธ๋ฆฌ ์กด์ฌํ์ง ์๋ ๊ฑฐ์ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์ orElseGet์ ์ฌ์ฉํ๋ฉด ๋๋ค.
Optional์ ์๋นํ ์ ์ฐํ๊ณ Null๋ก๋ถํฐ ์์ ์ ๋ณด์ฅ๋ฐ์ ์ ์์ด์ ์ข์ ๋ณด์ ๋๋ค. ํ์ง๋ง ์๋ชป๋ Optional์ ์ฌ์ฉ์ ์ปค๋ค๋ ๋น์ฉ์ ์๊ตฌํ๋ฉฐ ๋ง์ ๋จ์ ๋ค์ ์ผ๊ธฐํ ์ ์์ต๋๋ค. Java ์ธ์ด์ ์ํคํ ํธ(์ค๊ณ์)์ธ Brian Goetz๋ Optional์ ๋ํด ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ์์ต๋๋ค.
Optional is intended to provide a limited mechanism for library method return types where there needed to be a clear way to represent โno result," and using null for such was overwhelmingly likely to cause errors.- Brian Goetz(Java Architect) -
์ฆ, ์์ ๋ด์ฉ์ ๋งค์ฐ ๊ฐ์ถ๋ฆฌ๋ฉดย Optional์ย ๋ฐํ ํ์ ์ผ๋ก ์ฌ์ฉ๋๋๋ก ๋งค์ฐ ์ ํ์ ์ธ ๊ฒฝ์ฐ๋ก ์ค๊ณ๋์๋ค๋ ๊ฒ์ธ๋ฐ,ย ๋ค์ ํฌ์คํ ์์๋ ์ธ์ Optional์ ์ฌ์ฉํด์ผ ํ๋์ง, ์ด๋ป๊ฒ ์ฌ์ฉํด์ผ ํ๋์ง์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Optional์ถ๊ฐ2
1. ์ธ์ Optional์ ์ฌ์ฉํด์ผ ํ๋๊ฐ?
[ย Optional์ดย ๋ง๋ค์ด์งย ์ด์ ์ย ์๋ย ]
Java8๋ถํฐ Null์ด๋ Null์ด ์๋ ๊ฐ์ ์ ์ฅํ๋ ์ปจํ ์ด๋ ํด๋์ค์ธ Optional์ด ์ถ๊ฐ๋์๋ค. Java ์ธ์ด์ ์ํคํ ํธ(์ค๊ณ์)์ธ Brian Goetz๋ Optional์ ๋ํด ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ์๋ค.
Optional is intended to provide a limited mechanism for library method return types where there needed to be a clear way to represent โno result," and using null for such was overwhelmingly likely to cause errors.- Brian Goetz(Java Architect) -
์์ ๋ด์ฉ์ ์ ๋ฆฌํ๋ฉด Optional์ย null์ ๋ฐํํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋์ ๊ฒฝ์ฐ์ '๊ฒฐ๊ณผ ์์'์ ๋ช ํํ๊ฒ ๋๋ฌ๋ด๊ธฐ ์ํด ๋ฉ์๋์ ๋ฐํ ํ์ ์ผ๋ก ์ฌ์ฉ๋๋๋ก ๋งค์ฐ ์ ํ์ ์ธ ๊ฒฝ์ฐ๋ก ์ค๊ณ๋์๋ค๋ ๊ฒ์ด๋ค. ์ด๋ฌํ ์ค๊ณ ๋ชฉ์ ์ ๋ถํฉํ๊ฒ ์ค์ ๋ก Optional์ ์๋ชป ์ฌ์ฉํ๋ฉด ๋ง์ ๋ถ์์ฉ(Side Effect)์ด ๋ฐ์ํ๊ฒ ๋๋๋ฐ, ์ด๋ ํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋์ง ์์ธํ ์ดํด๋ณด๋๋ก ํ์.
[ Optional์ด ์ํํ ์ด์ , Optional์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํด์ผ ํ๋ ์ด์ ]
Optional์ ์ฌ์ฉํ๋ฉด ์ฝ๋๊ฐ Null-Safeํด์ง๊ณ , ๊ฐ๋ ์ฑ์ด ์ข์์ง๋ฉฐ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์ ์ ์ด ๋๋ค๋ ๋ฑ๊ณผ ๊ฐ์ ์๊ธฐ๋ค์ ๋ง์ด ์ ํ ์ ์๋ค. ํ์ง๋ง ์ด๋ Optional์ ๋ชฉ์ ์ ๋ง๊ฒ ์ฌ๋ฐ๋ฅด๊ฒย ์ฌ์ฉํ์ ๋์ ์ด์ผ๊ธฐ์ด๊ณ , Optional์ ๋จ๋ฐํ๋ ์ฝ๋๋ ์คํ๋ ค ๋ค์๊ณผ ๊ฐ์ ๋ถ์์ฉ(Side-Effect)๋ฅผ ์ ๋ฐํ ์ ์๋ค.
- NullPointerException ๋์ NoSuchElementException๊ฐ ๋ฐ์ํจ
- ์ด์ ์๋ ์์๋ ์๋ก์ด ๋ฌธ์ ๋ค์ด ๋ฐ์ํจ
- ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋จ์ด๋จ๋ฆผ
- ์๊ฐ์ , ๊ณต๊ฐ์ ๋น์ฉ(๋๋ ์ค๋ฒํค๋)์ด ์ฆ๊ฐํจ
NullPointerException ๋์ NoSuchElementException๊ฐ ๋ฐ์ํจ
๋ง์ฝ Optional๋ก ๋ฐ์ ๋ณ์๋ฅผ ๊ฐ์ด ์๋์ง ํ๋จํ์ง ์๊ณ ์ ๊ทผํ๋ ค๊ณ ํ๋ค๋ฉด NoSuchElementException๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
Optional<User> optionalUser = ... ; // optional์ด ๊ฐ๋ value๊ฐ ์์ผ๋ฉด NoSuchElementException ๋ฐ์ User user = optionalUser.get();Null-Safeํ๊ธฐ ์ํด Optional์ ์ฌ์ฉํ์๋๋ฐ, ๊ฐ์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ๋จํ์ง ์๊ณ ์ ๊ทผํ๋ค๋ฉด NullPointerException๋ ํผํด๋ NoSuchElementException๊ฐ ๋ฐ์ํ ์ ์๋ค.
์ด์ ์๋ ์์๋ ์๋ก์ด ๋ฌธ์ ๋ค์ด ๋ฐ์ํจ
Optional์ ์ฌ์ฉํ๋ฉด ๋ฌธ์ ๊ฐ ๋๋ ๋ํ์ ์ธ ๊ฒฝ์ฐ๊ฐ ์ง๋ ฌํ(Serialize)๋ฅผ ํ ๋์ด๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก Optional์ ์ง๋ ฌํ๋ฅผ ์ง์ํ์ง ์์์ ์บ์๋ ๋ฉ์ธ์งํ ๋ฑ๊ณผ ์ฐ๋ํ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. Optional์ ์ฌ์ฉํจ์ผ๋ก์จ ์คํ๋ ค ์๋ก์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ ๊ฒ์ด๋ค.
public class User implements Serializable { private Optional<String> name; }๋ฌผ๋ก Jackson์ฒ๋ผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ Optional์ด ์์ ๊ฒฝ์ฐ ๊ฐ์ wrap, unwrap ํ๋๋ก ์ง์ํด์ฃผ๊ธฐ๋ ํ์ง๋ง ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์คํ์ ํ์ ํด์ผํ๋ค๋ ์ ๋ฑ์์ ์คํ๋ ค ๋ถํธํจ์ ๋๋ ์ ์๋ค.
์ฐธ๊ณ ๋ก Jackson ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ jackson-modules-java8 project ํ๋ก์ ํธ๋ถํฐ Optional์ ์ง์ํ์ฌ, empty์ผ ๊ฒฝ์ฐ์๋ null์ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ์๋ ๊ฐ์ ๊บผ๋ด์ ์ฒ๋ฆฌํ๋๋ก ์ง์ํ๊ณ ์๋ค. ๋ํย Cacheable, CacheEvict, CachePut๊ณผ ๊ฐ์ย Spring์ ์บ์ ์ถ์ํ ๊ธฐ์ ๋ค์ Spring4๋ถํฐ ์ด๋ฌํ wrap, unwrap์ ์ง์ํ๊ณ ์๋ค.
์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋จ์ด๋จ๋ฆผ
์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ด Optional์ ๋ฐ์์ ๊ฐ์ ๊บผ๋ธ๋ค๊ณ ํ์. ์ฐ๋ฆฌ๋ ์์์ ์ดํด๋ณธ๋๋ก optionalUser์ ๊ฐ์ด ๋น์ด์์ผ๋ฉด NoSuchElementException๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด ๊ฐ์ ์ ๋ฌด๋ฅผ ๊ฒ์ฌํ๊ณ ๊บผ๋ด๋๋ก ์ฝ๋๋ฅผ ์์ฑํ์๋ค.
public void temp(Optional<User> optionalUser) { User user = optionalUser.orElseThrow(IllegalStateException::new); // ์ดํ์ ํ์ฒ๋ฆฌ ์์ ์งํ... }๊ทธ๋ฐ๋ฐ ์์ ๊ฐ์ ์ฝ๋๋ ๋ ๋ค์ NPE๋ฅผ ์ ๋ฐํ ์ ์๋ค. ์๋ํ๋ฉด optionalUser ๊ฐ์ฒด ์์ฒด๊ฐ null์ผ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฌ๋ฉด ์ฐ๋ฆฌ๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ ํด์ผ ํ๋ค.
public void temp(Optional<User> optionalUser) { if (optionalUser != null && optionalUser.isPresent()) { // ์ดํ์ ํ์ฒ๋ฆฌ ์์ ์งํ... } throw new IllegalStateException(); }์ด๋ฌํ ์ฝ๋๋ ์คํ๋ ค ๊ฐ์ ์ ๋ฌด๋ฅผ 2๋ฒ ๊ฒ์ฌํ๊ฒ ํ์ฌ ๋จ์ํ null์ ์ฌ์ฉํ์ ๋๋ณด๋ค ์ฝ๋๊ฐ ๋ณต์กํด์ก๋ค. ๊ทธ ์ธ์๋ Optional์ ์ ๋ค๋ฆญ ํ์ ๋๋ฌธ์๋ ๋ถํ์ํ๊ฒ ์ฝ๋ ๊ธ์์๊น์ง ๋์ด๋ฌ๋ค. ์ด๋ ๋ฏ Optional์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ์ง ๋ชปํ๊ณ ๋จ์ฉํ๋ฉด ์คํ๋ ค ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง ์ ์๋ค.
์๊ฐ์ , ๊ณต๊ฐ์ ๋น์ฉ(๋๋ ์ค๋ฒํค๋)์ด ์ฆ๊ฐํจ
- ๊ณต๊ฐ์ ๋น์ฉ: Optional์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ธ๋ ์ปจํ ์ด๋์ด๋ฏ๋ก Optional ๊ฐ์ฒด ์์ฒด๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ถ๊ฐ๋ก ํ์ํ๋ค.
- ์๊ฐ์ ๋น์ฉ: Optional ์์ ์๋ ๊ฐ์ฒด๋ฅผ ์ป๊ธฐ ์ํด์๋ Optional ๊ฐ์ฒด๋ฅผ ํตํด ์ ๊ทผํด์ผ ํ๋ฏ๋ก ์ ๊ทผ ๋น์ฉ์ด ์ฆ๊ฐํ๋ค.
์ด๋ค ๊ธ์์๋ Optional์ ์ฌ์ฉํ๋ฉด ๋จ์ ๊ฐ์ ์ฌ์ฉํ์ ๋๋ณด๋ค ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด 4๋ฐฐ ์ ๋ ์ฆ๊ฐํ๋ค๊ณ ํ๋ค. ๊ทธ ์ธ์๋ Optional์ Serializable ํ์ง ์๋ ๋ฑ์ ๋ฌธ์ ๊ฐ ์์ผ๋ฏ๋ก ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ถ๊ฐ์ ์ธ ๊ฐ๋ฐ ์๊ฐ์ด ์์๋ ์ ์๋ค.
ํ์ง๋ง ์์์ ์ค๋ช ํ ์์๋ค์ ๋๋ถ๋ถ์ Optional์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ์ง ์์๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ ๊ฒ์ด๋ค. Optional์ ๋ง๋ค์ด์ง ์๋๊ฐ ์๋นํ ๋ช ํํ ๋งํผ ๋ชฉ์ ์ ๋ง๊ฒ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉ๋์ด์ผ ํ๋ค. ์๋์์๋ ์ฌ๋ฐ๋ฅธ Optional ์ฌ์ฉ์ ์ํ ๊ฐ์ด๋๋ฅผ ์๊ฐํ๋ค.
2. ์ฌ๋ฐ๋ฅธ Optional ์ฌ์ฉ๋ฒ ๊ฐ์ด๋
[ ์ฌ๋ฐ๋ฅธ Optional ์ฌ์ฉ๋ฒ ๊ฐ์ด๋ ]
- Optional ๋ณ์์ Null์ ํ ๋นํ์ง ๋ง์๋ผ
- ๊ฐ์ด ์์ ๋ Optional.orElseX()๋ก ๊ธฐ๋ณธ ๊ฐ์ ๋ฐํํ๋ผ
- ๋จ์ํย ๊ฐ์ย ์ป์ผ๋ ค๋ย ๋ชฉ์ ์ผ๋ก๋งย Optional์ย ์ฌ์ฉํ์งย ๋ง๋ผ
- ์์ฑ์, ์์ ์, ๋ฉ์๋ ํ๋ผ๋ฏธํฐ ๋ฑ์ผ๋ก Optional์ ๋๊ธฐ์ง ๋ง๋ผ
- Collection์ ๊ฒฝ์ฐ Optional์ด ์๋ ๋น Collection์ ์ฌ์ฉํ๋ผ
- ๋ฐํ ํ์ ์ผ๋ก๋ง ์ฌ์ฉํ๋ผ
Optional ๋ณ์์ Null์ ํ ๋นํ์ง ๋ง์๋ผ
Optional์ ์ปจํ ์ด๋/๋ฐ์ฑ ํด๋์ค์ผ ๋ฟ์ด๋ฉฐ, Optional ๋ณ์์ null์ ํ ๋นํ๋ ๊ฒ์ Optional ๋ณ์ ์์ฒด๊ฐ null์ธ์ง ๋ ๊ฒ์ฌํด์ผ ํ๋ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๊ฐ์ด ์๋ ๊ฒฝ์ฐ๋ผ๋ฉด Optional.empty()๋ก ์ด๊ธฐํํ๋๋ก ํ์.
// AVOIDpublic Optional<Cart> fetchCart() { Optional<Cart> emptyCart = null; ... }๊ฐ์ด ์์ ๋ Optional.orElseX()๋ก ๊ธฐ๋ณธ ๊ฐ์ ๋ฐํํ๋ผ
Optional์ ์ฅ์ ์ค ํ๋๋ ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ํตํด ๊ฐ๋ ์ฑ์ข๊ณ ์ ์ฐํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค๋ ๊ฒ์ด๋ค. ๊ฐ๊ธ์ ์ด๋ฉด isPresent()๋ก ๊ฒ์ฌํ๊ณ get()์ผ๋ก ๊ฐ์ ๊บผ๋ด๊ธฐ ๋ณด๋ค๋ orElseGet ๋ฑ์ ํ์ฉํด ์ฒ๋ฆฌํ๋๋ก ํ์.
private String findDefaultName() { return ...; } // AVOIDpublic String findUserName(long id) { Optional<String> optionalName = ... ; if (optionalName.isPresent()) { return optionalName.get(); } else { return findDefaultName(); } } // PREFERpublic String findUserName(long id) { Optional<String> optionalName = ... ; return optionalName.orElseGet(this::findDefaultName); }orElseGet์ ๊ฐ์ด ์ค๋น๋์ด ์์ง ์์ ๊ฒฝ์ฐ, orElse๋ ๊ฐ์ด ์ค๋น๋์ด ์๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ฉด ๋๋ค. ๋ง์ฝ null์ ๋ฐํํด์ผ ํ๋ ๊ฒฝ์ฐ๋ผ๋ฉด orElse(null)์ ํ์ฉํ๋๋ก ํ์. ๋ง์ฝ ๊ฐ์ด ์์ด์ throwํด์ผํ๋ ๊ฒฝ์ฐ๋ผ๋ฉด orElseThrow๋ฅผ ์ฌ์ฉํ๋ฉด ๋๊ณ ๊ทธ ์ธ์๋ ๋ค์ํ ๋ฉ์๋๋ค์ด ์์ผ๋ ์ ๋นํ ํ์ฉํ๋ฉด ๋๋ค.
์ถ๊ฐ์ ์ผ๋ก Java9 ๋ถํฐ๋ ifPresentOrElse๋ ์ง์ํ๊ณ ์์ผ๋ฉฐ, Java 10๋ถํฐ๋ orElseThrow()์ ๊ธฐ๋ณธ์ผ๋ก NoSuchElementException()๋ฅผ ๋์ง ์ ์๋ค. ๋ง์ฝ Java8์ด๋ 9๋ฅผ ์ฌ์ฉ์ค์ด๋ผ๋ฉด ๋ช ์์ ์ผ๋ก ๋๊ฒจ์ฃผ๋ฉด ๋๋ค.
๋จ์ํ ๊ฐ์ ์ป์ผ๋ ค๋ ๋ชฉ์ ์ผ๋ก๋ง Optional์ ์ฌ์ฉํ์ง ๋ง๋ผ
๋จ์ํ ๊ฐ์ ์ป์ผ๋ ค๊ณ Optional์ ์ฌ์ฉํ๋ ๊ฒ์ Optional์ ๋จ์ฉํ๋ ๋ํ์ ์ธ ๊ฒฝ์ฐ์ด๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ์๋ ๊ตณ์ด Optional์ ์ฌ์ฉํด ๋น์ฉ์ ๋ญ๋นํ๋ ๊ฒ ๋ณด๋ค๋ ์ง์ ๊ฐ์ ๋ค๋ฃจ๋ ๊ฒ์ด ์ข๋ค.
// AVOIDpublic String findUserName(long id) { String name = ... ; return Optional.ofNullable(name).orElse("Default"); } // PREFERpublic String findUserName(long id) { String name = ... ; return name == null ? "Default" : name; }์์ฑ์, ์์ ์, ๋ฉ์๋ ํ๋ผ๋ฏธํฐ ๋ฑ์ผ๋ก Optional์ ๋๊ธฐ์ง ๋ง๋ผ
Optional์ ํ๋ผ๋ฏธํฐ๋ก ๋๊ธฐ๋ ๊ฒ์ ์๋นํ ์๋ฏธ์๋ ํ๋์ด๋ค. ์๋ํ๋ฉด ๋๊ฒจ์จ ํ๋ผ๋ฏธํฐ๋ฅผ ์ํด ์์ฒด null์ฒดํฌ๋ ์ถ๊ฐ๋ก ํด์ฃผ์ด์ผ ํ๊ณ , ์ฝ๋๋ ๋ณต์กํด์ง๋ ๋ฑ ์๋นํ ๋ฒ๊ฑฐ๋ก์์ง๊ธฐ ๋๋ฌธ์ด๋ค. Optional์ ๋ฐํ ํ์ ์ผ๋ก ๋์ฒด ๋์์ ์ฌ์ฉํ๊ธฐ ์ํด ๊ณ ์๋ ๊ฒ์์ ๋ช ์ฌํด์ผ ํ๋ฉฐ, ์์ ์ค๋ช ํ๋๋ก Serializable์ ๊ตฌํํ์ง ์์ผ๋ฏ๋ก ํ๋ ๊ฐ์ผ๋ก ์ฌ์ฉํ์ง ์์์ผ ํ๋ค.
// AVOIDpublic class User { private final String name; private final Optional<String> postcode; public Customer(String name, Optional<String> postcode) { this.name = Objects.requireNonNull(name, () -> "Cannot be null"); this.postcode = postcode; } public Optional<String> getName() { return Optional.ofNullable(name); } public Optional<String> getPostcode() { return postcode; } }Optional์ ์ ๊ทผ์์ ์ ์ฉํ๋ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค. ์์ ์์์์ name์ ์ป๊ธฐ ์ํด Optional.ofNullable()๋ก ๋ฐํํ๊ณ ์๋๋ฐ, Brian Goetz๋ Getter์ Optional์ ์น์ด ๋ฐํํ๋ ๊ฒ์ ๋๊ณ ๋จ์ฉํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ธฐํ์๋ค.
I think routinely using it as a return value for getters would definitely be over-use.- Brian Goetz(Java Architect) -
Collection์ ๊ฒฝ์ฐ Optional์ด ์๋ ๋น Collection์ ์ฌ์ฉํ๋ผ
Collection์ ๊ฒฝ์ฐ ๊ตณ์ด Optional๋ก ๊ฐ์ ํ์๊ฐ ์๋ค. ์คํ๋ ค ๋น Collection์ ์ฌ์ฉํ๋ ๊ฒ์ด ๊น๋ํ๊ณ , ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ณ๋ค.
// AVOIDpublic Optional<List<User>> getUserList() { List<User> userList = ...;// null์ด ์ฌ ์ ์์return Optional.ofNullable(items); } // PREFERpublic List<User> getUserList() { List<User> userList = ...;// null์ด ์ฌ ์ ์์return items == null ? Collections.emptyList() : userList; }์๋์ ๊ฒฝ์ฐ๋ ์ฌ์ฉ์ ํผํด์ผ ํ๋ ์ผ์ด์ค์ด๋ค. Optional์ ๋น์ธ๊ธฐ ๋๋ฌธ์ ์ต๋ํ ์ฌ์ฉ์ ์ง์ํด์ผ ํ๋ค. ์๋์ ์ผ์ด์ค๋ผ๋ฉด map์ getOrDefault ๋ฉ์๋๊ฐ ์์ผ๋ ์ด๊ฑธ ํ์ฉํ๋ ๊ฒ์ด ํจ์ฌ ์ข๋ค.
// AVOIDpublic Map<String, Optional<String>> getUserNameMap() { Map<String, Optional<String>> items = new HashMap<>(); items.put("I1", Optional.ofNullable(...)); items.put("I2", Optional.ofNullable(...)); Optional<String> item = items.get("I1"); if (item == null) { return "Default Name" } else { return item.orElse("Default Name"); } } // PREFERpublic Map<String, String> getUserNameMap() { Map<String, String> items = new HashMap<>(); items.put("I1", ...); items.put("I2", ...); return items.getOrDefault("I1", "Default Name"); }๋ฐํ ํ์ ์ผ๋ก๋ง ์ฌ์ฉํ๋ผ
Optional์ย ๋ฐํ ํ์ ์ผ๋ก์จ ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์๋ ๊ฒฝ์ฐ์ ๊ฒฐ๊ณผ ์์์ ๋ช ํํ ๋๋ฌ๋ด๊ธฐ ์ํดย ๋ง๋ค์ด์ก์ผ๋ฉฐ,ย Stream API์ ๊ฒฐํฉ๋์ด ์ ์ฐํ ์ฒด์ด๋ api๋ฅผ ๋ง๋ค๊ธฐ ์ํด ํ์ํ ๊ฒ์ด๋ค.ย ์๋ฅผ ๋ค์ด Stream API์ findFirst()๋ findAny()๋ก ๊ฐ์ ์ฐพ๋ ๊ฒฝ์ฐ์ ์ด๋ค ๊ฒ์ ๋ฐํํ๋๊ฒ ํฉ๋ฆฌ์ ์ผ์ง Java ์ธ์ด๋ฅผ ์ค๊ณํ๋ ์ฌ๋์ด ๋์ด ๊ณ ๋ฏผํด๋ณด์. ์ธ์ด๋ฅผ ๋ง๋๋ ์ฌ๋์ ์ ์ฅ์์๋ Null์ ๋ฐํํ๋ ๊ฒ๋ณด๋ค ๊ฐ์ ์ ๋ฌด๋ฅผ ๋ํ๋ด๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ ๊ฒ์ด๋ค. Java ์ธ์ด ์ค๊ณ์๋ค์ ์ด๋ฌํ ๊ณ ๋ฏผ ๋์ Optional์ ๋ง๋ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ฏ๋ก Optional์ด ์ค๊ณ๋ ๋ชฉ์ ์ ๋ง๊ฒ ๋ฐํ ํ์ ์ผ๋ก๋ง ์ฌ์ฉ๋์ด์ผ ํ๋ค.
Optional์ ์๋ชป ์ฌ์ฉํ๋ ๊ฒ์ ๋น์ฉ์ ์ฆ๊ฐ์ํค๋ ๋ฐ๋ฉด์ ์ฝ๋ ํ์ง์ ์คํ๋ ค ์ ํ์ํจ๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์์์ ์ ๋ฆฌํ ๊ท์น์ ์ค์ํ๋ฉฐ ์ฌ๋ฐ๋ฅธ ๋ฐฉ์์ผ๋ก Optional์ ์ฌ์ฉํ๋๋ก ํ์.
Arraysํด๋์ค
- Arraysํด๋์ค๋ ํญ๋ชฉ์ ๋ ฌ,ํญ๋ชฉ๊ฒ์,ํญ๋ชฉ๋น๊ต์๊ฐ์ ๋ฉ์๋ ์ ๊ณต
- ๋ชจ๋ ๋ฉ์๋๋ static๋ฉ์๋๋ก,Arraysํด๋์ค๋ก ๋ฐ๋ก ์ฌ์ฉ๊ฐ๋ฅ
๋ฐฐ์ด ๋ณต์ฌ
๋ฐฐ์ด ๋ณต์ฌ๋ฅผ ์ํด ๋จ์ํ๊ฒ
System.arraycopy(int[] src, int srcPos, int[] dest, int destPos, int length);// (์๋ณธ๋ฐฐ์ด, ์๋ณธ์์์ธ๋ฑ์ค, ํ๊ฒ๋ฐฐ์ด, ํ๊ฒ์์์ธ๋ฑ์ค, ๋ณต์ฌ๊ฐ์)๋ฉ์๋๋ฅผ ์ด์ฉํ ์ ์๋ค
์ด ์ด์ธ์๋ Arrays ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ๋ณต์ฌํ ์ ์๋ค
char[] arr2 = Arrays.copyOf(arr1, arr1.length);// arr1 ๋ฐฐ์ด arr1.length ๋งํผ์ arr2๋ก ๋ณต์ฌchar[] arr3 = Arrays.copyOfRange(arr1, 1, 3);// arr1[1] ~ arr1[2] ๋ฅผ arr3[0] ~ arr3[1] ๋ก ๋ณต์ฌ// 1~3์์ ๋ ์ธ๋ฑ์ค๋ ํฌํจ๋์ง ์๋๋ค๋ฐฐ์ด ํญ๋ชฉ ์ ๋ ฌ
Arrays.sort(arr);๊ธฐ๋ณธ ํ์ ย ๋๋ย Stringย ๋ฐฐ์ด์
์์ ๊ฐ์ด arr ๋ฐฐ์ด์ย ์ฌ์ ์(์ค๋ฆ์ฐจ์)์ผ๋ก ์ ๋ ฌํ ์ ์๋ค
๋ง์ฝ ์ฌ์ฉ์ ์ ์ ํด๋์ค ํ์ ์ด๋ผ๋ฉด, Comparable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ ์์ด์ผ ํ๋ค (implements)
๋ค์๊ณผ ๊ฐ์ด Member ย ํด๋์ค๋ฅผ ์์ฑํด๋ณด์
// Member ํ์ ๋ง ๋น๊ตํ๊ธฐ ์ํด ์ ๋ค๋ฆญ <> ์ฌ์ฉclass Member implements Comparable<Member> { String name; Member(String name) this.name = name; @Override int compareTo(Memeber m) return name.compareTo(m.name);// ๋ด๋ฆผ์ฐจ์์ผ ๋๋ *(-1) ๋ฅผ ํ์ฌ -1, 0, 1๋ฅผ ๊ตฌ๋ถํ๋ค}public class Example { public static void main(String[] args) { Member m1 = new Member("aa"); Member m2 = new Member("bb"); Member m3 = new Member("cc"); Member[] members = {m1, m2, m3}; Arrays.sort(members); }}๋ฐฐ์ด ํญ๋ชฉย ๊ฒ์
Arrays.sort() ๋ฉ์๋๋ก ์ ๋ ฌ์ ํ ํ์,
Arrays.binarySearch()ย ๋ฉ์๋๋ก ์ํ๋ ํญ๋ชฉ์ ์ธ๋ฑ์ค ๊ฐ์ ์ฐพ์ ์ ์๋ค
( ์ ๋ ฌ์ ํ์ง ์์ ํ์ binarySearch() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, ์๋ ํญ๋ชฉ์ ์ฐพ์ผ๋ฉดย ์์๊ฐ์ด ๋ฆฌํด๋๋ค
๋์ค์ ๊ธฐํ๊ฐ ๋๋ฉด ๋ฆฌํด๋๋ ์์๊ฐ์ ์ข ๋ ์์๋ณด์ )
// Member[] members = {"aa", "bb", "cc"}; ์ผ ๋Arrays.sort(members);int idx = Arrays.binarySearch(members, "bb");// idx == 1๋ฐฐ์ด ๋์ผ ํญ๋ชฉ ์ฑ์ฐ๊ธฐ
fill() ๋ฉ์๋๋ก ๋ฐฐ์ด์ ๋์ผํ ๊ฐ์ ์ ์ฅํ ์ ์๋ค
void fill(๋ฐฐ์ด, ๊ฐ)void fill(๋ฐฐ์ด, ์์์ธ๋ฑ์ค, ๋์ธ๋ฑ์ค, ๊ฐ)
StringBuilder
StringBuilderย (java.lang.StringBuilder)
- ์์ฑ์
- StringBuilderย sbย =ย newย StringBuilder(): ๊ฐ์ฒด ์ ์ธ
- StringBuilderย sbย =ย newย StringBuilder("aaa"): ๋ฌธ์์ด์ ๋ฐ๋ก ๋ฃ์ ์๋ ์๋ค.
- ์ฃผ์ ๋ฉ์๋
- .append(): ๋ฌธ์์ด์ ์ถ๊ฐํ๋ค. (sb.append("bbb"),ย sb.append(4))
- .insert(int offset, String str): offset ์์น์ str์ ์ถ๊ฐํ๋ค. (sb.insert(2,ย "ccc"))
- .replace(): ์ฒซ๋ฒ์งธ์ ๋๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋ ์ซ์ ์ธ๋ฑ์ค์ ์์นํ ๋ฌธ์์ด์ ๋์ฒดํ๋ค. (.replace(3,ย 6,ย "ye"))
- .substring(int start, (int end)):ย ์ธ๋ฑ์ฑ. ํ๋ผ๋ฏธํฐ๊ฐ ํ๋๋ผ๋ฉด ํด๋น ์ธ๋ฑ์ค๋ถํฐ ๋๊น์ง, ๋๊ฐ๋ผ๋ฉด ์์์ ๊ณผ ๋์ -1 ๊น์ง ์ธ๋ฑ์ฑ (sb.substring(5),ย sb.substring(3,ย 7))
- .deleteCharAt(int index): ์ธ๋ฑ์ค์ ์์นํ ๋ฌธ์ ํ๋๋ฅผ ์ญ์ ํ๋ค. (sb.deleteCharAt(3))
- .delete(int start, int end): start ๋ถํฐ end-1 ๊น์ง์ ๋ฌธ์๋ฅผ ์ญ์ ํ๋ค. (sb.delete(3,ย sb.length()))
- .toString(): String์ผ๋ก ๋ณํํ๋ค. (sb.toString())
- .reverse(): ํด๋น ๋ฌธ์ ์ ์ฒด๋ฅผ ๋ค์ง๋๋ค. (sb.reverse())
- .setCharAt(int index, String s): index ์์น์ ๋ฌธ์๋ฅผ s๋ก ๋ณ๊ฒฝ
- .setLength(int len): ๋ฌธ์์ด ๊ธธ์ด ์กฐ์ ,ย ํ์ฌ ๋ฌธ์์ด๋ณด๋ค ๊ธธ๊ฒ ์กฐ์ ํ๋ฉด ๊ณต๋ฐฑ์ผ๋ก ์ฑ์์ง,ย ํ์ฌ ๋ฌธ์์ด๋ณด๋ค ์งง๊ฒ ์กฐ์ ํ๋ฉด ๋๋จธ์ง ๋ฌธ์๋ ์ญ์
- .trimToSize():ย ๋ฌธ์์ด์ด ์ ์ฅ๋ char[] ๋ฐฐ์ด ์ฌ์ด์ฆ๋ฅผ ํ์ฌ ๋ฌธ์์ด ๊ธธ์ด์ ๋์ผํ๊ฒ ์กฐ์ ,ย String ํด๋์ค์ trim()์ด ์ ๋ค ๊ณต๋ฐฑ์ ์ ๊ฑฐํ๋ ๊ฒ๊ณผ ๊ฐ์ด ๊ณต๋ฐฑ ์ฌ์ด์ฆ๋ฅผ ์ ๊ณตํ๋ ๊ฒ,ย ๋ฐฐ์ด์ ๋จ๋ ์ฌ์ด์ฆ๋ ๊ณต๋ฐฑ์ด๋ฏ๋ก, ๋ฌธ์์ด ๋ท๋ถ๋ถ์ ๊ณต๋ฐฑ์ ๋ชจ๋ ์ ๊ฑฐํด์ค๋ค๊ณ ๋ณด๋ฉด ๋จ
import java.lang.StringBuilder; publicclasssb { publicstaticvoidmain(String[] args)throws IOException{ StringBuilder sb =new StringBuilder("aaa"); // ๋ฌธ์์ด ์ถ๊ฐ System.out.println(sb.append("bbb")); // aaabbb System.out.println(sb.append(4)); // aaabbb4 // ๋ฌธ์์ด ์ฝ์ System.out.println(sb.insert(2, "ccc")); // aacccabbb4 // ๋ฌธ์์ด ์นํ, ๋ฌธ์์ด ๊ต์ฒด System.out.println(sb.replace(3, 6, "ye")); // aacyebbb4 // ์ธ๋ฑ์ฑ, ๋ฌธ์์ด ์๋ฅด๊ธฐ System.out.println(sb.substring(5)); // bbb4 System.out.println(sb.substring(3, 7)); // yebb // ๋ฌธ์ ์ญ์ System.out.println(sb.deleteCharAt(3)); // aacebbb4 // ๋ฌธ์์ด ์ญ์ System.out.println(sb.delete(3, sb.length())); // aac // ๋ฌธ์์ด ๋ณํ System.out.println(sb.toString()); // aac // ๋ฌธ์์ด ๋ค์ง๊ธฐ System.out.println(sb.reverse()); // caa // ๋ฌธ์ ๋์ฒด, ๋ฌธ์ ๊ต์ฒด, ๋ฌธ์ ์นํ sb.setCharAt(1, 'b'); System.out.println(sb); // cba // ๋ฌธ์์ด ๊ธธ์ด ์กฐ์ sb.setLength(2); System.out.println(sb); // cb } }- ์์ฑ์
repeat๋ฉ์๋
// String ๋ฉ์๋๋ก ๋ฌธ์์ด์ ํ๋ผ๋ฏธํฐ์ ์ฃผ์ด์ง ํ์๋งํผ ๋ฐ๋ณต // ํ๋ผ๋ฏธํฐ๊ฐ์ 0์ผ๋ก ์ง์ ํ๋ฉด ๋น๋ฌธ์์ด ๋ฐํ // ์์๋ก ์ง์ ํ๋ฉด IllegalArgumentExceptionthrow ์๋ฌ๋ฅผ ๋ฐํ // 1๋ก ์ง์ ํ๋ฉด ๋ฌธ์์ด ๊ทธ๋๋ ๋ฐํ // ๋ด๋ถ์ ์ผ๋ก Arrays.fill()๋ฐ System.arraycopy()๋ฉ์๋ ํธ์ถํ์ฌ ์๋ก์ด ๋ฌธ์์ด ์์ฑ // ๋ฌธ์์ด.repeat(๋ช๋ฒ๋ฐ๋ณตํ ์ง์ ์)
toString ๊ณผ String.valueOf()์ฐจ์ด์
String.valueOf() - ํ๋ผ๋ฏธํฐ๊ฐ null์ด๋ฉด ๋ฌธ์์ด "null"์ ๋ง๋ค์ด์ ๋ฐํํ๋ค. toString() - ๋์ ๊ฐ์ด null์ด๋ฉด NPE๋ฅผ ๋ฐ์์ํค๊ณ Object์ ๋ด๊ธด ๊ฐ์ด String์ด ์๋์ฌ๋ ์ถ๋ ฅํ๋ค. valueOf์ null์ฒดํฌ ๋ฐฉ๋ฒ์ "null".equals(string) ํํ๋ก ์ฒดํฌ๋ฅผ ํด์ผํ๋ค.
Comparator Comparable
// ๋๊ฐ๋ค ์ธํฐํ์ด์ค๋ก ๊ฐ์ฒด๋ฅผ ๋น๊ตํ ์ ์๋๊ณ ๋ง๋ค๊ฒํ๊ณ , ์ฌ์ฉํ ๋ ค๋ฉด ์ธํฐํ์ด์ค๋ ์ ์ธ๋ ๋ฉ์๋๋ฅผ ๋ฐ๋์ ๊ตฌํํด์ผํ๋ค // ๊ฐ์ฒด๋ ์ ๋ ฌ ๊ธฐ์ค์ด ์๋ค public interface Comparator<T> { int compare(T o1, T o2); // ์ฒซ๋ฒ์งธ ๊ฐ์ด ํฌ๋ฉด ์์, ๋๋ฒ์งธ ๊ฐ์ด ํฌ๋ฉด ์์, ๊ฐ์ผ๋ฉด 0 ๋ฐํ } public interface Comparable<T> { public int compareTo(T o); // ๋ฐํ๊ฐ์ int์ด์ง๋ง ๋ ๊ฐ์ฒด๊ฐ ๊ฐ์ผ๋ฉด 0, ๋น๊ตํ๋ ๊ฐ๋ณด๋ค ํฌ๋ฉด ์์ ์์ผ๋ฉด ์์ ๋ฐํ } // Comparable: ๊ธฐ๋ณธ ์ ๋ ฌ๊ธฐ์ค์ ๊ตฌํํ๋๋ฐ ์ฌ์ฉ // Comparator: ๊ธฐ๋ณธ ์ ๋ ฌ ๊ธฐ์ค ์ธ์ ๋ค๋ฅธ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๊ณ ์ ํ ๋ ์ฌ์ฉComparable
- ์ปฌ๋ ์ ์ ์ ๋ ฌ ์กฐ๊ฑด์ ์ ๋ ฌ ํ๊ณ ์ ํ๋ ๊ฐ์ฒด ๋ด๋ถ์ ์ ์ ํ ์ ์๊ฒ ํด์ค๋ค
package t1; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; public class Test { public static void main(String[] args) { List<Student1> list = Arrays.asList( new Student1("์๋ผ๋น๋ ธ",80,70), new Student1("๊ฐ๋ค์จ",45,100), new Student1("๊น์ฌ์ฐ",90,90) ); Collections.sort(list); // ์๋์ ์ ๋ ฌ๊ธฐ์ค์ ๋ง๋ค์ง ์๊ณ ๊ทธ๋ฅ sortํ๋ฉด // ์ ๋ ฌ๊ธฐ์ค์ด ์์ด์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค for(Student1 s : list){ System.out.println(s.getName() + s.getMath()); } } } class Student1 implements Comparable<Student1>{ private int english; private int math; private String name; public Student1(String name, int english, int math){ this.name = name; this.english = english; this.math = math; } public int getEnglish(){ return english; } public void setEnglish(int english){ this.english = english; } public int getMath(){ return math; } public void setMath(int math){ this.math = math; } public String getName(){ return name; } public void setName(){ this.name = name; } @Override public int compareTo(Student1 o) { // System.out.println("์ผ๋จ this.math : " + this.math); // System.out.println("๊ทธ๋ฆฌ๊ณ ๋ฐ์์จ ๋งค๊ฐ๋ณ์ ์ํ์ ์ : "+o.getMath()); // ์๋ถ๋ถ์ Collections.sort()๋ฉ์๋์ ๊ธฐ์ค์ ๋ง๋ค๊ธฐ ์ํ ๋ถ๋ถ return this.math - o.getMath(); } }Compartor
- ๋ ๋งค๊ฐ๋ณ์ ๊ฐ์ฒด๋ฅผ ๋น๊ต
- ์๊ธฐ์์ ๊ณผ ๋งค๊ฐ๋ณ์ ๊ฐ์ฒด๋ฅผ ๋น๊ตํ๋ค
package t1; import java.util.*; public class Test { public static void main(String[] args) { List<Student1> list = Arrays.asList( new Student1("์๋ผ๋น๋ ธ",80,70), new Student1("๊ฐ๋ค์จ",45,100), new Student1("๊น์ฌ์ฐ",90,90) ); Score sc = new Score(); Collections.sort(list,sc); // 1. ๋น๊ตํ ๊ฐ๋ค์ด ๋ค์ด์๋ Collection list // 2. ํด๋น๊ฐ๋ค์ ๋น๊ตํด์ค ๊ธฐ์ค์ผ๋ก implements Comparatorํ ํด๋์ค for(Student1 s : list){ System.out.println(s.getName() + s.getMath()); } } } class Student1{ private int english; private int math; private String name; public Student1(String name, int english, int math){ this.name = name; this.english = english; this.math = math; } public int getEnglish(){ return english; } public void setEnglish(int english){ this.english = english; } public int getMath(){ return math; } public void setMath(int math){ this.math = math; } public String getName(){ return name; } public void setName(){ this.name = name; } } class Score implements Comparator<Student1>{ @Override public int compare(Student1 s1, Student1 s2){ return s1.getEnglish() - s2.getEnglish(); } }package t1; import java.util.*; public class Test { public static void main(String[] args) { List<Student1> list = Arrays.asList( new Student1("์๋ผ๋น๋ ธ",80,70), new Student1("๊ฐ๋ค์จ",45,100), new Student1("๊น์ฌ์ฐ",90,90) ); Collections.sort(list, new Comparator<Student1>() { @Override public int compare(Student1 o1, Student1 o2) { return o1.getEnglish() - o2.getEnglish(); } }); // 1. ๋น๊ตํ ๊ฐ๋ค์ด ๋ค์ด์๋ Collection list // 2. ํด๋น๊ฐ๋ค์ ๋น๊ตํด์ค ๊ธฐ์ค์ผ๋ก implements Comparatorํ ํด๋์ค for(Student1 s : list){ System.out.println(s.getName() + s.getMath()); } } } class Student1{ private int english; private int math; private String name; public Student1(String name, int english, int math){ this.name = name; this.english = english; this.math = math; } public int getEnglish(){ return english; } public void setEnglish(int english){ this.english = english; } public int getMath(){ return math; } public void setMath(int math){ this.math = math; } public String getName(){ return name; } public void setName(){ this.name = name; } }- Comparable์ ์๊ธฐ ์์ ๊ณผ ํ๋ผ๋ฏธํฐ๋ก ๋ค์ด์ค๋ ๊ฐ์ฒด๋ฅผ ๋น๊ตํ๋ ๊ฒ
- Comparator์ ์๊ธฐ ์์ ์ ์ํ๊ฐ ์ด๋ป๋ ์๊ด์์ด ํ๋ผ๋ฏธํฐ๋ก ๋ค์ด์ค๋ ๋ ๊ฐ์ฒด๋ฅผ ๋น๊ตํ๋ ๊ฒ
์ต๋ช ํด๋์ค(Anonymous Class)
// Java์์ ๋ค๋ฅธ ํด๋์ค ๋ด์์ ํด๋์ค๋ฅผ ์ ์ํ ์ ์์ผ๋ฉฐ, ์ ์๋ ํด๋์ค๋ฅผ ์ค์ฒฉ ํด๋์ค๋ผ๊ณ ํ๋ค. // ์ค์ฒฉ ํด๋์ค๋ ์ด๋ฆ์ ์ค์ ํ์ง์๊ณ ์์ฑํ ์ ์์ผ๋ฉฐ, ์ด๋ฆ์ด ์๋ ์ค์ฒฉ ํด๋์ค๋ฅผ ์ต๋ช ํด๋์ค๋ผ๊ณ ํ๋ค // ์ต๋ช ํด๋์ค๋ ๋ค๋ฅธ ํด๋์ค ๋ด๋ถ์ ์ ์๋๋ฏ๋ก ์ต๋ช ๋ด๋ถ ํด๋์ค๋ผ๊ณ ๋งํ๊ธฐ๋ ํ๋ค// ์ผ๋ฐ์ ์ผ๋ก interface๋ฅผ ์ฌ์ฉํ ๋ // ๊ตฌํํด์ ์ฌ์ฉํจ interface Test1{ public void t(); } public class Test implements Test1 { @Override public void t(){ System.out.println("์ธํฐํ์ด์ค ํ ์คํธ"); } public static void main(String[] args) { Test1 tt = new Test(); tt.t(); } }// ์ต๋ช ํด๋์ค ์ฌ์ฉ // implements ์์ด main์ ์ ์ธ์ new๋ก ์ง์ ๊ตฌํํด์ค interface Test1{ public void t(); } public class Test{ public static void main(String[] args) { Test1 tt = new Test1() { @Override public void t() { System.out.println("์ต๋ช ํด๋์ค์ ๋ฉ์๋ ์ ์"); } }; tt.t(); }}์ต๋ช ํด๋์ค ์ ํ
- ํด๋์ค๋ฅผ ํ์ฅํ๋ ์ต๋ช ๋ด๋ถ ํด๋์ค
- ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ์ต๋ช ๋ด๋ถ ํด๋์ค
- ๋ด๋ถ ๋ฉ์๋/์์์ ์ธ์๋ฅผ ์ ์ํ๋ ์ต๋ช ๋ด๋ถ ํด๋์ค
ํด๋์ค ํ์ฅ
- ํด๋์ค๋ฅผ ํ์ฅํ๋ ์ต๋ช ๋ด๋ถ ํด๋์ค๋ ์์์์ด ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๊ธฐ ์ํด์
package t1; class test1{ public void tt(){ System.out.println("์ฌ๊ธฐ๋ test1์์์ ๋ฉ์๋ ํธ์ถ"); } } public class Test{ public static void main(String[] args) { test1 t1 = new test1(); t1.tt(); test1 t2 = new test1(){ @Override public void tt(){ System.out.println("์ฌ๊ธฐ๋ main์์ ๋ฉ์๋ ํธ์ถ"); } }; t2.tt(); } } // ์ฌ๊ธฐ๋ test1์์์ ๋ฉ์๋ ํธ์ถ // ์ฌ๊ธฐ๋ main์์ ๋ฉ์๋ ํธ์ถ์ธํฐํ์ด์ค ๊ตฌํ
- ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ์ต๋ช ๋ด๋ถ ํด๋์ค๋ ๊ตฌํ ํด๋์ค๋ฅผ ์ ์ํ์ง ์๊ณ ์ธํฐํ์ด์ค๋ฅผ ์ฐธ์กฐํ๋ ์ต๋ช ๋ด๋ถ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํจ
interface Test11 { public void t11(); } public class Test { public static void main(String[] args) { Test11 tt = new Test11() { @Override public void t11() { System.out.println("์ฌ๊ธฐ๋ ์์ฑํด์ ๋ฐ๋ก์คํ"); } }; tt.t11(); } }๋ด๋ถ ๋ฉ์๋/์์ฑ์ ์ธ์ ์ ์
- ์ต๋ช ๋ด๋ถ ํด๋์ค๋ฅผ ์ธ์๋ก ํ์ฌ ๋ฉ์๋ ๋๋ ์์ฑ์์ ์ ๋ฌํ ์ ์๋ค
package t1; interface Test11 { public void t11(); } class TestClass { public void t11(Test11 t){ t.t11(); } } public class Test { public static void main(String[] args) { TestClass tc = new TestClass(); tc.t11(new Test11() { @Override public void t11() { System.out.println("์ด๋ ๊ฒ๋ ์ ์ํ๊ณ ์ฌ์ฉ์ด ๊ฐ๋ฅํด์"); } }); } }- ์ต๋ช ๋ด๋ถ ํด๋์ค๋ ํด๋์ค๋ฅผ ์ ์ํ์ง ์๊ณ ํน์ ์์ ์ ์ํํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค
- ์ต๋ช ๋ด๋ถ ํด๋์ค๋ ์ผ๋ฐ์ ์ผ๋ก ํ์ ํด๋์ค๋ฅผ ํ์ฅํ๊ฑฐ๋ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ค
set โ ๋ฐฐ์ด ๋ณํ
Integer [] arr = {1,2,3,4,5}; // ์์ํ์ ์ผ๋ก ๋ฐฐ์ด์ ์ ์ธํ๋ฉด ์ค๋ฅ๋ฐ์ // Wrapperํด๋์ค๋ก ํด์ฃผ์ด์ผํจ Set<Integer> set = new HashSet<Integer>(Arrays.asList(arr)); System.out.println(set);Set<Integer> set = new HashSet<Integer>(Arrays.asList(1,2,3,45,5,3)); Integer [] arr = set.toArray(new Integer[0]); // ๋ฐฐ์ด์ ์ฌ์ด์ฆ๋ฅผ ์ง์ ํด์ฃผ๋๋ฐ 0์ด๋ฉด sizeํฌ๊ธฐ๋ก ์์ฑ๋๋ค System.out.println(Arrays.toString(arr));
Mathํด๋์ค
// java.Langํจํค์ง์ ํฌํจ๋ ํด๋์ค // ๋ฉ์๋๋ค์ ์ ๋ถ static์ผ๋ก ๊ตฌํ -> ๊ฐ์ฒด๊ตฌํ ํ์์์์๋ฐ ๋ํ์ ์ธ Math ๋ฉ์๋
- ์ด์ธ์ ๊ฒ์ ์๋ฐ docs์์ ์ฐพ์๋ณด๊ธฐ
๋ฉ์๋ ์ค๋ช static double random() 0.0 ์ด์ 1.0 ๋ฏธ๋ง์ ๋ฒ์์์ ์์์ doubleํ ๊ฐ์ ํ๋ ์์ฑํ์ฌ ๋ฐํํจ. static double abs(double a)static double abs(float a)static double abs(int a)static double abs(long a) ์ ๋ฌ๋ ๊ฐ์ด ์์์ด๋ฉด ๊ทธ ๊ฐ์ ์ ๋๊ฐ์ ๋ฐํํ๋ฉฐ, ์ ๋ฌ๋ ๊ฐ์ด ์์์ด๋ฉด ์ธ์๋ฅผ ๊ทธ๋๋ก ๋ฐํํจ. static double ceil(double a) ์ ๋ฌ๋ doubleํ ๊ฐ์ ์์ ๋ถ๋ถ์ด ์กด์ฌํ๋ฉด ์์ ๋ถ๋ถ์ ๋ฌด์กฐ๊ฑด ์ฌ๋ฆฌ๊ณ ๋ฐํํจ. static double floor(double a) ์ ๋ฌ๋ doubleํ ๊ฐ์ ์์ ๋ถ๋ถ์ด ์กด์ฌํ๋ฉด ์์ ๋ถ๋ถ์ ๋ฌด์กฐ๊ฑด ๋ฒ๋ฆฌ๊ณ ๋ฐํํจ. static long round(double a)static int round(float a) ์ ๋ฌ๋ ๊ฐ์ ์์์ ์ฒซ์งธ ์๋ฆฌ์์ ๋ฐ์ฌ๋ฆผํ ์ ์๋ฅผ ๋ฐํํจ. static double rint(double a) ์ ๋ฌ๋ doubleํ ๊ฐ๊ณผ ๊ฐ์ฅ ๊ฐ๊น์ด ์ ์๊ฐ์ doubleํ์ผ๋ก ๋ฐํํจ. static double max(double a, double b)static float max(float a, float b)static long max(long a, long b)static int max(int a, int b) ์ ๋ฌ๋ ๋ ๊ฐ์ ๋น๊ตํ์ฌ ํฐ ๊ฐ์ ๋ฐํํจ. static double min(double a, double b)static float min(float a, float b)static long min(long a, long b)static int min(int a, int b) ์ ๋ฌ๋ ๋ ๊ฐ์ ๋น๊ตํ์ฌ ์์ ๊ฐ์ ๋ฐํํจ. static double pow(double a, double b) ์ ๋ฌ๋ ๋ ๊ฐ์ doubleํ ๊ฐ์ ๊ฐ์ง๊ณ ์ ๊ณฑ ์ฐ์ฐ์ ์ํํ์ฌ, ab์ ๋ฐํํจ. static double sqrt(double a) ์ ๋ฌ๋ doubleํ ๊ฐ์ ์ ๊ณฑ๊ทผ ๊ฐ์ ๋ฐํํจ. static double sin(double a)static double cos(double a)static double tan(double a) ์ ๋ฌ๋ doubleํ ๊ฐ์ ํด๋นํ๋ ๊ฐ๊ฐ์ ์ผ๊ฐ ํจ์ซ๊ฐ์ ๋ฐํํจ. static double toDegrees(double angrad) ํธ๋๋ฒ์ ๋ผ๋์ ๊ฐ์ ๋๋ต์ ์ธ ์ก์ญ๋ถ๋ฒ์ ๊ฐ๋ ๊ฐ์ผ๋ก ๋ณํํจ. static double toRaidans(double angdeg) ์ก์ญ๋ถ๋ฒ์ ๊ฐ๋ ๊ฐ์ ๋๋ต์ ์ธ ํธ๋๋ฒ์ ๋ผ๋์ ๊ฐ์ผ๋ก ๋ณํํจ. 1. random() ๋ฉ์๋ - ์๋ฐ ๋๋ค ํจ์
- java random() ์์
System.out.println((int)(Math.random() * 100));// 0 ~ 99 Random ran = new Random(); System.out.println(ran.nextInt(100));// 0 ~ 992. abs() ๋ฉ์๋ - ์๋ฐ ์ ๋๊ฐ ํจ์
- java abs() ์์
System.out.println(Math.abs(10));// 10 System.out.println(Math.abs(-10));// 10 System.out.println(Math.abs(-3.14));// 3.143.ย floor() ๋ฉ์๋, ceil() ๋ฉ์๋์ round() ๋ฉ์๋ - ์๋ฐ ๋ด๋ฆผ, ์ฌ๋ฆผ, ๋ฐ์ฌ๋ฆผ ํจ์
- java floor(), ceil(), round() ์์
System.out.println(Math.ceil(10.0));// 10.0 System.out.println(Math.ceil(10.1));// 11.0 System.out.println(Math.ceil(10.000001));// 11.0 System.out.println(Math.floor(10.0));// 10.0 System.out.println(Math.floor(10.9));// 10.0 System.out.println(Math.round(10.0));// 10 System.out.println(Math.round(10.4));// 10 System.out.println(Math.round(10.5));// 114.ย max() ๋ฉ์๋์ min() ๋ฉ์๋ - ์๋ฐ ์ต๋๊ฐ, ์ต์๊ฐ ํจ์
- ์ฃผ์ด์ง ๋ ์์ค ๊ฐ ๋ฐํ
- java max(),min() ์์
System.out.println(Math.max(3.14, 3.14159));// 3.14159 System.out.println(Math.min(3.14, 3.14159));// 3.14 System.out.println(Math.max(-10, -11));// -10 System.out.println(Math.min(-10, -11));// -115. pow() ๋ฉ์๋์ sqrt() ๋ฉ์๋ - ์๋ฐ ์ ๊ณฑ, ์ ๊ณฑ๊ทผ ํจ์
- pow()๋ ์ ๊ณฑ, sqrt()๋ ์ ๊ณฑ๊ทผ ๋ฐํ
- java pow(), sqrt() ์์
System.out.println((int)Math.pow(5, 2));// 25 System.out.println((int)Math.sqrt(25));// 5
๋๋ค์ ::(์ด์ค ์ฝ๋ก ์ฐ์ฐ์,๋ฉ์๋ ์ฐธ์กฐ ํํ์)์ ์ฉ๋์ ์ฌ์ฉ๋ฒ
- ๋ฉ์๋ ์ฐธ์กฐ ํํ์ - ๋๋ค์์์ ํ๋ผ๋ฏธํฐ ์ค๋ณตํด์ ์ฌ์ฉํ๊ธฐ ์ซ์ ๋ ์ฌ์ฉ - ๋๋ค ํํ์์์๋ง ๊ฐ๋ฅ - ์ฌ์ฉ๋ฒ [์ธ์คํด์ค]::[๋ฉ์๋๋ช (๋๋ new)] * static ๋ฉ์๋์ ๊ฒฝ์ฐ ์ธ์คํฐ์ค๋์ ํด๋์ค๋ฅผ ์ฌ์ฉํ ์ ์๋คimport java.util.Arrays; import java.util.List; public class DoubleColonTest { public static void main(String[] args) { List<String> names = Arrays.asList("๊น๊ฐ์", "๊น๊ฐ๋"); // x๋ฅผ ๊ฑด๋ค๊ณ ๋ฐ๋ ๊ณผ์ ์์ x๋ฅผ ๋ ๋ฒ ์ ๊ฒ ๋๋ค. names.forEach(x -> System.out.println(x)); // ์์ x๋ค์ ๋นผ๋ฒ๋ฆฌ๊ณ ์๋์ ๊ฐ์ด ์์ฑํ ์ ์๋ค. names.forEach(System.out::println); } } import java.util.Arrays; import java.util.List; public class DoubleColonTest { public String addNim(String s) { return s + "๋"; } public static void main(String[] args) { List<String> names = Arrays.asList("๊น๊ฐ์", "๊น๊ฐ๋");; DoubleColonTest dct = new DoubleColonTest(); names.stream().map(x -> dct.addNim(x)).forEach(System.out::println); // ์ ์ฉ ์ names.stream().map(dct::addNim).forEach(System.out::println); // ์ ์ฉ ํ } }// ์์ฑ์๊ฐ ํ๋ผ๋ฏธํฐ ํ ๊ฐ๋ก ์ด๋ฃจ์ด์ง DTO์ ๋ฐฐ์ด์ ์์ฑ์ public class Dog { private String name; private String species; // ...setter // ...getter @Override public String toString() { return "Dog{" + "name='" + name + '\'' + ", species='" + species + '\'' + '}'; } } ------------------------------------------------------------------------------------------------ import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class DoubleColonTest { public static String addNim(String s) { return s + "๋"; } public static void main(String[] args) { List<String> names = Arrays.asList("๊น๊ฐ์", "๊น๊ฐ๋"); List<Dog> dogs1 = names.stream() .map(x -> new Dog(x)) // ์ ์ฉ ์ .collect(Collectors.toList()); List<Dog> dogs2 = names.stream() .map(Dog::new) // ์ ์ฉ ํ .collect(Collectors.toList()); dogs2.forEach(x -> x.setSpecies("์ดํ๋ฆฌ์ ๊ทธ๋ ์ด ํ์ด๋")); System.out.println(dogs1); System.out.println(dogs2); } }// ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๋ ํ๋ผ๋ฏธํฐ์ ์ข ๋ฅ์ ๊ฐ์๊ฐ ๊ฐ์ผ๋ฉด ์ฌ์ฉ ๊ฐ๋ฅ @FunctionalInterface public interface StringToDog { public String convert(String name, String species, int price); } public class Dog { private String name; private String species; private int price; public static String introduce(String name, String species, int price) { return name + " : " + species + " : " + price; } // ............ } import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class DoubleColonTest { public static void main(String[] args) { // ํ๋ผ๋ฏธํฐ์ ๊ฐ์์ ํ์ ์ด ๊ฐ๋ค๋ฉด ๋ฉ์๋ ์ฐธ๊ณ ํํ์์ด ์ ์ฉ๋๋ค. StringToDog stringToDog1 = (name, species, price) -> Dog.introduce(name, species, price); StringToDog stringToDog2 = Dog::introduce; System.out.println(stringToDog1.convert("๊ฐ๋ฅ์ด", "๋ฏน์ค", 100)); System.out.println(stringToDog2.convert("๋๋ ์ด", "๋ฏน์ค", 1000)); } }
Errors
local variable is redundant
์๋ฌ๋ ์๋๊ณ ๋ถํ์ํ๊ฑฐ๋ ํด๋น ๋ณ์๊ฐ ์ฌ์ฉ๋๊ณ ์์ง์๋ค๋ ์๋ฏธ
possible lossy conversion from double to int
์ค์๊ฐ์ int๋ก ํ์ ์ง์ ํ์๊ธฐ๋๋ฌธ์
- ํ๋ณํ
- ๋ฐ์ดํฐ ํ์ ๋ณ๊ฒฝ
์ธํ ๋ฆฌ์ ์ด Cannot resolve symbol ์๋ฌ
// jdk ์ค์ ๋ฌธ์ ์ด๊ฑฐ๋ ์ธํ ๋ฆฌ์ ์ด๊ฐ ๋ง์ฝ์ ๋ถ๋ฆฌ๊ฑฐ๋ 1. file -> project structure -> project sdk๋ถ๋ถ ์ค์ ํด์ฃผ๊ธฐ(jdk์ถ๊ฐ) 2. build -> rebuild project 3. file -> invalidate caches -> clear VCS log caches and indexes -> invalidate and restart(์บ์๋น์ฐ๊ณ ์ฌ์คํ)
int ํ์ ์ ํ๊ณ์๋ฌ
class Solution { public long[] solution(int x, int n) { long[] answer = new long[n]; long result = 0; System.out.println("์ฌ๊ธฐ ๋ญ๋์ค๋ : " + answer.length); for(int i = 0; i < n; i++){ result += x; answer[i] = result; System.out.println("๊ทธ๋ฌ๋ฉด ์ฌ๊ธฐ๋ ๋ญ๋์ค๋ : " + answer[i] ); } return answer; } }- result ๋ถ๋ถ์ด int์์๋๋ ์๋ฌ๋ถ๋ถ์ด ๋ฐ์ํ๋ค
- ๊ทธ์ด์ ๋ก๋ int๋ฒ์์ธ -21์ต์์ 21์ต์ ์ซ์ํฌ๊ธฐ๋ฅผ ๋์ด๊ฐ์์ด๋ค
์์์ ํ๊ท ๊ตฌํ๊ธฐ ์ฃผ์์
- returnํ์ ์ด ์์์ ์ผ ๊ฒฝ์ฐ์๋ ํด๋น๊ฐ์ int๋ก ๋๋๋ ๊ฒฝ์ฐ ์์์ ๋ถ๋ถ์ด ์๋ต๋๋ ์ด์๊ฐ์๋ค
- ๊ทธ๋ฌ๋ฏ๋ก ๊ฐ์ double๋ก ๋๋์ด์ฃผ์ด์ผ์ง ํ๊ท ์ ์์์ ์ด ์๋ต๋์ง์๋๋ค
โ.classโ expected์๋ฌ
- ์ปดํ์ผํ๋ ๊ณผ์ ์์ ๋ฐ์ํ๋์๋ฌ
- syntax error์ด๋ค {}๋ ;๋ฑ์ด ์๋์ง ์์์ฑ๋์๋์ง ํ์ธํ๊ธฐ
ArrayIndexOutOfBoundsException
- ๋ฐฐ์ด์ ํฌ๊ธฐ ์ด์์ ์ซ์๊ฐ ๋ค์ด๊ฐ๊ฑฐ๋ ๋ฐฐ์ด์ ์์น๊ฐ์ ์์๊ฐ ๋ค์ด๊ฐ๋ ๋ฑ์ ์ค๋ฅ
Cannot find symbol
๐์ฝ๋๊ฐ ์ปดํ์ผ๋ ๋ ์ปดํ์ผ๋ฌ๋ ์์ค์ฝ๋์ ์๋ณ์๋ค์ด ๊ฐ๊ฐ ์ด๋ค ์๋ฏธ๊ฐ ์๋์ง ํด์์ด ์์ ์ ํ ์ ์๋ ๊ฒฝ์ฐ( = ์ปดํ์ผ๋ฌ๊ฐ ์์ค์ฝ๋๋ฅผ ํด์ํ ์ ์์)์ธ ๊ฒฝ์ฐ ์ถ๋ ฅ
2. Cannot find symbol ์์ธ
๊ต์ฅํ ๋ค์ํ ์์ธ์ด ๋๋ก๋ ๋ณตํฉ์ ์ผ๋ก ์์ ์ ์๋ค.
1. ์คํ ๋ง ์ค์์ฑ : ์๋ฅผ๋ค์ด StringBuffer๋ฅผ SpringBuffer๋ก ์์ฑ. SpringBuffer ํด๋์ค๊ฐ ์์ด ์ฝ๋๋ฅผ ์ปดํ์ผํ ์ ์๋ค.
StringBuffer sb = new SpringBuffer();Error:(5, 31) java: cannot find symbolsymbol: class SpringBufferlocation: class com.example.demo.cannotfindsymbol.Test
2. ๋์๋ฌธ์ ์ค์์ฑ : StringBuffer -> Stringbuffer๋ก ์์ฑ.
3. ๋ณ์ ์ ์ธ์ ํ์ง์๊ณ ์ฌ์ฉ
System.out.println(str); // ์ ์ธํ์ง ์์ str ๋ณ์ ์ฌ์ฉ4. ๋ค๋ฅธ ์์ญ์ ์ ์ธํ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ์ค๋ฅ : for๋ฌธ ์์ญ์ ๋ณ์๋ฅผ ์ธ๋ถ์์ ์ ๊ทผ.
for(int i=0; i<2; i++){ System.out.println(i); } System.out.println(i); // i๋ฅผ ์ฐพ์ ์ ์์ด ์ค๋ฅ5. ๊ฐ์ฒด๊ฐ ๊ฐ์ง๊ณ ์์ง ์์ ๋ณ์๋ ํจ์์ ์ ๊ทผํ๋ ๊ฒฝ์ฐ
String str = "123"; str.reverse(); // String ๊ฐ์ฒด๋ reverse() ๋ฉ์๋๊ฐ ์๋ค.6. new ํค์๋๋ฅผ ์์ฑํ์ง ์์ ๊ฒฝ์ฐ
StringBuffer sb = StringBuffer();7. ๊ฐ์ ํด๋์ค๋ช ์ ๋ค๋ฅธ ํจํค์ง ํด๋์ค๊ฐ import ๋ ๊ฒฝ์ฐ : IDE์ ์๋ ์ํฌํธ ๊ธฐ๋ฅ์ ์ด์ฉํ๋ค ๋ณด๋ฉด ์ข ์ข ๋ฐ์ํ๋ค. ์ฌ์ฉํ๊ณ ์ ํ๋ ํจํค์ง์ ํด๋์ค๊ฐ ์ํฌํธ ๋์๋์ง ํ์ธํ๋ค.
8. ์ธ๋ฏธ์ฝ๋ก (;)์ด ์๋ชป ์์ฑ๋ ๊ฒฝ์ฐ : ์๋๋ ์์ด์ผ ๋ ์ธ๋ฏธ์ฝ๋ก ์ด ์ค๊ฐ์ ์์ฑ๋์๋ค.
์ธ๋ฏธ์ฝ๋ก ์ ์ํด for(~~~) ์ ์ฝ๋๋ธ๋ญ{ }์ด ๋ถ๋ฆฌ๋๋ฉฐ ์ฝ๋๋ธ๋ญ{ }์์ i๋ ์ ์ธ๋์ง ์์์ผ๋ฏ๋ก ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
for (int i = 0; i < 100; i++); { System.out.println("i : " + i); }9. ์คํผ๋ ์ดํฐ๊ฐ ์ค์์ฑ ๋ ๊ฒฝ์ฐ : ์๋์์๋ *๋ฅผ ์๋ตํจ์ผ๋ก์จ i๋ผ๋ ๋ฉ์๋๋ฅผ ์ฐพ์ผ๋ ์์ผ๋ฏ๋ก ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
int a = 1; int b = 2; int i = 1; int result = i(a+b); // i*(a+b) ์์ *๋ฅผ ์์ฑํ์ง ์์cannot find symbol ํด๊ฒฐ
๋ฐ์ํ ์ ์๋ ์์ธ์ด ์๋ ๋ค์ํ๊ณ ๋ณตํฉ์ ์ด๋ค ๋ณด๋, ์ค๋ฅ๊ฐ ๋ฐ์ํ ๋ถ๋ถ์ ์ค์ฌ์ผ๋ก ์์ฑํ ์ฝ๋๋ฅผ ์ฃผ์ ๊น๊ฒ ๋๋ฒ๊น ํ๋ ์๋ฐ์ ์๋ค.
๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ฅผ ์๋ชป ์์ฑํ ๊ฒ ์ธ์๋ ์๋ํ ๊ฒ๊ณผ ๋ค๋ฅธ ๋ฒ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค๋๊ฐ(์์กด์ฑ ์๋ฌ), IDE์์ ๋ฌธ์ ๊ฐ ์๋ค๋๊ฐ, ํน์ ์์ค๋ฅผ ์ปดํ์ผํ์ง ์์๋๊ฐ ๋ฑ์ ๋ค์ํ ์์ธ์ด ์์ผ๋ฏ๋ก ๋จ๊ณ๋ณ๋ก ์ดํด๋ด์ผ ํ๋ค.
์ฐธ๊ณ
might not have been initialized
- ๋ณ์๊ฐ ์ ์ธ์ ๋์๋๋ฐ ๊ฐ์ด์๋ ์ํ์์์ ์ค๋ฅ
int num; num++; // ์ค๋ฅ ๋ฐ์ // num์ด ์ ์ธ๋ง ๋์๊ณ ์์๋ ๊ฐ์ด ์๋ ์ฆ๊ฐ์ฐ์ฐ์๋ฅผ ์๊ตฌํ๋ฉด ์ซ์๋ช๋ถํฐ ์ฆ๊ฐ์ ํด์ผํ๋์ง ๋ชจ๋ฅด๊ธฐ๋๋ฌธ์ ์ค๋ฅ๋ฐ์
error: incompatible types: possible lossy conversion from double to int
- ์์์ ์ int๋ก ๋ณํํ๋ฉด ์์์ ์๋์ ์๋ฅผ ์๊ฒ๋๋ค
- double์ int๋ก ์ ์ฅํ๋ ๊ฒ์ lossy ํ ์ ์๊ฒ ๋๋ฌธ์ ๋ฐ์ํ๋ ์ค๋ฅ
- ๊ฐ์ ํ๋ณํ์ ํ๋ ๋ฐ์ดํฐ ํ์ ์ ๋ง์ถ์ด์ฃผ๋ฉด๋๋ค
public, should be declared in a file name
public interface๋ก ์์ฑํด์ ๋ฐ์ํ ์๋ฌ ํด๋์ค๋ช ์ด public์ผ๋ก ์ ์ธ๋์๋๋ฐ ํ์ผ๋ช ๊ณผ ๋ค๋ฅผ ๊ฒฝ์ฐ public์ผ๋ก ์ ์ธ๋ ํด๋์ค๊ฐ ์๋ค๋ฉด ๋ฐ๋์ ๊ทธ ํด๋์ค๋ช ๊ณผ ํ์ผ๋ช ์ด ๊ฐ์์ผํ๋ค ๊ฒฐ๊ตญ public์ ์ง์ฐ๊ณ interface์์ฑ
