Skip to content

Latest commit

Β 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

polymorphism

λ‹€ν˜•μ„± ν•™μŠ΅ μ €μž₯μ†Œ. μ§€κΈˆμ€ λ§€κ°œλ³€μˆ˜μ— μ˜ν•œ λ‹€ν˜•μ„±κ³Ό 두 λ‹€ν˜•μ„±μ˜ λ§Œλ‚¨ 두 μž₯이 λ“€μ–΄ μžˆλ‹€.

κ°œλ…μ„ κΈ€λ‘œ 읽고 λ„˜κΈ°μ§€ μ•ŠκΈ° μœ„ν•΄, μ»΄νŒŒμΌλŸ¬κ°€ μ‹€μ œλ‘œ 무엇을 막고 무엇을 ν—ˆμš©ν•˜λŠ”μ§€λ₯Ό ν…ŒμŠ€νŠΈλ‘œ λ°•μ•„λ‘”λ‹€. "이둠상 이렇닀"κ°€ μ•„λ‹ˆλΌ "돌렀보면 이렇닀"κ°€ λ‚¨λŠ” 것이 λͺ©ν‘œλ‹€.

Java 21 / Gradle / JUnit 5. ν…ŒμŠ€νŠΈ 51개, μ „λΆ€ 톡과.

./gradlew test

μ–΄λ””λΆ€ν„° μ½λ‚˜

νŒ¨ν‚€μ§€λ§ˆλ‹€ READMEκ°€ ν•˜λ‚˜μ”© μžˆλ‹€. μ½”λ“œλ³΄λ‹€ λ¨Όμ € 읽으라고 μ“΄ 것이닀.


λ§€κ°œλ³€μˆ˜μ— μ˜ν•œ λ‹€ν˜•μ„±

νƒ€μž… 자체λ₯Ό 인자둜 λ°›λŠ”λ‹€. μ½”λ“œλŠ” νƒ€μž… νŒŒλΌλ―Έν„°μ— λŒ€ν•΄ 아무것도 κ°€μ •ν•˜μ§€ μ•Šκ³ , κ·Έλž˜μ„œ λͺ¨λ“  νƒ€μž…μ— λŒ€ν•΄ μ˜³μ„ 수 μžˆλ‹€.

두 λ¬Έμ„œλŠ” 같은 좕을 λ°˜λŒ€νŽΈμ—μ„œ λ³Έλ‹€ β€” νƒ€μž… νŒŒλΌλ―Έν„°κ°€ μ–Έμ œ μ •ν•΄μ§€κ³  μ–Όλ§ˆλ‚˜ 였래 μ‚¬λŠ”κ°€.

genericfunction β€” ν•¨μˆ˜κ°€ νƒ€μž…μ„ 받을 λ•Œ

μ‹œκ·Έλ‹ˆμ²˜λŠ” 빈칸 (T, R)만 남기고, κ·Έ λΉˆμΉΈμ€ 호좜 μ§€μ λ§ˆλ‹€ μƒˆλ‘œ μ±„μ›Œμ§„λ‹€. 호좜이 λλ‚˜λ©΄ νƒ€μž… νŒŒλΌλ―Έν„°λ„ ν•¨κ»˜ λλ‚œλ‹€.

μ œλ„€λ¦­ ν•¨μˆ˜μ˜ νƒ€μž… 흐름

generictype β€” νƒ€μž…μ΄ νƒ€μž…μ„ 받을 λ•Œ

νƒ€μž… νŒŒλΌλ―Έν„°λŠ” νƒ€μž…μ„ μ λŠ” μˆœκ°„ μ •ν•΄μ Έ κ·Έ 값이 μ‚¬λŠ” λ‚΄λ‚΄ λ”°λΌλ‹€λ‹Œλ‹€. 그리고 λŸ°νƒ€μž„μ—λŠ” μ†Œκ±°λ‘œ μ§€μ›Œμ Έ, 갈라져 λ‚˜μ˜¨ νƒ€μž…λ“€μ΄ λ‹€μ‹œ 클래슀 ν•˜λ‚˜κ°€ λœλ‹€.

