좔상 클래슀 & 봉인 클래슀

2025. 4. 17. 10:42Β·Backend/JAVA
728x90

πŸ“˜ 좔상

사전적 의미의 좔상(abstract)은 싀체 간에 κ³΅ν†΅λ˜λŠ” νŠΉμ„±μ„ μΆ”μΆœν•œ 것

좔상 클래슀

객체λ₯Ό 생성할 수 μžˆλŠ” 클래슀λ₯Ό 싀체 클래슀라고 ν•œλ‹€λ©΄,
이런 ν΄λž˜μŠ€λ“€μ˜ 곡톡적인 `ν•„λ“œ`λ‚˜ `λ©”μ†Œλ“œ`λ₯Ό μΆ”μΆœν•΄μ„œ μ„ μ–Έν•œ 클래슀λ₯Ό 좔상 클래슀라고 함

μ˜ˆμ‹œ 
μƒˆ, κ³€μΆ©, λ¬Όκ³ κΈ°λŠ” λ™λ¬Όμ΄λΌλŠ” 곡톡적인 νŠΉμ„±μ„ 가짐
싀체 클래슀 =  μƒˆ, κ³€μΆ©, λ¬Όκ³ κΈ°
좔상 클래슀 = 동물

좔상 ν΄λž˜μŠ€λŠ” `new μ—°μ‚°μž`λ₯Ό μ‚¬μš©ν•˜μ—¬ 객체λ₯Ό 직접 생성할 수 μ—†λ‹€.


좔상 클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” 이유 ❓

1. 곡톡 κΈ°λŠ₯을 λ¬Άμ–΄μ„œ μ½”λ“œ 쀑볡 λ°©μ§€

  • μ—¬λŸ¬ μžμ‹ ν΄λž˜μŠ€μ— κ³΅ν†΅λœ ν•„λ“œλ‚˜ λ©”μ„œλ“œλ₯Ό 좔상 ν΄λž˜μŠ€μ— μ •μ˜ν•΄μ„œ, μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±κ³Ό μœ μ§€λ³΄μˆ˜μ„±μ„ 높일 수 있음.
abstract class Animal {
    String name;

    void breathe() {
        System.out.println("μˆ¨μ„ μ‰°λ‹€");
    }

    abstract void sound(); // 곡톡 κΈ°λŠ₯μ΄μ§€λ§Œ λ™μž‘ 방식은 닀름
}

→ breathe()λŠ” λͺ¨λ“  λ™λ¬Όμ΄ κ³΅μœ ν•˜λ‹ˆκΉŒ μΆ”상 ν΄λž˜μŠ€μ—μ„œ κ΅¬ν˜„,
→ sound()λŠ” λ™λ¬Όλ§ˆλ‹€ λ‹€λ₯΄λ‹ˆκΉŒ μΆ”상 λ©”μ„œλ“œλ‘œ μ„ μ–Έν•΄μ„œ μžμ‹μ΄ κ΅¬ν˜„ν•˜κ²Œ ν•¨.

2. μžμ‹ ν΄λž˜μŠ€κ°€ λ°˜λ“œμ‹œ κ΅¬ν˜„ν•΄μ•Ό ν•  λ©”μ„œλ“œ κ°•μ œ

  • 좔상 λ©”μ„œλ“œλ₯Ό μ„ μ–Έν•˜λ©΄, μžμ‹ ν΄λž˜μŠ€λŠ” κ·Έ λ©”μ„œλ“œλ₯Ό λ°˜λ“œμ‹œ μ˜€λ²„λΌμ΄λ”©ν•΄μ•Ό ν•΄.
    → ν†΅μΌλœ μΈν„°νŽ˜μ΄μŠ€ 제곡이 κ°€λŠ₯ν•΄μ§€κ³ , μ‹€μˆ˜λ‘œ 빠뜨릴 걱정이 없어짐.
