Inheritance Modifiers (final, open, abstract)
About
Kotlin์ ์์๋ณ๊ฒฝ์์ธ final
, open
, abstract
์ ๋ํด์ ์์๋ณธ๋ค.
์์(Inheritance)์ด๋
์์์ ๊ธฐ์กด์ ํด๋์ค๋ฅผ ์ฌ์ฌ์ฉํด ์์ ํด๋์ค๊ฐ ๋ถ๋ชจ ํด๋์ค์ ๋ฉค๋ฒ๋ฅผ ๋ฌผ๋ ค๋ฐ๋ ๊ฒ์ ๋ปํ๋ค. Java์์ ์์์ extends
ํค์๋๋ฅผ ์ด์ฉํด ๊ฐ๋ฅํ๋ค.
์์์๋ ๋ค์๊ณผ ๊ฐ์ ํน์ง์ด ์๋ค.
์์์ ๊ธฐ์กด์ ๋ง๋ค์ด ๋์ ํด๋์ค์ ์ฌ์ฌ์ฉ, ํ์ฅ์ ์ํด ์ฌ์ฉํ๋ค.
Java์์๋ ๋จ์ผ ์์๋ง ๊ฐ๋ฅํ๋ค.
๋ถ๋ชจ(super), ์์(sub)ํด๋์ค๊ฐ ์กด์ฌํ๋ค. ๊ฐ๊ฐ ๊ธฐ๋ฐ(base), ํ์(derived) ํด๋์ค๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค.
Java์์
Object
ํด๋์ค๋ ๋ชจ๋ ํด๋์ค์ ์ต์์์ ์์นํ๋ค.๋ชจ๋ ํด๋์ค๋
Object
ํด๋์ค์ ์ ์๋ 11๊ฐ์ ๋ฉ์๋๋ฅผ ์์๋ฐ๋๋ค. (toString()
,equals()
,hashCode()
๋ฑ)
private
๋ฉค๋ฒ ๋ณ์๋ ์์์ด ์๋๋ค.super
ํค์๋๋ฅผ ์ด์ฉํด ์์ ํด๋์ค์ ๋ฉค๋ฒ/๋ฉ์๋์ ์ ๊ทผํ ์ ์๋ค.
์์์ ๋ ์ ํํ ๋งํด์ ๊ตฌํ ์์(์๋ธํด๋์ฑ)๊ณผ ์ธํฐํ์ด์ค ์์(์๋ธํ์ดํ)์ผ๋ก ๋ถ๋ฅํ ์ ์์ผ๋ฉฐ, ์์ํ๊ฒ ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ๊ธฐ ์ํ ๋ชฉ์ ์ผ๋ก ์์์ ๊ตฌํํ๋ ๊ฒ์ ๊ตฌํ ์์, ๋คํ์ ์ธ ํ๋ ฅ์ ์ํด ๋ถ๋ชจ ํด๋์ค์ ์์ ํด๋์ค๊ฐ ์ธํฐํ์ด์ค๋ฅผ ๊ณต์ ํ ์ ์๋๋ก ์์์ ์ด์ฉํ๋ ๊ฒ์ ์ธํฐํ์ด์ค ์์์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. <์ค๋ธ์ ํธ>(์ํค๋ถ์ค, 2019)
Java์ ์์
Java์์ ํด๋์ค๋ ๊ธฐ๋ณธ ์ค์ ์ผ๋ก ๋ชจ๋ ์์์ด ๊ฐ๋ฅํ์ผ๋ฉฐ, ํด๋์ค ์์ final
ํค์๋๋ฅผ ๋ถ์ด๋ฉด ์์์ ๋ง์ ์ ์์๋ค.
๊ฐ์ฒด์งํฅ์ ์ธ ๊ด์ ์์ ์ทจ์ฝํ ๊ธฐ๋ฐ ํด๋์ค(fragile base class) ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์์ ํด๋์ค๋ ๋ถ๋ชจ ํด๋์ค์ ๋ถํ์ํ ์ธ๋ถ์ฌํญ์ ์ฎ์ด๊ฒ ๋๋ค. ๋ถ๋ชจ ํด๋์ค์ ์์ ๋ณ๊ฒฝ์๋ ์์ ํด๋์ค๋ ์ปดํ์ผ ์ค๋ฅ์ ์คํ ์๋ฌ๋ผ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์์์ ์ฌ์ฉํ๋ค๋ฉด ๋ฐ์ํ๊ฒ ๋๋ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๊ทผ๋ณธ์ ์ธ ์ทจ์ฝ์ฑ์ด๋ค.
Kotlin๊ณผ ์์
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Kotlin์์ ํด๋์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก final
์ด๋ฉฐ open
์ ํตํด ๋ฒ ์ด์ค ํด๋์ค๋ก ๋ง๋ค๋๋ก ํ๋ค.
์์๋ณ๊ฒฝ์๋ ์ด 3๊ฐ์ง๊ฐ ์กด์ฌํ๋ค.
final
open
abstract
final
์์์ด ๋ถ๊ฐ๋ฅํ ์์๋ณ๊ฒฝ์์ด๋ค. ํด๋์ค์ ๊ธฐ๋ณธ์ด๊ณ , ์๋ต์ด ๊ฐ๋ฅํ๋ค.
open
์์์ ํ์ฉํ๋ค.
abstract
์ธ์คํด์คํ ํ๊ธฐ ์ํด์๋ ์์์ ํด์ ์๋ก์ด ํด๋์ค๋ฅผ ์ ์ํด์ผ ํ๋ค.
์ถ์ ํด๋์ค๋ผ๊ณ ํ๋ฉฐ, ๊ณตํต๋ ์ฝ๋, ๋์ ๋ฑ์ ์ ์ํ ๋ ์ฌ์ฉํ๋ค.
Spring ๊ฐ๋ฐํ ๋ Kotlin๊ณผ ์์
Spring Boot 2.x ๋ฒ์ ๋ถํฐ๋ CGLIB Proxy ๋ฐฉ์์ผ๋ก Bean์ ๊ด๋ฆฌํ๊ณ ์๋ค. CGLIB Proxy๋ target class๋ฅผ ์์๋ฐ์ ์์ฑํ๊ธฐ ๋๋ฌธ์ ์์์ด ๊ฐ๋ฅํ ์ํ์ฌ์ผ ํ๋ค. ๊ทธ๋ฐ๋ฐ Kotlin์์๋ final
์์๋ณ๊ฒฝ์๊ฐ ํด๋์ค์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ฉ๋๋ค. ๋ฐ๋ผ์ ์์์ด ๋ถ๊ฐ๋ฅํ ์ํ๊ฐ ๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ํด๋์ค์ ์ ๋ถ open์ ๋ถ์ฌ ์ฃผ์ด์ผ ํ๋๋ฐ, ์ด๋ฌํ ์์
์ ๋งค์ฐ ๋ฒ๊ฑฐ๋กญ๋ค. Kotlin์์๋ ์ด๊ฒ์ ํด๊ฒฐํ๊ธฐ ์ํด all-open
ํ๋ฌ๊ทธ์ธ์ ์ ๊ณตํ๋ค.
plugin.spring
ํ๋ฌ๊ทธ์ธ์ ์ถ๊ฐํ๋ฉด ์๋ ์ด๋
ธํ
์ด์
์ ๋ํด all-open
์ ์๋์ผ๋ก ์ถ๊ฐ์ํจ๋ค. kotlin-allopen
, plugin.spring
์ ๋์ผํ ํ๋ก์ ํธ์ด๋ค.
@Component
@Async
@Transactional
@Cacheable
@SpringBootTest
@Configuration
,@Controller
,@RestController
,@Service
,@Repository
, (@Component
๋ก ๋ฉํ์ด๋ ธํ ์ด์ ์ด ์ ์ฉ๋์ด ์์ผ๋ฏ๋ก ์๋ ์ ์ฉ)
ํ์ง๋ง Spring์ ์ฌ์ฉํ๋ฉด์ JPA๋ ์ฌ์ฉํ๊ณค ํ๋๋ฐ, JPA ์ด๋ ธํ ์ด์ ์ ๋ํด์๋ ๋ช ์๋ฅผ ํด์ค์ผ ํ๋ค.
์์ ์ฝ๋์ฒ๋ผ allOpen
์ ๋ช
์์ ์ผ๋ก ์ ์ฉํด์ผ @Entity
ํด๋์ค๊ฐ open
์ผ๋ก ์ ์ธ๋๋ค. open
์์๋ณ๊ฒฝ์๊ฐ ์ ์ฉ๋์ง ์์ผ๋ฉด Proxy ๊ธฐ๋ฐ์ผ๋ก Lazy ๋ก๋ฉ์ ํ ์ ์๋ค.
@ManyToOne
๋ฑ ๊ด๊ณ๋ฅผ ์ค์ ํ๊ณ fetch = FetchType.LAZY
๋ฅผ ์ ์ฉํ์ ๋์ ์์์ด๋ค.
๋ค์์ ํ ์คํธ ์ฝ๋์ด๋ค.
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
Last updated