🧩 객체지ν–₯의 μž¬μ‚¬μš© : 상속 쑰립에 λŒ€ν•˜μ—¬ !

sery270Β·2021λ…„ 5μ›” 11일
4

Android

λͺ©λ‘ 보기
11/13

객체 지ν–₯의 원칙에 λ”°λ₯΄λ©΄, μƒμ†λ³΄λ‹€λŠ” 쑰립을 μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€κ³  ν•©λ‹ˆλ‹€. κ·Έ 이유인 상속을 ν†΅ν•œ μž¬μ‚¬μš©μ˜ 단점듀에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄κ³ , 쑰립과 μƒμ†μ˜ μ˜ˆμ‹œλ“€μ„ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. μ˜€λŠ˜λ„ ν™”μ΄νŒ… μž…λ‹ˆλ‹€ 🌿

객체 쑰립, 객체 ꡬ성은 같은 μš©μ–΄ !
object composition 에 λŒ€ν•œ λ²ˆμ—­μ˜ 차이둜, 객체 쑰립, 객체 ꡬ성 λ“±μ˜ μš©μ–΄λ‘œ λΆˆλ¦½λ‹ˆλ‹€.

1️⃣ 상속을 ν†΅ν•œ μž¬μ‚¬μš©μ˜ 단점 3가지


  • μ–΄λ–€ 클래슀λ₯Ό μƒμ†λ°›λŠ”λ‹€λŠ” 것은 κ·Έ ν΄λž˜μŠ€μ— μ˜μ‘΄ν•œλ‹€λŠ” λœ»μž…λ‹ˆλ‹€.

μƒμœ„ 클래슀 λ³€κ²½μ˜ 어렀움

  • 상속 계측을 따라 μƒμœ„ 클래슀의 변경이 ν•˜μœ„ ν΄λž˜μŠ€μ— 영ν–₯을 μ£ΌκΈ° λ•Œλ¬Έμ—, μ΅œμ•…μ˜ 경우 μƒμœ„ 클래슀의 λ³€ν™”κ°€ λͺ¨λ“  ν•˜μœ„ ν΄λž˜μŠ€μ— 영ν–₯을 쀄 수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ΄λŸ¬ν•œ 영ν–₯으둜 인해, 상속 κ΅¬ν˜„μœΌλ‘œ 된 ꡬ쑰에선 (상속을 ν†΅ν•œ μž¬μ‚¬μš© ꡬ쑰에선), μƒμœ„ 클래슀의 변경이 μ–΄λ ΅μŠ΅λ‹ˆλ‹€.

클래슀의 λΆˆν•„μš”ν•œ 증가

  • μœ μ‚¬ν•œ κΈ°λŠ₯을 ν™•μž₯ν•˜λŠ” κ³Όμ •μ—μ„œ 클래슀의 κ°œμˆ˜κ°€ λΆˆν•„μš”ν•˜κ²Œ 증가할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • (μžλ°”) 닀쀑 상속을 ν•  수 μ—†μœΌλ―€λ‘œ, 상속받을 수 μžˆλŠ” 클래슀의 개수 (λΆ€λͺ¨μ˜ 개수) κ°€ μ œν•œλ©λ‹ˆλ‹€.
    • 즉 μ œν•œλœ 상속을 받아햐할 수 밖에 μ—†μœΌλ―€λ‘œ, 이미 κ΅¬ν˜„λœ ν΄λž˜μŠ€λ“€μ΄ μžˆμŒμ—λ„ λΆˆκ΅¬ν•˜κ³ , λ‹€μ‹œ κ΅¬ν˜„ν•΄μ•Όν•˜λŠ” 상황이 μƒκΉλ‹ˆλ‹€.
      • μ΄λŠ” 클래슀의 λΆˆν•„μš”ν•œ μ¦κ°€λ‘œ μ΄μ–΄μ§‘λ‹ˆλ‹€.

