๐Ÿ“š
TIL
  • README
  • Git
    • Basic
    • Remote Repository
    • Log & Diff
    • Rebase&Cherri-Pick
    • git-flow
  • DevOps
    • Monolithic vs MSA
    • Jenkins ์‹œ์ž‘ํ•˜๊ธฐ
    • Airflow ์‹œ์ž‘ํ•˜๊ธฐ
    • Airflow ์‹œ์ž‘ํ•˜๊ธฐ
    • Build Tools
      • maven
  • ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•๋ก 
    • TDD
  • Spring
    • IoC
    • Is Spring Bean Thread-Safe?
    • Spring Singleton
    • Component Scan
    • Spring Annotation
    • ์˜์กด ๊ด€๊ณ„ ์ฃผ์ž…(DI)
    • Lombok ํ™œ์šฉํ•˜๊ธฐ
    • Bean ์ƒ๋ช…์ฃผ๊ธฐ์™€ ์ฝœ๋ฐฑ
    • Bean Scope
    • AOP(1) - AOP๋ž€
    • AOP(2) - Aop Proxy
    • AOP(3) - Dynamic Proxy
    • AOP(4) - AspectJ
    • POJO
    • Spring ์„œ๋น„์Šค ๊ตฌ์กฐ
    • Transaction
    • JPA๋ž€?
    • JPA Entity
    • Spring Data JPA
    • Spring Data Specification
    • Model Mapping
    • Cache
    • restTemplate
    • YAML ํŒŒ์ผ ์„ค์ •
    • Spring Boot
      • H2 DB ์„ค์ •
      • ๋‹ค์ค‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์ •
      • Mybatis ์—ฐ๋™ํ•˜๊ธฐ
    • Spring Batch
      • Batch ์‹œ์ž‘ํ•ด๋ณด๊ธฐ
      • Batch Job Flow
      • Job
      • Step
      • Batch Scope & Job Parameter
      • JobRepository์™€ ๋ฉ”ํƒ€ํ…Œ์ด๋ธ”
      • Chunk ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
      • ItemReader
      • ItemProcessor
      • ItemWriter
      • Batch Schedular
      • Job๋ณ„ Bean๋“ฑ๋กํ•˜๊ธฐ
      • Batch ๊ตฌํ˜„์‹œ ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜ ์ •๋ฆฌ
      • Spring Batch Scaling
        • Multithread Job๊ตฌํ˜„์‹œ ์ด์Šˆ์‚ฌํ•ญ
    • Spring test
      • Junit5
        • ํ…Œ์ŠคํŠธ ์ด๋ฆ„ ํ‘œ๊ธฐ
        • ํ…Œ์ŠคํŠธ ๊ทธ๋ฃน ์‚ฌ์ด์˜ ๊ด€๊ณ„
        • ํƒœ๊ทธ์™€ ํ•„ํ„ฐ๋ง
        • ๋™์  ํ…Œ์ŠคํŠธ
        • ํ…Œ์ŠคํŠธ LifeCycle
        • ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ
        • ํ…Œ์ŠคํŠธ ์ˆœ์„œ
        • AssertJ
        • ํ…Œ์ŠคํŠธ ๋ณ‘๋ ฌ ์‹คํ–‰
        • AssertJ
        • Mock
      • Spring Boot Test DB ๋ถ„๋ฆฌ
      • Spring Batch Test
  • Web Application
    • Web Server & WAS
    • ๊ด€๋ จ ๊ฐœ๋… - HTTP API, HTML, CSR, SSR
    • Servlet
    • JSP
    • Cookie And Session
    • ์˜ˆ์™ธํŽ˜์ด์ง€
    • Java Bean
    • JDBC
    • Connection Pool
    • ํŒŒ์ผ ์—…๋กœ๋“œ
    • Expression Language
    • JSTL
    • FrontControllerํŒจํ„ด Command ํŒจํ„ด
    • Forwarding
    • MVC
    • ํšŒ์›๊ฐ€์ž…์˜ˆ์ œ
    • ์ฐธ๊ณ 
      • ๊ฐœ๋ฐœํ™˜๊ฒฝ์„ค์ •
  • Java+
    • SOAP/WSDL vs REST
    • WSDL์„ JAVA๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ
    • SOAP ํ†ต์‹  OPEN API๋กœ ๊ฐœ๋ฐœํ•ด๋ณด๊ธฐ
  • Java
    • Basic
      • ๋ณ€์ˆ˜์™€ ํƒ€์ž…
      • ์—ฐ์‚ฐ์ž
      • ์กฐ๊ฑด๋ฌธ๊ณผ ๋ฐ˜๋ณต๋ฌธ
      • ์ฐธ์กฐ ํƒ€์ž…
      • ํด๋ž˜์Šค
      • ์ƒ์†(Inheritance)
      • ์ธํ„ฐํŽ˜์ด์Šค(Interface)
      • ์ค‘์ฒฉ ํด๋ž˜์Šค์™€ ์ค‘์ฒฉ ์ธํ„ฐํŽ˜์ด์Šค
      • ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
      • API - Object, System, Class, Math, Wrapper
      • API - String, StringBuffer, StringBuilder
      • Thread
      • Generic
      • Lambda
      • Collection - List, Set
      • Collection - Map
      • Collection - Tree
      • Collection - Stack, Queue
      • Stream
      • Reflection
      • ์ •๊ทœํ‘œํ˜„์‹
      • GUI
      • UML
      • Serializable
    • Advanced
      • OutOfMemoryError
      • AutoValue
      • meta-annotation
        • @Retention
        • @Target
        • @Repeatable
    • Effective Java 3/E
      • ITEM 1: Static Factory Method(์ •์  ๋ฉ”์†Œ๋“œ)
      • ITEM 2: Builder Pattern
      • ITEM 3: Singleton
      • ITEM 4: Private Constructor
      • ITEM 5: Dependency Injection
      • ITEM 6: Avoid Unnecessary Object
      • ITEM 7: Eliminate Object Reference
      • ITEM 8: Avoid finalizer and cleaner
      • ITEM 9: try-with-resources
      • ITEM 10: The gerneral contract when overriding equlas
      • ITEM 11: Overriding hashCode
      • ITEM 12: overriding toString
      • ITEM 13: overriding clone judiciously
      • ITEM 14: Consider implementing comparable
      • ITEM 15: ํด๋ž˜์Šค์™€ ๋ฉค๋ฒ„์˜ ์ ‘๊ทผ์„ ์ตœ์†Œํ™”ํ•ด๋ผ
      • ITEM 16: Use Accessor methods
      • ITEM 17: ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์„ ์ตœ์†Œํ™”ํ•ด๋ผ(๋ถˆ๋ณ€ ํด๋ž˜์Šค)
      • ITEM 18: ์ƒ์†๋ณด๋‹จ ์ปดํฌ์ง€์…˜์„ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 19: ์ƒ์†์„ ๊ณ ๋ คํ•ด ์„ค๊ณ„ํ•˜๊ณ  ๋ฌธ์„œํ™”ํ•ด๋ผ
      • ITEM 20: ์ถ”์ƒ ํด๋ž˜์Šค๋ณด๋‹ค ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์šฐ์„ ํ•˜๋ผ
      • ITEM 21: ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ตฌํ˜„ํ•˜๋Š” ์ชฝ์„ ์ƒ๊ฐํ•ด ์„ค๊ณ„ํ•ด๋ผ.
      • ITEM 22: ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํƒ€์ž…์„ ์ •์˜ํ•˜๋Š” ์šฉ๋„๋กœ๋งŒ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 23: ํƒœ๊ทธ ๋‹ฌ๋ฆฐ ํด๋ž˜์Šค๋ณด๋‹ค ํด๋ž˜์Šค ๊ณ„์ธต๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•ด๋ผ
      • ITEM 24: ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋Š” ๋˜๋„๋ก static์œผ๋กœ ๊ตฌํ˜„ํ•ด๋ผ
      • ITEM 25: ํ†ฑ๋ ˆ๋ฒจ ํด๋ž˜์Šค๋Š” ํ•œ ํŒŒ์ผ์— ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•ด๋ผ.
      • ITEM 26: Raw type์€ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ๋ผ
      • ITEM 27: ๋น„๊ฒ€์‚ฌ ๊ฒฝ๊ณ ๋ฅผ ์ œ๊ฑฐํ•ด๋ผ
      • ITEM 28: ๋ฐฐ์—ด๋ณด๋‹ค๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 29: ์ด์™•์ด๋ฉด ์ œ๋„ค๋ฆญ ํƒ€์ž…์œผ๋กœ ๋งŒ๋“ค์–ด๋ผ
      • ITEM 30: ์ด์™•์ด๋ฉด ์ œ๋„ค๋ฆญ ๋ฉ”์„œ๋“œ๋กœ ๋งŒ๋“ค์–ด๋ผ
      • ITEM 31 : ํ•œ์ •์  ์™€์ผ๋“œ์นด๋“œ๋ฅผ ์‚ฌ์šฉํ•ด API ์œ ์—ฐ์„ฑ์„ ๋†’์—ฌ๋ผ
      • ITEM 32: ์ œ๋„ค๋ฆญ๊ณผ ๊ฐ€๋ณ€์ธ์ˆ˜๋ฅผ ํ•จ๊ป˜ ์“ธ ๋•Œ๋Š” ์‹ ์ค‘ํ•ด๋ผ
      • ITEM 33: ํƒ€์ž… ์•ˆ์ „ ์ด์ข… ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ณ ๋ คํ•ด๋ผ
      • ITEM 34: int ์ƒ์ˆ˜ ๋Œ€์‹  ์—ด๊ฑฐ ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 35: ordinal ๋ฉ”์„œ๋“œ ๋Œ€์‹  ์ธ์Šคํ„ด์Šค ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 36: ๋น„ํŠธ ํ•„๋“œ ๋Œ€์‹  EnumSet์„ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 37: ordinal ์ธ๋ฑ์‹ฑ ๋Œ€์‹  EnumMap์„ ์‚ฌ์šฉํ•ด๋ผ
      • TEM 38 : ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์—ด๊ฑฐํƒ€์ž…์ด ํ•„์š”ํ•˜๋ฉด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 39: ๋ช…๋ช… ํŒจํ„ด๋ณด๋‹ค ์• ๋„ˆํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 40: @Override ์–ด๋…ธํ…Œ์ด์…˜์„ ์ผ๊ด€๋˜๊ฒŒ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 41: ์ •์˜ํ•˜๋ ค๋Š” ๊ฒƒ์ด ํƒ€์ž…์ด๋ผ๋ฉด ๋งˆ์ปค ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 42: ์ต๋ช… ํด๋ž˜์Šค๋ณด๋‹ค๋Š” ๋žŒ๋‹ค๋ฅผ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 43: ๋žŒ๋‹ค๋ณด๋‹ค๋Š” ๋ฉ”์„œ๋“œ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 44: ํ‘œ์ค€ ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 45: ์ŠคํŠธ๋ฆผ์€ ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 46: ์ŠคํŠธ๋ฆผ์—์„œ ๋ถ€์ž‘์šฉ ์—†๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 47: ๋ฐ˜ํ™˜ ํƒ€์ž…์œผ๋กœ๋Š” ์ŠคํŠธ๋ฆผ๋ณด๋‹ค ์ปฌ๋ ‰์…˜์ด ๋‚ซ๋‹ค.
      • ITEM 48: ์ŠคํŠธ๋ฆผ ๋ณ‘๋ ฌํ™”๋Š” ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 49: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์œ ํšจํ•œ์ง€ ๊ฒ€์‚ฌํ•ด๋ผ
      • ITEM 50: ์ ์‹œ์— ๋ฐฉ์–ด์  ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค์–ด๋ผ
      • ITEM 51: ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ์‹ ์ค‘ํžˆ ์„ค๊ณ„ํ•ด๋ผ
      • ITEM 52: ๋‹ค์ค‘์ •์˜๋Š” ์‹ ์ค‘ํžˆ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 53: ๊ฐ€๋ณ€์ธ์ˆ˜๋Š” ์‹ ์ค‘ํžˆ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 54: null์ด ์•„๋‹Œ, ๋นˆ ์ปฌ๋ ‰์…˜์ด๋‚˜ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ด๋ผ
      • ITEM 55: Optional ๋ฐ˜ํ™˜์€ ์‹ ์ค‘ํ•˜๊ฒŒ ํ•ด๋ผ
      • ITEM 56: ๊ณต๊ฐœ๋œ API ์š”์†Œ์—๋Š” ํ•ญ์ƒ ์ฃผ์„์„ ์ž‘์„ฑํ•ด๋ผ
      • ITEM 57: ์ง€์—ญ๋ณ€์ˆ˜์˜ ๋ฒ”์œ„๋ฅผ ์ตœ์†Œํ™”ํ•ด๋ผ
      • ITEM 58: ์ „ํ†ต์ ์ธ for ๋ฌธ๋ณด๋‹ค๋Š” for-each๋ฌธ์„ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 59: ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ตํžˆ๊ณ  ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 60: ์ •ํ™•ํ•œ ๋‹ต์ด ํ•„์š”ํ•˜๋‹ค๋ฉด float์™€ double์€ ํ”ผํ•ด๋ผ
      • ITEM 61: ๋ฐ•์‹ฑ๋œ ๊ธฐ๋ณธ ํƒ€์ž…๋ณด๋‹ค๋Š” ๊ธฐ๋ณธ ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 62: ๋‹ค๋ฅธ ํƒ€์ž…์ด ์ ์ ˆํ•˜๋‹ค๋ฉด ๋ฌธ์ž์—ด ์‚ฌ์šฉ์„ ํ”ผํ•ด๋ผ
      • ITEM 63: ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ์€ ๋А๋ฆฌ๋‹ˆ ์ฃผ์˜ํ•ด๋ผ
      • ITEM 64: ๊ฐ์ฒด๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด ์ฐธ์กฐํ•ด๋ผ
      • ITEM 65: ๋ฆฌํ”Œ๋ ‰์…˜๋ณด๋‹ค๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 66: ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ๋Š” ์‹ ์ค‘ํžˆ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 67: ์ตœ์ ํ™”๋Š” ์‹ ์ค‘ํžˆ ํ•ด๋ผ
      • ITEM 68: ์ผ๋ฐ˜์ ์œผ๋กœ ํ†ต์šฉ๋˜๋Š” ๋ช…๋ช… ๊ทœ์น™์„ ๋”ฐ๋ผ๋ผ
    • ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„ ์›์น™(SOLID)
    • ๋””์ž์ธํŒจํ„ด
      • Strategy Pattern
      • Template Method Pattern
      • Factory Method Pattern
      • Singleton
      • Delegation
      • Proxy
      • Adapter Pattern
    • ์‹ค์Šต
      • ์ธํ„ฐํŽ˜์ด์Šค ์‹ค์Šต - Vehicle
      • ์ธํ„ฐํŽ˜์ด์Šค ์‹ค์Šต - Remote
      • GUI ์‹ค์Šต - Calculator
      • GUI ์‹ค์Šต - button
      • GUI ์‹ค์Šต - lotto
      • Thread ์‹ค์Šต - ์ขŒ์„์˜ˆ์•ฝ, ๋ฉ”์„ธ์ง€๋ณด๋‚ด๊ธฐ
    • Jar vs War
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
    • KEY
    • Index
    • Transaction
    • Trigger
    • Procedure / Function
    • Package
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐฐ์›€ํ„ฐ
      • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ
      • ๊ด€๊ณ„๋ฐ์ดํ„ฐ ๋ชจ๋ธ
      • ๊ด€๊ณ„๋Œ€์ˆ˜์™€ SQL
    • MySQL
      • Database๋ž€
      • MySQL ์‹œ์ž‘ํ•˜๊ธฐ
      • MySQL Database
      • MySQL Table
      • CRUD
      • ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
      • Server์™€ Client
    • PostgreSQL
    • NoSQL
      • Install Cassandra on mac
      • Cassandra๋ž€?
      • NiFi๋ž€
  • Algorithm
    • String
    • Recursion
    • Dynamic Programming
    • Array, Struct, Pointer
    • Math
    • Sort
    • List
    • Stack
    • Queue
    • Graph
    • Tree
    • Maze
    • AVL
    • ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ(Binary Search Tree)
    • DFS์™€ BFS
    • ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜(Dijkstra's Algorithm)
    • Red-Black ํŠธ๋ฆฌ
    • A* ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • Heap
    • Huffman Coding
    • Priority Queue
    • Bellman-Ford ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • C++
      • Class
      • STL
        • STL pair
        • STL Container - Associate Container
        • STL Container - Sequence Container
        • STL Container - Container Adapter
  • JavaScript
    • JABASCRIPT BASIC
    • Shallow Copy vs Deep Copy
    • OBJECT MODEL
    • NODE
    • ๋™๊ธฐ ์ฒ˜๋ฆฌ vs ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ
    • AJAX
    • CALLBACK
    • PROMISE
    • DEFERRER
    • UNDERSCORE
    • WEBPACK
    • SCOPE
    • EXECUTION CONTEXT
    • Image Object
    • BFCache๋ž€?
    • history.scrollRestoration
    • Intersection Observer
    • JWT - JSON Web Token
    • HTML vs JSON
  • Vue.js
    • ํ™˜๊ฒฝ์„ค์ •
    • Vue.js๋ž€?
    • Vue Instance
    • Vue Component
    • Vue Router
    • HTTP ํ†ต์‹ 
    • Template
    • Single File Component
    • Vue Animation
    • Vuex
    • Djnago์™€ ์—ฐ๋™ํ•˜๊ธฐ
  • Backbone.js
    • Model
    • Collection
    • Sync
    • view
  • Node.js
    • Doit! - ๋…ธ๋“œ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋Œ€ํ‘œ์ ์ธ ์„œ๋ฒ„์™€ ์šฉ๋„
    • Doit! - ๋…ธ๋“œ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ  ๊ฐœ๋ฐœ ๋„๊ตฌ ์„ค์น˜ํ•˜๊ธฐ
    • Doit! - ๋…ธ๋“œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ดํŽด๋ณด๊ธฐ
    • Doit! - ๋…ธ๋“œ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ์นœํ•ด์ง€๊ธฐ
    • Doit! - ๋…ธ๋“œ์˜ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ ์•Œ์•„๋ณด๊ธฐ
    • Doit! - ์›น ์„œ๋ฒ„ ๋งŒ๋“ค๊ธฐ
    • Doit! - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉํ•˜๊ธฐ
    • Doit! - ์ต์Šคํ”„๋ ˆ์Šค ํ”„๋กœ์ ํŠธ๋ฅผ ๋ชจ๋“ˆํ™”ํ•˜๊ธฐ
    • Doit! - ๋ทฐ ํ…œํ”Œ๋ฆฟ ์ ์šฉํ•˜๊ธฐ
    • Doit! - ํŒจ์ŠคํฌํŠธ๋กœ ์‚ฌ์šฉ์ž ์ธ์ฆํ•˜๊ธฐ
    • Doit! - ์ฑ„ํŒ…์„œ๋ฒ„ ๋งŒ๋“ค๊ธฐ
    • Doit! - JSON-RPC ์„œ๋ฒ„ ๋งŒ๋“ค๊ธฐ
  • Python
    • Warning-Could not import the lzma module
    • Pandas
      • Pandas ์ž๋ฃŒ๊ตฌ์กฐ
      • Pandas ๋ฐ์ดํ„ฐ ์ž…์ถœ๋ ฅ
      • DataFrame Data ์‚ดํŽด๋ณด๊ธฐ
      • ์‹œ๊ฐํ™” ๋„๊ตฌ - Matplotlib
  • ML
    • ์ถ”์ฒœ ์‹œ์Šคํ…œ
      • Collaborative Filtering
      • Matrix Factorization
  • Django
    • Basic
      • ํ™˜๊ฒฝ์„ค์ •
      • About Django
      • Start Django Project
      • Secret Key ๊ด€๋ฆฌํ•˜๊ธฐ
      • Settings ๋ถ„๋ฆฌํ•˜๊ธฐ
      • Django App
      • Django View & URL (1)
      • Django Model
        • MySQL ์—ฐ๋™
      • Django Admin
      • Django View & URL (2)
      • Django Template
      • Django Template & View & URL
      • Django Static
      • Django form
    • Advanced
      • Django Generic View
      • Django Automated Testing
      • Django Extenstion Template
      • Django Model Package
      • Django OpenSSL setting
    • REST framework
      • Rest API
      • Serializers
      • ViewSet
    • Error
      • ํ™˜๊ฒฝ์„ค์ • zlib ์˜ค๋ฅ˜๋ฐœ์ƒ
      • ModuleNotFoundError
    • ํŒจํ‚ค์ง€
      • django-debug-toolbar
    • Vue.js ์—ฐ๋™ํ•˜๊ธฐ
  • Ruby
    • variable & input/output
    • ์กฐ๊ฑด๋ฌธ
    • ๋ฐ˜๋ณต๋ฌธ
    • Array & Hash
    • Method
    • Proc&Lamda
    • Class
  • Ruby on Rails
    • Scaffolding
    • Controller
    • Model
    • Model-M:N relation
    • Model Validation
    • ๋ฉ‹์‚ฌ 10์ฃผ์ฐจ ์ˆ˜์—…(Tip)
  • HTML/CSS
    • Udacity - Intro to HTML/CSS
    • Udacity - Responsive Web Design
    • Udacity - Responsive Images
    • HTML Basic
    • CSS Basic
    • HTML5 Sementic Tag
    • HTML ํ…์ŠคํŠธ ๊ด€๋ จ ํƒœ๊ทธ๋“ค
    • HTML5 ๋ฉ€ํ‹ฐ๋ฏธ๋””์–ด
    • HTML ํผ ๊ด€๋ จ ํƒœ๊ทธ๋“ค
    • ํ…์ŠคํŠธ ๊ด€๋ จ ์Šคํƒ€์ผ
    • ์ƒ‰์ƒ๊ณผ ๋ฐฐ๊ฒฝ์„ ์œ„ํ•œ ์Šคํƒ€์ผ
    • ๋ ˆ์ด์•„์›ƒ์„ ์œ„ํ•œ ์Šคํƒ€์ผ
    • CSS ํฌ์ง€์…”๋‹
    • ๋‹ค์žฌ๋‹ค๋Šฅํ•œ CSS3 ์„ ํƒ์ž
    • CSS์™€ ์• ๋‹ˆ๋ฉ”์ด์…˜
    • ๋ฐ˜์‘ํ˜• ์›น์ด๋ž€?
  • OS(์šด์˜์ฒด์ œ)
    • Linux
      • Daemon
      • Cron
      • ํ”„๋กœ์„ธ์Šค ๊ด€๋ จ ๋ช…๋ น์–ด
      • ํ…์ŠคํŠธ ํŒŒ์ผ ๋ช…๋ น์–ด
  • Network
    • ๋„คํŠธ์›Œํฌ ๊ธฐ๋ณธ ๊ฐœ๋…
    • ๋„คํŠธ์›Œํฌ ๊ธฐ๋ณธ ๊ทœ์น™
    • ๋ฌผ๋ฆฌ ๊ณ„์ธต
    • ๋ฐ์ดํ„ฐ ๋งํฌ ๊ณ„์ธต
    • ๋„คํŠธ์›Œํฌ ๊ณ„์ธต
    • ์ „์†ก ๊ณ„์ธต
    • ์‘์šฉ ๊ณ„์ธต
    • ๋„คํŠธ์›Œํฌ ์ „์ฒด ํ๋ฆ„
    • ๋ฌด์„  ๋žœ
  • IT ๊ธฐํƒ€์ง€์‹
    • NAS๋ž€
Powered by GitBook
On this page
  • ์ŠคํŠธ๋ฆผ ์ข…๋ฅ˜
  • IntStream
  • File Stream
  • Pipeline
  • Optional Class
  • reduce
  • Collect
  • ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ
  • ์ฐธ๊ณ 

Was this helpful?

  1. Java
  2. Basic

Stream

PreviousCollection - Stack, QueueNextReflection

Last updated 3 years ago

Was this helpful?

Stream์€ Java8๋ถ€ํ„ฐ ์ถ”๊ฐ€๋œ Collection์˜ ์ €์žฅ ์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ์ฐธ์กฐํ•ด์„œ Lambda์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๋ฐ˜๋ณต์ž์ด๋‹ค.

Stream์€ Iterator์™€ ๋น„์Šทํ•œ ์—ญํ• ์„ ํ•˜๋Š” ๋ฐ˜๋ณต์ž ์ด์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•์„ ๊ฐ€์ง„๋‹ค.

  • ๋žŒ๋‹ค์‹์œผ๋กœ ์š”์†Œ ์ฒ˜๋ฆฌ ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

List<User> list = Arrays.asList(
	new User("Teddy", "testid", "testtest"),
	new User("faker", "hideOnBush", "testtest")
);		
		
Stream<User> stream = list.stream();
stream.forEach(s->{
	String name = s.getName();
	String id = s.getId();
	System.out.println(name + " : " + id);
});
  • ๋‚ด๋ถ€ ๋ฐ˜๋ณต์ž๋ฅผ ์‚ฌ์šฉํ•ด ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๊ฐ€ ์‰ฝ๋‹ค.

์™ธ๋ถ€ ๋ฐ˜๋ณต์ž(external iterator)๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ๋กœ ์ง์ ‘ Collection์˜ ์š”์†Œ๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ๊ฐ€์ ธ์˜ค๋Š” ํŒจํ„ด์„ ๋งํ•œ๋‹ค. for๋ฌธ, Iterator๋ฅผ ์ด์šฉํ•˜๋Š” whlie๋ฌธ ๋ชจ๋‘ ์™ธ๋ถ€ ๋ฐ˜๋ณต์ž๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

class Driver {
    public static void main(String[] args) {
      List<Integer> list = Arrays.asList(1,2,3,4,5,6);
      Iterator<Integer> iter = list.iterator();

      // ์ˆœ์„œ๋Œ€๋กœ 1 2 3 4 5 6 ์ถœ๋ ฅ
      while (iter.hasNext()) {
        System.out.println(iter.next());
      }
    }
}

๋‚ด๋ถ€ ๋ฐ˜๋ณต์ž(internal iterator)๋Š” Collection ๋‚ด๋ถ€์—์„œ ์š”์†Œ๋“ค์„ ๋ฐ˜๋ณต์‹œํ‚ค๊ณ , ๊ฐœ๋ฐœ์ž๋Š” ์š”์†Œ๋‹น ์ฒ˜๋ฆฌํ•ด์•ผํ•  ์ฝ”๋“œ๋งŒ ์ œ๊ณตํ•˜๋Š” ํŒจํ„ด์„ ๋งํ•œ๋‹ค. ๋‚ด๋ถ€ ๋ฐ˜๋ณต์ž๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐœ๋ฐœ์ž๋Š” ์š”์†Œ ์ฒ˜๋ฆฌ ์ฝ”๋“œ์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‚ด๋ถ€ ๋ฐ˜๋ณต์ž๋Š” ๋ณ‘๋ ฌ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ํšจ์œจ์ ์œผ๋กœ ์š”์†Œ๋ฅผ ๋ฐ˜๋ณต์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ์ŠคํŠธ๋ฆผ์„ ์ด์šฉํ•˜๋ฉด ์ฝ”๋“œ๋„ ๊ฐ„๊ฒฐํ•ด์ง€์ง€๋งŒ, ์š”์†Œ์˜ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๊ฐ€ Collecton ๋‚ด๋ถ€์—์„œ ์ฒ˜๋ฆฌ๋˜๋Š”๊ฒƒ์ด ๋” ์ข‹์€ ํšจ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

class Driver {
    public static void main(String[] args) {
      List<Integer> list = Arrays.asList(1,2,3,4,5,6);
      // Integer ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ–๋Š” Stream ์ƒ์„ฑ
      Stream<Integer> stream = list.stream();

      // forEach()๋ฅผ ์‚ฌ์šฉํ•ด์„œ 1 2 3 4 5 6 ์ถœ๋ ฅ
      stream.forEach((Integer i) -> { System.out.println(i); });
    }
}
public class PracticeExample{
  public static void main(String[] args){
		List<String> list = Arrays.asList("Faker", "Teddy", "Effort", "Wolf", "Bang", "Clid");
		Stream<String> stream = list.parallelStream(); // parallesStream : ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ
		stream.forEach(PracticeExample :: print);
  }
  public static void print(String str) {
		System.out.println(str + Thread.currentThread().getName());
	}
}
Wolfmain
FakerForkJoinPool.commonPool-worker-3
TeddyForkJoinPool.commonPool-worker-1
ClidForkJoinPool.commonPool-worker-2
BangForkJoinPool.commonPool-worker-3
Effortmain

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ŠคํŠธ๋ฆผ์€ ์ค‘๊ฐ„ ์ฒ˜๋ฆฌ์™€ ์ตœ์ข… ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

    • ์ค‘๊ฐ„ ์ฒ˜๋ฆฌ : ๋งคํ•‘, ํ•„ํ„ฐ๋ง, ์ •๋ ฌ

    • ์ตœ์ข… ์ฒ˜๋ฆฌ : ๋ฐ˜๋ณต, ์นด์šดํŒ…, ํ‰๊ท , ์ดํ•ฉ ๋“ฑ์˜ ์ง‘๊ณ„ ์ฒ˜๋ฆฌ

List<Student> sList = Arrays.asList(
				new Student("Faker", 50),
				new Student("Teddy", 30),
				new Student("Effort", 10));
		
double avg = sList.stream()
						.mapToInt(Student::getScore)	// ์ค‘๊ฐ„์ฒ˜๋ฆฌ
						.average()										// ์ตœ์ข…์ฒ˜๋ฆฌ
						.getAsDouble();
System.out.println(avg);

์ŠคํŠธ๋ฆผ ์ข…๋ฅ˜

BaseStream ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ๋ชจ๋“  ์ŠคํŠธ๋ฆผ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ณตํ†ต ๋ฉ”์†Œ๋“œ๋“ค์ด ์ •์˜ ๋˜์–ด์žˆ์œผ๋ฉฐ, ์ง์ ‘ ์‚ฌ์šฉ๋˜์ง€๋Š” ์•Š๋Š”๋‹ค.

๋ฆฌํ„ด ํƒ€์ž…
๋ฉ”์†Œ๋“œ
์†Œ์Šค

Stream<T>

java.util.Collection.stream() java.util.Collection.parallelStream()

Collection

Stream<T> IntStream LongStream DoubleStream

Arrays.stream(T[]) Stream.of(T[]) Arrays.stream(int[]) IntStream.of(int[]) Arrays.stream(long[]) LongStream.of(long[]) Arrays.stream(double[]) DoubleStream.of(double[])

๋ฐฐ์—ด

IntStream

IntStream.range(int, int) IntStream.rangeClosed(int, int)

int ๋ฒ”์œ„

LongStream

LongStream.range(long, long) LongStream.rangeClosed(long, long)

long ๋ฒ”์œ„

Stream<Path>

Files.find(Path, int, BiPredicate, FileVisitOption) Files.list(Path)

๋””๋ ‰ํ† ๋ฆฌ

Stream<String>

Files.lines(Path, Charset) Files.list(Path)

ํŒŒ์ผ

DoubleStream IntStream LongStream

Random.doubles() Random.ints() Random.longs()

๋žœ๋ค์ˆ˜

IntStream

IntStream stream = IntStream.rangeClosed(1,100); // 1<= a <=100 
stream.forEach(a -> sum += a);
System.out.println(sum); // 5050

rangeClosed๋Š” ๋‘๋ฒˆ์งธ ์ธ์ž๋ฅผ ํฌํ•จํ•˜๋ฉฐ, range๋Š” ๋‘๋ฒˆ์งธ ์ธ์ž๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.

File Stream

Path path = Paths.get("...");
Stream<String> stream;

stream = Files.lines(path, Charset.defaultCharset());
stream.forEach(System.out :: println); // s->System.out.println(s)์™€ ๊ฐ™๋‹ค.

File file = path.toFile();
FileReader fileReader = new FileReader(file);
BufferedReader br = new BufferedReader(fileReader);
stream = br.lines();
stream.forEach(System.out :: println);

Pipeline

๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•ด ์ถ•์†Œํ•˜๋Š” ๊ฒƒ์„ ์ผ๋ฐ˜์ ์œผ๋กœ Reduction์ด๋ผ๊ณ  ํ•œ๋‹ค. ๋ฐ์ดํ„ฐ์˜ ํ•ฉ๊ณ„, ํ‰๊ท ๊ฐ’, ์นด์šดํŒ…, ์ตœ๋Œ€, ์ตœ์†Œ๊ฐ’ ๋“ฑ์ด ๋Œ€ํ‘œ์ ์ธ ๋ฆฌ๋•์…˜์˜ ๊ฒฐ๊ณผ๋ฌผ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ ๊ฒฐ๊ณผ๋ฌผ๋กœ ๋ฐ”๋กœ ์ง‘๊ณ„ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ์ค‘๊ฐ„์ฒ˜๋ฆฌ(ํ•„ํ„ฐ๋ง, ๋งคํ•‘, ์ •๋ ฌ, ๊ทธ๋ฃนํ•‘)์ด ํ•„์š”ํ•˜๋‹ค.

ํŒŒ์ดํ”„๋ผ์ธ์€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ŠคํŠธ๋ฆผ์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๊ตฌ์กฐ๋ฅผ ๋งํ•˜๋ฉฐ, ์ตœ์ข…์ฒ˜๋ฆฌ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ชจ๋‘ ์ค‘๊ฐ„ ์ฒ˜๋ฆฌ ์ŠคํŠธ๋ฆผ์ด๋‹ค.

์ค‘๊ฐ„ ์ŠคํŠธ๋ฆผ์ด ์ƒ์„ฑ๋  ๋•Œ ์š”์†Œ๋“ค์ด ๋ฐ”๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ์ตœ์ข… ์ฒ˜๋ฆฌ๊ฐ€ ์‹œ์ž‘๋˜๊ธฐ ์ „๊นŒ์ง€ ์ค‘๊ฐ„์ฒ˜๋ฆฌ๋Š” ์ง€์—ฐ(lazy)๋˜๋ฉฐ, ์ตœ์ข… ์ฒ˜๋ฆฌ๊ฐ€ ์‹œ์ž‘๋˜๋ฉด ์ค‘๊ฐ„ ์ŠคํŠธ๋ฆผ์—์„œ ์ฒ˜๋ฆฌ๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค.

Stream<Member> mfStream = list.stream();
Stream<Member> mStream = mfStream.filter(m->m.getSex() == Member.MALE);
IntStream ageStream = mStream.mapToInt(Member::getAge());
Double ageAvg = ageStream.average().getAsDouble();
double ageAvg = list.stream()
  									.filter(m->m.getSex() == Member.MALE) // ์ค‘๊ฐ„์ฒ˜๋ฆฌ
  									.mapToInt(Member::getAge())						// ์ค‘๊ฐ„์ฒ˜๋ฆฌ
  									.average()														// ์ตœ์ข…์ฒ˜๋ฆฌ
  									.getAsDouble();

๋ฆฌํ„ดํƒ€์ž…์ด ์ŠคํŠธ๋ฆผ์ด๋ผ๋ฉด ์ค‘๊ฐ„ ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ์ด๊ณ , ๊ธฐ๋ณธํƒ€์ž… ์ด๊ฑฐ๋‚˜ OptionalXXX๋ผ๋ฉด ์ตœ์ข… ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ์ด๋‹ค.

Optional Class

Optional ํด๋ž˜์Šค๋Š” ์ €์žฅํ•˜๋Š” ๊ฐ’์˜ ํƒ€์ž…๋งŒ ๋‹ค๋ฅผ ๋ฟ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์€ ๊ฑฐ์˜ ๋™์ผํ•˜๋‹ค. Optional ํด๋ž˜์Šค๋Š” ๋‹จ์ˆœํžˆ ์ง‘๊ณ„ ๊ฐ’๋งŒ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ง‘๊ณ„ ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๋””ํดํŠธ ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ณ , ์ง‘๊ณ„ ๊ฐ’์„ ์ฒ˜๋ฆฌํ•˜๋Š” Consumer๋„ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฆฌํ„ดํƒ€์ž…
๋ฉ”์†Œ๋“œ(๋งค๊ฐœ ๋ณ€์ˆ˜)
์„ค๋ช…

boolean

isPresent()

๊ฐ’์ด ์ €์žฅ๋˜์–ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€

T double int long

orElse(T) orElse(double) orElse(int) orElse(long)

๊ฐ’์ด ์ €์žฅ๋˜์–ด ์žˆ์ง€ ์•Š์„ ๊ฒฝ์šฐ ๋””ํดํŠธ ๊ฐ’ ์ง€์ •

void

ifPresent(Consumer) ifPresent(DoubleConsumer) ifPresent(IntConsumer) ifPresent(LongConsumer)

๊ฐ’์ด ์ €์žฅ๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ Consumer์—์„œ ์ฒ˜๋ฆฌ

double avg = list.stream()
  								.mapToInt(Integer::intValue)
  								.average()
  								.orElse(0.0); // ๊ฐ’์ด ์ €์žฅ๋˜์ง€ ์•Š์„ ๊ฒฝ์šฐ defulat 0.0

list.stream()
  .mapToInt(Integer::intValue)
  .average()
  .ifPresent(a -> System.out.println(a)); // ๊ฐ’์ด ์กด์žฌํ•˜๋ฉด ์ถœ๋ ฅ

reduce

reduce๋Š” ์ŠคํŠธ๋ฆผ์˜ ๋ชจ๋“  ์›์†Œ๋“ค์„ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๋กœ ํ•ฉ์นœ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค
๋ฆฌํ„ด ํƒ€์ž…
๋ฉ”์†Œ๋“œ(๋งค๊ฐœ ๋ณ€์ˆ˜)

Stream

Optional<T>

reduce(BinaryOperator<T> accumulator)

T

reduce(T identity, BinaryOperator<T> accumulator)

IntStream

OptionalInt

reduce(IntBinaryOperator op)

int

reduce(int identity, IntBinaryOperator op)

LongStream

OptionalLong

reduce(LongBinaryOperator op)

long

reduce(long identity, LongBinaryOperator op)

DoubleStream

OptionalDouble

reduce(DoubleBinaryOperator op)

double

reduce(double identity, DoubleBinaryOperator op)

int sum = sutentList.stream()
  									.map(Student :: getScore)
  									.reduce((a,b) -> a+b)
  									.get();

ํ•™์ƒ๋“ค์˜ ์„ฑ์  ์ด์ ์„ ๊ตฌํ•˜๋Š” ์˜ˆ์‹œ์ด๋‹ค. ์—ฌ๊ธฐ์„œ ์ŠคํŠธ๋ฆผ์— ์š”์†Œ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ์— NoSuchElementException์ด ๋ฐœ์ƒํ•œ๋‹ค.

int sum = sutentList.stream()
  									.map(Student :: getScore)
  									.reduce(0, (a,b) -> a+b); // default 0

identity(๋””ํดํŠธ ๊ฐ’)์„ ์ฃผ์–ด, ์ŠคํŠธ๋ฆผ์— ์š”์†Œ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ์—๋Š” 0์„ ๋ฆฌํ„ดํ•˜๋Š” ์˜ˆ์‹œ์ด๋‹ค.

persons.stream()
			 .reduce(0, (sum, p) -> sum += p.age, (sum1, sum2) -> sum1 + sum2);

๋‹ค์Œ์€ 3๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์€ ์˜ˆ์‹œ์ด๋‹ค.

Integer ageSum = persons
    .parallelStream()
    .reduce(0,
        (sum, p) -> {
            System.out.format("accumulator: sum=%s; person=%s\n", sum, p);
            return sum += p.age;
        },
        (sum1, sum2) -> {
            System.out.format("combiner: sum1=%s; sum2=%s\n", sum1, sum2);
            return sum1 + sum2;
        });

// accumulator: sum=0; person=Pamela
// accumulator: sum=0; person=David
// accumulator: sum=0; person=Max
// accumulator: sum=0; person=Peter
// combiner: sum1=18; sum2=23
// combiner: sum1=23; sum2=12
// combiner: sum1=41; sum2=35

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ์‹คํ–‰๋˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

Collect

collect ๋ฉ”์†Œ๋“œ๋Š” ํ•„์š”ํ•œ ์š”์†Œ๋งŒ Collection์œผ๋กœ ๋‹ด์„ ์ˆ˜ ์žˆ๊ณ , ์š”์†Œ๋“ค์„ ๊ทธ๋ฃนํ•‘ํ•œ ํ›„ ์ง‘๊ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฆฌํ„ดํƒ€์ž…
๋ฉ”์†Œ๋“œ(๋งค๊ฐœ ๋ณ€์ˆ˜)
์ธํ„ฐํŽ˜์ด์Šค

R

collect(Collector<T,A,R> collertor)

Stream

๋งค๊ฐœ๊ฐ’์ธ Collector๋Š” ์–ด๋–ค ์š”์†Œ๋ฅผ ์–ด๋–ค Collection์— ์ˆ˜์ง‘ํ•  ๊ฒƒ์ธ์ง€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. Collectors ๊ตฌํ˜„ ๊ฐ์ฒด๋Š” ์•„๋ž˜ Collectors ํด๋ž˜์Šค์˜ ๋‹ค์–‘ํ•œ ์ •์  ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

๋ฆฌํ„ด ํƒ€์ž…
์ •์  ๋ฉ”์†Œ๋“œ
์„ค๋ช…

Collector<T, ?, List<T>>

toList()

T๋ฅผ List์— ์ €์žฅ

Collector<T, ?, Set<T>>

toSet()

T๋ฅผ Set์— ์ €์žฅ

Collector<T, ?, Collection<T>>

toCollection(Supplier<Collection<T>>)

T๋ฅผ Supplier๊ฐ€ ์ œ๊ณตํ•œ Collection์— ์ €์žฅ

Collertor<T, ?, Map<K,U>>

toMap( Function<T,K> keyMapper, Function<T,U> valueMapper)

T๋ฅผ K์™€ U๋กœ ๋งคํ•‘ํ•ด K๋ฅผ ํ‚ค๋กœ, U๋ฅผ ๊ฐ’์œผ๋กœ Map์— ์ €์žฅ

Collector<T, ?, ConcurrentMap<K,U>>

toConcurrentMap( Function<T,K> keyMapper, Function<T,U> valueMapper)

T๋ฅผ K์™€ U๋กœ ๋งคํ•‘ํ•ด K๋ฅผ ํ‚ค๋กœ, U๋ฅผ ๊ฐ’์œผ๋กœ ConcurrentMap์— ์ €์žฅ

List<Student> sList = Arrays.asList(
				new Student("Faker", 50, "a"),
				new Student("Teddy", 30, "b"),
				new Student("Effort", 10, "c"));
		
Map<String, Student> map = new HashMap<String,Student>();
map = sList.stream()
  				 .collect(Collectors.toMap(Student::getName, Function.identity(),
										(o1, o2) -> o1, HashMap::new));

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

collect๋Š” ๋‹จ์ˆœํžˆ ์š”์†Œ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๊ธฐ๋Šฅ ์™ธ์— Collection์˜ ์š”์†Œ๋ฅผ ๊ทธ๋ฃนํ•‘ํ•ด์„œ Map ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ๋„ ์ œ๊ณตํ•œ๋‹ค.

๋ฆฌํ„ด ํƒ€์ž…
์ •์ ๋ฉ”์†Œ๋“œ
์„ค๋ช…

Collertor<T, ?, Map<K,List<T>>>

groupingBy(Function<T,K> classfier)

T๋ฅผ K๋กœ ๋งคํ•‘ํ•˜๊ณ  Kํ‚ค์— ์ €์žฅ๋œ List์— T๋ฅผ ์ €์žฅํ•œ Map ์ƒ์„ฑ

Collertor<T, ?, ConcurrentMap<K,List<T>>>

groupingByConcurrent(Function<T,K> classfier)

Collertor<T, ?, Map<K, D>>

groupingBy( Function<T,K> classfier, Collector<T,A,D> collector)

T๋ฅผ K์— ๋งคํ•‘ํ•˜๊ณ  Kํ‚ค์— ์ €์žฅ๋œ D๊ฐ์ฒด์— T๋ฅผ ๋ˆ„์ ํ•œ Map ์ƒ์„ฑ

Collertor<T, ?, ConcurrentMap<K, D>>

groupingByConcurrent( Function<T,K> classfier, Collector<T,A,D> collector)

Collertor<T, ?, Map<K, D>>

groupingBy( Function<T,K> classfier, Supplier<Map<K,D>> mapFactory, Collector<T,A,D> collector)

T๋ฅผ K๋กœ ๋งคํ•‘ํ•˜๊ณ  Supplier๊ฐ€ ์ œ๊ณตํ•˜๋Š” Map์—์„œ Kํ‚ค์— ์ €์žฅ๋œ D๊ฐ์ฒด์— T๋ฅผ ๋ˆ„์ 

Collertor<T, ?, ConcurrentMap<K, D>>

groupingBy( Function<T,K> classfier, Supplier<ConcurrentMap<K,D>> mapFactory, Collector<T,A,D> collector)

Map<String, List<Student>> mapByGrade = sList.stream()
				.collect(Collectors.groupingBy(Student::getGrade));

๋‹ค์Œ ์˜ˆ์ œ๋Š” ์„ฑ์ ๋ณ„๋กœ ํ•ด๋‹น Student List๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

Map<Student.Sex, Double> mapBySex = totalList,stream()
  .collect(
  	Collectors.groupingBy(
      Student :: getSex,
      Collectors.averagingDouble(Student :: getScore)
    )
	);

๋‹ค์Œ์€ ์„ฑ๋ณ„๋กœ ํ‰๊ท  ์ ์ˆ˜๋ฅผ ์ €์žฅํ•œ Map์„ ๊ตฌํ˜„ํ•œ ์˜ˆ์ œ์ด๋‹ค. ์œ„์˜ ์˜ˆ์ œ ์ฒ˜๋Ÿผ ๊ทธ๋ฃนํ•‘ ํ›„์— ๋งคํ•‘์ด๋‚˜ ์ง‘๊ณ„(ํ‰๊ท , ์นด์šดํŒ…, ์—ฐ๊ฒฐ, ์ตœ๋Œ€, ์ตœ์†Œ, ํ•ฉ๊ณ„)๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ

๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ž€ ๋ฉ€ํ‹ฐ ์ฝ”์–ด CPU ํ™˜๊ฒฝ์—์„œ ํ•˜๋‚˜์˜ ์ž‘์—…์„ ๋ถ„ํ• ํ•ด์„œ ๊ฐ๊ฐ์˜ ์ฝ”์–ด๊ฐ€ ๋ณ‘๋ ฌ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๋งํ•˜๋ฉฐ, ์ž‘์—… ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. Java8๋ถ€ํ„ฐ ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค.

๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ๋Š” ๋™์‹œ์„ฑ(Concurrency)์™€ ๋ณ‘๋ ฌ์„ฑ(Parallelism)์œผ๋กœ ์‹คํ–‰๋˜๊ณ  ์žˆ๋‹ค.

  • ๋™์‹œ์„ฑ : ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉฐ ์‹คํ–‰ํ•˜๋Š” ์„ฑ์งˆ

  • ๋ณ‘๋ ฌ์„ฑ : ๋ฉ€ํ‹ฐ ์ฝ”์–ด๋ฅผ ์ด์šฉํ•ด ๋™์‹œ์— ์‹คํ–‰ํ•˜๋Š” ์„ฑ์งˆ

    • ๋ฐ์ดํ„ฐ ๋ณ‘๋ ฌ์„ฑ : ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์ชผ๊ฐœ์–ด ์„œ๋ธŒ ๋ฐ์ดํ„ฐ๋“ค๋กœ ๋งŒ๋“ค๊ณ  ์ด ๋ฐ์ดํ„ฐ๋“ค์„ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌํ•ด ์ž‘์—…์„ ๋นจ๋ฆฌ ๋๋‚ด๋Š” ๊ฒƒ(parallelStream)

    • ์ž‘์—… ๋ณ‘๋ ฌ์„ฑ : ์„œ๋กœ ๋‹ค๋ฅธ ์ž‘์—…์„ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ(Web Server : ๊ฐ๊ฐ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์š”์ฒญํ•œ ๋‚ด์šฉ์„ ๊ฐœ๋ณ„ ์Šค๋ ˆ๋“œ์—์„œ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌ)

์‹ฑ๊ธ€ ์ฝ”์–ด CPU๋ฅผ ์ด์šฉํ•œ ๋ฉ€ํ‹ฐ ์ž‘์—…์€ ๋ณ‘๋ ฌ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ, ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉฐ ์‹คํ–‰ํ•˜๋Š” ๋™์‹œ์„ฑ ์ž‘์—…์ด๋‹ค.

์ฐธ๊ณ 

์—์„œ ์ค‘๊ฐ„์ฒ˜๋ฆฌ, ์ตœ์ •์ฒ˜๋ฆฌ ๊ด€๋ จ ๋ฉ”์†Œ๋“œ ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Java Platform SE8
WRAITHKIM์˜ ์ง€์‹๊ณต๋ฐฉ - JAVA 8 ์ŠคํŠธ๋ฆผ ํŠœํ† ๋ฆฌ์–ผ
https://img1.daumcdn.net/thumb/R800x0/?scode=mtistory2&fname=https%3A%2F%2Fk.kakaocdn.net%2Fdn%2FbIkiar%2Fbtqv8ZcbOZx%2FklC5KFkgrq14Y5r7veUE11%2Fimg.png
https://2.bp.blogspot.com/-lVHntG4DKmE/WfH_1yMlyRI/AAAAAAAAD2g/4ZegKGLxz1kFI7ZSPETPpVvR4q_r1QbhgCLcBGAs/s1600/stream-api.png
https://img1.daumcdn.net/thumb/R800x0/?scode=mtistory2&fname=https%3A%2F%2Fk.kakaocdn.net%2Fdn%2Fn8du1%2FbtqyfZCGBVV%2Fo9D5OKGxRWBQG6x9i4ufC0%2Fimg.png
https://img1.daumcdn.net/thumb/R800x0/?scode=mtistory2&fname=https%3A%2F%2Fk.kakaocdn.net%2Fdn%2FbOal1L%2FbtqygTVOUmK%2F91WGSPZR5JEeSERr86UB2k%2Fimg.png
https://t1.daumcdn.net/cfile/tistory/216AD74555EFB2F02E
https://img1.daumcdn.net/thumb/R800x0/?scode=mtistory2&fname=https%3A%2F%2Fk.kakaocdn.net%2Fdn%2FCxC94%2FbtqwVThGa7H%2F96yyfojioFOPKZPjKMNHq0%2Fimg.png