[Swift] Swift ์—์„œ Hashable, Codable์€ ๋ญ˜๊นŒ? Protocol ์•Œ์•„๋ณด๊ธฐ

    Apple developer์—์„œ ์ œ๊ณตํ•˜๋Š” swiftui tutorial ์˜ˆ์‹œ ์ฝ”๋“œ

    swiftui tutorial ์˜ ์˜ˆ์‹œ ์ฝ”๋“œ๋ฅผ ๊ณต๋ถ€ํ•˜๋‹ค๋ณด๋ฉด, Struct ๋’ค์— ~able ๋กœ ๋ถ™์€ ๊ฒƒ๋“ค์ด ๋ณด์ธ๋‹ค. 

    ์ด๊ฑด ๋ฌด์—‡์ด๋ฉฐ ๊ฐ๊ฐ ์–ด๋–ค ์—ญํ• ์„ ํ• ๊นŒ?

     

    Hashable๊ณผ Codable์€ ์Šค์œ„ํ”„ํŠธ ์–ธ์–ด์—์„œ ํ”„๋กœํ† ์ฝœ(Protocol)์ด๋‹ค.

     

     

     

    ์˜ˆ์‹œ์ฝ”๋“œ์—์„œ ๊ฐ๊ฐ์˜ ์˜๋ฏธ

    1. Hashable:
    Hashable ํ”„๋กœํ† ์ฝœ์€ ๊ฐ์ฒด๋ฅผ ๊ณ ์œ ํ•œ ํ•ด์‹œ๊ฐ’์œผ๋กœ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ํ”„๋กœํ† ์ฝœ์ด๋‹ค. ํ•ด์‹œ๊ฐ’์€ ๊ฐ์ฒด๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ, ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ณ„์‚ฐ๋œ๋‹ค. Hashable ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๋ฉด ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ Set์ด๋‚˜ Dictionary์˜ ํ‚ค๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, Hashable ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋Š” ๊ฐ์ฒด๋Š” ์ง‘ํ•ฉ(Set)๊ณผ ๊ฐ™์€ ์ž๋ฃŒ ๊ตฌ์กฐ์—์„œ ์ค‘๋ณต๋œ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค. Landmark ๊ตฌ์กฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ Hashable ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋ฏ€๋กœ, ์ด ๊ฐ์ฒด๋Š” Set์ด๋‚˜ Dictionary์˜ ํ‚ค๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. 

    2. Codable:
    Codable ํ”„๋กœํ† ์ฝœ์€ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , ๋‹ค์‹œ ํ•ด๋‹น ํ˜•์‹์—์„œ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ์ฆ‰, Codable์„ ์ค€์ˆ˜ํ•˜๋Š” ๊ฐ์ฒด๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ง๋ ฌํ™”(Serialization)ํ•˜๊ณ , ์—ญ์ง๋ ฌํ™”(Deserialization)ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ๊ฐ์ฒด๋ฅผ JSON, XML, Property List ๋“ฑ๊ณผ ๊ฐ™์€ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜, ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค. Codable์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด๋ฅผ ์ธ์ฝ”๋”ฉ(Encoding)ํ•˜๊ฑฐ๋‚˜ ๋””์ฝ”๋”ฉ(Decoding)ํ•˜๋Š” ์ž‘์—…์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. Landmark ๊ตฌ์กฐ์ฒด๋Š” Codable ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋ฏ€๋กœ, ์ด ๊ฐ์ฒด๋ฅผ JSON ๋ฐ์ดํ„ฐ๋กœ ์ธ์ฝ”๋”ฉํ•˜๊ฑฐ๋‚˜ JSON ๋ฐ์ดํ„ฐ์—์„œ ๋””์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ๋‹ค.

     



    ํ”„๋กœํ† ์ฝœ์˜ ์˜๋ฏธ

     

    ํ”„๋กœํ† ์ฝœ(Protocol)์€ ์Šค์œ„ํ”„ํŠธ ์–ธ์–ด์—์„œ ํŠน์ • ๊ธฐ๋Šฅ ๋˜๋Š” ์—ญํ• ์„ ์ •์˜ํ•˜๋Š” ์ถ”์ƒ์ ์ธ ์ฒญ์‚ฌ์ง„์ด๋‹ค. protocol์€ method, property ๋ฐ ๋‹ค๋ฅธ ๋ฉค๋ฒ„์˜ ์ง‘ํ•ฉ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. Class, Struct, Enum ๋“ฑ์˜ ํƒ€์ž…์€ ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜์—ฌ ํ•ด๋‹น ํ”„๋กœํ† ์ฝœ์ด ์š”๊ตฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

    ํ”„๋กœํ† ์ฝœ์€ ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์—ฐ์„ฑ์„ ๋†’์—ฌ์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ๋‹ค์–‘ํ•œ ํƒ€์ž…์ด ๋™์ผํ•œ ํ”„๋กœํ† ์ฝœ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋“ค์„ ์ผ๊ด€๋œ ๋ฐฉ์‹์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜๋ฉด ํƒ€์ž… ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ , ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ค€๋‹ค.

     

     


    ๋ช‡ ๊ฐ€์ง€ ์ฃผ์š” ํ”„๋กœํ† ์ฝœ

    1. Equatable
    Equatable ํ”„๋กœํ† ์ฝœ์€ ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋“ค์„ ์„œ๋กœ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ํ”„๋กœํ† ์ฝœ์ด๋‹ค. ์ด๋ฅผ ์ค€์ˆ˜ํ•˜๋Š” ํƒ€์ž…์€ ๋™๋“ฑ ๋น„๊ต ์—ฐ์‚ฐ์ž(==)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์Šคํ„ด์Šค๋“ค์„ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋‹ค.

    2. Comparable
    Comparable ํ”„๋กœํ† ์ฝœ์€ ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋“ค์„ ์ˆœ์„œ๋Œ€๋กœ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ํ”„๋กœํ† ์ฝœ์ด๋‹ค. ์ด๋ฅผ ์ค€์ˆ˜ํ•˜๋Š” ํƒ€์ž…์€ ๋น„๊ต ์—ฐ์‚ฐ์ž(<, >, <=, >=)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์Šคํ„ด์Šค๋“ค์„ ๋น„๊ตํ•˜๊ณ  ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

    3. CustomStringConvertible
    CustomStringConvertible ํ”„๋กœํ† ์ฝœ์€ ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฌธ์ž์—ด๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ์„ ์ •์˜ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์ด๋‹ค. ์ด๋ฅผ ์ค€์ˆ˜ํ•˜๋Š” ํƒ€์ž…์€ description์ด๋ผ๋Š” ์†์„ฑ์„ ๊ตฌํ˜„ํ•˜์—ฌ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

    4. UITableViewDelegate, UITableViewDataSource
    UITableViewDelegate์™€ UITableViewDataSource ํ”„๋กœํ† ์ฝœ์€ ํ…Œ์ด๋ธ” ๋ทฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์— ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ์„ ์ •์˜ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์ด๋‹ค. UITableViewDelegate๋Š” ํ…Œ์ด๋ธ” ๋ทฐ์˜ ๋™์ž‘์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆํ•˜๊ณ , UITableViewDataSource๋Š” ํ…Œ์ด๋ธ” ๋ทฐ์˜ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

    5. URLSessionDelegate, URLSessionDataDelegate
    URLSessionDelegate์™€ URLSessionDataDelegate ํ”„๋กœํ† ์ฝœ์€ ๋„คํŠธ์›Œํฌ ์ž‘์—…์„ ๊ด€๋ฆฌํ•˜๊ณ  ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ •์˜ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์ด๋‹ค. URLSessionDelegate๋Š” ๋„คํŠธ์›Œํฌ ์ž‘์—…์˜ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , URLSessionDataDelegate๋Š” ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

     


    ์ด ์™ธ์—๋„ ๋‹ค์–‘ํ•œ ํ”„๋กœํ† ์ฝœ์ด ์Šค์œ„ํ”„ํŠธ์—์„œ ์ œ๊ณต๋˜๋ฉฐ, ํ•„์š”์— ๋”ฐ๋ผ ์ง์ ‘ ํ”„๋กœํ† ์ฝœ์„ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

     

     

    1. Equatable

    struct Point: Equatable {
        var x: Int
        var y: Int
    }
    
    let point1 = Point(x: 3, y: 5)
    let point2 = Point(x: 3, y: 5)
    
    if point1 == point2 {
        print("๋‘ ์ ์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.")
    } else {
        print("๋‘ ์ ์€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.")
    }


    ์œ„์˜ ์˜ˆ์‹œ์—์„œ `Point` ๊ตฌ์กฐ์ฒด๋Š” `Equatable` ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๊ณ  ์žˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋‘ ๊ฐœ์˜ `Point` ์ธ์Šคํ„ด์Šค๋ฅผ `==` ์—ฐ์‚ฐ์ž๋กœ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.



    2. CustomStringConvertible

    struct Person: CustomStringConvertible {
        var name: String
        var age: Int
        
        var description: String {
            return "์ด๋ฆ„: \(name), ๋‚˜์ด: \(age)์„ธ"
        }
    }
    
    let person = Person(name: "John", age: 30)
    print(person)


    ์œ„์˜ ์˜ˆ์‹œ์—์„œ `Person` ๊ตฌ์กฐ์ฒด๋Š” `CustomStringConvertible` ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๊ณ  ์žˆ๋‹ค. ์ด๋กœ ์ธํ•ด `person` ์ธ์Šคํ„ด์Šค๋ฅผ `print` ํ•จ์ˆ˜๋กœ ์ถœ๋ ฅํ•  ๋•Œ, `description` ์†์„ฑ์ด ์‚ฌ์šฉ๋˜์–ด "์ด๋ฆ„: John, ๋‚˜์ด: 30์„ธ"๋ผ๋Š” ๋ฌธ์ž์—ด์ด ์ถœ๋ ฅ๋œ๋‹ค.

     

     


    3. UITableViewDelegate

    class MyTableViewController: UIViewController, UITableViewDelegate {
        // ...
        
        func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            // ํŠน์ • ์…€์ด ์„ ํƒ๋˜์—ˆ์„ ๋•Œ ์‹คํ–‰๋˜๋Š” ๋กœ์ง
        }
        
        // ...
    }


    ์œ„์˜ ์˜ˆ์‹œ์—์„œ `MyTableViewController` ํด๋ž˜์Šค๋Š” `UIViewController`๋ฅผ ์ƒ์†ํ•˜๊ณ , `UITableViewDelegate` ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๊ณ  ์žˆ๋‹ค. ์ด๋กœ ์ธํ•ด ํ•ด๋‹น ํด๋ž˜์Šค๋Š” ํ…Œ์ด๋ธ” ๋ทฐ์˜ ๋™์ž‘์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. `didSelectRowAt` ๋ฉ”์„œ๋“œ๋Š” ํŠน์ • ์…€์ด ์„ ํƒ๋˜์—ˆ์„ ๋•Œ ์‹คํ–‰๋˜๋Š” ๋กœ์ง์„ ๊ตฌํ˜„ํ•œ ์˜ˆ์‹œ์ด๋‹ค.

    ์ด๋ ‡๊ฒŒ ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์—์„œ ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋Šฅ์„ ์ •์˜ํ•˜๊ณ  ํ•„์š”ํ•œ ๊ณณ์—์„œ ์ ์ ˆํ•œ ํƒ€์ž…์— ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๋ฉด ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์—ฐ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

     

     

     

    ์•„์ง๋„ ํ”„๋กœํ† ์ฝœ์„ ์™œ! ์จ์•ผํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด

     

    ํ”„๋กœํ† ์ฝœ ์‚ฌ์šฉํ•  ๋•Œ 

    protocol Drawable {
        func draw()
    }
    
    struct Circle: Drawable {
        func draw() {
            print("์›์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.")
        }
    }
    
    struct Rectangle: Drawable {
        func draw() {
            print("์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.")
        }
    }
    
    func drawShapes(_ shapes: [Drawable]) {
        for shape in shapes {
            shape.draw()
        }
    }
    
    let circle = Circle()
    let rectangle = Rectangle()
    
    drawShapes([circle, rectangle])

    ์œ„์˜ ์ฝ”๋“œ๋Š” Drawable์ด๋ผ๋Š” ํ”„๋กœํ† ์ฝœ์„ ์ •์˜ํ•˜๊ณ , Circle๊ณผ Rectangle ๊ตฌ์กฐ์ฒด๊ฐ€ ์ด ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

    ๊ทธ๋ฆฌ๊ณ  drawShapes ํ•จ์ˆ˜๋Š” Drawable ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋Š” ๊ฐ์ฒด๋“ค์˜ ๋ฐฐ์—ด์„ ์ธ์ž๋กœ ๋ฐ›์•„ ๊ทธ๋ฆผ์„ ๊ทธ๋ฆฌ๋Š” ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

     

    ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ด์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

    - ๋‹ค์–‘ํ•œ ๋„ํ˜•์„ ๊ทธ๋ฆฌ๋Š” ํ•จ์ˆ˜ drawShapes์—์„œ Drawable ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋Š” ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, Circle๊ณผ Rectangle ์ด์™ธ์— ๋‹ค๋ฅธ ๊ตฌ์กฐ์ฒด๋‚˜ ํด๋ž˜์Šค๋„ drawShapes ํ•จ์ˆ˜์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

    - ์ƒˆ๋กœ์šด ๋„ํ˜•์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด Drawable ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋Š” ๊ตฌ์กฐ์ฒด๋ฅผ ์ถ”๊ฐ€๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค. ๊ธฐ์กด์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ, ์ด๋ฏธ ๊ตฌํ˜„๋œ drawShapes ํ•จ์ˆ˜๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    - Drawable ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋Š” ๊ฐ์ฒด๋“ค์€ draw ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค. ์ด๋กœ์จ ํ•ด๋‹น ๊ฐ์ฒด๋“ค์€ ๋„ํ˜•์„ ๊ทธ๋ฆฌ๋Š” ๊ณตํ†ต๋œ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

     

     

     

    ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ 

    struct Circle {
        func draw() {
            print("์›์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.")
        }
    }
    
    struct Rectangle {
        func draw() {
            print("์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.")
        }
    }
    
    func drawShapes(_ shapes: [Any]) {
        for shape in shapes {
            if let drawable = shape as? Drawable {
                drawable.draw()
            }
        }
    }
    
    let circle = Circle()
    let rectangle = Rectangle()
    
    drawShapes([circle, rectangle])

    ์œ„์˜ ์ฝ”๋“œ๋Š” Drawable ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  Circle๊ณผ Rectangle ๊ตฌ์กฐ์ฒด๋ฅผ ๊ตฌํ˜„ํ•œ ์˜ˆ์‹œ์ด๋‹ค.

    drawShapes ํ•จ์ˆ˜๋Š” Any ํƒ€์ž…์˜ ๊ฐ์ฒด ๋ฐฐ์—ด์„ ์ธ์ž๋กœ ๋ฐ›๊ณ , ๊ฐ์ฒด๊ฐ€ Drawable ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋Š”์ง€ ๊ฒ€์‚ฌํ•œ ํ›„์— ๊ทธ๋ฆผ์„ ๊ทธ๋ฆฌ๋Š” ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

    ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ์ ์ด ์žˆ๋‹ค

    drawShapes ํ•จ์ˆ˜๋Š” Any ํƒ€์ž…์˜ ๋ฐฐ์—ด์„ ๋ฐ›์•„ ๊ฐ์ฒด์˜ ํƒ€์ž…์„ ๊ฒ€์‚ฌํ•ด์•ผ ํ•œ๋‹ค. ์ด๋กœ ์ธํ•ด ํƒ€์ž… ์•ˆ์ •์„ฑ์ด ๋–จ์–ด์ง€๊ณ , ์‹คํ–‰ ์‹œ๊ฐ„์— ํƒ€์ž… ์บ์ŠคํŒ…์ด ํ•„์š”ํ•˜๊ฒŒ ๋œ๋‹ค.
    ์ƒˆ๋กœ์šด ๋„ํ˜•์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” drawShapes ํ•จ์ˆ˜์˜ ๊ตฌํ˜„์„ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค. ์ด๋ฏธ ๊ตฌํ˜„๋œ ํ•จ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ์˜ค๋ฅ˜ ๊ฐ€๋Šฅ์„ฑ์„ ๋†’์ด๊ณ  ๊ธฐ์กด ์ฝ”๋“œ์™€์˜ ํ˜ธํ™˜์„ฑ์„ ํ•ด์น˜๋Š” ์š”์†Œ๊ฐ€ ๋œ๋‹ค.
    ๊ฐ์ฒด๋“ค์€ draw ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜์ง€๋งŒ, ์ด๋ฅผ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋‹ค. ๋”ฐ๋ผ์„œ, ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฐ์ฒด๋ฅผ drawShapes ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

     

     

     

    ๊ฒฐ๋ก 

    ์ด์™€ ๊ฐ™์ด ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ์˜ ์œ ์—ฐ์„ฑ, ์žฌ์‚ฌ์šฉ์„ฑ, ํ™•์žฅ์„ฑ์ด ํ–ฅ์ƒ๋˜๋ฉฐ, ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ช…์‹œํ™”์™€ ํ˜‘์—…์„ ์›ํ™œํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค!

     

    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€