μ œλ„€λ¦­ νƒ€μž…μ˜ νƒ€μž… 흐름


두 λ‹€ν˜•μ„±μ˜ λ§Œλ‚¨

μ•ž μž₯μ—μ„œλŠ” νƒ€μž… νŒŒλΌλ―Έν„°λ₯Ό μ„œλ‘œ λ¬΄κ΄€ν•œ 빈칸으둜만 λ‹€λ€˜λ‹€. 그런데 μ‹€μ œ νƒ€μž…λ“€ μ‚¬μ΄μ—λŠ” 이미 μ„œλΈŒνƒ€μž… 관계가 μžˆλ‹€. κ·Έ 관계가 νƒ€μž… μƒμ„±μžλ₯Ό 톡과할 λ•Œ μ–΄λ–»κ²Œ λ˜λŠ”κ°€ β€” μ„Έ λ¬Έμ„œκ°€ 같은 물음의 λ‹€λ₯Έ 얼꡴이닀.

λ¬Έμ„œ λ¬»λŠ” 것
inheritance 물렀받을 λ•Œ νƒ€μž… 인자λ₯Ό 전달할 것인가 κ³ μ •ν•  것인가
bound T에 λŒ€ν•΄ μ΅œμ†Œν•œ 무엇을 μ•Œμ•„μ•Ό ν•˜λŠ”κ°€
variance Integer <: Number일 λ•Œ Cell<Integer>와 Cell<Number>λŠ” 무슨 관계인가

가변성이 이 μž₯의 핡심이닀. λΆˆλ³€μ€ μ œλ„€λ¦­μ˜ 결함이 μ•„λ‹ˆλΌ 읽기와 μ“°κΈ°λ₯Ό λͺ¨λ‘ ν—ˆμš©ν•œ λŒ€κ°€μ΄κ³ , κ·Έ 증거가 λ°°μ—΄μ΄λΌλŠ” λ°˜λ‘€λ‘œ 같은 μ–Έμ–΄ μ•ˆμ— λ“€μ–΄ μžˆλ‹€.

κ°€λ³€μ„±μ˜ λ°©ν–₯κ³Ό λ°°μ—΄μ˜ ꡬ멍


ꡬ쑰

com.study.polymorphism/
β”œβ”€β”€ parametric/                 λ§€κ°œλ³€μˆ˜μ— μ˜ν•œ λ‹€ν˜•μ„±
β”‚   β”œβ”€β”€ genericfunction/        ν•¨μˆ˜κ°€ νƒ€μž…μ„ λ°›λŠ”λ‹€
β”‚   β”‚   └── Lists.java
β”‚   └── generictype/            νƒ€μž…μ΄ νƒ€μž…μ„ λ°›λŠ”λ‹€
β”‚       β”œβ”€β”€ Stack.java          νƒ€μž… νŒŒλΌλ―Έν„° ν•˜λ‚˜
β”‚       β”œβ”€β”€ Pair.java           νƒ€μž… νŒŒλΌλ―Έν„° λ‘˜
β”‚       └── ObjectStack.java    λŒ€λΉ„ - λ§€κ°œλ³€μˆ˜κ°€ μ—†λ˜ μ‹œμ ˆ
└── genericsubtyping/           두 λ‹€ν˜•μ„±μ˜ λ§Œλ‚¨
    β”œβ”€β”€ inheritance/            μ œλ„€λ¦­ ν΄λž˜μŠ€μ™€ 상속
    β”‚   β”œβ”€β”€ Box.java  Chest.java        νƒ€μž… νŒŒλΌλ―Έν„°λ₯Ό 전달
    β”‚   └── StringBox.java              νƒ€μž… 인자λ₯Ό κ³ μ • - λΈŒλ¦¬μ§€ λ©”μ„œλ“œ
    β”œβ”€β”€ bound/                  νƒ€μž… λ§€κ°œλ³€μˆ˜ μ œν•œ
    β”‚   β”œβ”€β”€ NumberBox.java              μƒν•œ
    β”‚   β”œβ”€β”€ Bounds.java                 닀쀑 λ°”μš΄λ“œ - ꡐ차 νƒ€μž…
    β”‚   └── Request.java  JsonRequest.java   μž¬κ·€ λ°”μš΄λ“œ
    └── variance/               κ°€λ³€μ„±
        β”œβ”€β”€ Source.java  Sink.java  Cell.java   곡변 / λ°˜κ³΅λ³€ / λΆˆλ³€
        β”œβ”€β”€ Variance.java                       μ“°λŠ” μͺ½μ—μ„œ λ§Œλ“œλŠ” λ³€μ„±
        β”œβ”€β”€ CovariantArrays.java                λ°°μ—΄μ΄λΌλŠ” λ°˜λ‘€
        └── Capture.java                        검사기가 λ¬ΌμŒν‘œλ₯Ό μ—¬λŠ” κ³Όμ •