μƒμ†μ˜ 였용

  • 상속을 잘λͺ» μ‚¬μš©ν•˜κΈ° μ‰½μŠ΅λ‹ˆλ‹€.
  • μ„œλ‘œ λ‹€λ₯Έ μ±…μž„μ„ κ°–λŠ”, 같은 μ’…λ₯˜κ°€ μ•„λ‹Œ 클래슀의 κ΅¬ν˜„μ„ μž¬μ‚¬μš©ν•˜κΈ° μœ„ν•΄ 상속을 λ°›κ²Œ 되면, 잘λͺ»λœ μ‚¬μš©μœΌλ‘œ λ¬Έμ œκ°€ λ°œμƒν•˜κ²Œ λ©λ‹ˆλ‹€.

2️⃣ κ·Έλž˜μ„œ 쑰립(Composition)μ΄λž€ ?


  • 객체 지ν–₯μ—μ„œ 객체 쑰립은 보톡 ν•„λ“œμ—μ„œ λ‹€λ₯Έ 객체λ₯Ό μ°Έμ‘°ν•˜λŠ” λ°©μ‹μœΌλ‘œ κ΅¬ν˜„λ©λ‹ˆλ‹€.

  • ν•œ 객체가 λ‹€λ₯Έ 객체λ₯Ό μ‘°λ¦½ν•΄μ„œ ν•„λ“œλ‘œ κ°–λŠ”λ‹€λŠ” 것은 λ‹€λ₯Έ 객체의 κΈ°λŠ₯을 μ‚¬μš©ν•œλ‹€λŠ” 의미λ₯Ό κ°€μ§‘λ‹ˆλ‹€.

    public class FlowController {
    
        public void process() {
            ByteSource source = ByteSourceFactory.getInstance().create();
            byte[] data = source.read();
    
            Encryptor encryptor = new Encryptor();
            byte[] encryptedData = encryptor.encrypt(data);
    
            FileDataWriter writer = new FileDataWriter();
            writer.write(encryptedData);
        }
    }
  • 쑰립을 μ΄μš©ν•˜λŠ” νŒ¨ν„΄μœΌλ‘œ μœ„μž„ νŒ¨ν„΄μ΄ μžˆμŠ΅λ‹ˆλ‹€.

    • μœ„μž„μ΄λž€ λ‚΄κ°€ ν•  일을 λ‹€λ₯Έ κ°μ²΄μ—κ²Œ λ„˜κΈ΄λ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€.
    • 객체가 해야할일을 λΆ€λΆ„μ μœΌλ‘œ ν™•μž₯ν•΄μ„œ λŒ€μ‹  처리λ₯Ό ν•΄μ€λ‹ˆλ‹€.

클래슀의 λΆˆν•„μš”ν•œ 증가 방지

  • κΈ°λŠ₯이 좔가될 λ•Œ, κΈ°μ‘΄ 클래슀의 κ΅¬ν˜„ μƒμ†λŒ€μ‹ , ν•΄λ‹Ή ν΄λž˜μŠ€μ— λŒ€ν•œ 쑰립을 톡해 κΈ°λŠ₯을 μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • 즉, 상속을 ν†΅ν•œ ν™•μž₯의 결과인 λΆˆν•„μš”ν•œ 클래슀 증가가 λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ .

μƒμ†μ˜ 였용 방지

  • 아무리 μ—¬λŸ¬κΈ°λŠ₯을 μ‘°λ¦½μ‹œμΌœλ„, μžμ‹ μ˜ μ—­ν• (μžμ‹ μ˜ νƒ€μž…)으둜만 μ‚¬μš©λ˜κ²Œ ν•©λ‹ˆλ‹€.
    • μ—¬λŸ¬κΈ°λŠ₯을 μƒμ†λ°›λŠ”λ‹€λ©΄, νŠΉμ • κΈ°λŠ₯의 μ—­ν• (λΆ€λͺ¨μ˜ νƒ€μž…)으둜 μ‚¬μš©λ  κ°€λŠ₯성이 있고, μ΄λŠ” μƒμ†μ˜ 였용의 문제둜 μ΄μ–΄μ§€κ²Œ λ©λ‹ˆλ‹€.

3️⃣ 쑰립의 예 1) iOS의 UIKit Framwork


μ μ ˆν•œ μ˜ˆμ‹œλ₯Ό 쀀비쀑 ~,~

4️⃣ 쑰립의 예 2) Android의 Context


