Skip to content
This repository was archived by the owner on Dec 30, 2021. It is now read-only.

Chapter 06. Objects and Data Structures Part.1

sponge edited this page Aug 21, 2021 · 4 revisions

2021.08.21 (SAT) 10:20-12:00 (100mins)
πŸš€ Lead by. 'Jeongyeol'

의문문으둜 μ‹œμž‘ν•˜κΈ°

μ™œ λ³€μˆ˜λŠ” λΉ„κ³΅κ°œ(private)둜 μ •μ˜ν• κΉŒ?
-> λ³€μˆ˜μ— μ˜μ‘΄ν•˜μ§€ μ•Šκ²Œ λ§Œλ“€κ³  μ‹Άμ–΄μ„œ

μ™œ 쑰회(get) ν•¨μˆ˜μ™€ μ„€μ •(set) ν•¨μˆ˜λ₯Ό
λ‹Ήμ—°ν•˜κ²Œ 곡개(public)둜 λΉ„κ³΅κ°œ λ³€μˆ˜(private variable)λ₯Ό 외뢀에 λ…ΈμΆœν• κΉŒ?


자료 좔상화

1. 자료 ꡬ쑰에 μ €μž₯된 μ •λ³΄λ§ŒμœΌλ‘œ μ‚¬μš©λ°©λ²•μ„ μ•Œ 수 μ—†λ‹€. πŸ€”

⬇️ Block 6-1: ꡬ체적인 User 클래슀

// in Java
public class User {
  public long id;
  public String name;
}
// in Typescript
class User {
  id: number;
  name: string;
}

export default User;

μœ„ ν΄λž˜μŠ€λŠ” μ‚¬μš©μž 정보λ₯Ό λͺ…ν™•νžˆ ν‘œν˜„ν•˜κ³  μžˆλ‹€.

⬇️ Block 6-2: 좔상적인 User 클래슀

// in Java
public interface User {
  long getId();
  String getName();
  void setUserInfo(long id, String name);
  
  String getTenuer();
  String getJoinDate();
  void setJoinDate(int yyyy, int mm, int dd);
}
// in Typescript
interface User {
  getId(): number;
  getName(): string;
  setUserInfo(id: number, y: string): void;
  
  getTenuer(): string;
  getJoinDate(): string;
  setJoinDate(yyyy: number, mm: number, dd: number): void;
}

export default User;

μΈν„°νŽ˜μ΄μŠ€λŠ” 자료 ꡬ쑰λ₯Ό ν‘œν˜„ν•˜λŠ” 것 μ΄μƒμœΌλ‘œ 자료 ꡬ쑰λ₯Ό μ ‘κ·Όν•˜λŠ” μ •μ±…κΉŒμ§€ κ°•μ œν•œλ‹€.

  • μƒκ°μ˜ 였λ₯˜ 짚고 λ„˜μ–΄κ°€κΈ°: μ’Œν•­μ΄ λ§Œμ‘±λœλ‹€κ³  μš°ν•­μ„ λ§Œμ‘±ν•˜μ§„ μ•ŠλŠ”λ‹€.

    • ν΄λž˜μŠ€μ™€ λ³€μˆ˜ 사이에 ν•¨μˆ˜λΌλŠ” 계측을 λ„£λŠ”λ‹€ /= κ΅¬ν˜„μ΄ 감좰진닀

    • Getter/Setter둜 λ³€μˆ˜λ₯Ό 닀룬닀 /= 자료ꡬ쑰λ₯Ό ν‘œν˜„ν•˜λŠ” 클래슀

      // User 클래슀둜 μƒμ„±λœ μΈμŠ€ν„΄μŠ€μ˜ public id λ³€μˆ˜λ₯Ό λ°”λ‘œ μ ‘κ·Ό
      const idFromUserAsDataStructrue = user.id;
      // User 클래슀둜 μƒμ„±λœ μΈμŠ€ν„΄μŠ€μ˜ public getId() ν•¨μˆ˜λ₯Ό 톡해 λ³€μˆ˜λ₯Ό μ ‘κ·Ό
      const idFromUserAsObject = user.getId();
      // return id; => λ‚΄λΆ€ 자료λ₯Ό κ·ΈλŒ€λ‘œ λ…ΈμΆœν•˜λŠ” 경우, κ΅¬ν˜„μ΄ 감좰져 μžˆλ‹€κ³  보기 μ–΄λ ΅λ‹€.
      // in Typescript
      class Execution {
        private a: number;
        private b: number;
      
        constructor(a: number, b: number) {
          this.a = a;
          this.b = b;
        }
      
        public plus() {
          return this.a + this.b;
        }
      }
      
      const exec = new Execution(1, 2);
      // exec.a; // error TS2341: Property 'a' is private
      const result = exec.plus();
      console.log(result); // 3
  • μ§„μ •ν•œ 의미의 클래슀(Class)

    • 좔상 μΈν„°νŽ˜μ΄μŠ€λ₯Ό 제곡
    • μ‚¬μš©μžκ°€ μ‹€μ œ κ΅¬ν˜„ λ‚΄μš©μ„ λͺ°λΌλ„, 자료의 핡심을 μ‘°μž‘ν•  수 μžˆλ‹€

2. μΆ”μƒν™”λ˜μ–΄ 제곡된 κΈ°λŠ₯이 μ •λ³΄μ˜ 좜처λ₯Ό λ“œλŸ¬λ‚΄μ§€ μ•ŠλŠ”λ‹€. πŸ€”

⬇️ Block 6-3: ꡬ체적인 Salary 클래슀

// in Java
public interface Salary {
  long getTotalPayments();
  double getInsentives();
}
// in Typescript
interface Salary {
  getTotalPayments(): number; 
  getInsentives(): number;
}

export default Salary;

두 ν•¨μˆ˜κ°€ λ³€μˆ˜κ°’μ„ 읽어 λ°˜ν™˜ν•  λΏμ΄λΌλŠ” 사싀이 거의 ν™•μ‹€ν•˜λ‹€

  • getTotalPayments(): 전체 μ§€κΈ‰μ•‘μ΄λΌλŠ” ꡬ체적인 숫자λ₯Ό μ œκ³΅ν•˜λ„λ‘ λͺ…μ‹œ
  • getInsentives(): μΈμ„Όν‹°λΈŒ λΉ„μœ¨μ΄λΌλŠ” ꡬ체적인 숫자 μ œκ³΅ν•˜λ„λ‘ λͺ…μ‹œ

⬇️ Block 6-4: 좔상적인 Salary 클래슀

// in Java
public interface Salary {
  long getRatioOfInsentives();
}
// in Typescript
interface Salary {
  getRatioOfInsentives(): number; 
}

export default Salary;

ν•΄λ‹Ή 정보가 μ–΄λ””μ„œ μ˜€λŠ”μ§€ μ „ν˜€ λ“œλŸ¬λ‚˜μ§€ μ•Šλ„λ‘ 좔상화 λ˜μ–΄μžˆλ‹€.

🌟 κ°œλ°œμžλŠ”!!!

  • 객체가 ν¬ν•¨ν•˜λŠ” 자료λ₯Ό ν‘œν˜„ν•  κ°€μž₯ 쒋은 방법을 πŸ”₯μ‹¬κ°ν•˜κ²Œ κ³ λ―Όν•΄μ•Ό ν•œλ‹€.πŸ”₯

  • 아무 생각 없이 Getter/Setterλ₯Ό μΆ”κ°€ν•˜λŠ” 방법이 κ°€μž₯ λ‚˜μ˜λ‹€.


자료/객체 λΉ„λŒ€μΉ­

κ°μ²΄λŠ” 좔상화 λ’€λ‘œ 자료λ₯Ό 숨긴 채, 자료λ₯Ό λ‹€λ£¨λŠ” ν•¨μˆ˜λ§Œ κ³΅κ°œν•œλ‹€.
μžλ£Œκ΅¬μ‘°λŠ” 자료 κ·ΈλŒ€λ‘œλ₯Ό κ³΅κ°œν•˜λ©°, 별닀λ₯Έ ν•¨μˆ˜λ₯Ό μ œκ³΅ν•˜μ§€ μ•ŠλŠ”λ‹€.

μœ„ 2κ°€μ§€ μ˜λ„λŠ” 본질적으둜 μƒλ°˜λœλ‹€. (사싀 μ • λ°˜λŒ€μ˜ 의미λ₯Ό κ°€μ§„λ‹€.)

⬇️ Block 6-5: 절차적인 λ„ν˜• 클래슀
(μ°Έκ³ ) JavascriptλŠ” λΆ€λ™μ†Œμˆ˜μ μ„ ν¬ν•¨ν•˜λŠ” 숫자 계산이 μ·¨μ•½ν•˜λ―€λ‘œ 예제둜 κ΅¬μ„±ν•˜μ§€ μ•ŠμŒ

// in Java
public class Point {
  public double x;
  public double y;
}

public class Square {
  public Point topLeft;
  public double side;
}

public class Rectangle {
  public Point topLeft;
  public double height;
  public double width;
}

public class Circle {
  public Point center;
  public double radius;
}

public class Geometry {
  public final double PI = 3.141592653589793;
  
  public double area(Object shape) throws NoSuchShapeException
  {
    if (shape instanceof Square) {
      Square s = (Square)shape;
      return s.side * s.side;
    }
    else if (shape instanceof Square) {
      Rectangle r = (Rectangle)shape;
      return r.height * r.width;
    }
    else if (shape instanceof Circle) {
      Circle c = (Circle) shape;
      return PI * c.radius * c.radius;
    }
    throw new NoSuchShapeException();
  }
}
  • 클래슀λ₯Ό 톡해 정보λ₯Ό 담은 μΈμŠ€ν„΄μŠ€λ₯Ό area(Object shape) ν•¨μˆ˜μ— μ§‘μ–΄λ„£μ–΄μ„œ ν˜ΈμΆœν•˜λ©΄ 면적이 ꡬ해진닀.
    객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μœ„ μ½”λ“œλ₯Ό λ³Έλ‹€λ©΄ μ½”μ›ƒμŒ 칠지도 λͺ¨λ₯΄μ§€λ§Œ, μ ˆμ°¨μ μ΄λΌμ„œ λΉ„νŒν•œλ‹€λ©΄ λ§žλŠ” 말이닀.
  • λ„ν˜•μ˜ λ‘˜λ ˆλ₯Ό κ΅¬ν•˜λŠ” perimeter(Object shape) ν•¨μˆ˜λ₯Ό μΆ”κ°€λ‘œ κ΅¬ν˜„ν•œλ‹€λ©΄?
    λ†€λžκ²Œλ„ Geometry ν΄λž˜μŠ€μ— μ˜μ‘΄ν•˜λŠ” λ‹€λ₯Έ λ„ν˜• ν΄λž˜μŠ€λ“€μ˜ λ³€ν™” 없이 μΆ”κ°€ν•  수 μžˆλ‹€.
  • λ°˜λŒ€λ‘œ μƒˆλ‘œμš΄ λ„ν˜•μ„ μΆ”κ°€ν•œλ‹€λ©΄? 예λ₯Ό λ“€μ–΄ Pentagon(μ •μ˜€κ°ν˜•)을 μΆ”κ°€ν•œλ‹€λ©΄?
    λ‹Ήμ—°ν•˜κ²Œλ„ Geometry ν΄λž˜μŠ€μ— μ†ν•œ λͺ¨λ“  ν•¨μˆ˜λ₯Ό κ³ μ³μ•Όν•œλ‹€.

⬇️ Block 6-6: λ‹€ν˜•μ μΈ λ„ν˜• 클래슀
(μ°Έκ³ ) JavascriptλŠ” λΆ€λ™μ†Œμˆ˜μ μ„ ν¬ν•¨ν•˜λŠ” 숫자 계산이 μ·¨μ•½ν•˜λ―€λ‘œ 예제둜 κ΅¬μ„±ν•˜μ§€ μ•ŠμŒ

// in Java
public interface Shape {
  double area();
}

public class Square implements Shape {
  private Point topLeft;
  private double side;
  
  public double area() {
    return side * side;
  }
}

public class Rectangle implements Shape {
  private Point topLeft;
  private double height;
  private double width;
  
  public double area() {
    return height * width;
  }
}

public class Circle implements Shape {
  private final double PI = 3.141592653589793;
  private Point center;
  private double radius;
  
  public double area() {
    return PI * radius * radius;
  }
}

μ΄μ―€μ—μ„œ λ‹€μ‹œ ν•œλ²ˆ μ½μ–΄λ³΄μž.

κ°μ²΄λŠ” 좔상화 λ’€λ‘œ 자료λ₯Ό 숨긴 채, 자료λ₯Ό λ‹€λ£¨λŠ” ν•¨μˆ˜λ§Œ κ³΅κ°œν•œλ‹€.

μžλ£Œκ΅¬μ‘°λŠ” 자료 κ·ΈλŒ€λ‘œλ₯Ό κ³΅κ°œν•˜λ©°, λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό μ œκ³΅ν•˜μ§€ μ•ŠλŠ”λ‹€.

μ–΄λ– ν•œκ°€? 두 쑰건은 μ™„μ „νžˆ λ°˜λŒ€λœλ‹€λŠ” 사싀을 이해할 수 μžˆκ² λŠ”κ°€?

μ •λ¦¬ν•˜μžλ©΄

  1. Block 6-5의 절차적인 방법과
    Block 6-6의 λ‹€ν˜•μ μΈ 방법은
    μƒν˜Έλ³΄μ™„μ μΈ νŠΉμ§•μ΄ μžˆλ‹€. (사싀 λ°˜λŒ€λ‹€!!)

  2. 객체와 μžλ£Œκ΅¬μ‘°λŠ” 근본적으둜 μ–‘λΆ„λœλ‹€. (μ•„λž˜ λͺ…μ œλŠ” 참이닀)

    1. 자료 ꡬ쑰λ₯Ό μ‚¬μš©ν•˜λŠ” 절차적인 μ½”λ“œ

      • κΈ°μ‘΄ 자료 ꡬ쑰λ₯Ό λ³€κ²½ν•˜μ§€ μ•ŠμœΌλ©΄μ„œ μƒˆ ν•¨μˆ˜λ₯Ό μΆ”κ°€ν•˜κΈ° 쉽닀.
        ➑️ κΈ°λŠ₯ κ΅¬ν˜„μ— μ˜ν•œ ν™•μž₯
      • μƒˆλ‘œμš΄ 자료 ꡬ쑰λ₯Ό μΆ”κ°€ν•˜κΈ° μ–΄λ ΅λ‹€.
        ➑️ μƒˆλ‘œμš΄ μžλ£Œκ΅¬μ‘°μ— λŒ€ν•œ μΆ”κ°€ κΈ°λŠ₯ κ΅¬ν˜„μ΄ ν•„μš”
    2. 객체 μ§€ν–₯ μ½”λ“œ

      • κΈ°μ‘΄ ν•¨μˆ˜λ₯Ό λ³€κ²½ν•˜μ§€ μ•ŠμœΌλ©΄μ„œ μƒˆ 클래슀λ₯Ό μΆ”κ°€ν•˜κΈ° 쉽닀.
        ➑️ λ‹€ν˜•μ„±μ„ ν†΅ν•œ ν™•μž₯
      • μƒˆλ‘œμš΄ ν•¨μˆ˜λ₯Ό μΆ”κ°€ν•˜κΈ° μ–΄λ ΅λ‹€.
        ➑️ λ‹€ν˜•μ„±μ— λŒ€ν•œ κ°•μ œν™”λ‘œ λͺ¨λ“  ν΄λž˜μŠ€μ— λŒ€ν•œ μˆ˜μ •μ΄ ν•„μš”

λ…Έλ ¨ν•œ ν”„λ‘œκ·Έλž˜λ¨Έλ“€μ€
객체 μ§€ν–₯ ν”„λ‘œκ·Έλž¨μ—μ„œ λ°˜λ“œμ‹œ "λͺ¨λ“  것이 객체닀"λΌλŠ” 말은 λ―Έμ‹ μ΄λΌλŠ” 것을 잘 μ•ˆλ‹€.


Go to Part 2

Suite-up

πŸ“” Prerequisites

πŸ“” How to use

Artifacts

πŸ“Œ Clean Code

πŸ“Œ Meaningful Names + Extra

πŸ“Œ Functions

πŸ“Œ Comments

πŸ“Œ Formatting

πŸ“Œ Objects and Data Structures

Remains

ongoing! πŸ€

πŸ“Œ Error Handling

πŸ“Œ Boundaries

πŸ“Œ Unit Tests

πŸ“Œ Classes

πŸ“Œ Systems

πŸ“Œ Emergence

up-to-here! πŸš€

🧷 Concurrency

🧷 Successive Refinement

🧷 JUnit Internals

🧷 Refactoring SerialDate

Clone this wiki locally