BuNa_
IT Story
BuNa_
전체 방문자
였늘
μ–΄μ œ
  • λΆ„λ₯˜ 전체보기 (117)
    • CS (14)
      • 운영체제 (8)
      • λ„€νŠΈμ›Œν¬ (0)
      • Design Pattern (1)
      • OOP (4)
    • λŒ€μ™Έν™œλ™ (24)
      • μš°μ•„ν•œν…Œν¬μ½”μŠ€ (14)
      • DND 동아리 (4)
      • UMC 동아리 (5)
      • 해컀톀 (1)
    • Android (29)
      • MVVM (2)
      • μŠ€ν„°λ”” (11)
      • Compose (3)
      • Unit Test (1)
    • Project (5)
      • μ–΄λ”°μ„Έμ›Œ (5)
      • DnD κ³Όμ™Έ μ„œλΉ„μŠ€ (0)
    • Programming (11)
      • Kotlin (4)
      • 파이썬 (7)
    • Git (1)
    • 인곡지λŠ₯ (22)
    • λ°±μ€€ (8)
    • 기타 (3)
      • IntelliJ (1)
      • 일상 (0)

λΈ”λ‘œκ·Έ 메뉴

  • ν™ˆ

곡지사항

인기 κΈ€

νƒœκ·Έ

  • μ›μ‹œκ°’ 포μž₯
  • μš°ν…Œμ½” ν”„λ¦¬μ½”μŠ€
  • μ•ˆλ“œλ‘œμ΄λ“œ
  • Compose
  • Ai
  • UMC
  • 객체지ν–₯ μƒν™œμ²΄μ‘°
  • μš°ν…Œμ½”
  • μš°μ•„ν•œν…Œν¬μ½”μŠ€
  • λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°
  • μ™ΈλΆ€ λ‹¨νŽΈν™”
  • RecyclerView
  • 인곡지λŠ₯
  • λ°±μ€€
  • ViewModel
  • μš°ν…Œμ½” 5κΈ°
  • μ–΄λ”°μ„Έμ›Œ
  • μ„ ν˜•νšŒκ·€
  • Android
  • 인곡지λŠ₯ λΆ„λ₯˜
  • 컴곡선배
  • λ”₯λŸ¬λ‹
  • MVVM
  • 운영체제
  • k-means++
  • μ…€λ ˆλ‹ˆμ›€
  • External fragmentation
  • K-means
  • Baekjoon
  • 파이썬

졜근 λŒ“κΈ€

졜근 κΈ€

ν‹°μŠ€ν† λ¦¬

hELLO Β· Designed By μ •μƒμš°.
BuNa_

IT Story

객체지ν–₯ ν”„λ‘œκ·Έλž˜λ° - OOP 좔상화(Abstraction) μ΄λž€?
CS/OOP

객체지ν–₯ ν”„λ‘œκ·Έλž˜λ° - OOP 좔상화(Abstraction) μ΄λž€?

2022. 10. 17. 23:07

πŸ‘€β€‹   Study Goal

  • 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°(OOP) 좔상화 κ°œλ…μ„ μ΄ν•΄ν•©λ‹ˆλ‹€.
  • 좔상화가 μ‚¬μš©λ˜λŠ” 사둀λ₯Ό μ½”λ“œλ‘œ μž‘μ„±ν•΄λ΄…λ‹ˆλ‹€.

 

✏️   μΆ”상화(Abstraction) λž€?

 

좔상화(Abstraction)λŠ” 사물(Object)의 곡톡적인 νŠΉμ§•μ„ ν•˜λ‚˜μ˜ κ°œλ…μœΌλ‘œ λ‹€λ£¨λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

ex) 개(Dog)와 고양이(Cat)λ₯Ό 동물(Animal)μ΄λΌλŠ” ν•˜λ‚˜μ˜ 좔상적인 κ°œλ…μœΌλ‘œ λ‹€λ£° 수 μžˆμŠ΅λ‹ˆλ‹€.


πŸ’‘  좔상화(Abstraction)의 μ˜ˆμ‹œ(Example)λŠ” 무엇이 μžˆμ„κΉŒ?

 

객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°(OOP) μ–Έμ–΄λ₯Ό 닀루닀 보면 좔상화가 무엇인지 μ •ν™•νžˆλŠ” λͺ¨λ₯΄λ”라도 λͺ…칭에 λŒ€ν•΄μ„œλŠ” 많이 λ“€μ–΄λ³΄μ•˜μ„ κ²ƒμž…λ‹ˆλ‹€.

