๐ŸŒ†
Sunset Archive
GitHubLinkedInBlog
  • litsynp
  • Archives
    • Projects
      • Let's Parking!
      • ๋ง›์ง‘๋ชฌ์Šคํ„ฐ (JMT Monster)
      • spring-x-demo Projects
    • Articles
      • My Thoughts on GitBook
      • Wake-on-LAN & RDP Setup
    • Learning
      • Languages
        • Rust
          • Useful Links
          • Syntax
          • Pointers
          • Dependencies
          • Logging
          • Phantom Types
          • Iterable
            • Optional Skip
        • Go
          • Useful Links
          • Structures
          • Zero Values
          • Error Handling
          • Dependency Injection
          • Project Layout
        • JavaScript/TypeScript
          • Basics
            • Types
              • [JS] Falsy Values
              • [TS] Types - unknown, any, never
            • Rest Parameters (...)
            • Spread Syntax (...)
            • Destructuing Assignment
            • CJS, AMD, UMD, ESM
          • Advanced
            • Conditional Destructuring Assignment
            • Type Guards
          • Miscellaneous
            • Dependency Injection in JS?
            • ESLint, Prettier, TypeScript
          • Node
            • Useful Links
            • General
              • V8 Engine
              • Version Management: NVM
              • Environment Variables
            • Database
              • Knex
        • C
          • Dynamic Multi-dimensional Arrays
        • Spring
          • General
            • @Import v.s. @ContextConfiguration
            • MessageSource
          • Kotlin+Spring
            • Kotlin Annotations (Use-Site Targets)
            • Handling Null in Request DTO
            • Handling Null in URL
          • Reactive Stack
            • Reactive API with Spring WebFlux
          • Spring Security
            • Google OAuth Setup
          • Spring Batch
            • Bulk Insert
        • Kotlin
          • val/var in Constructor
          • Initializer Blocks
          • Inheritance Modifiers (final, open, abstract)
          • Delegate Pattern
        • Java
          • Serialization
          • Random Number Generation
            • (1) Math.random() v.s. Random
            • (2) Random v.s. ThreadLocalRandom
        • Python
          • Version Management
        • Ruby
          • Installation
          • Getters & Setters
        • Elixir
        • Erlang
        • Flutter
        • AWS
          • AWS CLI
        • Terraform
          • Installation
          • Basics
      • Code
        • OOP
          • The 4 Basic Concepts of OOP
          • The SOLID Principles
          • GRASP
          • Spring POJO
          • Others
        • Functional Programming
          • Currying
          • Higher-Order Function
          • Closure
          • Monad
        • ๊ณต๋ณ€์„ฑ, ๋ฐ˜๊ณต๋ณ€์„ฑ, ๋ฌด๊ณต๋ณ€์„ฑ
        • Others
          • UUID
          • GraphQL
          • Multimedia
            • Streaming
          • Geography
            • ์œ„๋„ (Latitude), ๊ฒฝ๋„ (Longitude)
      • Tools
        • Nix
        • Mermaid
          • Flowchart
          • Sequence Diagram
          • Class Diagram
          • Entity Relationship Diagrams
        • VSCode
          • VSCode CLI
          • VSCode Extensions
        • JetBrains
          • IntelliJ - Open Projects in Tabs
          • Delete Leftover IDE Directories
        • vim
          • Commands
      • Books
        • ๋‹ค์žฌ๋‹ค๋Šฅ ์ฝ”ํ‹€๋ฆฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (Programming Kotlin)
          • Pt 01. ์ฝ”ํ‹€๋ฆฐ์œผ๋กœ ์Šคํฌ๋ฆฝํŒ… ํ•˜๊ธฐ
            • Ch 01. ์ฝ”ํ‹€๋ฆฐ ์‹œ์ž‘ํ•˜๊ธฐ
            • Ch 02. Java ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ์ฝ”ํ‹€๋ฆฐ ํ•„์ˆ˜ ์‚ฌํ•ญ
            • Ch 03. ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ž
            • Ch 05. ์ฝœ๋ ‰์…˜ ์‚ฌ์šฉํ•˜๊ธฐ
        • ์˜ค๋ธŒ์ ํŠธ (Object)
          • Ch.0 ๋“ค์–ด๊ฐ€๋ฉฐ - ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„
          • Ch.1 ๊ฐ์ฒด, ์„ค๊ณ„
          • Ch.2 ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
          • Ch.3 ์—ญํ• , ์ฑ…์ž„, ํ˜‘๋ ฅ
          • Ch.4 ์„ค๊ณ„ ํ’ˆ์งˆ๊ณผ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„
          • Ch.5 ์ฑ…์ž„ ํ• ๋‹นํ•˜๊ธฐ
          • Ch.6 ๋ฉ”์‹œ์ง€์™€ ์ธํ„ฐํŽ˜์ด์Šค
          • Ch.7 ์œ ์—ฐํ•œ ์„ค๊ณ„
          • Ch.8 ์˜์กด์„ฑ ๊ด€๋ฆฌํ•˜๊ธฐ
          • Ch.9 ์œ ์—ฐํ•œ ์„ค๊ณ„
          • Ch.10 ์ƒ์†๊ณผ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ
          • Ch.11 ํ•ฉ์„ฑ๊ณผ ์œ ์—ฐํ•œ ์„ค๊ณ„
          • Ch.12 ๋‹คํ˜•์„ฑ
          • Ch.13 ์„œ๋ธŒํด๋ž˜์‹ฑ๊ณผ ์„œ๋ธŒํƒ€์ดํ•‘
          • Ch.14 ์ผ๊ด€์„ฑ ์žˆ๋Š” ํ˜‘๋ ฅ
          • Ch.15 ๋””์ž์ธ ํŒจํ„ด๊ณผ ํ”„๋ ˆ์ž„์›Œํฌ
          • End. ๋งˆ์น˜๋ฉฐ - ๋‚˜์•„๊ฐ€๊ธฐ
          • ํ›„๊ธฐ
        • ํ—ค๋“œ ํผ์ŠคํŠธ ๋””์ž์ธ ํŒจํ„ด (Head First Design Patterns)
          • Ch.1 ๋””์ž์ธ ํŒจํ„ด ์†Œ๊ฐœ์™€ ์ „๋žต ํŒจํ„ด
          • Ch.2 ์˜ต์ €๋ฒ„ ํŒจํ„ด
          • Ch.3 ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด
          • Ch.4 ํŒฉํ† ๋ฆฌ ํŒจํ„ด
          • Ch.5 ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด
          • Ch.6 ์ปค๋งจ๋“œ ํŒจํ„ด
          • Ch.7 ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด๊ณผ ํผ์‚ฌ๋“œ ํŒจํ„ด
          • Ch.8 ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ํŒจํ„ด
          • Ch.9 ๋ฐ˜๋ณต์ž ํŒจํ„ด๊ณผ ์ปดํฌ์ง€ํŠธ ํŒจํ„ด
          • Ch.10 ์ƒํƒœ ํŒจํ„ด
          • Ch.11 ํ”„๋ก์‹œ ํŒจํ„ด
          • Ch.12 ๋ณตํ•ฉ ํŒจํ„ด
        • ์ดํŽ™ํ‹ฐ๋ธŒ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ (Effective TypeScript)
          • Ch.1 ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์•Œ์•„๋ณด๊ธฐ
            • Item 1 ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ด€๊ณ„ ์ดํ•ดํ•˜๊ธฐ
            • Item 2 ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์„ค์ • ์ดํ•ดํ•˜๊ธฐ
            • Item 3 ์ฝ”๋“œ ์ƒ์„ฑ๊ณผ ํƒ€์ž…์ด ๊ด€๊ณ„์—†์Œ์„ ์ดํ•ดํ•˜๊ธฐ
            • Item 4 ๊ตฌ์กฐ์  ํƒ€์ดํ•‘์— ์ต์ˆ™ํ•ด์ง€๊ธฐ
            • Item 5 any ํƒ€์ž… ์ง€์–‘ํ•˜๊ธฐ
          • Ch.2 ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ํƒ€์ž… ์‹œ์Šคํ…œ
            • Item 6 ํŽธ์ง‘๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํƒ€์ž… ์‹œ์Šคํ…œ ํƒ์ƒ‰ํ•˜๊ธฐ
            • Item 7 ํƒ€์ž…์ด ๊ฐ’๋“ค์˜ ์ง‘ํ•ฉ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ธฐ
            • Item 1-7 Study Summary
            • Item 8 ํƒ€์ž… ๊ณต๊ฐ„๊ณผ ๊ฐ’ ๊ณต๊ฐ„์˜ ์‹ฌ๋ฒŒ ๊ตฌ๋ถ„ํ•˜๊ธฐ
            • Item 9 ํƒ€์ž… ๋‹จ์–ธ๋ณด๋‹ค๋Š” ํƒ€์ž… ์„ ์–ธ์„ ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 10 ๊ฐ์ฒด ๋ž˜ํผ ํƒ€์ž… ํ”ผํ•˜๊ธฐ
            • Item 11 ์ž‰์—ฌ ์†์„ฑ ์ฒดํฌ์˜ ํ•œ๊ณ„ ์ธ์ง€ํ•˜๊ธฐ
            • Item 12 ํ•จ์ˆ˜ ํ‘œํ˜„์‹์— ํƒ€์ž… ์ ์šฉํ•˜๊ธฐ
            • Item 13 ํƒ€์ž…๊ณผ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ฐจ์ด์  ์•Œ๊ธฐ
            • Item 14 ํƒ€์ž… ์—ฐ์‚ฐ๊ณผ ์ œ๋„ˆ๋ฆญ ์‚ฌ์šฉ์œผ๋กœ ๋ฐ˜๋ณต ์ค„์ด๊ธฐ
            • Item 15 ๋™์  ๋ฐ์ดํ„ฐ์— ์ธ๋ฑ์Šค ์‹œ๊ทธ๋‹ˆ์ฒ˜ ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 16 number ์ธ๋ฑ์Šค ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ณด๋‹ค๋Š” Array, ํŠœํ”Œ, ArrayLike๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 17 ๋ณ€๊ฒฝ ๊ด€๋ จ๋œ ์˜ค๋ฅ˜ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด readonly ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 18 ๋งคํ•‘๋œ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’์„ ๋™๊ธฐํ™”ํ•˜๊ธฐ
          • Ch.3 ํƒ€์ž… ์ถ”๋ก 
            • Item 19 ์ถ”๋ก  ๊ฐ€๋Šฅํ•œ ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด ์žฅํ™ฉํ•œ ์ฝ”๋“œ ๋ฐฉ์ง€ํ•˜๊ธฐ
            • Item 20 ๋‹ค๋ฅธ ํƒ€์ž…์—๋Š” ๋‹ค๋ฅธ ๋ณ€์ˆ˜ ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 21 ํƒ€์ž… ๋„“ํžˆ๊ธฐ
            • Item 22 ํƒ€์ž… ์ขํžˆ๊ธฐ
            • Item 23 ํ•œ๊บผ๋ฒˆ์— ๊ฐ์ฒด ์ƒ์„ฑํ•˜๊ธฐ
            • Item 24 ์ผ๊ด€์„ฑ ์žˆ๋Š” ๋ณ„์นญ ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 25 ๋น„๋™๊ธฐ ์ฝ”๋“œ์—๋Š” ์ฝœ๋ฐฑ ๋Œ€์‹  async ํ•จ์ˆ˜ ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 26 ํƒ€์ž… ์ถ”๋ก ์— ๋ฌธ๋งฅ์ด ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”์ง€ ์ดํ•ดํ•˜๊ธฐ
            • Item 27 ํ•จ์ˆ˜ํ˜• ๊ธฐ๋ฒ•๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ํƒ€์ž… ํ๋ฆ„ ์œ ์ง€ํ•˜๊ธฐ
          • Ch.4 ํƒ€์ž… ์„ค๊ณ„
            • Item 28 ์œ ํšจํ•œ ์ƒํƒœ๋งŒ ํ‘œํ˜„ํ•˜๋Š” ํƒ€์ž…์„ ์ง€ํ–ฅํ•˜๊ธฐ
            • Item 29 ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋„ˆ๊ทธ๋Ÿฝ๊ฒŒ, ์ƒ์„ฑํ•  ๋•Œ๋Š” ์—„๊ฒฉํ•˜๊ฒŒ
            • Item 30 ๋ฌธ์„œ์— ํƒ€์ž… ์ •๋ณด๋ฅผ ์“ฐ์ง€ ์•Š๊ธฐ
            • Item 31 ํƒ€์ž… ์ฃผ๋ณ€์— null ๊ฐ’ ๋ฐฐ์น˜ํ•˜๊ธฐ
            • Item 32 ์œ ๋‹ˆ์˜จ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ณด๋‹ค๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ์œ ๋‹ˆ์˜จ์„ ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 33 string ํƒ€์ž…๋ณด๋‹ค ๋” ๊ตฌ์ฒด์ ์ธ ํƒ€์ž… ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 34 ๋ถ€์ •ํ™•ํ•œ ํƒ€์ž…๋ณด๋‹ค๋Š” ๋ฏธ์™„์„ฑ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 35 ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹Œ, API์™€ ๋ช…์„ธ๋ฅผ ๋ณด๊ณ  ํƒ€์ž… ๋งŒ๋“ค๊ธฐ
            • Item 36 ํ•ด๋‹น ๋ถ„์•ผ์˜ ์šฉ์–ด๋กœ ํƒ€์ž… ์ด๋ฆ„ ์ง“๊ธฐ
            • Item 37 ๊ณต์‹ ๋ช…์นญ์—๋Š” ์ƒํ‘œ๋ฅผ ๋ถ™์ด๊ธฐ
          • Ch.5 any ๋‹ค๋ฃจ๊ธฐ
            • Item 38 any ํƒ€์ž…์€ ๊ฐ€๋Šฅํ•œ ํ•œ ์ข์€ ๋ฒ”์œ„์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 39 any๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ๋ณ€ํ˜•ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 40 ํ•จ์ˆ˜ ์•ˆ์œผ๋กœ ํƒ€์ž… ๋‹จ์–ธ๋ฌธ ๊ฐ์ถ”๊ธฐ
            • Item 41 any์˜ ์ง„ํ™”๋ฅผ ์ดํ•ดํ•˜๊ธฐ
            • Item 42 ๋ชจ๋ฅด๋Š” ํƒ€์ž…์˜ ๊ฐ’์—๋Š” any ๋Œ€์‹  unknown์„ ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 43 ๋ชฝํ‚ค ํŒจ์น˜๋ณด๋‹ค๋Š” ์•ˆ์ „ํ•œ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 44 ํƒ€์ž… ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ์ถ”์ ํ•˜์—ฌ ํƒ€์ž… ์•ˆ์ „์„ฑ ์œ ์ง€ํ•˜๊ธฐ
          • Ch.6 ํƒ€์ž… ์„ ์–ธ๊ณผ @types
            • Item 45 devDependencies์— typescript์™€ @types ์ถ”๊ฐ€ํ•˜๊ธฐ
            • Item 46 ํƒ€์ž… ์„ ์–ธ๊ณผ ๊ด€๋ จ๋œ ์„ธ ๊ฐ€์ง€ ๋ฒ„์ „ ์ดํ•ดํ•˜๊ธฐ
            • Item 47 ๊ณต๊ฐœ API์— ๋“ฑ์žฅํ•˜๋Š” ๋ชจ๋“  ํƒ€์ž…์„ ์ต์ŠคํฌํŠธํ•˜๊ธฐ
            • Item 48 API ์ฃผ์„์— TSDoc ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 49 ์ฝœ๋ฐฑ์—์„œ this์— ๋Œ€ํ•œ ํƒ€์ž… ์ œ๊ณตํ•˜๊ธฐ
            • Item 50 ์˜ค๋ฒ„๋กœ๋”ฉ ํƒ€์ž…๋ณด๋‹ค๋Š” ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 51 ์˜์กด์„ฑ ๋ถ„๋ฆฌ๋ฅผ ์œ„ํ•ด ๋ฏธ๋Ÿฌ ํƒ€์ž… ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 52 ํ…Œ์ŠคํŒ… ํƒ€์ž…์˜ ํ•จ์ •์— ์ฃผ์˜ํ•˜๊ธฐ
          • Ch.7 ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ธฐ
            • Item 53 ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ๋ณด๋‹ค๋Š” ECMAScript ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 54 ๊ฐ์ฒด๋ฅผ ์ˆœํšŒํ•˜๋Š” ๋…ธํ•˜์šฐ
            • Item 55 DOM ๊ณ„์ธต ๊ตฌ์กฐ ์ดํ•ดํ•˜๊ธฐ
            • Item 56 ์ •๋ณด๋ฅผ ๊ฐ์ถ”๋Š” ๋ชฉ์ ์œผ๋กœ private ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ
            • Item 57 ์†Œ์Šค๋งต์„ ์‚ฌ์šฉํ•˜์—ฌ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋””๋ฒ„๊น…ํ•˜๊ธฐ
          • Ch.8 ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ธฐ
            • Item 58 ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ž‘์„ฑํ•˜๊ธฐ
            • Item 59 ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋„์ž… ์ „์— @ts-check์™€ JSDoc์œผ๋กœ ์‹œํ—˜ํ•ด ๋ณด๊ธฐ
            • Item 60 allowJS๋กœ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 61 ์˜์กด์„ฑ ๊ด€๊ณ„์— ๋”ฐ๋ผ ๋ชจ๋“ˆ ๋‹จ์œ„๋กœ ์ „ํ™˜ํ•˜๊ธฐ
            • Item 62 ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์˜ ์™„์„ฑ์„ ์œ„ํ•ด noImplicitAny ์„ค์ •ํ•˜๊ธฐ
        • Dive Into Design Patterns
          • ๋””์ž์ธ ํŒจํ„ด ์†Œ๊ฐœ
          • ์†Œํ”„ํŠธ์›จ์–ด ๋””์ž์ธ ์›์น™๋“ค
          • ๋””์ž์ธ ํŒจํ„ด ๋ชฉ๋ก
          • ์œ ์šฉํ•œ ๋งํฌ
        • ๊ฐ€์ƒ ๋ฉด์ ‘ ์‚ฌ๋ก€๋กœ ๋ฐฐ์šฐ๋Š” ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ ์„ค๊ณ„ ๊ธฐ์ดˆ (System Design Interview)
          • Key Points
          • Real Life Systems
          • Engineering Blogs
        • Node.js ๋””์ž์ธ ํŒจํ„ด ๋ฐ”์ด๋ธ” (Node.js Design Patterns 3rd Edition)
        • ๋ฆฌํŒฉํ„ฐ๋ง 2ํŒ (Refactoring: 2nd Ed.)
          • 1์žฅ ๋ฆฌํŒฉํ„ฐ๋ง: ์ฒซ ๋ฒˆ์งธ ์˜ˆ์‹œ
          • 2์žฅ ๋ฆฌํŒฉํ„ฐ๋ง ์›์น™
          • 3์žฅ ์ฝ”๋“œ์—์„œ ๋‚˜๋Š” ์•…์ทจ
          • 4์žฅ ํ…Œ์ŠคํŠธ ๊ตฌ์ถ•ํ•˜๊ธฐ