abstract class Animal {
    abstract void sound(); // 무쑰건 μ˜€λ²„λΌμ΄λ”©ν•΄μ•Ό 함
}

3. 객체 생성을 막고 섀계 μš©λ„λ‘œλ§Œ μ‚¬μš©

  • 좔상 ν΄λž˜μŠ€λŠ” 직접 객체둜 λ§Œλ“€ 수 μ—†μŒ → 였직 `상속 μ „μš©`
  • 즉, μ„€κ³„λ„μ²˜λŸΌ "곡톡 규격"만 μ œκ³΅ν•˜κ³ , μ‹€μ œ λ™μž‘μ€ μžμ‹μ΄ μ±„μ›Œλ„£λŠ” ꡬ쑰
Animal a = new Animal(); // ❌ μ—λŸ¬! 좔상 ν΄λž˜μŠ€λŠ” μΈμŠ€ν„΄μŠ€ν™” λΆˆκ°€

4. μΈν„°νŽ˜μ΄μŠ€λ³΄λ‹€ μœ μ—°ν•œ 선택지

  • μžλ°”λŠ” 닀쀑 상속이 μ•ˆ λ˜λ‹ˆκΉŒ, ν΄λž˜μŠ€λŠ” ν•˜λ‚˜λ°–μ— 상속 λͺ» 함.
  • ν•˜μ§€λ§Œ μΈν„°νŽ˜μ΄μŠ€λŠ” 닀쀑 κ΅¬ν˜„μ΄ κ°€λŠ₯ν•˜κ³ , 좔상 ν΄λž˜μŠ€λŠ” μƒμ†λ§Œ κ°€λŠ₯함.
  • 좔상 ν΄λž˜μŠ€λŠ” ν•„λ“œ, μƒμ„±μž, 일반 λ©”μ„œλ“œκΉŒμ§€ 포함할 수 μžˆμ–΄μ„œ, 곡톡 κ΅¬ν˜„ 둜직이 λ§Žμ€ 경우 μΈν„°νŽ˜μ΄μŠ€λ³΄λ‹€ μœ λ¦¬ν•¨.
λͺ©μ  μ„€λͺ…
곡톡 κΈ°λŠ₯ μ •μ˜ μžμ‹ ν΄λž˜μŠ€μ— κ³΅ν†΅λœ μ½”λ“œ λ¬ΆκΈ°
λ©”μ„œλ“œ κ΅¬ν˜„ κ°•μ œ μžμ‹ ν΄λž˜μŠ€κ°€ λ°˜λ“œμ‹œ μ˜€λ²„λΌμ΄λ”©ν•˜κ²Œ 함
μ„€κ³„μš© 클래슀 직접 객체 생성 λ°©μ§€, μ„€κ³„λ„λ‘œλ§Œ μ‚¬μš©
μΈν„°νŽ˜μ΄μŠ€λ³΄λ‹€ μ‹€μš©μ μΈ 경우 ν•„λ“œλ‚˜ κ΅¬ν˜„ λ©”μ„œλ“œκ°€ ν•„μš”ν•œ 경우 더 적합

Q. 좔상 ν΄λž˜μŠ€κ°€ 좔상 클래슀λ₯Ό 상속할 수 μžˆμ„κΉŒ?

A. 좔상 ν΄λž˜μŠ€λŠ” λ‹€λ₯Έ 좔상 클래슀λ₯Ό 상속할 수 있음

μ™œ 좔상 ν΄λž˜μŠ€κ°€ 좔상 클래슀λ₯Ό μƒμ†ν•˜λŠ”κ°€?

1. 좔상화 단계(레벨)λ₯Ό λ‚˜λˆŒ 수 있기 λ•Œλ¬Έμ—

λ³΅μž‘ν•œ μ‹œμŠ€ν…œμΌμˆ˜λ‘ ν•œ λ²ˆμ— λͺ¨λ“  κ±Έ μ •μ˜ν•˜κΈ°λ³΄λ‹¨, μ μ§„μ μœΌλ‘œ μΆ”μƒν™”ν•΄μ„œ κ³„μΈ΅μ μœΌλ‘œ κ΅¬μ‘°ν™”ν•˜λŠ” 게 μ’‹μŒ