μ‹€μ œλ‘œ 좔상화λ₯Ό μ μš©ν•˜λ”λΌλ„ κ°œλ…μ„ λͺ¨λ₯΄κ³  μžˆλŠ” μƒνƒœλΌλ©΄, 좔상화λ₯Ό μ μš©ν•œμ§€λ„ λͺ¨λ₯΄κ³  μ‚¬μš©ν•  λ•Œκ°€ λ§ŽμŠ΅λ‹ˆλ‹€.

 

μœ„μ— μž‘μ„±λ˜μ–΄ μžˆλŠ” κ²ƒμ²˜λŸΌ 좔상화(Abstraction)λŠ” 사물(Object)의 곡톡적인 νŠΉμ§•μ„ ν•˜λ‚˜μ˜ κ°œλ…μœΌλ‘œ λ‹€λ£¨λŠ” κ²ƒμž…λ‹ˆλ‹€.

 

ν•˜μ§€λ§Œ μ΄λ ‡κ²Œλ§Œ μ΄μ•ΌκΈ°ν•˜λ©΄ λ“£λŠ” μ‚¬λžŒμ€ 였히렀 이해가 λ˜μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€.

 

'λ§ν‹°μ¦ˆμ™€ μ›°μ‹œμ½”κΈ°'

 

ν•˜λ‚˜μ˜ 사둀λ₯Ό λ“€μ–΄λ³΄κ² μŠ΅λ‹ˆλ‹€.
친ꡬ AλŠ” λ§ν‹°μ¦ˆλ₯Ό ν‚€μš°κ³  있고, 친ꡬ BλŠ” μ›°μ‹œμ½”κΈ°λ₯Ό ν‚€μš°κ³  μžˆμŠ΅λ‹ˆλ‹€.

어쩐 일인지 λ‘˜μ€ λ™μ‹œμ— 산책을 λ‚˜κ°€κΈ° μ‹œμž‘ν•©λ‹ˆλ‹€.

 

'μ‚°μ±… 도쀑에 마주친 λ§ν‹°μ¦ˆμ™€ μ›°μ‹œμ½”κΈ°'

 

친ꡬ Aκ°€ κ·€μ—¬μš΄ λ§ν‹°μ¦ˆμ™€ 산책을 ν•˜λ‹€κ°€ λͺ…λŸ‰ν•œ μ›°μ‹œμ½”κΈ°μ™€ μ‚°μ±…ν•˜κ³  μžˆλŠ” 친ꡬ Bλ₯Ό λ§Œλ‚¬μŠ΅λ‹ˆλ‹€.
친ꡬ AλŠ” 친ꡬ Bμ—κ²Œ 인사λ₯Ό 건넀고 μ„œλ‘œμ˜ '개(Dog)' μ—κ²Œλ„ 인사λ₯Ό ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

 

친ꡬ A  "λ„ˆν¬ 개(Dog)λŠ” 'ν„°λ²…ν„°λ²…' 잘 κ±·λŠ” νŽΈμ΄κ΅¬λ‚˜?  우리 μ§‘ κ°œλŠ” 아직 μ–΄λ €μ„œ κ·ΈλŸ°μ§€ 잘 κ±·μ§€ λͺ»ν•΄."
친ꡬ B  "그러게, λ„ˆν¬ 개(Dog)λŠ” 아직 μ–΄λ €μ„œ κ·ΈλŸ°μ§€ '총총' κ±·λŠ”κ΅¬λ‚˜

 


 

이 상황을 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 좔상화(Abstraction)에 λΉ—λŒ€μ–΄ 이해해보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

두 μΉœκ΅¬λŠ” μ„œλ‘œμ˜ 애완견 'λ§ν‹°μ¦ˆ' 와 'μ›°μ‹œμ½”κΈ°' λ₯Ό μ •ν™•νžˆ 콕 μ§‘μ–΄μ„œ μ΄μ•ΌκΈ°ν•˜μ§€ μ•Šκ³  'κ°•μ•„μ§€(Dog)' λΌλŠ” 좔상적인 λͺ…μΉ­μœΌλ‘œ λΆ€λ₯΄κ³  μžˆμŠ΅λ‹ˆλ‹€.

 

λ˜ν•œ, 이 λ‘˜μ€ 크게 개(Dog), κ±·λŠ”λ‹€(move)λŠ” 곡톡적인 νŠΉμ§• μ§€λ‹ˆκ³  μžˆμŠ΅λ‹ˆλ‹€.

 