Powered by GitBook
On this page
  • About
  • ์ƒ์†(Inheritance)์ด๋ž€
  • Java์™€ ์ƒ์†
  • Kotlin๊ณผ ์ƒ์†
  • Spring ๊ฐœ๋ฐœํ•  ๋•Œ Kotlin๊ณผ ์ƒ์†
  • ์ •๋ฆฌ
  • More
  • REF

Was this helpful?

Edit on GitHub
  1. Archives
  2. Learning
  3. Languages
  4. Kotlin

Inheritance Modifiers (final, open, abstract)

PreviousInitializer BlocksNextDelegate Pattern

Last updated 9 months ago

Was this helpful?

About

Kotlin์˜ ์ƒ์†๋ณ€๊ฒฝ์ž์ธ final, open, abstract์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณธ๋‹ค.

์ƒ์†(Inheritance)์ด๋ž€

์ƒ์†์€ ๊ธฐ์กด์˜ ํด๋ž˜์Šค๋ฅผ ์žฌ์‚ฌ์šฉํ•ด ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๋ฅผ ๋ฌผ๋ ค๋ฐ›๋Š” ๊ฒƒ์„ ๋œปํ•œ๋‹ค. Java์—์„œ ์ƒ์†์€ extends ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•ด ๊ฐ€๋Šฅํ–ˆ๋‹ค.

