본문 바로가기

DEV

[iOS/Swift] 프로그래밍 심화 주차 과제 코드 리뷰, 수정

반응형

기본 문제 수정 및 개선

func c<T> (_ arr: [T]) -> [T] {
    var array = [T]()
    for i in arr.indices {
        if i % 2 == 0 {
            array.append(arr[i])
        }
    }
    return array
}
let arrC1 = [1, 2, 3, 4, 5]
let arrC2 = ["가", "나", "다", "라", "마"]
print(c(arrC1))
print(c(arrC2))

 

기존의 func c를 공부하는 차원에서 고차함수를 이용해서 따로 만들어봄

// .filter
func cWithFilter<T> (_ arr: [T]) -> [T] {
    let array = arr.enumerated()
        .filter { $0.0 % 2 == 0 }
        .map { $0.1 }
    return array
}
print("withFilter: \(cWithFilter(arrC2))")

 

 

짝수번째 요소 가져오는 로직 개선

배열의 짝수번째 요소를 제거해서 반환하는 함수를 만드는 문제였다.

인덱스는 0부터 시작하기에 인덱스 기준에서 짝수 인덱스 요소를 추가하면 되는 간단한 문제였다.

그런데 나는 i+1 % 2 == 0 일시 다음 반복으로 넘어가도록 로직을 짰었다.

func a (_ arr: [Int]) -> [Int] {
    var array = [Int]()
    for i in arr.indices {
        if (i+1) % 2 == 0 { continue }
        array.append(arr[i])
    }
    return array
}

 

 

 

도전 문제 수정 및 개선

// MARK: - 도전문제 1
//- [ ]  Base Class `Car` 를 설계해주세요.
//- 4가지의 상태를 정의해주세요.
//- 브랜드, 모델, 연식
//- 모두 String 타입입니다.
//- 엔진
//- Engine 이라는 커스텀 타입으로 정의해주세요.
//- 1개의 동작을 정의해주세요.
//- 운전하기
//- 동작 예시) “Car 주행 중…”  출력
//- 추가하고 싶은 상태와 동작은 마음껏 추가해주세요.
//- stop(), charge(), refuel() 등..
print("\n< 도전 문제 1 >")

protocol Engine {
    func drive()
    func stop()
}

class Car {
    var brand: String
    var model: String
    var year: String
    var engine: Engine
    
    init(brand: String, model: String, year: String, engine: Engine) {
        self.brand = brand
        self.model = model
        self.year = year
        self.engine = engine
    }
    
    func drive() {
        print("Car 주행 중...")
    }
    
    func stop() {
        print("Car 정지")
    }
    
    func refuel() {
        print("기름을 다 채웠습니다.")
    }
}


//- [ ]  `Car` 를 상속한 `ElectricCar` 를 설계해주세요.
//- ElectricEngine 타입의 Engine 을 사용해야합니다.
struct ElectricEngine: Engine {
    func drive() {
        print("ElectricCar 주행 중...")
    }

    func stop() {
        print("ElectricCar 정지")
    }
    
}

class ElectricCar: Car {
    
    init(brand: String, model: String, year: String, engine: ElectricEngine) {
        super.init(
            brand: brand,
            model: model,
            year: year,
            engine: engine
        )
    }
    
    func charge() {
       print("충전이 완료되었습니다.")
    }
}

//- [ ]  `Car` 를 상속한 `HybridCar` 를 설계해주세요.
//- 새로운 엔진 타입 `HydrogenEngine` 을 정의해주세요.
//- HybridCar 에는 기존 Car 에 없던 새로운 동작이 추가됩니다.
//- 엔진을 런타임에 바꿀 수 있는 `switchEngine(to:)` 입니다.
struct HybridEngine: Engine {
    func drive() {
        print("HybridCar 주행 중...")
    }
    
    func stop() {
        print("HybridCar 정지")
    }
    
}

class HybridCar: Car {
    
    init(brand: String, model: String, year: String, engine: HybridEngine) {
        super.init(
            brand: brand,
            model: model,
            year: year,
            engine: engine
        )
    }
    
    func switchEngine(to newEngine: Engine) {
        engine = newEngine
        print("엔진이 바꼈습니다.")
    }
}

//- [ ]  `HybridCar` 인스턴스를 생성하고, `switchEngine(to:)` 를 호출하여 서로 다른 타입의 엔진으로 교체하는 코드를 작성해주세요.
let hybridCar = HybridCar(
    brand: "A",
    model: "Ailo",
    year: "2025",
    engine: HybridEngine()
)
hybridCar.engine.drive()
let electricEngine = ElectricEngine()
hybridCar.switchEngine(to: electricEngine)
hybridCar.engine.drive()
print(hybridCar.engine)

 

기존 코드 문제점

  • Car, Engine프로토콜에 각각 drive(), stop() 함수 공존.
  • Engine 이란 프로토콜에 drive, stop 기능이 있는게 의미적으로 잘못됨.
  • HybridCar, ElectricCar에서 EngineType을 Hide하지 않아서 초기화가 두번 됨

위 문제들을 수정하여 다시 코드를 짰다.

 

// MARK: - 도전문제 1
//- [ ]  Base Class `Car` 를 설계해주세요.
//- 4가지의 상태를 정의해주세요.
//- 브랜드, 모델, 연식
//- 모두 String 타입입니다.
//- 엔진
//- Engine 이라는 커스텀 타입으로 정의해주세요.
//- 1개의 동작을 정의해주세요.
//- 운전하기
//- 동작 예시) “Car 주행 중…”  출력
//- 추가하고 싶은 상태와 동작은 마음껏 추가해주세요.
//- stop(), charge(), refuel() 등..
print("\n< 도전 문제 1 >")

enum Engines: String {
    case Gasoline = "Gasoline"
    case Electric
    case Hybrid
}

protocol EngineProtocol {
    var engineType: String { get }
}

struct GasolineEngine: EngineProtocol {
    let engineType: String
}

class Car {
    var brand: String
    var model: String
    var year: String
    var engine: EngineProtocol
    
    init(brand: String, model: String, year: String, engine: EngineProtocol) {
        self.brand = brand
        self.model = model
        self.year = year
        self.engine = engine
    }
    
    func drive() {
        print("\(self.engine.engineType) Car 주행 중...")
    }
    
    func stop() {
        print("\(self.engine.engineType) Car 정지")
    }
    
    func refuel() {
        print("기름을 다 채웠습니다.")
    }
}


//- [ ]  `Car` 를 상속한 `ElectricCar` 를 설계해주세요.
//- ElectricEngine 타입의 Engine 을 사용해야합니다.
struct ElectricEngine: EngineProtocol {
    var engineType: String
}

class ElectricCar: Car {
    
    init(brand: String, model: String, year: String) {
        super.init(
            brand: brand,
            model: model,
            year: year,
            engine: ElectricEngine(engineType: Engines.Electric.rawValue)
        )
    }
    
    func charge() {
       print("충전이 완료되었습니다.")
    }
}

//- [ ]  `Car` 를 상속한 `HybridCar` 를 설계해주세요.
//- 새로운 엔진 타입 `HydrogenEngine` 을 정의해주세요.
//- HybridCar 에는 기존 Car 에 없던 새로운 동작이 추가됩니다.
//- 엔진을 런타임에 바꿀 수 있는 `switchEngine(to:)` 입니다.
struct HybridEngine: EngineProtocol {
    var engineType: String
}

class HybridCar: Car {
    
    init(brand: String, model: String, year: String) {
        super.init(
            brand: brand,
            model: model,
            year: year,
            engine: HybridEngine(engineType: Engines.Hybrid.rawValue)
        )
    }
    override func drive() {
        print(engine.engineType)
        print("\(self.engine.engineType) Car 주행 중...")
    }
    
    override func stop() {
        print("\(self.engine.engineType) Car 정지")
    }
    func switchEngine(to newEngine: EngineProtocol) {
        engine = newEngine
        print("엔진: \(engine.engineType)")
    }
}

//- [ ]  `HybridCar` 인스턴스를 생성하고, `switchEngine(to:)` 를 호출하여 서로 다른 타입의 엔진으로 교체하는 코드를 작성해주세요.
let hybridCar = HybridCar(brand: "T", model: "X", year: "2025")
hybridCar.drive()
hybridCar.switchEngine(to: ElectricEngine(engineType: "Electric"))
hybridCar.drive()
print(hybridCar.engine)

let car = Car(
    brand: "H",
    model: "S",
    year: "2025",
    engine: GasolineEngine(engineType: Engines.Gasoline.rawValue)
)
car.drive()
car.stop()
car.refuel()

 

반응형