이 외에도 μ§–λŠ”λ‹€(Howl), 이름이 μžˆλ‹€(name) λ“± λ‹€μ–‘ν•œ 곡톡적인 νŠΉμ§•μ΄ μžˆμ„ κ²ƒμž…λ‹ˆλ‹€.

 

 

좔상화(Abstraction)λŠ” 사물(Object)의 곡톡적인 νŠΉμ§•μ„ ν•˜λ‚˜μ˜ κ°œλ…μœΌλ‘œ λ‹€λ£¨λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

 

πŸ’‘  μ™œ(Why) 좔상화(Abstraction)λ₯Ό μ‚¬μš©ν•˜λ‚˜μš”?

 

κ·Έλƒ₯ λ§ν‹°μ¦ˆλŠ” λ§ν‹°μ¦ˆ, μ›°μ‹œμ½”κΈ°λŠ” μ›°μ‹œμ½”κΈ° 라고 λΆ€λ₯΄λ©΄ μ•ˆ λ˜λ‚˜μš”?
μ™œ μ–΄λ ΅κ³  ν—·κ°ˆλ¦¬κ²Œ 곡톡 νŠΉμ§•μ„ ν•˜λ‚˜μ˜ κ°œλ…μœΌλ‘œ 닀루어야 ν•˜λ‚˜μš”?

 

좔상화λ₯Ό λ“£κ³  λ‚˜μ„œ 처음 λ– μ˜€λ₯Έ μƒκ°μž…λ‹ˆλ‹€.

ν”„λ‘œκ·Έλž˜λ¨ΈλŠ” 항상 μ™œ(Why)λΌλŠ” μ˜λ¬Έμ„ ν’ˆμ–΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

 

λ§ν‹°μ¦ˆλŠ” λ§ν‹°μ¦ˆ.java, μ›°μ‹œμ½”κΈ°λŠ” μ›°μ‹œμ½”κΈ°.java 둜 λ”°λ‘œ μƒκ°ν•˜λ©΄ μ•ˆ λ˜λŠ” κ²ƒμΌκΉŒ?

 

μ™œ 곡톡적인 νŠΉμ§•μ„ ν•˜λ‚˜μ˜ κ°œλ…μœΌλ‘œ 닀루어야 ν•˜λŠ”κ°€?

 

μ œκ°€ κ³΅λΆ€ν•˜κ³  μƒκ°ν•˜λŠ” μΆ”μƒν™”μ˜ μž₯점을 μ΄λ ‡μŠ΅λ‹ˆλ‹€.

 

1. 곡톡적인 νŠΉμ§•μ„ 좔상 클래슀둜 μ •μ˜ν•΄μ€ŒμœΌλ‘œμ¨ 쀑볡 μ½”λ“œ, 보일러 ν”Œλ ˆμ΄νŠΈ μ½”λ“œλ₯Ό 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.
2. μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±(Reusability) 증가
3. μœ μ§€λ³΄μˆ˜, 가독성을 높일 수 μžˆμŠ΅λ‹ˆλ‹€. (Dog와 κ΄€λ ¨λœ λͺ¨λ“  λ‘œμ§μ„ μˆ˜μ •ν•΄μ•Ό ν•  λ•Œ, Dog 좔상 클래슀만 μˆ˜μ •ν•˜λ©΄ λ©λ‹ˆλ‹€.)

 

* μ°Έκ³ 

보일러 ν”Œλ ˆμ΄νŠΈ μ½”λ“œ : μ΅œμ†Œν•œμ˜ λ³€κ²½μœΌλ‘œ μ—¬λŸ¬ κ³³μ—μ„œ μž¬μ‚¬μš©λ˜λ©°, 반볡적으둜 λΉ„μŠ·ν•œ ν˜•νƒœλ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ½”λ“œ

 

πŸ’‘  좔상화(Abstraction)λ₯Ό μ μš©ν•œ μ½”λ“œ

 

public abstract class Dog {
    private String name;
    private String type;

    public Dog(String name, String type) {
        this.name = name;
        this.type = type;
    }

    abstract void howl();
    abstract void walk();

    public void smell() {
        System.out.println(name + "이 λƒ„μƒˆλ₯Ό λ§‘μŠ΅λ‹ˆλ‹€.");
    }

    public String getName() {
        return name;
    }

    public String getType() {
        return type;
    }
}

 