λ³€κ²½μ˜ μœ μ—°ν•¨/ μž¬μ‚¬μš©μ„±μ„ 보μž₯ν•  λ•Œ 쑰립을 μ‚¬μš©ν•œλ‹€.

  • 이 κΈ€μ—μ„œ μ•Œ 수 μžˆλ“―, 쑰립 κ΅¬μ‘°λŠ” μƒμ†μ˜ 단점듀을 ν•΄κ²°ν•˜λ©΄μ„œ λ™μ‹œμ— 각 κΈ°λŠ₯을 제곡 λ°›κΈ° μœ„ν•΄ λ“±μž₯ν•œ κ΅¬μ‘°μž…λ‹ˆλ‹€. 즉 κ·Έ κΈ°λŠ₯의 μ‚¬μš©κ³Ό ν™•μž₯을 μ œν•œν•˜λ―€λ‘œμ„œ, μƒμ†μ˜ 단점인 μœ μ—°ν•˜μ§€ μ•Šμ€ μœ μ§€λ³΄μˆ˜ 문제λ₯Ό ν•΄κ²°ν•˜κ³  μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

  • 이λ₯Ό ν† λŒ€λ‘œ 쑰립을 λ‹€μ‹œ ν•΄μ„ν•˜μžλ©΄, μ‘°λ¦½μ΄λž€ μž¬μ‚¬μš©μ˜ 관점, μœ μ§€λ³΄μˆ˜μ˜ κ΄€μ μ—μ„œ μœ μš©ν•œ ꡬ쑰인 κ²ƒμž…λ‹ˆλ‹€.

쑰립 ꡬ쑰λ₯Ό μ‚¬μš©ν•œ Android의 Context

  • ContextλŠ” μ—¬λŸ¬ μ»΄ν¬λ„ŒνŠΈ(Activity, Service, Application)의 μƒμœ„ ν΄λž˜μŠ€μž…λ‹ˆλ‹€. λ˜ν•œ μ—¬λŸ¬ μ»΄ν¬λ„ŒνŠΈλŠ” 이 Contextλ₯Ό 톡해 μ—°κ²°λ˜μ–΄μžˆμŠ΅λ‹ˆλ‹€.

  • μ•„λž˜ μ½”λ“œλŠ” 쑰립 ꡬ쑰λ₯Ό μ‚¬μš©ν•˜μ—¬ Context의 κΈ°λŠ₯을 μ‚¬μš©ν•˜κ³  μžˆλŠ” ContextWrapper 클래슀의 μ½”λ“œμž…λ‹ˆλ‹€. μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄κ³ , μ΄λ ‡κ²Œ 쑰립ꡬ쑰λ₯Ό μ‚¬μš©ν•œ μ΄μœ μ— λŒ€ν•΄μ„œ μƒκ°ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

    public class ContextWrapper extends Context {
        @UnsupportedAppUsage
        Context mBase;
    
        public ContextWrapper(Context base) {
            mBase = base;
        }
    
        /**
         * Set the base context for this ContextWrapper.  All calls will then be
         * delegated to the base context.  Throws
         * IllegalStateException if a base context has already been set.
         *
         * @param base The new base context for this wrapper.
         */
        protected void attachBaseContext(Context base) {
            if (mBase != null) {
                throw new IllegalStateException("Base context already set");
            }
            mBase = base;
        }
    
        /**
         * @return the base context as set by the constructor or setBaseContext
         */
        public Context getBaseContext() {
            return mBase;
        }
    
        @Override
        public AssetManager getAssets() {
            return mBase.getAssets();
        }
    
        @Override
        public Resources getResources() {
            return mBase.getResources();
        }
    
        @Override
        public Context getApplicationContext() {
            return mBase.getApplicationContext();
        }
    
    // μ΄ν•˜ μƒλž΅
    }
  • Activity, Service, ApplicationλŠ” ContextImplλ₯Ό 직접 μƒμ†ν•˜μ—¬ μ‚¬μš©ν•˜μ§€ μ•Šκ³ , 곡개 λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 쑰립의 방법을 톡해 μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

    • ContextWrapperμ—μ„œ ContextImpl의 곡개 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬, ContextImpl의 μΈμŠ€ν„΄μŠ€λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
      • getBaseContext(), getApplicationContext()
    • 즉 ContextWrapperκ°€ ContextImpl의 λ°˜ν™˜μ„ μœ„μž„ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
  • 이런 쑰립 ꡬ쑰의 이점은 μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

    • ContextImpl의 λ³€μˆ˜κ°€ λ…ΈμΆœλ˜μ§€ μ•Šκ²Œ λ©λ‹ˆλ‹€.
    • ContextWrapper의 μ½”λ“œκ°€ λ‹¨μˆœν•΄μ§‘λ‹ˆλ‹€. ContextImpl의 λ©”μ„œλ“œλ“€μ„ μ μ ˆν•˜κ²Œ ν˜ΈμΆœν•˜κΈ°λ§Œ ν•˜λ©΄ 되기 λ•Œλ¬Έμž…λ‹ˆλ‹€.
    • 각 μ»΄ν¬λ„ŒνŠΈλ³„λ‘œ μ‚¬μš©λ˜λŠ” κΈ°λŠ₯을 μ œμ–΄, μœ μ§€λ³΄μˆ˜, μž¬μ‚¬μš©ν•˜κΈ° μ‰¬μ›Œμ‘ŒμŠ΅λ‹ˆλ‹€.
  • μ•„λž˜ 링크λ₯Ό 톡해 μ½”λ“œ 원문을 ν™•μΈν•˜μ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€.

