00. Java Documents

https://docs.oracle.com/javase/8/docs/api/index.html

01. Object Class

  • Object Class ๋Š” Java ์— ์กด์žฌํ•˜๋Š” ๋ชจ๋“  Class ์˜ ์ตœ์ƒ์œ„ Class ์ž„
  • Object Class ์— ์กด์žฌํ•˜๋Š” method ์ค‘, ์ž์ฃผ overriding ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋“ค์€,
    • equals(), toString(), hashCode()
  • ์—ฌ๊ธฐ์„œ equals() ์˜ ๊ฒฝ์šฐ, ๋ชจ๋“  ๊ฐ’์ด ๊ฐ™์€ Obejct ๋ผ๊ณ  ํ•˜๋”๋ผ๋„
    • s1.equals(s2) ์™€ ๊ฐ™์ด ๋น„๊ตํ•˜๋ฉด ๋‹ค๋ฅด๋‹ค๊ณ  ๋‚˜์˜ด โ†’ hashCode() ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ
  • ๋”ฐ๋ผ์„œ, ์ƒํ™ฉ์— ๋งž๊ฒŒ equals() ๋ฅผ overriding ํ•˜์—ฌ method ๋ฅผ customizing ํ•  ํ•„์š”๊ฐ€ ์žˆ์Œ

02. java.lang ํŒจํ‚ค์ง€

  • Wrapper, Object, String, StringBuffer, StringBuilder, System, Math ๋“ฑ์˜ ๊ธฐ๋ณธ์ ์ธ Class ๊ฐ€ ๋ชจ๋‘ java.lang package ์— ํฌํ•จ๋จ
  • Wrapper Class
    • ๊ธฐ๋ณธ ์ž๋ฃŒํ˜• ๋ฐ์ดํ„ฐ๋ฅผ Object ๋กœ ๋ณ€ํ™˜์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” Class ๋ฅผ ์˜๋ฏธ
    • ๊ฐ ์ž๋ฃŒํ˜•๋งˆ๋‹ค ๊ฐ๊ฐ์˜ Wrapper Class ๊ฐ€ ์กด์žฌ (ex. int โ†’ Integer)
    • ์ตœ์‹  Java ์—์„œ๋Š” Integer i = new Integer(5); ๊ฐ€ ์•„๋‹Œ Integer i = 5; ์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜์—ฌ๋„ ์ž๋™์œผ๋กœ Integer Object ๊ฐ€ ๋งŒ๋“ค์–ด์ง
      • ๊ธฐ๋ณธ ํƒ€์ž… ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด ํƒ€์ž… ๋ฐ์ดํ„ฐ๋กœ ์ž๋™ ํ˜•๋ณ€ํ™˜ ์‹œ์ผœ์ฃผ๋Š” ๊ธฐ๋Šฅ โ†’ Auto Boxing
      • ๋ฐ˜๋Œ€๋กœ, ๊ฐ์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ณธํ˜• ํƒ€์ž… ๋ฐ์ดํ„ฐ๋กœ ์ž๋™ ํ˜•๋ณ€ํ™˜ ํ•˜๋Š” ๊ธฐ๋Šฅ โ†’ Auto Unboxing
  • StringBuffer Class
    • String Class ๋Š” ์ ˆ๋Œ€ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋ถˆ๋ณ€ Class ์ž„
    • ๋ฐ˜๋ฉด StringBuffer Class ๋Š” ๊ฐ€๋ณ€ Class ์ž„
    • sb.append() method ๋Š” this, ์ฆ‰ ์ž๊ธฐ ์ž์‹ ์˜ object ๋ฅผ return ํ•จ
      • ๋”ฐ๋ผ์„œ, ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ method ๋ฅผ ์—ฐ์†์ ์œผ๋กœ ํ˜ธ์ถœ โ†’ Method Chaining
      • ex) sb.append("A").append("B").append("C")...
  • String Class ์˜ ๋ฌธ์ œ์ 
    • String object ๋ฅผ + ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•˜์—ฌ ์—ฐ์†์ ์œผ๋กœ ๋”ํ•ด์ฃผ๋ฉด,
      • ๋”ํ•  ๋•Œ๋งˆ๋‹ค ๋‚ด๋ถ€์ ์œผ๋กœ ์ƒˆ๋กœ์šด StringBuilder object ๊ฐ€ ์ƒ์„ฑ๋˜์–ด ์„ฑ๋Šฅ์ด ๋‚ฎ์•„์ง
    • ๋”ฐ๋ผ์„œ, StringBuilder ๋ฅผ ์„ ์–ธํ•˜๊ณ , ์ด์— ์—ฐ์†์ ์œผ๋กœ ๋”ํ•ด์•ผ new ๋ฅผ ํ†ตํ•œ ์ƒˆ๋กœ์šด Object ์ƒ์„ฑ์ด ์•ˆ ๋˜๊ณ , ํ›จ์”ฌ ๋” ๋น ๋ฅธ ์„ฑ๋Šฅ์„ ๋ณด์ž„
  • Math Class
    • Math Class ๋Š” ์ƒ์„ฑ์ž ์ž์ฒด๊ฐ€ private ์ด๊ธฐ ๋•Œ๋ฌธ์— new ๋ฅผ ํ†ตํ•œ ๊ฐ์ฒด ์ƒ์„ฑ์ด ๋ถˆ๊ฐ€๋Šฅ
    • ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  method ๊ฐ€ static ์œผ๋กœ ์„ ์–ธ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ „์—ญ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • Math.max(5, 30), Math.min(50, 30), Math.abs(-10), Math.pow(2, 10), Math.log10(100)
    • Math.random() ์€ 0 ๋ถ€ํ„ฐ 1 ์‚ฌ์ด์˜ ๋žœ๋คํ•œ ์†Œ์ˆ˜๋ฅผ return