νŒ¨ν‚€μ§€λ₯Ό κ°€λ₯΄λŠ” 기쀀은 κ·Έ 절이 λ˜μ§€λŠ” λ¬ΌμŒμ΄λ‹€. ν…ŒμŠ€νŠΈλŠ” src/test/java μ•„λž˜ 같은 ꡬ쑰둜 λΆ™μ–΄ μžˆλ‹€.

이 μ €μž₯μ†Œμ˜ κ·œμΉ™

  • ν…ŒμŠ€νŠΈ λ¨Όμ €. ν”„λ‘œλ•μ…˜ μ½”λ“œλŠ” μ‹€νŒ¨ν•˜λŠ” (RED) ν…ŒμŠ€νŠΈλ₯Ό 눈으둜 ν™•μΈν•œ 뒀에 μ“΄λ‹€.
  • 정상 경둜만 ν…ŒμŠ€νŠΈν•˜μ§€ μ•ŠλŠ”λ‹€. 빈 μ»¬λ ‰μ…˜, μš©λŸ‰ 경계, null, 길이 뢈일치 같은 μ‹€νŒ¨ κ²½λ‘œλ„ ν•¨κ»˜ κ³ μ •ν•œλ‹€.
  • 정책은 μ½”λ“œ μ˜†μ— 근거와 ν•¨κ»˜. Stack의 null κ±°λΆ€, zip의 길이 뢈일치 κ±°λΆ€λŠ” λ‘˜ λ‹€ fail-closed이고, μ™œ κ·Έλ ‡κ²Œ κ³¨λžλŠ”μ§€κ°€ JavaDoc에 μ ν˜€ μžˆλ‹€.
  • JavaDoc은 "무엇을"이 μ•„λ‹ˆλΌ "μ™œ". @param source μ†ŒμŠ€ 리슀트 같은 λ™μ–΄λ°˜λ³΅μ€ 달지 μ•ŠλŠ”λ‹€. ./gradlew javadoc이 λ‚΄λŠ” @param λˆ„λ½ κ²½κ³ λŠ” κ·Έλž˜μ„œ λ‚˜λŠ” 것이닀.
  • ν•œ 쀄 = ν•œ λ¬Έμž₯. 주석은 λ¬Έμž₯ κ²½κ³„μ—μ„œλ§Œ 쀄을 λ°”κΎΌλ‹€. ν•œ λ¬Έμž₯을 고치면 diff에 ν•œ μ€„λ§Œ λœ¬λ‹€.
  • λ¬Έμ„œμ— 적은 μ—λŸ¬ λ©”μ‹œμ§€λŠ” μ‹€μ œλ‘œ ν™•μΈν•œ κ²ƒλ§Œ μ“΄λ‹€. 각 README의 μ‹€ν—˜ ν‘œκ°€ κ·Έλ ‡λ‹€.

About

πŸ’» γ€Žνƒ€μž…μœΌλ‘œ κ²¬κ³ ν•˜κ²Œ λ‹€ν˜•μ„±μœΌλ‘œ μœ μ—°ν•˜κ²Œγ€ 책을 ν†΅ν•΄μ„œ 배운 λ‹€ν˜•μ„± ν•™μŠ΅ μ €μž₯μ†Œ

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages