ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ 면접을 μœ„ν•œ cs 전곡지식 λ…ΈνŠΈ 정리 ] 1. λ””μžμΈ νŒ¨ν„΄κ³Ό ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„ : ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„
    Book 2024. 4. 12. 15:37
    λ°˜μ‘ν˜•

    (좜처 :  https://www.inflearn.com/course/%EA%B0%9C%EB%B0%9C%EC%9E%90-%EB%A9%B4%EC%A0%91-cs-%ED%8A%B9%EA%B0%95)

     

    ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μ΄λž€ ?

     

    ν”„λ‘œκ·Έλž˜λ¨Έμ—κ²Œ ν”„λ‘œκ·Έλž˜λ°μ˜ 관점을 κ°–κ²Œ ν•΄μ£ΌλŠ” 역할을 ν•˜λŠ” 개발 방법둠

     

    ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μ€ 크게 μ„ μ–Έν˜•, λͺ…λ Ήν˜•μœΌλ‘œ λ‚˜λˆ„λ©°, μ„ μ–Έν˜•μ€ ν•¨μˆ˜ν˜•μ΄λΌλŠ” ν•˜μœ„ 집합을 κ°–κ³  λͺ…λ Ήν˜•μ€ λ‹€μ‹œ 객체지ν–₯, μ ˆμ°¨μ§€ν–₯으둜 λ‚˜λ‰œλ‹€.

    1.2 ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„

    1.2.1 μ„ μ–Έν˜•κ³Ό ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°
    1.2.2 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°
    1.2.3 μ ˆμ°¨ν˜• ν”„λ‘œκ·Έλž˜λ°
    1.2.4 νŒ¨λŸ¬λ‹€μž„μ˜ ν˜Όν•©

    1.2 ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„

     

    1.2.1 μ„ μ–Έν˜•κ³Ό ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°

     

    • μ„ μ–Έν˜•κ³Ό ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°(declarative programming)의 μ •μ˜
    • '무엇을' ν’€μ–΄λ‚΄λŠ”κ°€μ— μ§‘μ€‘ν•˜λŠ” νŒ¨λŸ¬λ‹€μž„μœΌλ‘œ, 'μˆœμˆ˜ν•¨μˆ˜'듀을 λΈ”λ‘μ²˜λŸΌ μŒ“μ•„ λ‘œμ§μ„ κ΅¬ν˜„ν•˜κ³  'κ³ μ°¨ ν•¨μˆ˜'λ₯Ό 톡해 μž¬μ‚¬μš©μ„±μ„ 높인 ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μ΄λ‹€.
    • "ν”„λ‘œκ·Έλž¨μ€ ν•¨μˆ˜λ‘œ 이루어진 것이닀."λΌλŠ” λͺ…μ œκ°€ λ‹΄κ²¨μžˆλŠ” νŒ¨λŸ¬λ‹€μž„μ΄κΈ°λ„ ν•˜λ©°, ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°(functional programming)은 μ„ μ–Έν˜• νŒ¨λŸ¬λ‹€μž„μ˜ 일쒅이닀.
    • μˆœμˆ˜ν•¨μˆ˜
    • 좜λ ₯이 μž…λ ₯μ—λ§Œ μ˜μ‘΄ν•˜λŠ” 것을 μ˜λ―Έν•˜λ©°, λ§Œμ•½ λ‹€λ₯Έ μ „μ—­λ³€μˆ˜ 등이 좜λ ₯에 영ν–₯을 μ£Όλ©΄ μˆœμˆ˜ν•¨μˆ˜κ°€ μ•„λ‹ˆλ‹€.
    • κ³ μ°¨ ν•¨μˆ˜
    • ν•¨μˆ˜κ°€ ν•¨μˆ˜λ₯Ό κ°’μ²˜λŸΌ λ§€κ°œλ³€μˆ˜λ‘œ λ°›μ•„ λ‘œμ§μ„ 생성할 수 μžˆλŠ” 것을 λ§ν•œλ‹€.
    • 일급객체
      κ³ μ°¨ ν•¨μˆ˜λ₯Ό μ“°κΈ° μœ„ν•΄μ„œλŠ” ν•΄λ‹Ή μ–Έμ–΄κ°€ 일급 κ°μ²΄λΌλŠ” νŠΉμ§•μ„ κ°€μ Έμ•Ό ν•˜λ©° κ·Έ νŠΉμ§•μ€ μ•„λž˜μ™€ κ°™λ‹€.
      - λ³€μˆ˜λ‚˜ λ©”μ„œλ“œμ— ν•¨μˆ˜λ₯Ό ν• λ‹Ήν•  수 있음
      - ν•¨μˆ˜ μ•ˆμ— ν•¨μˆ˜λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ 담을 수 있음
      - ν•¨μˆ˜κ°€ ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•  수 있음

    1.2.2 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°

     

    • 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°(OOP, Object-Oriented Programming)의 μ •μ˜
    • κ°μ²΄λ“€μ˜ μ§‘ν•©μœΌλ‘œ ν”„λ‘œκ·Έλž¨μ˜ μƒν˜Έ μž‘μš©μ„ ν‘œν˜„ν•˜λ©° 데이터λ₯Ό 객체둜 μ·¨κΈ‰ν•˜μ—¬ 객체 내뢀에 μ„ μ–Έλœ λ©”μ†Œλ“œλ₯Ό ν™œμš©ν•˜λŠ” 방식을 λ§ν•œλ‹€.
    • 섀계에 λ§Žμ€ μ‹œκ°„μ΄ μ†Œμš”λ˜λ©°, 처리 속도가 λ‹€λ₯Έ ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μ— λΉ„ν•΄ μƒλŒ€μ μœΌλ‘œ λŠλ¦¬λ‹€.
    • 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ νŠΉμ§•
    • 좔상화(abstraction) 
      λ³΅μž‘ν•œ μ‹œμŠ€ν…œμœΌλ‘œλΆ€ν„° 핡심적인 κ°œλ… λ˜λŠ” κΈ°λŠ₯을 κ°„μΆ”λ €λ‚΄λŠ” 것

    • μΊ‘μŠν™”(encapsulation)
      객체의 속성과 λ©”μ„œλ“œλ₯Ό ν•˜λ‚˜λ‘œ λ¬Άκ³  일뢀λ₯Ό 외뢀에 감좔어 μ€λ‹‰ν•˜λŠ” 것
    • 상속성(inheriance)
      μƒμœ„ 클래슀의 νŠΉμ„±μ„ ν•˜μœ„ ν΄λž˜μŠ€κ°€ μ΄μ–΄λ°›μ•„μ„œ μž¬μ‚¬μš©ν•˜κ±°λ‚˜ μΆ”κ°€,ν™•μž₯ν•˜λŠ” 것
      μ½”λ“œμ˜ μž¬μ‚¬μš© μΈ‘λ©΄, 계측적인 관계 생성, μœ μ§€λ³΄μˆ˜μ„± μΈ‘λ©΄μ—μ„œ μ€‘μš”

    • λ‹€ν˜•μ„±(polymoriphism)
      ν•˜λ‚˜μ˜ λ©”μ„œλ“œλ‚˜ ν΄λž˜μŠ€κ°€ λ‹€μ–‘ν•œ λ°©λ²•μœΌλ‘œ λ™μž‘ν•˜λŠ” 것

      - μ˜€λ²„λ‘œλ”©(overloading) : 같은 이름을 가진 λ©”μ„œλ“œλ₯Ό μ—¬λŸ¬κ°œ λ‘λŠ” 것
         λ©”μ„œλ“œμ˜ νƒ€μž…, λ§€κ°œλ³€μˆ˜μ˜ μœ ν˜•, 개수 λ“±μœΌλ‘œ μ—¬λŸ¬ 개λ₯Ό λ‘˜ 수 있으며 컴파일 쀑에 λ°œμƒν•˜λŠ” 정적 λ‹€ν˜•μ„±
    class Person {
    
        public void eat(String a) {
            System.out.println("I eat " + a);
        }
    
        public void eat(String a, String b) {
            System.out.println("I eat " + a + " and " + b);
        }
    }
    
    public class CalculateArea {
    
        public static void main(String[] args) {
            Person a = new Person();
            a.eat("apple");
            a.eat("tomato", "phodo");
        }
    }
    /*
    I eat apple
    I eat tomato and phodo
    */

     

    - μ˜€λ²„λΌμ΄λ”©(overriding) : μƒμœ„ ν΄λž˜μŠ€λ‘œλΆ€ν„° 상속받은 λ©”μ„œλ“œλ₯Ό ν•˜μœ„ ν΄λž˜μŠ€κ°€ μž¬μ •μ˜ν•˜λŠ” 것

    class Animal {
        public void bark() {
            System.out.println("mumu! mumu!");
        }
    }
    
    class Dog extends Animal {
        @Override
        public void bark() {
            System.out.println("wal!!! wal!!!");
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Dog d = new Dog();
            d.bark();
        }
    }
    /*
    wal!!! wal!!!
    */

     

    • 섀계원칙 (SOLID 원칙)
    • 단일 μ±…μž„ 원칙(SRP, Single Responsibility Principle)
      λͺ¨λ“  ν΄λž˜μŠ€λŠ” 각각 ν•˜λ‚˜μ˜ μ±…μž„λ§Œ κ°€μ Έμ•Ό ν•œλ‹€λŠ” 원칙
      AλΌλŠ” 둜직이 μ‘΄μž¬ν•œλ‹€λ©΄ μ–΄λ– ν•œ ν΄λž˜μŠ€λŠ” A에 λŒ€ν•œ ν΄λž˜μŠ€μ—¬μ•Ό ν•˜κ³  이λ₯Ό μˆ˜μ •ν•œλ‹€κ³  해도 A와 κ΄€λ ¨λœ μˆ˜μ •μ΄μ–΄μ•Ό 함

    • 개방-폐쇄 원칙(OCP, Open Closed Prinsiple)
      μœ μ§€λ³΄μˆ˜ 사항이 생긴닀면 μ½”λ“œλ₯Ό μ‰½κ²Œ ν™•μž₯ν•  수 있게 ν•˜κ³  μˆ˜μ •ν•  λ•ŒλŠ” λ‹«ν˜€ μžˆμ–΄μ•Ό ν•˜λŠ” 원칙
      기쑴의 μ½”λ“œλŠ” 잘 λ³€κ²½ν•˜μ§€ μ•ŠμœΌλ©΄μ„œ ν™•μž₯은 μ‰½κ²Œ ν•  수 μžˆμ–΄μ•Ό 함

    • μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙(LSP, Liskov Substritution Principle)
      ν”„λ‘œκ·Έλž¨μ˜ κ°μ²΄λŠ” ν”„λ‘œκ·Έλž¨μ˜ 정확성을 κΉ¨λœ¨λ¦¬μ§€ μ•ŠμœΌλ©΄μ„œ ν•˜μœ„ νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ‘œ λ°”κΏ€ 수 μžˆμ–΄μ•Όν•˜λŠ” 원칙
      μƒμ†λœ λΆ€λͺ¨, μžμ‹ κ³„μΈ΅μ—μ„œ λΆ€λͺ¨ 객체에 μžμ‹ 객체λ₯Ό 넣어도 μ‹œμŠ€ν…œμ΄ λ¬Έμ œμ—†μ΄ λŒμ•„κ°€κ²Œ λ§Œλ“œλŠ” 것

    • μΈν„°νŽ˜μ΄μŠ€ 뢄리 원칙(ISP, Interface Segragation Principle)
      ν•˜λ‚˜μ˜ 일반적인 μΈν„°νŽ˜μ΄μŠ€λ³΄λ‹€ ꡬ체적인 μ—¬λŸ¬ 개의 μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§Œλ“€μ–΄μ•Ό ν•˜λŠ” 원칙
    • 의쑴 μ—­μ „ 원칙(DIP, Dependency Inversion Principle)
      μžμ‹ λ³΄λ‹€ λ³€ν•˜κΈ° μ‰¬μš΄ 것에 μ˜μ‘΄ν•˜λ˜ 것을 μΆ”μƒν™”λœ μΈν„°νŽ˜μ΄μŠ€λ‚˜ μƒμœ„ 클래슀λ₯Ό 두어 λ³€ν•˜κΈ° μ‰¬μš΄ κ²ƒμ˜ 변화에 영ν–₯받지 μ•Šκ²Œ ν•˜λŠ” 원칙
      μƒμœ„ 계측은 ν•˜μœ„ κ³„μΈ΅μ˜ 변화에 λŒ€ν•œ κ΅¬ν˜„μœΌλ‘œλΆ€ν„° 독립해야 함
      예λ₯Όλ“€λ©΄ μžλ™μ°¨μ˜ 타이어λ₯Ό κ°ˆμ•„λΌμšΈ 수 μžˆλŠ” 틀을 λ§Œλ“€κ³  λ‹€μ–‘ν•œ 타이어λ₯Ό ꡐ체할 수 있게 λ§Œλ“€μ–΄μ•Ό 함

     

    1.2.3 μ ˆμ°¨ν˜• ν”„λ‘œκ·Έλž˜λ°

     

    • μ ˆμ°¨ν˜• ν”„λ‘œκ·Έλž˜λ°(Procedural Programming)의 μ •μ˜
    • 둜직이 μˆ˜ν–‰λ˜μ–΄μ•Ό ν•  연속적인 계산 κ³Όμ •μœΌλ‘œ 이루어져 있으며, 일이 μ§„ν–‰λ˜λŠ” λ°©μ‹μœΌλ‘œ μ½”λ“œλ₯Ό κ΅¬ν˜„ν•˜κΈ°λ§Œ ν•˜λ©΄ 되기 떄문에 μ½”λ“œμ˜ 가독성이 μ’‹μœΌλ©° μ‹€ν–‰ 속도가 빨라 계산이 λ§Žμ€ μž‘μ—… 등에 쓰인닀.
    • μ ˆμ°¨ν˜• ν”„λ‘œκ·Έλž˜λ°(Procedural Programming)의 μ‚¬μš©μ˜ˆμ‹œ
    • ν¬νŠΈλž€(fortran)을 μ΄μš©ν•œ λŒ€κΈ° κ³Όν•™ κ΄€λ ¨ μ—°μ‚°μž‘μ—…, λ¨Έμ‹  λŸ¬λ‹μ˜ 배치 μž‘μ—… λ“±
    • μ ˆμ°¨ν˜• ν”„λ‘œκ·Έλž˜λ°(Procedural Programming)의 단점
    • λͺ¨λ“ˆν™”ν•˜κΈ°κ°€ μ–΄λ ΅κ³  μœ μ§€ λ³΄μˆ˜μ„±μ΄ 떨어진닀.

     

    1.2.4 νŒ¨λŸ¬λ‹€μž„μ˜ ν˜Όν•©

     

    ν•˜λ‚˜μ˜ νŒ¨λŸ¬λ‹€μž„μ„ 기반으둜 ν†΅μΌν•˜μ—¬ μ„œλΉ„μŠ€λ₯Ό ꡬ좕할 μˆ˜λ„ 있고, μ—¬λŸ¬ νŒ¨λŸ¬λ‹€μž„μ˜ μž₯점만 μ‘°ν•©ν•΄ 상황과 λ§₯락에 따라 κ°œλ°œν•˜λŠ” 것도 μ’‹λ‹€.

    예λ₯Ό λ“€μ–΄ λ°±μ—”λ“œμ— λ¨Έμ‹ λŸ¬λ‹ νŒŒμ΄ν”„λΌμΈκ³Ό 거래 κ΄€λ ¨ 둜직이 μžˆλ‹€λ©΄ λ¨Έμ‹  λŸ¬λ‹ νŒŒμ΄ν”„λΌμΈμ€ μ ˆμ°¨μ§€ν–₯ν˜• νŒ¨λŸ¬λ‹€μž„, 거래 κ΄€λ ¨ λ‘œμ§μ€ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ„ μ μš©ν•˜λŠ” 것이 μ’‹λ‹€.

    λ°˜μ‘ν˜•

    λŒ“κΈ€

Designed by Tistory.