ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [사전캠프 TIL 1일차] Struct / Class / Protocol
    iOS💖 2025. 2. 3. 19:50

    학습 키워드

    Struct

    Class

    Protocol

    🗂️ POP (Protocol Oriented Programming)

     

     

    Struct vs. Class

    특징 Struct (구조체) Class (클래스)
    메모리 구조 Stack Heap
    타입 값 타입 (Value type) 참조 타입 (Reference type)
    상속 불가능 가능
    성능 메모리 복사 빠름 -> 성능 ⬆️ 메모리 참조 -> 성능 ⬇️
    공통점 Protocol 채택 & 구현 가능

     

     

    메모리 구조에 대해서는 이전에 학습하지 못했던 것 같다.

    앞으로 메모리 구조에 대해 더 공부해야될 것 같다.

    CS 공부가 시급..

     

     

     

    손정리

    Struct & Class

     

     

     

    같이 보면 좋은 포스트

    내가 과거에 정리했던 포스트

     

    1.  https://hortenssiaa.tistory.com/17?category=1120065

     

    (Swift) Structures VS. Classes

    Choose Structures by Default!Use structures by default.Use classes when you need Objective-C interoperability.Use classes when you need to control the identity of the data you’re modeling.Use structures along with protocols to adopt behavior by sharing i

    hortenssiaa.tistory.com

     

     

     


    Protocol

    • Protocol 은, 기능에 대한 정의만 제공!!
      • ➡️ 실제 구현 제공 X
      • ➡️ Protocol 채택하여야만 기능 구현 가능!
    • 채택 (Adopt) & 구현 (Implement) 가능 타입
      • Struct
      • Class
      • Enum
    • ⭐️⭐️ extension 을 통해, 역할에 대한 실제 구현 (= 메소드 구현) 가능함 ⭐️⭐️
    • 용도
      • 코드 재사용 가능
        • ➡️ 유연한 설계
      • POP 가능
        • Protocol-Oriented Programming, 프로토콜 기반의 설계 방식
    • 예제 코드)
    protocol Greetable {
        func greet() -> String
    }
    
    struct Person: Greetable {
        var name: String
        func greet() -> String {
            return "Hello, \\(name)!"
        }
    }
    
    let person = Person(name: "Mimi")
    print(person.greet()) // "Hello, Mimi!"

     

     

     

     

    직접 구현해보는 코드

    1. Struct 구현하기

    • 이름과 나이를 저장하는 User Struct를 작성하고, 두 명의 독립적인 사용자 인스턴스를 생성해주세요.
    • 두 인스턴스의 값을 변경한 후, 각 인스턴스가 서로 독립적임을 확인하세요.
    struct User {
        var name: String
        var age: Int
    }
    
    var sangyeon = User(name: "Sangyeon", age: 26) 
    var mimi = User(name: "Mimi", age: 29) 
    
    print(sangyeon.age) // 26
    print(mimi.age) // 29
    
    sangyeon.age = 13
    mimi.age = 21
    
    print(sangyeon.age) // 13
    print(mimi.age) // 21

     

     

     

     

    2. Class 구현하기

    • 이름과 나이를 저장하는 User Class를 작성하고, 두 개의 사용자 참조를 생성해주세요.
    • 한 참조의 값을 변경한 후, 두 참조가 동일한 값을 공유하는지 확인하세요.
    class User {
        init(name: String, age: Int) {
            self.name = name
            self.age = age
        }
        
        var name: String
        var age: Int
    }
    
    var sangyeon = User(name: "User Name", age: 100)
    var mimi = sangyeon
    
    print("[sangyeon] \(sangyeon.name), \(sangyeon.age)") // [sangyeon] User Name, 100
    print("[mimi] \(mimi.name), \(mimi.age)") // [mimi] User Name, 100
    
    sangyeon.age = 50
    
    print("[sangyeon] \(sangyeon.name), \(sangyeon.age)") // [sangyeon] User Name, 50
    print("[mimi] \(mimi.name), \(mimi.age)") // [mimi] User Name, 50
    
    mimi.name = "Mimi"
    
    print("[sangyeon] \(sangyeon.name), \(sangyeon.age)") // [sangyeon] Mimi, 50
    print("[mimi] \(mimi.name), \(mimi.age)") // [mimi] Mimi, 50

     

     

     

     

    3. Greetable 프로토콜

    • greet() 메서드를 포함한 Greetable 프로토콜을 정의합니다. 
    • Person Struct와 Robot Class에서 이 프로토콜을 채택하고 구현하세요. 
    • Person은 이름을 활용하여 인사를 출력, Robot은 고유 ID를 활용해 인사를 출력합니다.
    import Foundation
    
    protocol Greetable {
        func greet()
    }
    
    struct Person: Greetable {
        func greet() {
            print("Hello, This is Struct Person")
        }
    }
    
    class Robot: Greetable {
        func greet() {
            print("Hello, This is Robot no.\(UUID())")
        }
    }
    
    var person = Person()
    person.greet() // Hello, This is Struct Person
    
    var robot = Robot()
    robot.greet() // Hello, This is Robot no.4E57B4B1-6229-49FD-B8D7-57A053BD310E

     

     

     

     

    4. 프로토콜 확장(Extension)

    • Greetable 프로토콜에 기본 구현을 추가하여 greet() 메서드가 기본적으로 "Hello!"를 반환하도록 하세요. 
    • 기본 구현을 사용하지 않고 고유 인사를 반환하는 Alien Struct를 추가로 구현하세요.
    protocol Greetable {
        func greet() -> String
    }
    
    struct Person: Greetable { }
    var person = Person()
    print(person.greet()) // Hello!
    
    extension Greetable {
        func greet() -> String {
            return "Hello!"
        }
    }
    
    struct Alien: Greetable {
        func greet() -> String {
            return "Hello, from Alienumhahaha"
        }
    
    }
    var a = Alien()
    print(a.greet()) // Hello, from Alienumhahaha

     

     

     

     

    손정리

    Protocol

     

     

     

    같이 보면 좋은 포스트

    내가 과거에 정리했던 포스트

     

    1.   https://hortenssiaa.tistory.com/18

     

    (Swift) POP (Protocol Oriented Programming)

    protocol , extension , protocol extension 을 통해 POP (Protocol Oriented Programming)이 가능함  1. protocol : 어떤 역할에 대한 정의 제공실제 구현 제공 Xprotocol Payable { func calculateWages() -> Int}protocol Trainable { func trai

    hortenssiaa.tistory.com

     

     

     


    회고

    오랜만에 문법 복습을 한다.

    사전학습이라서 뭔가 별거 없을 것 같았는데, 알차게 구성되어있어서 넘 좋다!

    오늘은 OT라 정신없이 하루가 후딱지나갔지만,

    남은 4일간, 앞으로 문법 때문에 막히는 일 없게 복습을 잘 해보자. 

     

     

     

     

    댓글

Designed by black7375.