03. java.util ํŒจํ‚ค์ง€

  • java.util package
    • ๋‚ ์งœ์™€ ๊ด€๋ จ๋œ Class ์ธ Date, Calendar Class
    • ์ž๋ฃŒ๊ตฌ์กฐ์™€ ๊ด€๋ จ๋œ ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๊ด€๋ จ๋œ Interface ์™€ Class
    • Date Class ๋Š” ์ง€์—ญํ™”๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์•„์„œ deprecated ๋จ โ†’ ์ฆ‰ ๋” ์ด์ƒ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋‹ˆ ์‚ฌ์šฉ์„ ์ž์ œํ•ด๋ผ
      • ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ๋‚˜์˜จ Class ๊ฐ€ Calendar Class
      • ์ง€์—ญํ™”์™€ ๊ด€๋ จ๋œ ํด๋ž˜์Šค๋“ค์€ Locale๋กœ ์‹œ์ž‘๋˜๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ Class ๋“ค์ž„
    • List, Set, Collection, Map ์€ ์ž๋ฃŒ๊ตฌ์กฐ โ†’ ์ฆ‰Collection Framework ์™€ ๊ด€๋ จ๋œ Interface
  • Collection Framework ์—์„œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” Interface ๋Š” Collection Interface
    • Collection Interface ๋Š” ์ค‘๋ณต๋„ ํ—ˆ์šฉ, ์ž๋ฃŒ๊ฐ€ ์ €์žฅ๋œ ์ˆœ์„œ๋„ ๊ธฐ์–ตํ•˜์ง€ X
    • Collection ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋Œ€ํ‘œ์ ์ธ method โ†’ add(), size(), iterator()
    • iterator() ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ์ˆœํžˆ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ผ ์ˆ˜ ์žˆ๋Š” Iterator ๋ผ๋Š” Interface ๋ฅผ ๋ฐ˜ํ™˜
      • Iterator Interface ๋Š” ๋‹ค์Œ ๋‘ ๊ฐ€์ง€์˜ ๋Œ€ํ‘œ method ๋ฅผ ๊ฐ€์ง
        • hasNext() : ๊บผ๋‚ผ ๊ฒƒ์ด ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธ
        • next() : ํ•˜๋‚˜์”ฉ ์ž๋ฃŒ๋ฅผ ๊บผ๋‚ผ ๋•Œ ์‚ฌ์šฉ
  • Set Interface
    • ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ
    • Collection Interface ๋ฅผ ์ƒ์†๋ฐ›์Œ
    • Set Interface ์˜ add() method โ†’ ๊ฐ™์€ ์ž๋ฃŒ๊ฐ€ ์žˆ์œผ๋ฉด false, ์—†์œผ๋ฉด true return
  • List Interface
    • ์ค‘๋ณต์€ ํ—ˆ์šฉ, ์ˆœ์„œ๋ฅผ ๊ธฐ์–ต
    • ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Collection Interface ๋ฅผ ์ƒ์† โ†’ iterator() ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • ์ˆœ์„œ๋ฅผ ๊ธฐ์–ตํ•˜๊ธฐ ๋•Œ๋ฌธ์—, n ๋ฒˆ์งธ์˜ ์ž๋ฃŒ๋ฅผ ๊บผ๋‚ผ ์ˆ˜ ์žˆ๋Š” get(int n) method ๋ฅผ ๊ฐ€์ง
  • Map Interface
    • Key, Value ๋ฅผ ๊ฐ€์ง
    • put() method ๋ฅผ ์ด์šฉํ•˜์—ฌ key ์™€ value ๋ฅผ ํ•จ๊ป˜ ์ €์žฅ
    • ์›ํ•˜๋Š” key ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์„ ๊บผ๋‚ผ ๋•Œ๋Š” get(key) ์™€ ๊ฐ™์ด ์‚ฌ์šฉ
    • put() ์„ ํ†ตํ•˜์—ฌ ๊ธฐ์กด์— ์กด์žฌํ•˜๋Š” key ๊ฐ’์„ ๋„ฃ์œผ๋ฉด, overwrite ๋จ
    • Map ์— ์ €์žฅ๋œ ๋ชจ๋“  key ๋“ค์€ ์ค‘๋ณต X โ†’ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ชจ๋“  Key ๋ฅผ return ํ•˜๋Š” keySet()
      • keySet() ์€ Set type ์ด๋ฏ€๋กœ iterator() ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์›์†Œ๋ฅผ ๊บผ๋‚ผ ์ˆ˜ ์žˆ์Œ
  • Generic
    • Generic ์„ ์‚ฌ์šฉํ•˜์—ฌ, ์„ ์–ธํ•  ๋•Œ๋Š” ๊ฐ€์ƒ์˜ ํƒ€์ž…์œผ๋กœ ์„ ์–ธํ•˜๊ณ , ์‚ฌ์šฉ ์‹œ์—๋Š” ๊ตฌ์ฒด์ ์ธ ํƒ€์ž…์„ ์ง€์ •ํ•จ
    • Generic ์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ Class ๋Š” Collection Framework ์™€ ๊ด€๋ จ๋œ Class ๋“ค์ž„
    • public class Box<E> {} ์™€ ๊ฐ™์ด Box Class ๋ฅผ ์„ ์–ธ, ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” private E obj; ์™€ ๊ฐ™์ด ์•„์ง ์ •ํ•ด์ง€์ง€ ์•Š์€ E ํƒ€์ž…์˜ field ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉ
      • ์‹ค์ œ ์‚ฌ์šฉ ์‹œ์—๋Š”, Box<String> box = new Box<>(); ์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๊ณ ,
      • box.setObj("Hello"); ์™€ ๊ฐ™์ด ์ •ํ•œ ํƒ€์ž…์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ parameter ๋กœ ์‚ฌ์šฉ
      • ๋งŒ์•ฝ ์ •ํ•ด์ง„ ํƒ€์ž…๊ณผ ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ parameter ๋กœ ๋„ฃ์„ ๊ฒฝ์šฐ โ†’ ์˜ค๋ฅ˜
    • ์ •๋ฆฌํ•˜๋ฉด, Generic ์„ ํ†ตํ•˜์—ฌ ๋‹ค์–‘ํ•œ Class ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Class ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ

04. ๋‚ ์งœ์™€ ์‹œ๊ฐ„

  • Date Class
    • Date Class ๋Š” ์ง€์—ญํ™” (์‚ฌ์šฉ์ž์˜ ์ง€์—ญ์— ๋งž์ถค) ๋ถ€๋ถ„์ด ๊ณ ๋ ค๋˜์ง€ ์•Š์•˜์Œ
    • ๋”ฐ๋ผ์„œ, ๊ฑฐ์˜ ๋ชจ๋“  ์ƒ์„ฑ์ž์™€ method ๊ฐ€ Deprecated ๋˜์–ด ์žˆ์Œ
  • Calender Class
    • ๊ธฐ๋ณธ์ ์œผ๋กœ Calender Class ๋Š” Abstract Class ์ž„ โ†’ ๋”ฐ๋ผ์„œ ์ง์ ‘์ ์œผ๋กœ ๊ฐ์ฒด ์ƒ์„ฑ ๋ถˆ๊ฐ€
    • ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด getInstance() method ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ
      • Calendar cal = Calendar.getInstance();
      • ๋‚ด๋ถ€์ ์œผ๋กœ ์ž์‹ Class ์ธ GregodianCalender ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ return
    • Calender Class ๋ฅผ ์ด์šฉํ•˜์—ฌ ํ˜„์žฌ ๋‚ ์งœ ์ •๋ณด ์–ป๋Š” ๋ฒ•
      • get() method parameter ๋กœ Calender ์˜ ์–ด๋–ค constant ๋ฅผ ๋„ฃ๋А๋ƒ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง
      • int yyyy = cal.get(Calendar.YEAR);
      • int month = cal.get(Calendar.MONTH) + 1; โ†’ ์›”์€ 0 ๋ถ€ํ„ฐ ์‹œ์ž‘
      • HOUR โ†’ 12์‹œ๊ฐ„์ œ, HOUR_OF_DAY โ†’ 24 ์‹œ๊ฐ„์ œ
  • java.time package
    • ๊ธฐ์กด์— ์กด์žฌํ•˜๋˜ Calendar, Date Class ์˜ ๋ถ€์กฑํ•œ ๊ธฐ๋Šฅ โ†’ ์ƒˆ๋กญ๊ฒŒ ์žฌ ๋””์ž์ธํ•œ API ๋ฅผ ์ œ๊ณต
    • LocalDateTime timePoint = LocalDateTime.now(); : ํ˜„์žฌ ๋‚ ์งœ์™€ ์‹œ๊ฐ„
    • LocalDate ld = LocalDate.of(2021, Month.DECEMBER, 12); : ๋‚ ์งœ ๊ฐ์ฒด ์ƒ์„ฑ
      • ์ด์™ธ์—๋„ LocalTime ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ๊ฐ„ ๊ฐ์ฒด ์ƒ์„ฑ ๊ฐ€๋Šฅ
    • ์œ„์—์„œ ๋งŒ๋“  LocalDateTime ๊ฐ์ฒด์—์„œ ์›ํ•˜๋Š” ์ •๋ณด๋งŒ์„ ๋‹ค๋ฅธ method, getter ๋ฅผ ํ†ตํ•˜์—ฌ ์–ป์„ ์ˆ˜ ์žˆ์Œ
      • ex) LocalDate theDate = timePoint.toLocalDate();
      • ex) Month month = timePoint.getMonth();

05. IO

  • Java IO ๋Š” ํฌ๊ฒŒ Byte ๋‹จ์œ„ IO, Character ๋‹จ์œ„ IO ๋กœ ๋‚˜๋‰จ
    • byte ๋‹จ์œ„ IO ํด๋ž˜์Šค๋Š” InputStream, OutputStream ์ด๋ผ๋Š” ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ๋งŒ๋“ค์–ด์ง
    • char ๋‹จ์œ„ IO ํด๋ž˜์Šค๋„ Reader, Writer ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์ƒ์† ๋ฐ›์•„ ๋งŒ๋“ค์–ด์ง
  • ์ƒ์„ฑ์ž์— InputStream, Reader, Writer, OutputStream ์„ ์ „๋‹ฌ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด
    • ์ด Class ๋Š” ๋‹ค์–‘ํ•œ ์ž…๋ ฅ/์ถœ๋ ฅ ๋„๊ตฌ๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป
    • ex) BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  • ๋งŒ์•ฝ ํ•ด๋‹น ์ถ”์ƒ ํด๋ž˜์Šค๋“ค์„ ๋ฐ›๋Š” ์ƒ์„ฑ์ž๊ฐ€ ์—†๋‹ค๋ฉด
    • ์ด ํด๋ž˜์Šค๋Š” ๋‹จ์ˆœํžˆ ์ž…๋ ฅ์ด ์ถœ๋ ฅ ๋Œ€์ƒ์ด ๋ฌด์—‡์ธ์ง€ ๊ณ ์ •๋˜์–ด ์žˆ๋‹ค๋Š” ๋œป
    • ex) FileInputStream fis = new FileInputStream("data.txt");
  • ์žฅ์‹๋Œ€์ƒ ํด๋ž˜์Šค (Component)
    • Decorator ํŒจํ„ด์—์„œ, ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ๊ฐ์ฒด
    • ํŒŒ์ผ๋กœ ๋ถ€ํ„ฐ ์ž…๋ ฅ๋ฐ›๊ณ  ์“ฐ๊ธฐ ์œ„ํ•œ ํด๋ž˜์Šค : FileInputStream, FileOutputStream, FileReader, FileWriter
    • ๋ฐฐ์—ด๋กœ ๋ถ€ํ„ฐ ์ž…๋ ฅ๋ฐ›๊ณ  ์“ฐ๊ธฐ ์œ„ํ•œ ํด๋ž˜์Šค : ByteArrayInputStream, ByteArrayOutputStream, CharReader, CharWrite
  • ์žฅ์‹ํ•˜๋Š” ํด๋ž˜์Šค (Decorator)
    • Decorator ํŒจํ„ด์—์„œ, ์žฅ์‹ ๋Œ€์ƒ ํด๋ž˜์Šค์˜ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๋Š” ์—ญํ• 
    • DataInputStream, DataOutputStream : ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ž…๋ ฅ๋ฐ›๊ณ  ์ถœ๋ ฅ
    • BufferedReader, PrintWriter : println(), readLine() ๊ณผ ๊ฐ™์ด ๊ธฐ์กด ์žฅ์‹๋Œ€์ƒ ํด๋ž˜์Šค์™€๋Š” ๋‹ฌ๋ฆฌ โ€œํ•œ ์ค„๋งŒโ€ ์ถœ๋ ฅํ•˜๊ฑฐ๋‚˜ ์ž…๋ ฅ๋ฐ›๋Š” method ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ
  • ์ฆ‰, Decorator Pattern ์—์„œ ๋ณด๋ฉด,
    • ์žฅ์‹๋Œ€์ƒ ํด๋ž˜์Šค์ธ InputStreamReader ๋ผ๋Š” ์ƒค์›Œํ˜ธ์Šค์—,
    • BufferedReader ๋ผ๋Š” ๋ฌผ์ค„๊ธฐ๊ฐ€ ์—ฌ๋Ÿฌ ํ˜•ํƒœ๋กœ ๋ฐ”๋€Œ์–ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ์ตœ์‹ ํ˜• ์ƒค์›Œ๊ธฐ ํ—ค๋“œ๋ฅผ ๊ผฝ์•„์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ๋ณด๋ฉด ๋จ