μš°μ„  두 개(Object)의 곡톡적인 νŠΉμ§•μ„ ν•˜λ‚˜μ˜ κ°œλ…(Dog)으둜 닀룬 좔상 클래슀λ₯Ό λ§Œλ“€μ–΄ μ£Όκ² μŠ΅λ‹ˆλ‹€.

 

Dog ν΄λž˜μŠ€λŠ” 좔상 클래슀둜 직접 객체λ₯Ό μ„ μ–Έν•  μˆ˜λŠ” μ—†μ§€λ§Œ ν•˜μœ„ ν΄λž˜μŠ€κ°€ 상속을 λ°›μ•„ μ½”λ“œλ₯Ό μž¬μ‚¬μš©ν•  수 μžˆλ„λ‘ μ œκ³΅ν•©λ‹ˆλ‹€.

 

κ°œλŠ” 각자 이름(name)κ³Ό μ–΄λ–€ μ’…(type)인지에 λŒ€ν•œ ν•„λ“œ(field)λ₯Ό κ°€μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€.

 

행동(method) μœΌλ‘œλŠ” 울기(howl), κ±·κΈ°(walk)λ₯Ό ν•  수 있고 기본적으둜 λƒ„μƒˆ(smell)λ₯Ό 맑을 수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

public class WelshCorgi extends Dog {
    public WelshCorgi(String name) {
        super(name, "μ›°μ‹œμ½”κΈ°");
    }

    @Override
    void howl() {
        System.out.println("μ™ˆμ™ˆ! λ‚˜λŠ”μ•Ό " + getName() + ", " + getType());

    }

    @Override
    void walk() {
        System.out.println("ν„°λ²…ν„°λ²…");
    }

    @Override
    public void smell() {
        super.smell();
        System.out.println("킁킁");
    }
}

 

public class Maltese extends Dog {
    public Maltese(String name) {
        super(name, "λ§ν‹°μ¦ˆ");
    }

    @Override
    void howl() {
        System.out.println("멍멍! λ‚˜λŠ”μ•Ό " + getName() + ", " + getType());
    }

    @Override
    void walk() {
        System.out.println("총총");
    }

    @Override
    public void smell() {
        super.smell();
        System.out.println("슀읍슀읍");
    }
}

 

좔상 클래슀 Dogλ₯Ό 상속받은 μ›°μ‹œμ½”κΈ°μ™€ λ§ν‹°μ¦ˆμ— λŒ€ν•œ Classμž…λ‹ˆλ‹€.

 

getName(), getType(), super.smell()에 λŒ€ν•΄ 쀑볡 μ½”λ“œκ°€ λ°œμƒν•˜μ§€ μ•Šκ³  각자의 νŠΉμ„±μ— 맞게 μž¬μ •μ˜ λ˜κΈ°λ„ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

 

λ§Œμ•½ λƒ„μƒˆλ₯Ό 맑을 λ•Œ, κ°•μ•„μ§€μ˜ 이름(name)이 μ•„λ‹Œ μ’…(type)을 보여주고 μ‹Άλ‹€λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Ό ν• κΉŒμš”?

 

 

 

// before
public void smell() {
    System.out.println(name + "이 λƒ„μƒˆλ₯Ό λ§‘μŠ΅λ‹ˆλ‹€.");
}

// after
public void smell() {
    System.out.println(type + "이 λƒ„μƒˆλ₯Ό λ§‘μŠ΅λ‹ˆλ‹€.");
}

 

λ‹¨μˆœνžˆ Dog class의 smell()의 λ‚΄μš©λ§Œ λ³€κ²½ν•΄μ€€λ‹€λ©΄ Dogλ₯Ό 상속받은 ν΄λž˜μŠ€κ°€ 10κ°œλ“ , 100κ°œλ“  λ™μΌν•˜κ²Œ 적용될 κ²ƒμž…λ‹ˆλ‹€.

 

즉, μœ μ§€λ³΄μˆ˜μ™€ μž¬μ‚¬μš©μ„±μ„ 높일 수 μžˆλ‹€λŠ” μž₯점을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

public class Main {
    public static void main(String[] args) {
        Dog welshCorgi = new WelshCorgi("λͺ…λŸ‰");
        Dog maltese = new Maltese("κ·€μš€");

        System.out.println("두 κ°•μ•„μ§€κ°€ 산책을 λ‚˜μ™€ κ±·κ³  μžˆμŠ΅λ‹ˆλ‹€.");

        welshCorgi.walk();
        maltese.walk();

        welshCorgi.howl();
        maltese.howl();

        System.out.println("\n두 κ°•μ•„μ§€κ°€ μ„œλ‘œμ˜ λƒ„μƒˆλ₯Ό λ§‘κ³  μžˆμŠ΅λ‹ˆλ‹€.");

        welshCorgi.smell();
        maltese.smell();
    }
}

 