5️⃣ μƒμ†μ˜ 예 1) Android의 View


IS-A κ΄€κ³„μ—μ„œ κΈ°λŠ₯을 μ μ§„μ μœΌλ‘œ ν™•μž₯ν•  λ•Œ 상속을 μ‚¬μš©ν•©λ‹ˆλ‹€.

  • 반면, 상속은 λΆ€λͺ¨λ‘œλΆ€ν„° 물렀받은 무언가λ₯Ό ν™•μž₯ν•˜κ³  μž¬μ •μ˜ν•˜λŠ”λ°μ— μžμœ λ‘­μŠ΅λ‹ˆλ‹€. μ‘°λ¦½κ³ΌλŠ” 달리 주어진 κΈ°λŠ₯을 μ˜€λ²„λΌμ΄λ“œ ν•  μˆ˜λ„ 있고, 이λ₯Ό ν™•μž₯ν•˜μ—¬ μ—¬λŸ¬ μ»€μŠ€ν…€ 클래슀λ₯Ό λ§Œλ“€κΈ°λ„ μ’‹μŠ΅λ‹ˆλ‹€. 이 κΈ€μ˜ 1οΈβƒ£μ—μ„œ μ΄μ•ΌκΈ°ν–ˆλ˜ μƒμ†μ˜ λ‹¨μ μ—μ„œ μƒμ†μ˜ νŠΉμ§•μ„ 뽑아본닀면 μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

    • μƒμœ„ 클래슀 λ³€κ²½μ˜ 어렀움도, μžμ‹μ΄ λΆ€λͺ¨λ₯Ό μ‚¬μš©ν•  수 μžˆκΈ°μ— λ°œμƒν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

    • λΆˆν•„μš”ν•œ 클래슀의 ν™•μž₯도, κ°œλ°œμžκ°€ ν•„μš”ν•œ κΈ°λŠ₯에 λ”± 맞게 μ»€μŠ€ν…€ν•˜μ—¬, 즉 λΆ€λͺ¨λ₯Ό ν™•μž₯ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆκΈ°μ— λ°œμƒν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

    • 이λ₯Ό ν•œλ§ˆλ””λ‘œ μ •λ¦¬ν•œλ‹€λ©΄, μƒμ†μ΄λž€ μž¬μ‚¬μš©μ΄ μ•„λ‹Œ κΈ°λŠ₯의 ν™•μž₯μ΄λΌλŠ” κ΄€μ μ—μ„œ μœ μš©ν•œ ꡬ쑰인 κ²ƒμž…λ‹ˆλ‹€.

      • ν•œνŽΈ, 상속을 μ‚¬μš©ν•  λ•Œμ—”, 항상 IS-A 관계가 μ„±λ¦½ν•΄μ•Όν•©λ‹ˆλ‹€.

        IS-A 관계

        λ¨Όμ € μœ„ν‚€ν”Όλ””μ•„μ˜ μ„€λͺ…을 μ‚΄νŽ΄λ³΄μžλ©΄ 이와 κ°™μŠ΅λ‹ˆλ‹€. IS-A λŠ” 좔상화(ν˜•μ‹μ΄λ‚˜ ν΄λž˜μŠ€μ™€ 같은)λ“€ μ‚¬μ΄μ˜ 포함 관계λ₯Ό μ˜λ―Έν•˜λ©°, ν•œ 클래슀 Aκ°€ λ‹€λ₯Έ 클래슀 B의 μ„œλΈŒν΄λž˜μŠ€(νŒŒμƒν΄λž˜μŠ€)μž„μ„ μ΄μ•ΌκΈ°ν•©λ‹ˆλ‹€. λ‹€λ₯Έ 말둜, νƒ€μž… AλŠ” νƒ€μž… B의 λͺ…μ„Έ(specification)λ₯Ό μ•”μ‹œν•œλ‹€λŠ” μ μ—μ„œ νƒ€μž… B의 μ„œλΈŒνƒ€μž…μ΄λΌκ³ λ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

        쑰금 더 와 λ‹ΏλŠ” μ„€λͺ…을 μœ„ν•΄ λΉ„μœ λ₯Ό μ²¨μ–Έν•˜μžλ©΄, λΆ€λͺ¨κ°€ View, μžμ‹μ΄ TextView ꡬ쑰λ₯Ό λ§Œλ“€ λ•Œ, 상속 관계 (IS-A 관계)κ°€ μ„±λ¦½ν•˜λŠ”μ§€ 보고 μ‹Άλ‹€λ©΄, TextView is Viewκ°€ 참인지λ₯Ό ν™•μΈν•˜λ©΄ λœλ‹€λŠ” λ§μž…λ‹ˆλ‹€. (자고둜 이 λͺ…μ œλŠ” μ°Έμ΄λ―€λ‘œ, IS-A 관계가 μ„±λ¦½ν•˜λ©°, μ•„λž˜μ„œ μ„€λͺ…ν•  Viewκ°€ 상속 ꡬ쑰λ₯Ό μ‚¬μš©ν•œ 배경이 λ©λ‹ˆλ‹€.)