class Parent {}
class Child extends Parent {}

์ƒ์†์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•์ด ์žˆ๋‹ค.

  • ์ƒ์†์€ ๊ธฐ์กด์— ๋งŒ๋“ค์–ด ๋†“์€ ํด๋ž˜์Šค์˜ ์žฌ์‚ฌ์šฉ, ํ™•์žฅ์„ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

  • Java์—์„œ๋Š” ๋‹จ์ผ ์ƒ์†๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

  • ๋ถ€๋ชจ(super), ์ž์‹(sub)ํด๋ž˜์Šค๊ฐ€ ์กด์žฌํ•œ๋‹ค. ๊ฐ๊ฐ ๊ธฐ๋ฐ˜(base), ํŒŒ์ƒ(derived) ํด๋ž˜์Šค๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค.

  • Java์—์„œ Object ํด๋ž˜์Šค๋Š” ๋ชจ๋“  ํด๋ž˜์Šค์˜ ์ตœ์ƒ์œ„์— ์œ„์น˜ํ•œ๋‹ค.

    • ๋ชจ๋“  ํด๋ž˜์Šค๋Š” Object ํด๋ž˜์Šค์— ์ •์˜๋œ 11๊ฐœ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ƒ์†๋ฐ›๋Š”๋‹ค. (toString(), equals(), hashCode() ๋“ฑ)

  • private ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋Š” ์ƒ์†์ด ์•ˆ๋œ๋‹ค.

  • super ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•ด ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„/๋ฉ”์†Œ๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