abstract class Animal {
    abstract void makeSound();
}

abstract class Canine extends Animal {
    abstract void sniff();
}

class Dog extends Canine {
    void makeSound() { System.out.println("멍멍"); }
    void sniff() { System.out.println("킁킁"); }
}

 

  • `Animal`: λͺ¨λ“  λ™λ¬Όμ˜ 곡톡 κΈ°λŠ₯ μ •μ˜
  • `Canine`: 개과 λ™λ¬Όλ§Œμ˜ 곡톡 κΈ°λŠ₯(sniff) μ •μ˜ (아직 ꡬ체적이지 μ•ŠμŒ)
  • `Dog`: ꡬ체적인 동물 → μ—¬κΈ°μ„œμ•Ό μ‹€μ œ λ©”μ„œλ“œ κ΅¬ν˜„!

2. 곡톡 λ‘œμ§μ€ 좔상 ν΄λž˜μŠ€κ°€ λ‚˜λˆ  κ°–κΈ° λ•Œλ¬Έ

  • μƒμœ„ 좔상 클래슀: 정말 곡톡적인 좔상 λ©”μ„œλ“œ μ •μ˜
  • ν•˜μœ„ 좔상 클래슀: 더 ꡬ체적인 μ—­ν•  μ •μ˜ + 일뢀 곡톡 λ©”μ„œλ“œ κ΅¬ν˜„
  • μ΅œν•˜μœ„ 클래슀(κ΅¬ν˜„ 클래슀): μ™„μ „ν•œ κΈ°λŠ₯ κ΅¬ν˜„

μ΄λ ‡κ²Œ ν•˜λ©΄ 쀑볡을 μ€„μ΄λ©΄μ„œλ„ 역할을 λͺ…ν™•νžˆ 뢄리할 수 μžˆμ–΄.

ν•­λͺ© μ„€λͺ…
κ°€λŠ₯ μ—¬λΆ€ βœ… 좔상 ν΄λž˜μŠ€λŠ” 좔상 클래슀λ₯Ό 상속할 수 있음
μ‚¬μš©ν•˜λŠ” 이유 좔상화 단계λ₯Ό λ‚˜λˆ„κ³ , 역할을 κ³„μΈ΅μ μœΌλ‘œ λΆ„λ¦¬ν•˜κΈ° μœ„ν•΄
μž₯점 쀑볡 제거, ꡬ쑰적 섀계, μœ μ§€λ³΄μˆ˜ 쉬움

 


λ΄‰μΈλœ 클래슀

  • 기본적으둜 `final` 클래슀λ₯Ό μ œμ™Έν•œ λͺ¨λ“  ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ ν΄λž˜μŠ€κ°€ 될 수 있음
  • JAVA 15 λΆ€ν„° λ¬΄λΆ„λ³„ν•œ μžμ‹ 클래슀 생성을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ λ΄‰μΈλœ(sealed) ν΄λž˜μŠ€κ°€ λ„μž… 됨

πŸ‘‡πŸ» Person의 μžμ‹ ν΄λž˜μŠ€λŠ” Employee와 Manager만 κ°€λŠ₯

public sealed class Person permits Employee, Manager { ... }
  • sealed ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ permits ν‚€μ›Œλ“œ 뒀에 상속 κ°€λŠ₯ν•œ μžμ‹ 클래슀λ₯Ό μ§€μ •ν•΄μ•Ό 함.
  • λ΄‰μΈλœ Person 클래슀λ₯Ό μƒμ†ν•˜λŠ” Employee와 MangerλŠ” `final`, `non-sealed` λ˜λŠ” λ˜λ‹€λ₯Έ λ΄‰μΈλœ 클래슀인 `sealed` ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„ μ–Έν•΄μ•Ό 함