μ‹€ν–‰ κ²°κ³Ό

두 κ°•μ•„μ§€κ°€ 산책을 λ‚˜μ™€ κ±·κ³  μžˆμŠ΅λ‹ˆλ‹€.
ν„°λ²…ν„°λ²…
총총
μ™ˆμ™ˆ! λ‚˜λŠ”μ•Ό λͺ…λŸ‰, μ›°μ‹œμ½”κΈ°
멍멍! λ‚˜λŠ”μ•Ό κ·€μš€, λ§ν‹°μ¦ˆ

두 κ°•μ•„μ§€κ°€ μ„œλ‘œμ˜ λƒ„μƒˆλ₯Ό λ§‘κ³  μžˆμŠ΅λ‹ˆλ‹€.
λͺ…λŸ‰μ΄ λƒ„μƒˆλ₯Ό λ§‘μŠ΅λ‹ˆλ‹€. 킁킁
κ·€μš€μ΄ λƒ„μƒˆλ₯Ό λ§‘μŠ΅λ‹ˆλ‹€. 슀읍슀읍

 

⭐  κ²°λ‘ 

 

  • 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°(OOP)의 좔상화(Abstraction)의 κ°œλ…μ„ κ³΅λΆ€ν•¨μœΌλ‘œμ¨, 좔상화 적용 μ½”λ“œμ™€ 미적용 μ½”λ“œλ₯Ό ꡬ뢄할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ½”λ“œμ˜ 가독성과 μœ μ§€λ³΄μˆ˜ 및 μž¬μ‚¬μš©μ„±μ„ μœ„ν•΄ 곡톡적인 νŠΉμ§•μ„ 좔상화(Abstraction)ν•΄μ•Όκ² λ‹€λŠ” μƒκ°μœΌλ‘œ μ „ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

github : https://github.com/tmdgh1592

 

tmdgh1592 - Overview

λŠλ¦¬λ”λΌλ„ 천천히..!! 😁. tmdgh1592 has 21 repositories available. Follow their code on GitHub.

github.com

 

 

μ €μž‘μžν‘œμ‹œ λΉ„μ˜λ¦¬ λ³€κ²½κΈˆμ§€ (μƒˆμ°½μ—΄λ¦Ό)

'CS > OOP' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[Programming] μ›μ‹œκ°’κ³Ό μ»¬λ ‰μ…˜μ„ 포μž₯ν•΄μ•Ό ν•˜λŠ” 이유 - 래퍼 클래슀, 일급 μ»¬λ ‰μ…˜(Wrapper class, First-class Collection)  (2) 2023.02.17
객체지ν–₯ ν”„λ‘œκ·Έλž˜λ° - OOP 상속(Inheritance) μ΄λž€?  (1) 2022.11.01
객체지ν–₯ ν”„λ‘œκ·Έλž˜λ° - OOP μΊ‘μŠν™”(Encapsulation) μ΄λž€?  (1) 2022.10.20
    'CS/OOP' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • [Programming] μ›μ‹œκ°’κ³Ό μ»¬λ ‰μ…˜μ„ 포μž₯ν•΄μ•Ό ν•˜λŠ” 이유 - 래퍼 클래슀, 일급 μ»¬λ ‰μ…˜(Wrapper class, First-class Collection)
    • 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ° - OOP 상속(Inheritance) μ΄λž€?
    • 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ° - OOP μΊ‘μŠν™”(Encapsulation) μ΄λž€?
    BuNa_
    BuNa_
    μ•ˆλ“œλ‘œμ΄λ“œ 개발자λ₯Ό ν–₯ν•΄ 달리고 μžˆλŠ” κ³΅λŒ€μƒμž…λ‹ˆλ‹€! πŸ§‘ Android, Kotlin, Java, Python λ“± ν•™μŠ΅ν•˜κ³  μžˆλŠ” λ‚΄μš©κ³Ό ν”„λ‘œμ νŠΈλ₯Ό 주둜 μ—…λ‘œλ“œν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 지적과 쑰언은 μ–Έμ œλ‚˜ ν™˜μ˜μž…λ‹ˆλ‹€!😊 github : https://github.com/tmdgh1592

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