์ƒ์†์€ ๋” ์ •ํ™•ํžˆ ๋งํ•ด์„œ ๊ตฌํ˜„ ์ƒ์†(์„œ๋ธŒํด๋ž˜์‹ฑ)๊ณผ ์ธํ„ฐํŽ˜์ด์Šค ์ƒ์†(์„œ๋ธŒํƒ€์ดํ•‘)์œผ๋กœ ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ˆœ์ˆ˜ํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์œผ๋กœ ์ƒ์†์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๊ตฌํ˜„ ์ƒ์†, ๋‹คํ˜•์ ์ธ ํ˜‘๋ ฅ์„ ์œ„ํ•ด ๋ถ€๋ชจ ํด๋ž˜์Šค์™€ ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ƒ์†์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์„ ์ธํ„ฐํŽ˜์ด์Šค ์ƒ์†์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

Java์™€ ์ƒ์†

public final class NotInheritable {
    // ... Class contents
}

๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ๊ด€์ ์—์„œ ์ทจ์•ฝํ•œ ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค(fragile base class) ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž์‹ ํด๋ž˜์Šค๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ถˆํ•„์š”ํ•œ ์„ธ๋ถ€์‚ฌํ•ญ์— ์—ฎ์ด๊ฒŒ ๋œ๋‹ค. ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ž‘์€ ๋ณ€๊ฒฝ์—๋„ ์ž์‹ ํด๋ž˜์Šค๋Š” ์ปดํŒŒ์ผ ์˜ค๋ฅ˜์™€ ์‹คํ–‰ ์—๋Ÿฌ๋ผ๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ƒ์†์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋Š” ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ทผ๋ณธ์ ์ธ ์ทจ์•ฝ์„ฑ์ด๋‹ค.