상속 ꡬ쑰λ₯Ό μ‚¬μš©ν•œ Android의 View

  • μ™œ Viewκ°€ 상속 ꡬ쑰둜 κ΅¬ν˜„λ˜μ—ˆλŠ”μ§€ μ΄ν•΄ν•˜λ €λ©΄, IS-A관계와 κΈ°λŠ₯의 ν™•μž₯을 생각해보면 λ˜κ² μŠ΅λ‹ˆλ‹€ !
  • λ¨Όμ € κΈ°λŠ₯의 ν™•μž₯을 μƒκ°ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€. μ•ˆλ“œλ‘œμ΄λ“œμ—μ„œ μœ„μ ―κ³Ό κ΄€λ ¨ ν΄λž˜μŠ€λ“€ μ •μ˜ν• λ•Œ, 각 ν΄λž˜μŠ€μ— λ“€μ–΄κ°ˆ ν•„μˆ˜μ μΈ κΈ°λŠ₯이 μžˆμ—ˆμ„κ²λ‹ˆλ‹€. TextView에 λŒ€ν•΄ μ •μ˜ν•˜λ‹€λ³΄λ‹ˆ, TextView둜써의 ν•„μˆ˜μ μΈ κΈ°λŠ₯μ—” View둜써의 ν•„μˆ˜μ μΈ κΈ°λŠ₯(예λ₯Ό λ“€λ©΄ 화면에 λ³΄μ—¬μ§€λŠ” κΈ°λŠ₯)이 ν•„μš”ν•˜λ‹€λŠ” 것을 μ•Œκ²Œ λ©λ‹ˆλ‹€. μ΄λ²ˆμ—” Button에 λŒ€ν•΄ μ •μ˜ν•˜λ‹€λ³΄λ‹ˆ, Button둜써의 ν•„μˆ˜μ μΈ κΈ°λŠ₯μ—” TextView둜써의 ν•„μˆ˜μ μΈ κΈ°λŠ₯(예λ₯Ό λ“€λ©΄ λ²„νŠΌμ— 글씨가 λ³΄μ—¬μ§€λŠ” κΈ°λŠ₯)이 ν•„μš”ν•˜λ‹€λŠ” 것을 μ•Œκ²Œ λ©λ‹ˆλ‹€. μƒˆλ‘œμš΄ μœ„μ ―λ“€μ΄ κΈ°μ‘΄ μœ„μ ―λ“€μ„ ν™•μž₯ν•˜μ—¬ λ§Œλ“€μ–΄μ§„λ‹€λŠ” 것을 μ•Œκ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
    • View둜써의 ν•„μˆ˜μ μΈ κΈ°λŠ₯이 μžˆλ‹€.
      • TextView둜써의 ν•„μˆ˜μ μΈ κΈ°λŠ₯이 μžˆλ‹€.
        • Button둜써의 ν•„μˆ˜μ μΈ κΈ°λŠ₯이 μžˆλ‹€.
          • ...
  • λ˜ν•œ μ΄λ ‡κ²Œ 각 μœ„μ ―μ˜ ν•„μˆ˜μ μΈ κΈ°λŠ₯을 κ΅¬μƒν•˜λ©΄μ„œ, κΈ°μ‘΄ μœ„μ ―λ“€μ„ ν™•μž₯ν•˜μ—¬ λ§Œλ“€μ–΄μ•Όν•œλ‹€λŠ” 것을 μ•Œκ²Œλ˜λ‹ˆ, IS-A 관계도 λͺ…ν™•ν•΄μ‘ŒμŠ΅λ‹ˆλ‹€.
    • ImageButton은 Button이닀. (ImageButton은 Button둜써의 ν•„μˆ˜μ μΈ κΈ°λŠ₯이 ν•„μš”ν•˜λ‹€.)
      • Button은 TextView이닀.
        • TextViewλŠ” View이닀.