Stream ์ด๋ž€?

  • ์ŠคํŠธ๋ฆผ์€ Java ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฝ๊ฑฐ๋‚˜ ์“ฐ๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ถ”์ƒ์ ์ธ ๊ฐœ๋…
  • ์ŠคํŠธ๋ฆผ์€ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ์ž๋ฃŒ ๊ตฌ์กฐ ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด X
  • ๋ฐ์ดํ„ฐ๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ํ˜๋Ÿฌ๊ฐ€๋Š” ํ†ต๋กœ์ผ ๋ฟ โ†’ ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ํšจ์œจ์„ฑ์„ ์œ„ํ•˜์—ฌ buffer ๋ฅผ ์‚ฌ์šฉ
    • buffer ๋Š” ์ฃผ๋กœ JVM ์˜ heap ๋ฉ”๋ชจ๋ฆฌ์— ์กด์žฌ
    • ์‚ฌ์šฉ๋œ ์ดํ›„์—๋Š” ๊ทธ์ € dummy ๋ฐ์ดํ„ฐ (์ฐธ์กฐํ•˜๋Š” ์• ๋“ค์ด ์—†์Œ, Garbage Collection ๋Œ€์ƒ)
  • Byte ๋‹จ์œ„ ์ž…์ถœ๋ ฅ

    • InputStream, OutpuStream ์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋๋‚˜๋Š” Class
    • `fis = new FileInputStream(โ€œdata.txtโ€);
    • fos = new FileOutputStream("copy.txt");
  • Byte ๋‹จ์œ„ ์ž…์ถœ๋ ฅ ์‹ฌํ™”

    • byte[] buffer = new byte[512];
      • ์ด๋ ‡๊ฒŒ buffer ๋ฅผ 512 byte ๋กœ ์žก์•„์ฃผ๋ฉด,
    • while((readCount = fis.read(buffer))!= -1)
      • buffer ๋ฅผ read ์— ๋„ฃ์–ด์„œ ์‚ฌ์šฉํ•  ๋•Œ โ†’ ํ•œ๋ฒˆ์— 512 bytes ์”ฉ ์ฝ์–ด๋“ค์ž„
  • ๋‹ค์–‘ํ•œ ํƒ€์ž…์˜ ์ถœ๋ ฅ

    • ๋‹ค์–‘ํ•œ ํƒ€์ž…์˜ ์ž…์ถœ๋ ฅ์€ DataInputStream, DataOutputStream ์„ ์‚ฌ์šฉ
      • ์–˜๋„ค๋“ค์€ ์žฅ์‹ํ•˜๋Š” ํด๋ž˜์Šค, ์ฆ‰ Decorator ๋“ค์ด๋ผ Component ์™€ ๋ฐ˜๋“œ์‹œ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ•จ
    • DataOutputStream out = new DataOutputStream(new FileOutputStream("data.txt"));
    • ์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋œ out ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ˜•์‹์„ ์ง€์ •ํ•˜์—ฌ ์ž…๋ ฅ(write) ๊ฐ€๋Šฅ
    • out.writeInt(100);, out.writeBoolean(true);, out.writeDouble(50.5);
  • ๋‹ค์–‘ํ•œ ํƒ€์ž…์˜ ์ž…๋ ฅ

    • DataInputStream in = new DataInputStream(new FileInputStream("data.txt"));
    • ํŒŒ์ผ์— ์ž…๋ ฅํ•  ๋•Œ, ํƒ€์ž…์„ ์ง€์ •ํ•˜์—ฌ ์ž…๋ ฅํ–ˆ๊ฑฐ๋‚˜, ์›ํ•˜๋Š” ํƒ€์ž…์œผ๋กœ ์ฝ์–ด์˜ค๊ธฐ ๊ฐ€๋Šฅ
      • int i = in.readInt();, boolean b = in.readBoolean(); โ€ฆ
  • try-with-resources ๋ฌธ๋ฒ•

    • ์œ„์—์„œ ๋‹ค๋ฃฌ ๋ชจ๋“  ์ž…์ถœ๋ ฅ ๊ด€๋ จ ํด๋ž˜์Šค๋“ค์€ AutoClosable Interface ๋ฅผ implement ํ•˜๊ธฐ ๋•Œ๋ฌธ์—
      • try-with-resources ๋ฌธ๋ฒ•์— ์˜ํ•˜์—ฌ ๋ณ„๋„์˜ close() ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋จ
  • Char ๋‹จ์œ„ ์ž…์ถœ๋ ฅ (Console)

    • Class ์ด๋ฆ„์ด Reader ๋‚˜ Writer ๋กœ ๋๋‚จ
    • System.in ์€ ํ‚ค๋ณด๋“œ๋ฅผ ์˜๋ฏธ โ†’ InputStream type, ์ฆ‰ ์žฅ์‹ ๋Œ€์ƒ ํด๋ž˜์Šค
      • ์ฆ‰ ํ˜ผ์ž์„œ๋Š” ๋ชป ์“ฐ๊ธฐ ๋•Œ๋ฌธ์— InputStreamReader ํด๋ž˜์Šค๋ฅผ ์ด์šฉ
    • BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    • br.readLine() ์œผ๋กœ ํ•œ ์ค„์”ฉ ์ž…๋ ฅ๋ฐ›๊ธฐ ๊ฐ€๋Šฅ
  • Char ๋‹จ์œ„ ์ž…์ถœ๋ ฅ (File)

    • BufferedReader br = new BufferedReader(new FileReader("data.txt"))
      • ํŒŒ์ผ์—์„œ ์ฝ์–ด์˜ค๊ธฐ ์œ„ํ•˜์—ฌ FileReader ํด๋ž˜์Šค ์ด์šฉ
      • ํ•ด๋‹น ํŒŒ์ผ์—์„œ ํ•œ ์ค„์”ฉ ์ฝ์–ด์˜ค๊ธฐ ์œ„ํ•˜์—ฌ BufferedReader ํด๋ž˜์Šค ์ด์šฉ
        • readLine() method ๋Š” ํŒŒ์ผ์—์„œ ๋” ์ด์ƒ ์ฝ์–ด์˜ฌ ๋‚ด์šฉ์ด ์—†์„ ๋•Œ, null ์„ return
    • PrintWriter pw = new PrintWriter(new FileWriter("test.txt"));
      • ํŒŒ์ผ์— ์“ฐ๊ธฐ๋ฅผ ์œ„ํ•˜์—ฌ ๊ธฐ๋ณธ์ ์œผ๋กœ FileWriter ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ 
        • ์ด์— ๋Œ€ํ•œ Decorator ๋กœ PrintWriter ๋ฅผ ์‚ฌ์šฉ
        • String line = br.readLine() ์œผ๋กœ ํŒŒ์ผ์—์„œ ํ•œ ์ค„์”ฉ ์ฝ์–ด์˜ค๊ณ ,
        • pw.println() ๋ฅผ ํ†ตํ•˜์—ฌ ํ•œ ์ค„์”ฉ ๋‹ค๋ฅธ ํŒŒ์ผ์— ์“ฐ๊ธฐ

06. ์–ด๋…ธํ…Œ์ด์…˜

  • annotation ์€ ํด๋ž˜์Šค๋‚˜ method ์œ„์— ๋ถ™์—ฌ์„œ ์‚ฌ์šฉ โ†’ @ ๋ฅผ ๋ถ™์—ฌ์„œ ์‚ฌ์šฉ
  • ์ด๋ฅผ ํ†ตํ•˜์—ฌ annotation ์— ์„ค์ •๋œ ๊ฐ’์„ ํ†ตํ•˜์—ฌ ํด๋ž˜์Šค๊ฐ€ ์ข€ ๋” ๋‹ค๋ฅด๊ฒŒ ์‹คํ–‰๋˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Œ
    • ์ด ๋•Œ๋ฌธ์— annotation ์„ ์ผ์ข…์˜ ์„ค์ • ํŒŒ์ผ์ฒ˜๋Ÿผ ์„ค๋ช…ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์กด์žฌ
  • Java ๊ฐ€ ์ œ๊ณตํ•˜๋Š” annotation ๋„ ์žˆ๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๋งŒ๋“œ๋Š” Custom Annotation ๋„ ์กด์žฌ
    • public @interface MyAnnotation {} ์„ ํ†ตํ•˜์—ฌ ์ƒ์„ฑ ๊ฐ€๋Šฅ
    • ์ด ๋•Œ, JVM ์‹คํ–‰ ์‹œ์— ํ•ด๋‹น annotation ์„ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก
    • @Rentention(RetentionPolicy.RUNTIME) ์„ ์œ„์— ๋ถ™์—ฌ์ฃผ์–ด์•ผ ํ•จ

07. ์“ฐ๋ ˆ๋“œ

  • ํ”„๋กœ์„ธ์Šค โ†’ ํ˜„์žฌ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ

  • Java ํ”„๋กœ๊ทธ๋žจ์€ JVM ์— ์˜ํ•˜์—ฌ ์‹คํ–‰๋จ โ†’ ์ด JVM ๋„ ์—ญ์‹œ ํ”„๋กœ๊ทธ๋žจ ์ค‘ ํ•˜๋‚˜

  • OS ์ž…์žฅ์—์„œ๋Š” Java ๋„ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ

  • ์˜ˆ๋ฅผ ๋“ค์–ด, Word ํ”„๋กœ๊ทธ๋žจ์ด ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋ผ๋ฉด โ†’ ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค ์•ˆ์—์„œ๋„ ๋งž์ถค๋ฒ• ๊ฒ€์‚ฌ, ๊ธ€ ์ž‘์„ฑ ๋“ฑ์˜ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ๋ฆ„์ด ๋™์‹œ์— ๋™์ž‘ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Œ โ†’ ๊ฐ๊ฐ์ด ๋ฐ”๋กœ Thread ์— ํ•ด๋‹น

  • Thread ๋งŒ๋“ค๊ธฐ

    • Thread ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์€
      • Thread ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š” ๋ฐฉ๋ฒ•
        • Thread ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” run() method ๋ฅผ overriding
        • Thread ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , Thread ๋ฅผ start() method ๋ฅผ ํ†ตํ•˜์—ฌ ์‹คํ–‰
      • Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•
        • Runnable ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” run() method ๋ฅผ implement
        • Runnable ๋กœ ์ƒ์„ฑํ•œ Thread ๋Š” Thread class ๋กœ ์ƒ์„ฑํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— Thread ๊ฐ€ ์•„๋‹˜, ๊ทธ๋ƒฅ Runnable ๊ฐ์ฒด์ผ ๋ฟ โ†’ start() method ๊ฐ€ ์—†์Œ
        • ๋”ฐ๋ผ์„œ, Thread t1 = new Thread(r1); ์ฒ˜๋Ÿผ Runnable ๊ฐ์ฒด๋ฅผ Thread ์ƒ์„ฑ์ž์— ๋„ฃ์–ด์„œ Thread ๋กœ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•จ
        • ์ดํ›„์— t1.start() ๋ฅผ ํ†ตํ•˜์—ฌ Thread ๋ฅผ ์‹คํ–‰
  • Thread ์™€ ๊ณต์œ  ๊ฐ์ฒด

    • ์—ฌ๋Ÿฌ ๊ฐœ์˜ Thread ๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜๋Š” ํ•˜๋‚˜์˜ ๊ฐ์ฒด
    • Java ์—์„œ Thread ๋Š” ๋™์‹œ์— ์‹คํ–‰๋จ โ†’ ๊ณต์œ  ๊ฐ์ฒด์˜ field ๋‚˜ method ์— ๋™์‹œ์— ์ ‘๊ทผํ•  ๊ฒฝ์šฐ
      • Race Condition ๋ฌธ์ œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ โ†’ synchronized keyword ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ
        • synchronized ๋Š” method ๋‚˜ block ์— ์‚ฌ์šฉ โ†’ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ Thread ๋งŒ ํ•ด๋‹น ์ฝ”๋“œ์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ฆ
        • ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ๋จผ์ € ํ˜ธ์ถœํ•œ method ๊ฐ€ Monitoring Lock ์„ ์–ป์Œ โ†’ ํ•ด๋‹น method ๊ฐ€ ์ข…๋ฃŒ๋˜๊ฑฐ๋‚˜ wait() ์„ ๋งŒ๋‚˜๊ธฐ ์ „๊นŒ์ง€๋Š” Lock ์„ ์œ ์ง€
        • ๋‹ค๋ฅธ Thread ๋“ค์€ Lock ์„ ๋†“์„ ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ
      • method ๊ธธ์ด ๊ฐ€ ๋งค์šฐ ๊ธด method ์ž์ฒด์— synchronized keyword ๋ฅผ ๊ฑธ์–ด๋ฒ„๋ฆผ โ†’ ๋งˆ์ง€๋ง‰์— ๋Œ€๊ธฐํ•˜๋Š” Thread ๊ฐ€ starving ํ•  ์ˆ˜ ์žˆ์Œ โ†’ ๋”ฐ๋ผ์„œ Race Condition ์ด ๋ฐœ์ƒํ•  ๊ฒƒ ๊ฐ™์€ ๋ถ€๋ถ„์—๋งŒ ๋ถ€๋ถ„์ ์œผ๋กœ synchronized(this) { count++; } ๊ณผ ๊ฐ™์ด synchronized block ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋จ
  • Thread ์™€ ์ƒํƒœ์ œ์–ด

    • OS ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ Thread ๋ฅผ ์ž˜๊ฒŒ ์ชผ๊ฐœ์„œ ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉฐ ์‹คํ–‰ โ†’ ๋งˆ์น˜ ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž„
    • Thread ๋Š” ์‹คํ–‰๊ฐ€๋Šฅ์ƒํƒœ์ธ Runnable ๊ณผ ์‹คํ–‰ ์ƒํƒœ์ธ Running ์ƒํƒœ๋กœ ๋‚˜๋‰จ
      • Runnable ์€ ๊ณง ์ฐจ๋ก€์— CPU ์ž์›์„ ๋ฐ›๋Š”๋‹ค๋Š” ๊ฒƒ์ด๊ณ , Running ์€ ์ง€๊ธˆ ํ˜„์žฌ CPU ์ž์›์„ ๋ฐ›์•„์„œ ์‹คํ–‰ ์ค‘์ด๋ผ๋Š” ๊ฒƒ
    • ์‹คํ–‰๋˜๋Š” Thread ์•ˆ์—์„œ Thread.sleep() ํ˜ธ์ถœ๋˜๋ฉด โ†’ ํ•ด๋‹น Thread ๋Š” Time Waiting ์ƒํƒœ
      • wait()method ๊ฐ€ ํ˜ธ์ถœ์ด ๋˜๋ฉด โ†’ Thread ๋Š” Waiting ์ƒํƒœ
    • Thread.sleep() ์€ ํŠน์ •์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ์ž์‹  ์Šค์Šค๋กœ ๋ธ”๋ก์ƒํƒœ์—์„œ ๋น ์ ธ๋‚˜์™€ Runnable ๋กœ ๋ณต๊ท€
    • ํ˜„์žฌ Thread ๊ฐ€ wait() method ๋ฅผ ํ†ตํ•ด์„œ ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋๋‚˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆด ๋•Œ, ๊ทธ ๋‹ค๋ฅธ Thread ๋‚˜ ๋˜๋‹ค๋ฅธ Thread ์—์„œ notify() ๋‚˜ notifyAll() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์—๋Š” Waiting ์ƒํƒœ์—์„œ ํ•ด์ œ๋˜์ง€ ์•Š์Œ
    • wait() method ๋Š” ํ˜ธ์ถœ์ด ๋˜๋ฉด Monitoring Lock ์„ ๋†“๊ฒŒ ๋จ โ†’ ๊ทธ๋ž˜์„œ ๋Œ€๊ธฐ์ค‘์ธ ๋‹ค๋ฅธ ๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํ–‰๋จ
    • Thread ์˜ run() method ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด, Thread ๋Š” ์ข…๋ฃŒ๋จ โ†’ ์ฆ‰ Dead ์ƒํƒœ
    • Thread ์˜ yeild() method ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ํ•ด๋‹น Thread ๋Š” ๋‹ค๋ฅธ Thread ์—๊ฒŒ ์ž์›์„ ์–‘๋ณด
    • Thread๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” join() method ๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด โ†’ ํ•ด๋‹น Thread ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ํ˜„์žฌ Thread ๋Š” ๋ฉˆ์ถฐ์„œ ๋Œ€๊ธฐ (Blocked ์ƒํƒœ)
  • ๋ฐ๋ชฌ ์“ฐ๋ ˆ๋“œ (Daemon Thread)

    • Daemon ์ด๋ผ๋Š” ๊ฒƒ โ†’ ๋ฆฌ๋ˆ…์Šค, ์œ ๋‹‰์Šค ๊ณ„์—ด์—์„œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ๋™์ž‘ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ
    • Daemon Thread ๋Š” ์ผ๋ฐ˜ Thread ๊ฐ€ ๋ชจ๋‘ ์ข…๋ฃŒ๋˜๋ฉด ๊ฐ•์ œ์ ์œผ๋กœ ์ข…๋ฃŒ๋จ
    • Daemon Thread ๋กœ ์ง€์ •ํ•  Thread ๋Š” t1.start() ์ด์ „์— t1.setDaemon(true) ๋ฅผ ์‚ฌ์šฉ

08. ๋žŒ๋‹ค

  • Interface ์ค‘, method ๋ฅผ ํ•˜๋‚˜๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” Interface ๋ฅผ ํ•จ์ˆ˜ํ˜• Interface ๋ผ๊ณ  ํ•จ
    • ex) Runnerable Interface โ†’ run() ํ•˜๋‚˜๋งŒ ๊ฐ–๊ณ  ์žˆ์Œ
public class LambdaExam {
	public static void main(String[] args) {
		new Thread(new Runnable() {
			public void run() {
				for(int i = 0; i < 10; i++) {
					System.out.println("hello");
				}
			}
		}).start();
	}   
}
  • ์œ„์™€ ๊ฐ™์ด Thread ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ์—๋Š” Runnable ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ์ž์— ๋„ฃ์–ด์•ผ ํ•จ
  • ์ด๋•Œ, ๋ฐ”๋กœ Runnable ์˜ run() method ๋ฅผ overriding ํ•  ์ˆ˜ ์žˆ์Œ
  • ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์— ์ƒ์„ฑ๋œ Thread ๋ฅผ ๋ฐ”๋กœ .start() ๋ฅผ ํ†ตํ•ด ์‹คํ–‰ ๊ฐ€๋Šฅ
  • ๊ทธ๋Ÿฐ๋ฐ ๋„ˆ๋ฌด ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•จ
    • Java 8 ๋ฒ„์ „๋ถ€ํ„ฐ Lambda Expression ์„ ์ง€์›
    • Lambda Expression ์€ ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์‚ฌ์šฉ
    • ๋ถˆํ•„์š”ํ•œ ํด๋ž˜์Šค ์ •์˜ ์—†์ด ์งง๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฝ”๋“œ ์ž‘์„ฑ ๊ฐ€๋Šฅ
public class LambdaExam {  
	public static void main(String[] args) {
		new Thread( () -> {
			for(int i = 0; i < 10; i++) {
				System.out.println("hello");
			}
		}).start();
	}   
}
  • JVM ์ด Thread ์ƒ์„ฑ์ž๋ฅผ ๋ณด๊ณ , ํ•ด๋‹น ์ƒ์„ฑ์ž์— ์ „๋‹ฌ๋  ๊ฐ์ฒด๊ฐ€ Runnable ์ž„์„ ํŒŒ์•…

    • โ†’ ์ดํ›„์— ๋“ฑ์žฅํ•˜๋Š” ๋žŒ๋‹ค์‹์„, Runnable ์„ ๊ตฌํ˜„ํ•˜๋Š” ์ฝ”๋“œ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™์œผ๋กœ Runnable ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ Thread ์ƒ์„ฑ์ž์˜ parameter ๋กœ ๋„ฃ์–ด์คŒ
  • ๋žŒ๋‹ค์‹ ๋ฌธ๋ฒ•

    • (๋งค๊ฐœ๋ณ€์ˆ˜ ๋ชฉ๋ก) โ†’ { ์‹คํ–‰๋ฌธ }