Kotlin๊ณผ ์ƒ์†

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Kotlin์—์„œ ํด๋ž˜์Šค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ final์ด๋ฉฐ open์„ ํ†ตํ•ด ๋ฒ ์ด์Šค ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค๋„๋ก ํ–ˆ๋‹ค.

์ƒ์†๋ณ€๊ฒฝ์ž๋Š” ์ด 3๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•œ๋‹ค.

  1. final

  2. open

  3. abstract

final

์ƒ์†์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒ์†๋ณ€๊ฒฝ์ž์ด๋‹ค. ํด๋ž˜์Šค์˜ ๊ธฐ๋ณธ์ด๊ณ , ์ƒ๋žต์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

open

์ƒ์†์„ ํ—ˆ์šฉํ•œ๋‹ค.

abstract

์ธ์Šคํ„ด์Šคํ™” ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ƒ์†์„ ํ•ด์„œ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.

์ถ”์ƒ ํด๋ž˜์Šค๋ผ๊ณ  ํ•˜๋ฉฐ, ๊ณตํ†ต๋œ ์ฝ”๋“œ, ๋™์ž‘ ๋“ฑ์„ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

Spring ๊ฐœ๋ฐœํ•  ๋•Œ Kotlin๊ณผ ์ƒ์†

Spring Boot 2.x ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” CGLIB Proxy ๋ฐฉ์‹์œผ๋กœ Bean์„ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๋‹ค. CGLIB Proxy๋Š” target class๋ฅผ ์ƒ์†๋ฐ›์•„ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์†์ด ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์—ฌ์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ Kotlin์—์„œ๋Š” final ์ƒ์†๋ณ€๊ฒฝ์ž๊ฐ€ ํด๋ž˜์Šค์— ๊ธฐ๋ณธ์ ์œผ๋กœ ์ ์šฉ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์ƒ์†์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํด๋ž˜์Šค์— ์ „๋ถ€ open์„ ๋ถ™์—ฌ ์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ์ž‘์—…์€ ๋งค์šฐ ๋ฒˆ๊ฑฐ๋กญ๋‹ค. Kotlin์—์„œ๋Š” ์ด๊ฒƒ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด all-open ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ œ๊ณตํ•œ๋‹ค.