μ™œ Context은 쑰립으둜, ViewλŠ” μƒμ†μœΌλ‘œ κ΅¬ν˜„λ˜μ—ˆμ„κΉŒμš” ?

각 ν΄λž˜μŠ€κ°€ μ•ˆλ“œλ‘œμ΄λ“œ κ°œλ°œμžλ“€μ— μ˜ν•΄ μ»€μŠ€ν…€λ˜μ–΄ μ‚¬μš©λ μ§€λ₯Ό 생각해보면 이해가 μ‰¬μ›Œμ§€μ‹€ κ²λ‹ˆλ‹€.

ν˜„μž¬ λ§Žμ€ μ•ˆλ“œλ‘œμ΄λ“œ κ°œλ°œμžλ“€μ€ μ›ν•˜λŠ” 화면을 κ΅¬μ„±ν•˜κΈ° μœ„ν•΄, 주어진 κΈ°λ³Έ μœ„μ ―λ§κ³ λ„, λ‹€μ–‘ν•œ μ»€μŠ€ν…€ 클래슀λ₯Ό λ§Œλ“€μ–΄ ν™œμš©ν•˜κ³ μžˆμŠ΅λ‹ˆλ‹€. 반면 Contextλ₯Ό μ»€μŠ€ν…€ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” κ²½μš°λŠ” 아직 많이 듀어보지 λͺ»ν–ˆλŠ”λ°μš”. 이런 μ“°μž„μ— λ”°λΌμ„œ μ μ ˆν•œ ꡬ쑰가 μ‚¬μš©λ˜μ—ˆλ‹€κ³  이해할 수 μžˆμŠ΅λ‹ˆλ‹€. ViewλŠ” κΈ°λŠ₯의 ν™•μž₯에 μžμœ λ‘œμ›Œμ•Όν•  ν΄λž˜μŠ€μ΄λ―€λ‘œ 상속을, ContextλŠ” ν™•μž₯이 κ°•μ‘°λ˜μ§„ μ•ŠλŠ” ν΄λž˜μŠ€μ΄λ―€λ‘œ, μƒμ†μ˜ 단점듀을 λ³΄μ™„ν•˜κΈ° μœ„ν•΄ 쑰립을 μ‚¬μš©ν–ˆλ‹€κ³  이해할 수 μžˆμŠ΅λ‹ˆλ‹€.

#️⃣ Reference


profile
κ°œλ°œμ„Έλ¦¬μ˜ μ„±μž₯기🌿

0개의 λŒ“κΈ€