반응형
기본 문제 수정 및 개선
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()
반응형
'DEV' 카테고리의 다른 글
[iOS/Swift] UIKit ScrollView 스크롤이 안되는 오류 (AutoLayout, SnapKit) (0) | 2025.03.26 |
---|---|
[iOS/Swift] 이중우선순위 큐, components(sparatedBy:), split(separator:) (0) | 2025.03.24 |
[iOS/Swift] Zip 함수 (0) | 2025.03.19 |
[iOS/Swift] 상속(Inheritance)과 프로토콜(Protocol) (0) | 2025.03.18 |
[iOS/Swift] Sending 'closure' risks causing data races (data race) (0) | 2025.03.16 |