final 더 이상 상속 λΆˆκ°€
non-sealed 봉인 ν•΄μ œ

Q. non-sealedκ°€ μ‘΄μž¬ν•˜λŠ” 이유?

λ΄‰μΈλœ ν΄λž˜μŠ€λŠ” μžμ‹ 클래슀λ₯Ό ν•œμ •ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ”λ°, μ™œ μžμ‹μ—μ„œ 봉인을 ν•΄μ œν•˜λŠ”κ°€??

A. μ œν•œμ„ ν•˜λ©΄μ„œλ„ μœ μ—°ν•¨μ„ ν—ˆμš©ν•˜λ €λŠ” 섀계 μ² ν•™ λ•Œλ¬Έμ—

1. 일뢀 μžμ‹λ§Œ μ œν•œν•˜κ³ , μΌλΆ€λŠ” 자유둭게 ν•˜κ³  싢을 λ•Œ

sealed 클래슀λ₯Ό λ§Œλ“€λ©΄ μžμ‹ 클래슀λ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ œν•œ κ°€λŠ₯

public sealed class Shape permits Circle, Rectangle {}
만일 `Circle`은 더 이상 μžμ‹μ΄ ν•„μš”μ—†κ³  `Rectangle`은 더 μ„ΈλΆ„ν™”λœ νƒ€μž…μ΄ μžˆμ–΄μ•Ό ν•œλ‹€λ©΄?
public final class Circle extends Shape {}       // μžμ‹ λΆˆκ°€
public non-sealed class Rectangle extends Shape {} // μžμ‹ ν—ˆμš©

πŸ‘‰ `non-sealed`은 "λ‚˜λŠ” 자유둭게 ν™•μž₯될 수 μžˆλ‹€" 라고 μ„ μ–Έν•˜λŠ” 것

즉, λΆ€λͺ¨λŠ” μ „μ²΄μ μœΌλ‘œ μžμ‹λ“€μ„ μ œν•œν•˜μ§€λ§Œ, νŠΉμ • μžμ‹μ€ λ‹€μ‹œ μ—΄μ–΄λ‘”λ‹€κ³  선택할 수 있게 λ§Œλ“œλŠ” ꡬ쑰

2. 상속 κ³„μΈ΅μ˜ μœ μ—°μ„±μ„ μœ„ν•΄

μ–΄λ–€ 클래슀 계측은 μ—„κ²©ν•˜κ²Œ, μ–΄λ–€ 클래슀 계측은 μœ μ—°ν•˜κ²Œ μ—΄μ–΄λ‘˜ ν•„μš”κ°€ μžˆλ‹€.

예λ₯Ό λ“€μ–΄ Java의 sealedλŠ” OOPμ—μ„œ 도메인 λͺ¨λΈμ„ 더 μ•ˆμ „ν•˜κ²Œ μ„€κ³„ν•˜κΈ° μœ„ν•œ 도ꡬ인데,
λͺ¨λ“  계측이 λ”±λ”±ν•˜κ²Œ λ‹«ν˜€ 있으면 ν™•μž₯이 λΆˆκ°€λŠ₯ν•΄μ„œ λΆˆνŽΈν•  수 있음

sealed class Expr permits ConstExpr, VarExpr {}

non-sealed class VarExpr extends Expr {} // λ‹€μ–‘ν•œ λ³€μˆ˜ ν‘œν˜„μ΄ ν•„μš”ν•¨
final class ConstExpr extends Expr {}     // κ³ μ • μƒμˆ˜λŠ” ν™•μž₯ ν•„μš” μ—†μŒ

3. κΆŒν•œμ„ 일단 μ£Όκ³ , μžμ‹μ΄ 섀계 μ±…μž„μ„ κ°€μ§ˆ 수 μžˆλ„λ‘ 함

non-sealed은 λΆ€λͺ¨κ°€ "λ‚˜λŠ” λ„ˆκΉŒμ§€λŠ” μ œμ–΄ν• κ²Œ"
→ "κ·Έ λ‹€μŒμ€ λ„€κ°€ μ±…μž„μ§€κ³  μ•Œμ•„μ„œ μ—΄λ“  λ‹«λ“  κ²°μ •ν•΄" λΌλŠ” μ˜λ„λ„ μžˆλ‹€.

μ‹€λ¬΄μ—μ„œλŠ” μ΄λ ‡κ²Œ ν•˜μœ„ λͺ¨λ“ˆ 섀계 μ±…μž„μ„ λ„˜κΈ°λŠ” κ²½μš°λ„ 자주 있음

 

ν‚€μ›Œλ“œ μ„€λͺ… 상속 κ°€λŠ₯μ„± μ‚¬μš© λͺ©μ  μ˜ˆμ‹œ
sealed μžμ‹ 클래슀λ₯Ό μ œν•œν•˜κ³  싢을 λ•Œ μ‚¬μš© λͺ…μ‹œν•œ 클래슀만 κ°€λŠ₯ 상속 계측 μ œμ–΄, λ³΄μ•ˆμ„± ν–₯상 sealed class Shape permits Circle, Square {}
non-sealed 상속 μ œν•œμ„ ν•΄μ œν•˜κ³  싢을 λ•Œ μ‚¬μš© λˆ„κ΅¬λ“  상속 κ°€λŠ₯ μœ μ—°ν•œ ν™•μž₯ ν—ˆμš© non-sealed class Rectangle extends Shape {}
final 상속을 μ™„μ „νžˆ 막고 싢을 λ•Œ μ‚¬μš© μ ˆλŒ€ λΆˆκ°€ 클래슀 ν™•μž₯ κΈˆμ§€ final class Circle extends Shape {}
728x90
'Backend/JAVA' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • μ»¬λ ‰μ…˜ ν”„λ ˆμž„μ›Œν¬
  • 상속 κ΄€κ³„μ—μ„œ νƒ€μž… λ³€ν™˜μ˜ μ΄μœ μ™€ μ‚¬μš© λͺ©μ 
0woy
0woy
Algorithm, CS, Web λ“± 배운 λ‚΄μš©μ„ κΈ°λ‘ν•©λ‹ˆλ‹€.
  • 0woy
    0woy dev
    0woy
  • 전체
    였늘
    μ–΄μ œ
    • λΆ„λ₯˜ 전체보기 (40) N
      • Backend (3)
        • JAVA (3)
      • Frontend (15)
        • HTML5 (1)
        • CSS (1)
        • JS (4)
        • Vue 3 (9)
      • Computer Science (11)
        • λ„€νŠΈμ›Œν¬ (5)
        • 운영체제 (5)
      • PS (8) N
        • LeetCode (2)
        • Baekjoon (1)
        • Programmers (0)
        • μ•Œκ³ λ¦¬μ¦˜ (5) N
      • Dev Trivia (3)
  • λΈ”λ‘œκ·Έ 메뉴

    • ν™ˆ
    • νƒœκ·Έ
    • λ°©λͺ…둝
  • 링크

  • 곡지사항

  • 인기 κΈ€

  • νƒœκ·Έ

    fast recovery
    Vue3
    selectiverepeat
    javascript
    list
    fastretransmit
    JS
    속성
    상속
    tcp
    μ•”μ‹œμ κ·Έλž˜ν”„
    κ·Έλž˜ν”„
    Props
    dfs
    ν•¨μˆ˜
    읡λͺ…κ΅¬ν˜„κ°μ²΄
    BFS
    java
    map
    implicit graph
    function
    트리
    DP
    set
    leetcode
    html
    tcp tahoe
    basecase
    dom
    recursioncall
  • 졜근 λŒ“κΈ€

  • 졜근 κΈ€

  • 250x250
  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.3
0woy
좔상 클래슀 & 봉인 클래슀
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”