plugins {
    kotlin("plugin.jpa") version "1.4.32"
}
  • @Component

  • @Async

  • @Transactional

  • @Cacheable

  • @SpringBootTest

  • @Configuration, @Controller, @RestController, @Service, @Repository, (@Component๋กœ ๋ฉ”ํƒ€์–ด๋…ธํ…Œ์ด์…˜์ด ์ ์šฉ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์ž๋™ ์ ์šฉ)

ํ•˜์ง€๋งŒ Spring์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ JPA๋„ ์‚ฌ์šฉํ•˜๊ณค ํ•˜๋Š”๋ฐ, JPA ์–ด๋…ธํ…Œ์ด์…˜์— ๋Œ€ํ•ด์„œ๋„ ๋ช…์‹œ๋ฅผ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

// build.gradle.kts
allOpen {
    annotation("javax.persistence.Entity")
    annotation("javax.persistence.MappedSuperclass")
    annotation("javax.persistence.Embeddable")
}

์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ allOpen์„ ๋ช…์‹œ์ ์œผ๋กœ ์ ์šฉํ•ด์•ผ @Entity ํด๋ž˜์Šค๊ฐ€ open์œผ๋กœ ์„ ์–ธ๋œ๋‹ค. open ์ƒ์†๋ณ€๊ฒฝ์ž๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์œผ๋ฉด Proxy ๊ธฐ๋ฐ˜์œผ๋กœ Lazy ๋กœ๋”ฉ์„ ํ•  ์ˆ˜ ์—†๋‹ค.

@ManyToOne ๋“ฑ ๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•˜๊ณ  fetch = FetchType.LAZY๋ฅผ ์ ์šฉํ–ˆ์„ ๋•Œ์˜ ์˜ˆ์‹œ์ด๋‹ค.

@Entity
class Book(
    @Column(nullable = false)
    val title: String,
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(nullable = false)
    val order: Order,
) : BaseEntity()

@Entity
class Order(
    @Column(nullable = false)
    val number: String,
) : BaseEntity()

๋‹ค์Œ์€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์ด๋‹ค.

@Test
fun `lazy loading test`() {
    // Order, Book ์ƒ์„ฑ
    val order = orderRepository.save(Order("202208-01")
    val book = bookRepository.save(Book("New Book", order))
    
    // ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ์ดˆ๊ธฐํ™”
    entityManager.clear()
    
    // Lazy Loading์ด ์ ์šฉ๋˜์–ด book์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ๊ฑฐ๋ผ ์˜ˆ์ƒ
    val foundBook = bookRepository.findByIdOrNull(book.id!!)!!
}

Lazy ๋กœ์ด ์ ์šฉ๋˜์–ด book์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ๊ฑฐ๋ผ ์˜ˆ์ƒํ–ˆ์ง€๋งŒ ๊ฒฐ๊ณผ๋Š” ๋‹ค๋ฅด๋‹ค.

order์— ๋Œ€ํ•œ ์กฐํšŒ ์ฟผ๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์žˆ๋Š” ๋ชจ์Šต์ด๋‹ค. IntelliJ์˜ ๋””๋ฒ„๊น… ํˆด์„ ์ด์šฉํ•ด ํ™•์ธํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

Order์˜ Proxy ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ์‹ค์ œ Order ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๋ชจ์Šต์ด๋‹ค.

Kotlin์€ ๊ธฐ๋ณธ์ ์œผ๋กœ final์ด๋ฏ€๋กœ, ์ƒ์†์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘๋™ํ•˜๋Š” Proxy ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋”ฐ๋ผ์„œ open์„ ์ ์šฉํ•˜๋ฉด ์ œ๋Œ€๋กœ Lazy ๋กœ๋”ฉ์ด ๋™์ž‘ํ•˜๊ณ , Proxy ๊ธฐ๋ฐ˜์œผ๋กœ Order ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋œ๋‹ค.

์ •๋ฆฌ

Java, Kotlin ๋‘˜ ๋‹ค ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐœ๋…์ธ ์ƒ์†์„ ์ง€์›ํ•œ๋‹ค.

  • Java์—์„œ๋Š” abstract, final ๋“ฑ์˜ modifier๋กœ ์ƒ์† ๊ด€๋ จ ์„ค์ •์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ํด๋ž˜์Šค๊ฐ€ ์ƒ์†์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ final ํ‚ค์›Œ๋“œ๋ฅผ ์ง€์ •ํ•˜๋ฉด ์ƒ์†์„ ๋ง‰์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

  • Kotlin์—์„œ๋Š” ์ƒ์†๋ณ€๊ฒฝ์ž์ธ final, open, abstract๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. final์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ํ•˜์—ฌ ์ƒ์†์„ ๋ง‰์•„๋‘์—ˆ๋‹ค.

  • Spring๊ณผ Kotlin์„ ๊ฐ™์ด ์‚ฌ์šฉํ•  ๋•Œ๋Š” CGLIB์„ ์ด์šฉํ•œ Proxy ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Kotlin์—์„œ ๊ธฐ๋ณธ๊ฐ’์ด final์ธ ์ ์„ ๊ฐ์•ˆํ•˜์—ฌ allopen ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ ์šฉํ•ด์•ผ ํ•œ๋‹ค.

More

REF

Java์—์„œ ํด๋ž˜์Šค๋Š” ๊ธฐ๋ณธ ์„ค์ •์œผ๋กœ ๋ชจ๋‘ ์ƒ์†์ด ๊ฐ€๋Šฅํ–ˆ์œผ๋ฉฐ,

์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์•„๋ž˜ ์–ด๋…ธํ…Œ์ด์…˜์— ๋Œ€ํ•ด all-open์„ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€์‹œํ‚จ๋‹ค. kotlin-allopen, plugin.spring์€ ๋™์ผํ•œ ํ”„๋กœ์ ํŠธ์ด๋‹ค.

โš ๏ธ ์œ„ ๋‚ด์šฉ์˜ ์ถœ์ฒ˜, ์ด๋ฏธ์ง€์™€ ์ž์„ธํ•œ ๋‚ด์šฉ ๋ชจ๋‘ ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

<์˜ค๋ธŒ์ ํŠธ>(์œ„ํ‚ค๋ถ์Šค, 2019)
ํด๋ž˜์Šค ์•ž์— final ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์ด๋ฉด ์ƒ์†์„ ๋ง‰์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
plugin.spring ํ”Œ๋Ÿฌ๊ทธ์ธ
์ด ๋ธ”๋กœ๊ทธ
Tistory(9327144) - Kotlin๊ณผ Spring Bean
Tistory(๋ณธ์งˆ์˜ ์ค‘์š”์„ฑ) - [Java] ์ƒ์† (inheritance) ์ •์˜ / final ํด๋ž˜์Šค์™€ ๋ฉ”์†Œ๋“œ / instanceof ์—ฐ์‚ฐ์ž
Tistory(Kotlin World) - Kotlin์˜ ์ƒ์† ๋ณ€๊ฒฝ์ž : final, abstract, open
Carrey's ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ - Objects Study - Chapter10. ์œ ์—ฐํ•œ ์„ค๊ณ„
Yun Blog - Kotlin์œผ๋กœ Spring ๊ฐœ๋ฐœํ•  ๋•Œ
Kotlin Docs - All-open compiler plugin
Order์— ๋Œ€ํ•œ ์กฐํšŒ ์ฟผ๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์žˆ๋Š” ๋ชจ
Proxy ๊ฐ์ฒด๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ชจ์Šต