From bf2bfb459dfe3d05540e7d251ee6982c0b099f11 Mon Sep 17 00:00:00 2001 From: ybin4548 Date: Thu, 8 Jan 2026 20:56:15 +0900 Subject: [PATCH 1/8] =?UTF-8?q?=EA=B0=9C=EC=9D=B8=EA=B3=BC=EC=A0=9C=20?= =?UTF-8?q?=EB=AC=B8=EC=A0=9C=ED=92=80=EC=9D=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- chap2/chap2.xcodeproj/project.pbxproj | 294 ++++++++ .../contents.xcworkspacedata | 7 + .../UserInterfaceState.xcuserstate | Bin 0 -> 18550 bytes .../xcschemes/xcschememanagement.plist | 14 + chap2/chap2/main.swift | 636 ++++++++++++++++++ 5 files changed, 951 insertions(+) create mode 100644 chap2/chap2.xcodeproj/project.pbxproj create mode 100644 chap2/chap2.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 chap2/chap2.xcodeproj/project.xcworkspace/xcuserdata/son-yeongbin.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 chap2/chap2.xcodeproj/xcuserdata/son-yeongbin.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 chap2/chap2/main.swift diff --git a/chap2/chap2.xcodeproj/project.pbxproj b/chap2/chap2.xcodeproj/project.pbxproj new file mode 100644 index 0000000..37a9612 --- /dev/null +++ b/chap2/chap2.xcodeproj/project.pbxproj @@ -0,0 +1,294 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 77; + objects = { + +/* Begin PBXCopyFilesBuildPhase section */ + 8AFFB8A92F0D06A500B08B3D /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 8AFFB8AB2F0D06A500B08B3D /* chap2 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = chap2; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFileSystemSynchronizedRootGroup section */ + 8AFFB8AD2F0D06A500B08B3D /* chap2 */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = chap2; + sourceTree = ""; + }; +/* End PBXFileSystemSynchronizedRootGroup section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8AFFB8A82F0D06A500B08B3D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 8AFFB8A22F0D06A500B08B3D = { + isa = PBXGroup; + children = ( + 8AFFB8AD2F0D06A500B08B3D /* chap2 */, + 8AFFB8AC2F0D06A500B08B3D /* Products */, + ); + sourceTree = ""; + }; + 8AFFB8AC2F0D06A500B08B3D /* Products */ = { + isa = PBXGroup; + children = ( + 8AFFB8AB2F0D06A500B08B3D /* chap2 */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 8AFFB8AA2F0D06A500B08B3D /* chap2 */ = { + isa = PBXNativeTarget; + buildConfigurationList = 8AFFB8B22F0D06A500B08B3D /* Build configuration list for PBXNativeTarget "chap2" */; + buildPhases = ( + 8AFFB8A72F0D06A500B08B3D /* Sources */, + 8AFFB8A82F0D06A500B08B3D /* Frameworks */, + 8AFFB8A92F0D06A500B08B3D /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + 8AFFB8AD2F0D06A500B08B3D /* chap2 */, + ); + name = chap2; + packageProductDependencies = ( + ); + productName = chap2; + productReference = 8AFFB8AB2F0D06A500B08B3D /* chap2 */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 8AFFB8A32F0D06A500B08B3D /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 2620; + LastUpgradeCheck = 2620; + TargetAttributes = { + 8AFFB8AA2F0D06A500B08B3D = { + CreatedOnToolsVersion = 26.2; + }; + }; + }; + buildConfigurationList = 8AFFB8A62F0D06A500B08B3D /* Build configuration list for PBXProject "chap2" */; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 8AFFB8A22F0D06A500B08B3D; + minimizedProjectReferenceProxies = 1; + preferredProjectObjectVersion = 77; + productRefGroup = 8AFFB8AC2F0D06A500B08B3D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8AFFB8AA2F0D06A500B08B3D /* chap2 */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 8AFFB8A72F0D06A500B08B3D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 8AFFB8B02F0D06A500B08B3D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACOSX_DEPLOYMENT_TARGET = 26.2; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 8AFFB8B12F0D06A500B08B3D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACOSX_DEPLOYMENT_TARGET = 26.2; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + }; + name = Release; + }; + 8AFFB8B32F0D06A500B08B3D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 8AFFB8B42F0D06A500B08B3D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 8AFFB8A62F0D06A500B08B3D /* Build configuration list for PBXProject "chap2" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 8AFFB8B02F0D06A500B08B3D /* Debug */, + 8AFFB8B12F0D06A500B08B3D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 8AFFB8B22F0D06A500B08B3D /* Build configuration list for PBXNativeTarget "chap2" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 8AFFB8B32F0D06A500B08B3D /* Debug */, + 8AFFB8B42F0D06A500B08B3D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 8AFFB8A32F0D06A500B08B3D /* Project object */; +} diff --git a/chap2/chap2.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/chap2/chap2.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/chap2/chap2.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/chap2/chap2.xcodeproj/project.xcworkspace/xcuserdata/son-yeongbin.xcuserdatad/UserInterfaceState.xcuserstate b/chap2/chap2.xcodeproj/project.xcworkspace/xcuserdata/son-yeongbin.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..824ec7caa83b8e7a5274cd3e6298385efb7545b4 GIT binary patch literal 18550 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 literal 0 HcmV?d00001 diff --git a/chap2/chap2.xcodeproj/xcuserdata/son-yeongbin.xcuserdatad/xcschemes/xcschememanagement.plist b/chap2/chap2.xcodeproj/xcuserdata/son-yeongbin.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..bd604b7 --- /dev/null +++ b/chap2/chap2.xcodeproj/xcuserdata/son-yeongbin.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + chap2.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/chap2/chap2/main.swift b/chap2/chap2/main.swift new file mode 100644 index 0000000..1d73ada --- /dev/null +++ b/chap2/chap2/main.swift @@ -0,0 +1,636 @@ + +/* 필수 문제 1. + - [ ] 두 개의 Int 값을 파라미터로 받고, 하나의 String 값을 반환하는 클로저를 설계해주세요. + - 클로저 내부에서는 두 정수를 더한 후, "두 수의 합은 {합계} 입니다"라는 문자열을 반환합니다. + - [ ] 이 클로저를 상수 sum에 저장하고, 정확한 타입을 명시해주세요. + + ```swift + var num: Int = 3 + ``` + + - [ ] sum을 호출하는 코드를 작성해주세요. (파라미터로 전달하는 값은 임의로 선택) + - [ ] 위에서 정의한 sum과 동일한 타입의 클로저를 파라미터로 받고, 반환 값이 없는(void) 함수 calculate를 작성해주세요. + 1. (조건) calculate 함수 구현 내에서는 파라미터로 전달받은 클로저를 호출하는 코드를 포함해야합니다. + */ + + +/* 1. 두 개의 Int 값을 파라미터로 받고, 하나의 String 값을 반환하는 클로저*/ +let closure: (Int, Int) -> String = { + val1, val2 in + return "두 수의 합은 \(val1 + val2)입니다." +} +//let closure: (Int, Int) -> String = { +// return "두 수의 합은 \($0 + $1)입니다." +//} +//print(closure(10,20)) + +/* 2. 클로저를 상수 sum에 저장하고, 정확한 타입을 명시*/ +let sum: (Int, Int) -> String = closure + +/* 3. sum을 호출하는 코드*/ +print(sum(10,20)) + +/* 4. sum과 동일한 타입의 클로저를 파라미터로 받고, 반환 값이 없는(void) 함수 calculate */ +// 방법 1. 클로저만을 파라미터로 받음(고정 데이터 처리 가능) +func calculate(calClosure: (Int, Int) -> String){ + let result = calClosure(20,20) + print(result) +} + +calculate(calClosure : sum) +//방법 2. 계산 인자와 클로저를 파라미터로 받음(함수 호출 시에 인자를 지정하여 사용 가능) +func calculate(val1 : Int, val2 :Int ,calClosure: (Int,Int)->String){ + let result = calClosure(val1, val2) + print(result) +} +calculate(val1: 20, val2: 30, calClosure: sum) + + +/* 필수 문제 2. + - [ ] 아래 for-in 문을 map 을 사용하는 코드로 변환해주세요. + + ```swift + let numbers = [1, 2, 3, 4, 5] + + var result = [String]() + + for number in numbers { + result.append(number) + } + ``` + +- [ ] 주어진 입력값을 고차함수를 체이닝하여 주어진 출력값이 나오도록 구현해주세요. + - 입력: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] - 타입: Array + - 출력: [”2”, “4”, “6”, “8”, “10”] - 타입: Array + - 힌트 + + map 과 filter 를 이용해볼 수 있을 것 같습니다. + +- [ ] 이제 고차함수를 직접 만들어 봅니다. + - 함수명: myMap + - 파라미터는 2개 입니다. + 1. 배열: [Int] + 2. 변환 클로저: (Int) → String + - 반환 값은 1개 입니다. + 1. [String] + - myMap 함수 구현 내부에서 map, filter, reduce 등 고차함수를 직접 사용하지 않아야합니다. + - 완성된 myMap 호출 예시 + + ```swift + let result = myMap([1, 2, 3, 4, 5]) { + String($0) + } + + print(result) // ["1", "2", "3", "4", "5"] + ```*/ + +/* 1. for-in -> map 변경*/ +let numbers = [1,2,3,4,5] +var result = [String]() +result = numbers.map{String($0)} +print(result) + +/* 2. 고차함수 체이닝 */ +let num:[Int] = [1,2,3,4,5,6,7,8,9,10] +var res:[String] = num.filter{$0 % 2 == 0}.map{String($0)} +print(res) + +/* 3. 고차함수 생성 (map, filter, reduce 사용X */ +func myMap(_ arr:[Int], toStr: (Int) -> String) -> [String]{ + var myres: [String] = [] + for idx in arr{ + myres.append(toStr(idx)) + } + return myres +} +let arr2 = myMap([1,2,3,4,5]){ //result는 위에서 사용 중이라 arr2로 대체했습니다. + String($0) +} +print(arr2) + + + +/* 필수 문제 3. + - [ ] Int 배열의 짝수번째 요소를 제거해서 반환하는 함수 `a` 를 작성해주세요. + - 테스트 입력: [1, 2, 3, 4, 5] + - 테스트 출력: [2, 4] + - [ ] String 배열의 짝수번째 요소를 제거해서 반환하는 함수 `b` 를 작성해주세요. + - 테스트 입력: [”가”, “나”, “다”, “라”, “마”] + - 테스트 출력: [”나”, “라”] + - [ ] 위 두 함수를 하나의 함수로 대체할 수 있는 방법을 고민해보고, 함수 `c` 로 작성해주세요. + - [ ] 테스트 입력들을 넣고 호출하여 출력이 제대로 나오는지 작성해주세요. + - 테스트 입력: [1, 2, 3, 4, 5], [”가”, “나”, “다”, “라”, “마”] + - 테스트 출력: [2, 4], [”나”, “라”] + - [ ] 함수 `c` 를 기반으로 수정하여 함수 `d` 를 작성해주세요. + - 파라미터의 타입을 << 'Numeric 프로토콜'을 준수하는 타입의 요소를 가진 배열 >> 로 변경합니다. + */ + +/* 1. `a` 함수 작성 */ +func a(arr: [Int])->[Int]{ + var iArr: [Int] = [] + for idx in 0..[String]{ + var sArr: [String] = [] + for idx in 0..(arr: [T])->[T]{ + var cArr: [T] = [] + for idx in 0..(arr: [T])->[T]{ + var dArr: [T] = [] + for idx in 0.. String 메서드를 요구사항으로 포함합니다. + - 동작 예시: print("안녕하세요, 저는 \(name)입니다.") + - [ ] Robot, Cat, Dog 타입을 정의하고 Introducible 프로토콜을 채택해주세요. + - [ ] Robot 타입의 경우, name 값이 변경될 때마다 변경 이전값과 이후 값을 출력하도록 구현해주세요. + - 만약 변경 이전값과 이후값이 같다면 출력하지 않아야합니다. + - 출력 예시 + + ```swift + name 변경 알림 + 변경 이전 값: 피규어 + 변경 이후 값: 옵티머스 + ``` + + - [ ] Introducible 프로토콜 에 정의되지 않은 각 타입 고유의 메서드들도 하나씩 추가 정의해주세요. + - 예를 들어, Robot 은 충전하기(batteryCharge) 라는 메서드를 추가 할 수 있습니다. + - [ ] `[Introducible]` 타입 배열을 정의하고, Robot, Cat, Dog 인스턴스 1개씩을 append 해주세요. + - 배열을 순회하며 각 타입 고유의 메서드들을 호출하는 코드를 작성해주세요. + */ + +/* 1. Introducible 프로토콜 정의 */ +protocol Introducible{ + var name: String {get set} + func introduce()->String +} +/* 2. Robot 정의 */ +class Robot: Introducible{ + var name: String{ + didSet{ + print("name 변경 알림") + print("변경 이전 값: \(oldValue)") + print("변경 이후 값: \(name)") + } + } + var batterySts: Int = 50 + + func introduce()->String{ + return "안녕하세요. 저는 \(name)입니다." + } + func batteryCharge(){ + if batterySts == 100 { + print("배터리 충전이 완료된 상태입니다.") + }else { + batterySts += 10 + print("배터리가 충전되었습니다.") + } + print("현재 배터리 잔량은 \(batterySts)입니다.") + } + + init(name: String){ + self.name = name + } +} +/* 3. Cat 정의 */ +class Cat: Introducible{ + var name: String + func introduce()->String{ + return "안녕하세요. 저는 \(name)입니다." + } + func meow(){ + print("고양이가 울고있습니다.") + } + init(name: String) { + self.name = name + } +} +/* 4. Dog 정의 */ +class Dog: Introducible{ + var name: String + func introduce()->String{ + return "안녕하세요. 저는 \(name)입니다." + } + func bark(){ + print("개가 짖고있습니다.") + } + init(name: String) { + self.name = name + } +} +/* 5. robot,cat,dog 인스턴스 생성 -> append */ +var robot = Robot(name: "피규어") +var cat = Cat(name: "고양이") +var dog = Dog(name: "강아지") +var arr: [Introducible] = [] +arr.append(robot) +arr.append(cat) +arr.append(dog) +/* robot name 변경 */ +robot.name = "옵티머스" +/* 배열 순회하며 고유 메서드 출력 */ +for idx in arr{ + print(idx.introduce()) + if let r = idx as? Robot{ + r.batteryCharge() + } else if let c = idx as? Cat{ + c.meow() + } else if let d = idx as? Dog{ + d.bark() + } +} + + + +/* 필수 문제 5. + 우리는 간단한 **택배 도착 예측 시스템**을 만들고 있다고 가정합니다. + + 사용자에게 예상 도착일을 알려주려 하지만, 다음과 같은 여러 상황에서 문제가 발생할 수 있습니다: + + - 주소가 잘못된 경우 + - 배송이 아직 시작되지 않은 경우 + - 시스템 서버 에러로 예측이 불가능한 경우 + - [ ] 배송 상태를 표현하는 DeliveryStatus 열거형을 구현하고, 아래 3가지 상태를 포함하도록 합니다. + - notStarted + - inTransit(daysRemaining: Int) + - error + - [ ] 사용자 정의 에러 타입 DeliveryError를 Error 프로토콜을 따르도록 정의합니다. + - invalidAddress + - notStarted + - systemError(reason: String) + - [ ] 아래 시그니처를 가진 throwing function 을 구현해봅니다. + + ```swift + func predictDeliveryDay(for address: String, status: DeliveryStatus) throws -> String + ``` + + - 주소가 빈 문자열이면 DeliveryError.invalidAddress를 던져야 합니다. + - 배송이 아직 시작되지 않은 경우 DeliveryError.notStarted를 던져야 합니다. + - 시스템 에러 상태면 DeliveryError.systemError(reason:)을 던져야 합니다. + - 나머지 경우에는 "배송까지 X일 남았습니다." 형태의 문자열을 반환합니다. + - [ ] 위 함수를 do-catch 로 호출하고, 각 에러 상황에 따라 사용자에게 다른 메시지를 출력하세요. + */ + + +/* 1.DeliveryStatus Enum 구현 */ +enum DeliveryStatus { + case notStarted + case inTransit(daysRemaining: Int) + case error + +} +/* 2. DeliveryError 구현(Error Protocol) */ +enum DeliveryError: Error{ + case invalidAddress + case notStarted + case systemError(reason: String) +} +/* 3. throwing function 구현 */ +func predictDeliveryDay(for address: String, status: DeliveryStatus) throws -> String{ + if address.isEmpty{ + throw DeliveryError.invalidAddress + } + switch status{ + case .notStarted: + throw DeliveryError.notStarted + case .error: + throw DeliveryError.systemError(reason: "시스템에 오류가 있습니다.") + case .inTransit(daysRemaining: let days): + return "배송까지 \(days)일 남았습니다." + } +} +/* 4. do-catch로 호출 */ +do{ + let result = try predictDeliveryDay(for:"" ,status: .inTransit(daysRemaining: 3)) + print(result) +} catch DeliveryError.invalidAddress{ + print("주소가 입력되지 않았습니다.") +} catch DeliveryError.notStarted{ + print("배송이 아직 시작되지 않았습니다.") +} catch DeliveryError.systemError(reason: let reason){ + print("오류: \(reason)") +} + + + +/* 도전 문제 1. + - ‘자동차’ 라는 개념을 가지고 객체 지향 설계를 해봅니다. + - [ ] Base Class `Car` 를 설계해주세요. + - 4가지의 상태를 정의해주세요. + - 브랜드, 모델, 연식 + - 모두 String 타입입니다. + - 엔진 + - Engine 이라는 커스텀 타입으로 정의해주세요. + - 1개의 동작을 정의해주세요. + - 운전하기 + - 동작 예시) “Car 주행 중…” 출력 + - 추가하고 싶은 상태와 동작은 마음껏 추가해주세요. + - stop(), charge(), refuel() 등.. + - 정의한 각 상태 및 동작에 적절한 접근 제어자를 명시적으로 지정해주세요. + - [ ] `Car` 를 상속한 `ElectricCar` 를 설계해주세요. + - ElectricEngine 타입의 Engine 을 사용해야합니다. + - [ ] `Car` 를 상속한 `HybridCar` 를 설계해주세요. + - 새로운 엔진 타입 `HydrogenEngine` 을 정의해주세요. + - HybridCar 에는 기존 Car 에 없던 새로운 동작이 추가됩니다. + - 엔진을 런타임에 바꿀 수 있는 `switchEngine(to:)` 입니다. + - [ ] `HybridCar` 인스턴스를 생성하고, `switchEngine(to:)` 를 호출하여 서로 다른 타입의 엔진으로 교체하는 코드를 작성해주세요. + - [ ] 상속을 사용하여 기능을 추가하는 것과, 프로토콜 채택을 통해서 기능을 추가하는 것의 장단점, 차이를 고민하고 주석으로 서술해주세요. + */ + +/* 1. Base Class `Car` 설계 */ +class Car{ + private let brand: String + private let model: String + private let year: String + public var engine: Engine + private var isDrive: Bool = false + private var battery: Int = 50 + public var fuel: Int = 95 + + public func drive() { + isDrive = true + fuel -= 10 + print("Car 주행 중...") + } + public func stop(){ + isDrive = false + print("Car 멈춤") + } + + public func isDriving(){ + if isDrive == true{ + print("주행 중입니다.") + }else{ + print("차가 멈춰있습니다.") + } + } + + public func charge(){ + if battery == 100{ + print("배터리 충전이 완료된 상태입니다.") + }else{ + battery += 10 + print("현재 배터리 잔량은 \(battery)입니다.") + } + } + + private func isFull(){ + if fuel >= 100{ + print("연료가 가득찼습니다.") + } + } + public func refuel(){ + if fuel >= 100{ + isFull() + }else if (fuel + 20) >= 100{ + fuel = 100 + isFull() + }else { + fuel += 20 + print("현재 연료의 양은 \(fuel)입니다.") + } + } + + init(brand: String, model: String, year: String, engine: Engine) { + self.brand = brand + self.model = model + self.year = year + self.engine = engine + } +} +/* 2. Custom Engine */ +class Engine { + var engineName: String + + init(engineName: String) { + self.engineName = engineName + } +} +/* 3. Engine 상속받는 ElectricEngine, HydrogenEngine */ +class ElectricEngine: Engine { + init() { + super.init(engineName: "Electric Engine") + } +} +class HydrogenEngine: Engine { + init() { + super.init(engineName: "Hydrogen Engine") + } +} +/* 4. Car 상속받는 ElectricCar, HybridCar*/ +class ElectricCar: Car{ +} +class HybridCar: Car{ + /* 엔진을 런타임에 바꿀 수 있는 `switchEngine(to:)` */ + func switchEngine(to newEngine: Engine){ + engine = newEngine + } +} +/* 5. `HybridCar` 인스턴스를 생성 */ +var hybridcar = HybridCar(brand: "현대", model: "제네시스", year: "2025", engine: ElectricEngine()) +print(hybridcar.engine.engineName) +/* 6. `switchEngine(to:)` 를 호출 */ +hybridcar.switchEngine(to: HydrogenEngine()) +print(hybridcar.engine.engineName) +//hybridcar.drive() +//hybridcar.stop() +//hybridcar.isDriving() +//hybridcar.drive() +//hybridcar.isDriving() +//hybridcar.charge() +//hybridcar.refuel() +//hybridcar.drive() +//print(hybridcar.fuel) + +/* 7. 상속을 이용한 기능 추가, 프로토콜을 추가하여 기능 추가의 장,단점 + 1. 상속 + - 장점: 부모 클래스의 프로퍼티, 메소드를 바로 사용가능함.(생산성, 재사용성이 높음) + - 단점: 다중 상속이 불가능하다. 결합도가 높아서 유연하지 못함 + + 2. 프로토콜 + - 장점: 다중 채택이 가능하다.(효율적, 유연함) + - 단점: 상속과 달리 공통로직도 매번 구현해야함.(혹은, Extension) + */ + + + +/* 도전 문제 2. + - [ ] SortableBox 라는 이름의 제네릭 구조체를 정의해주세요. + - 타입 파라미터는 1개이며, T 라는 이름으로 지정합니다. + - [ ] SortableBox 에 인스턴스 프로퍼티 `var items: [T]` 를 추가해주세요. + - [ ] 타입 T 가 Comparable을 준수할 때에만 sortItems() 메서드를 사용할 수 있도록 구현하세요. + - sortItems() 메서드는 items 배열을 오름차순으로 정렬합니다. + - 정렬 결과는 items 프로퍼티에 반영되어야 합니다. + - [ ] T 가 Comparable 을 따르지 않는 타입일 경우, sortItems() 호출 시 컴파일 오류가 발생해야합니다. + */ + +/* 1. 제네릭 구조체 정의, 2. 프로퍼티 추가 */ + +struct SortableBox{ + var items: [T] + /* 3.1 sortItems() 메서드 구현 */ + mutating func sortItems() where T: Comparable{ + self.items.sort() + } +} + +/* 3.2 sortItems() 메서드 구현(Extension 사용) */ +//struct SortableBox{ +// var items: [T] +//} +// +//extension SortableBox where T: Comparable{ +// mutating func sortItems(){ +// items.sort() +// } +//} + +/* 테스트용(Comparable 준수) */ +var intbox = SortableBox(items: [4,2,3,1]) +intbox.sortItems() +print(intbox.items) +/* 테스트용(Comparable 미준수) */ +var boolbox = SortableBox(items: [true, false, true, false]) +/* Comparable 타입이 아닐 경우 sortItems() 호출 시 오류 발생*/ +//boolbox.sortItems() + + + +///* 도전 문제 3. +// 필수문제 4 구현에서 연속된 문제입니다. +// +// - [ ] Introducible 프로토콜을 채택하는 타입들에게 **기본 introduce() 동작**을 제공하세요. +// - 각 타입들이 introduce() 를 구현하지 않고도 introduce() 를 호출할 수 있어야합니다. +// - [ ] Robot, Cat, Dog 타입을 정의하고 Introducible 프로토콜을 채택해주세요. +// - 이 때, Robot 타입은 **기본 introduce() 동작** 이 아닌 커스텀 동작을 하도록 구현해주세요. +// */ +// +///* 1. Introducible 프로토콜 정의 */ +//protocol Introducible{ +// var name: String {get set} +// func introduce()->String +//} +///* 2. protocol extension 정의 */ +//extension Introducible{ +// func introduce() -> String { +// return "안녕하세요. 저는 \(name)입니다." +// } +//} +///* 3. Robot 정의 */ +//class Robot: Introducible{ +// var name: String +// func introduce() -> String { +// return "I am a robot. My name is \(name)." +// } +// init(name: String){ +// self.name = name +// } +//} +///* 4. Cat 정의 */ +//class Cat: Introducible{ +// var name: String +// init(name: String) { +// self.name = name +// } +//} +///* 5. Dog 정의 */ +//class Dog: Introducible{ +// var name: String +// init(name: String) { +// self.name = name +// } +//} +// +///* 테스트용 */ +//var robot = Robot(name: "피규어") +//var cat = Cat(name: "고양이") +//var dog = Dog(name: "강아지") +//print(robot.introduce()) +//print(cat.introduce()) +//print(dog.introduce()) + + + +/* 도전 문제 4. + - [ ] 클래스 A, B 사이에 순환참조가 발생하도록 구현해주세요. + - 각 클래스에 `deinit` 을 정의하여, 메모리 해제 여부를 확인할 수 있도록 해주세요. + - [ ] 또한 클래스 B 에는 `closure: (() -> Void)?` 프로퍼티를 만들고, 클로저 내부에서 `A`의 인스턴스를 참조하게 하여 클로저 기반의 순환 참조도 발생시켜보세요. + - [ ] 순환 참조를 해결할 수 있도록 weak, unowned 키워드를 클로저 캡처 리스트를 적절히 사용하여 순환 참조를 해결해주세요. + */ + +class A{ + let name: String + init(name: String){ + self.name = name + } + var B: B? + deinit{ print("\(name) is deinitialized")} +} + +class B{ + let age: Int + init(age: Int) { + self.age = age + } + weak var A: A? + deinit{ print("\(age) is deinitialized")} + + var closure: (()->Void)? +} + +var a: A? = A(name: "A") // A RC: 1, B RC: 0 +var b: B? = B(age: 26) // A RC: 1, B RC: 1 + +a?.B = b // A RC: 1, B RC: 2 +b?.A = a // A RC: 1, B RC: 2 +b?.closure = { [weak a] in + print("\(a?.name ?? "없음")") +} // A RC: 1, B RC: 2 + +a = nil // A RC: 0, B RC: 1 -> A.deinit 출력 +b = nil // A RC: 0, B RC: 0 -> B.deinit 출력 From 8a9aa728971c86cf7a4e9a22c78c275b49dda098 Mon Sep 17 00:00:00 2001 From: ybin4548 Date: Thu, 8 Jan 2026 21:10:04 +0900 Subject: [PATCH 2/8] clean up --- chap2/chap2.xcodeproj/project.pbxproj | 294 ------------------ .../contents.xcworkspacedata | 7 - .../UserInterfaceState.xcuserstate | Bin 18550 -> 0 bytes .../xcschemes/xcschememanagement.plist | 14 - 4 files changed, 315 deletions(-) delete mode 100644 chap2/chap2.xcodeproj/project.pbxproj delete mode 100644 chap2/chap2.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 chap2/chap2.xcodeproj/project.xcworkspace/xcuserdata/son-yeongbin.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 chap2/chap2.xcodeproj/xcuserdata/son-yeongbin.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/chap2/chap2.xcodeproj/project.pbxproj b/chap2/chap2.xcodeproj/project.pbxproj deleted file mode 100644 index 37a9612..0000000 --- a/chap2/chap2.xcodeproj/project.pbxproj +++ /dev/null @@ -1,294 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 77; - objects = { - -/* Begin PBXCopyFilesBuildPhase section */ - 8AFFB8A92F0D06A500B08B3D /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = /usr/share/man/man1/; - dstSubfolderSpec = 0; - files = ( - ); - runOnlyForDeploymentPostprocessing = 1; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 8AFFB8AB2F0D06A500B08B3D /* chap2 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = chap2; sourceTree = BUILT_PRODUCTS_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXFileSystemSynchronizedRootGroup section */ - 8AFFB8AD2F0D06A500B08B3D /* chap2 */ = { - isa = PBXFileSystemSynchronizedRootGroup; - path = chap2; - sourceTree = ""; - }; -/* End PBXFileSystemSynchronizedRootGroup section */ - -/* Begin PBXFrameworksBuildPhase section */ - 8AFFB8A82F0D06A500B08B3D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 8AFFB8A22F0D06A500B08B3D = { - isa = PBXGroup; - children = ( - 8AFFB8AD2F0D06A500B08B3D /* chap2 */, - 8AFFB8AC2F0D06A500B08B3D /* Products */, - ); - sourceTree = ""; - }; - 8AFFB8AC2F0D06A500B08B3D /* Products */ = { - isa = PBXGroup; - children = ( - 8AFFB8AB2F0D06A500B08B3D /* chap2 */, - ); - name = Products; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 8AFFB8AA2F0D06A500B08B3D /* chap2 */ = { - isa = PBXNativeTarget; - buildConfigurationList = 8AFFB8B22F0D06A500B08B3D /* Build configuration list for PBXNativeTarget "chap2" */; - buildPhases = ( - 8AFFB8A72F0D06A500B08B3D /* Sources */, - 8AFFB8A82F0D06A500B08B3D /* Frameworks */, - 8AFFB8A92F0D06A500B08B3D /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - ); - fileSystemSynchronizedGroups = ( - 8AFFB8AD2F0D06A500B08B3D /* chap2 */, - ); - name = chap2; - packageProductDependencies = ( - ); - productName = chap2; - productReference = 8AFFB8AB2F0D06A500B08B3D /* chap2 */; - productType = "com.apple.product-type.tool"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 8AFFB8A32F0D06A500B08B3D /* Project object */ = { - isa = PBXProject; - attributes = { - BuildIndependentTargetsInParallel = 1; - LastSwiftUpdateCheck = 2620; - LastUpgradeCheck = 2620; - TargetAttributes = { - 8AFFB8AA2F0D06A500B08B3D = { - CreatedOnToolsVersion = 26.2; - }; - }; - }; - buildConfigurationList = 8AFFB8A62F0D06A500B08B3D /* Build configuration list for PBXProject "chap2" */; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 8AFFB8A22F0D06A500B08B3D; - minimizedProjectReferenceProxies = 1; - preferredProjectObjectVersion = 77; - productRefGroup = 8AFFB8AC2F0D06A500B08B3D /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 8AFFB8AA2F0D06A500B08B3D /* chap2 */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXSourcesBuildPhase section */ - 8AFFB8A72F0D06A500B08B3D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 8AFFB8B02F0D06A500B08B3D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - ENABLE_USER_SCRIPT_SANDBOXING = YES; - GCC_C_LANGUAGE_STANDARD = gnu17; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MACOSX_DEPLOYMENT_TARGET = 26.2; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = macosx; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 8AFFB8B12F0D06A500B08B3D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_USER_SCRIPT_SANDBOXING = YES; - GCC_C_LANGUAGE_STANDARD = gnu17; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MACOSX_DEPLOYMENT_TARGET = 26.2; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - SDKROOT = macosx; - SWIFT_COMPILATION_MODE = wholemodule; - }; - name = Release; - }; - 8AFFB8B32F0D06A500B08B3D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_APPROACHABLE_CONCURRENCY = YES; - SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; - SWIFT_VERSION = 5.0; - }; - name = Debug; - }; - 8AFFB8B42F0D06A500B08B3D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_APPROACHABLE_CONCURRENCY = YES; - SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; - SWIFT_VERSION = 5.0; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 8AFFB8A62F0D06A500B08B3D /* Build configuration list for PBXProject "chap2" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 8AFFB8B02F0D06A500B08B3D /* Debug */, - 8AFFB8B12F0D06A500B08B3D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 8AFFB8B22F0D06A500B08B3D /* Build configuration list for PBXNativeTarget "chap2" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 8AFFB8B32F0D06A500B08B3D /* Debug */, - 8AFFB8B42F0D06A500B08B3D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 8AFFB8A32F0D06A500B08B3D /* Project object */; -} diff --git a/chap2/chap2.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/chap2/chap2.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/chap2/chap2.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/chap2/chap2.xcodeproj/project.xcworkspace/xcuserdata/son-yeongbin.xcuserdatad/UserInterfaceState.xcuserstate b/chap2/chap2.xcodeproj/project.xcworkspace/xcuserdata/son-yeongbin.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 824ec7caa83b8e7a5274cd3e6298385efb7545b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18550 zcmeHucVJUh`~NxT-gKwUC~4EQr8H>^ZC10ppc~34rHf5X+fV{+Q<@a0qMoaO3sF(r zB5e@_2O_TnC(3XyP!zW~5b;%9D9-P5?`=Au`hER<-}m?Z7izFxng`$XAx@DeDzt`73Tj%aW0ua>xY*Ma@GB5r zv#CKAQ&}^`)9q<4>L+>)g`x1ent(gtp?HTJUxOl16pBOfNR6Dxg>q0X%0v060F6fz zP$4Qp#i#_8qA6$wsz$TWJTxDqbpD!+Klc%ThLZ? zC)$R#qr1@E=pM8aJ&bmvN6@2aFWQIpqgT+Y=rwc@9Y#mcd+2@i5ju{(Kqt^w=xcNm z{e(`VpV2SqcdWv3I3BBU0@mO}oP?9{XqwVupDZ8^#6!HKm2{G2Z{&9dGou(46UW3eY9@ivFo{eOlgyZzY{tS^85?6~9E_7GVM>`Yrkt6`)G)P7 z9aGQDWacvSm`0|FX<-&IZA?3}j9JdCU{*1gGV7RYnDxxH%q`5V%x%mjria|vf_o@VwkuQ0DNuQ3OiL(B)vhs;OJQRZXjIP(SbHFKKznfZnJmHCbN zoeg8d*$6h79nGe&W7t$y%j(!PHl592$Fero&gQX2Y%yETPG&3FYPN=*$M0fg#DB~&Yom{Vo$R_ONfM#NF~vd7>P_0D~Xq+NXAG~CFv5q#2~Rq z@+Ae5@sdfB3dv+irKDO?U#DyDYHdA)q$nE2AQ@63)y&Eo;}TD|e-3>2pSOBlQ>)wW z??rN?poB8LC>D*PEd7`kHOOKsO3P;YI+yr6+)bWRUsG3`r#;Xh(^-lgHmB8*ZLnJ` zR)fu2>M#`BZDocsdufr~YA&}sax6i{31}>G+=DbI5hbByG#aI#F(?&jkq)Jybd*6Q zG=zrIFd9xHXe5oIQW{NTsEo?*LE}&+%0hZ%Kt_0*Q8uz5E3zRwRnR2bOKsFn?|}Cf zx{W?a5747@3Z2>@i?8-H!9dHJy#ZfmaM*R#Q~eFHgi_B!cUNowH33ij<-Sh-;=H1! z0N_zg(;`os2PRqF)n4lH2fXd>0N|AXL;*mku1-(A*Y9ogwt55I4YIU_zRo63ahJEX z8Tu(|Z5>MJuUJ^=@icpy0nmcunCWeA_AQ5@D9hU2jjf*AMV%gZ^F()RtEUtCOAxOY zb#}VjTVNpVfl^OnS4&0vLSKVS4r40uwFf*a0^$^*n^yT5*kTylk`AA@J>VCp0e+hg z3i4EjCT~XNXd;?~DyWjGXgp1ziHFcskhN*35=}={ytFj}qq*?i>1l;!T;`#Oj-s&* zvf72-R!^?UWUBMS&`f?`yP@0TYj0`vwwqwpmw-wzwZRNLou-mS?hg1iTR=>`E$#f0 zn3|x?(*N1!_O=`S%e@N&2T={GMRlltjwsaa?l#XX@lTJxuCfMpxfd?aoK;yfUC=f| zhdWmoT3mx{_P=jvGrD*I^0jA+;~UEE9D$v>L013oW9RoY`P!S$<|VGWra@NoZ{uZL z(d29PbaeU_i;KPpd11SGsqOAXi_pyA>0g3;$kB&dQ5$Nf$#gVL=|df8De9zS=t_DO ze_9Q*_^ylqHB-C+UhdE2IE*GZjTLAmKaFmX`15Eg$h)o&osTX+7t(Y(jV_^6hi>gEVQaPj zSGM*tfmhmpR%%5JvKHNd9NW>AXdSu=U5&0m>(RC7I|R>k-M+3s*$Mzn-d+V7?b*FF zb^2Oc1ubIqEnMjL0E(X7lYa=8b@qDp-n^PG47hbG640y3;>(_|gbkwKd=tx9*IKK?VoV^GMZ)oGL1IvZrk zXWilVHhUV~oyO(f=D?zZ=n$x_*U=mEKvi{hd7B%%10Mf$nM^gQUK4e3S@G_h*x3_r zKlL~rFT&lM=&gFtCv_F2z35Fe^B{T~?tka(`(KHgyLjf-iJhz4R-PDrPW5+mytc4; z6XO4g9esd41fHc{P{qD>cPD`72ZP{w6n)BX%E#yvT0()-XXqF$qvf<{E-ywE?aiJQ z9{+;oe!Fa{r@e)r3UBRwi6(D?9gflNNfDUA{KP~24f>w%@>}#Bt)P>KbXm6$#Out? z!o@-UihcugrLtyPSAe%z21nb6ejPgAKX3#f1V$KRf*H(W2@b)bI1Go=N;;iZ(HXRw z*3ep7N9*a#?Ko0I2pl6K1Xcn<%<4yodHo3C{r?Cdn6XAbfZo3gA@CSL2%Ji1_ag*O z1BAfoID>!FIdrb@PL#=Hwtm6EMw|_TgH6~>=hFqf*n+LJfj05y7HsN2JN^FxdITA` zaGoISI2VNdoL-!d3#gkm(xQFSr`T;F`1XVbepWU;q7+iWwV9K4)HkDF<};^_F`)aT&&!kNbN;7l+6^OXzIH{tfbqsXzZ|Csu50Cyn+UJl2!wf~s<=nC2m zf1k@AQvrMMdAw|`q-{ajx{#MGiuC-Owu9#3--$AHa5$IX%X!JV6kkR==+a(%1zt-# zY1h9`vaZ3`iIR0KNEUdypW*8PMgwO_mYnqk$8-z6{Y-6zH{l+Tre$4OFzvcGAt8TpYf?&kI)N1r4(4D-2*~@fNkgBfyX$sBOS^YixD5FBxbs z6*-HoPMgzV$jPxnP@p8+Vkj!MI}K)AnXRm-IH%0zattw(@hbuo`uCWW+e=Cd zPPxNouoY#O8ghzU<%Tj_jQFd90%VsFDm1P@jPMZt){RG;_rqxoWeg2Z}=JiGQ8n;f{>#J|3R~zD^ah&vI!PcJl89nR5=kbb zNy_X2Pi%I;+XmqbcU#BYAP7J}h2BhWqBqjp|1-;}EqZ3n#kJ~jr-JLMBN@oiOVUU> zy@lS|OU9CM^ftPYPOTRguwI;8gG_PuTkUb1+=#UgD4;#2)Sb8d@36QSY(34+SetJKgJ~RAtWdn4Y&Dkzn zPDzoq%vJ0%XO}dzxto0c72;QeyR*$<6FDv?D}+2&zt<#gWgl5ix`ha&_&YeG^T_%9 zI9Aes^pFea0|Gw$EtbLpTtpU$6aV?>1$0NS@73fgq}oQ-kW0v=&XpZ=}n<~z`lEmK27)1eRMzkE}G-@ zm$iCZ_|OT&p92E;lmZepc_35}fPi>ggG@EFxxzow3lU%s4@@%gLQUzEdUvPS&F2$_ zbrFO-I6)%i(17~vftwp-qlR*r1_6>*F+O+(X9xo{bwUihUficT;j2NG+Po~#ER5OE z3Lx8RXo6UI7sQ!!g`bOjAhW_|&JpjkIExsU85_mf@p1^Oa=iN4J5rV1o{c)-2Z8{pS3{;Ui2Vup02OVc~}I03Ap z`K-J8WBqWsrmL+DLJ6XP)p%O?h`GN`NKw>fJ4@^q*%u=0KTaz9$P?sAvWLDx-=J^P zJA)##mpsF(uYF`cIY3{fuhD~jO z?xrO*o(^}X8-hCxvT=V+E%K;$w|057g`%yDW~2m%eUKbJYuIm+x5yECn7&EhqEodK zPKq}*p_DX&QVx>$;kOVuIXxO60%B%MyaCX)Ea*5XJqwy;wjsc0I4-4fL=KS!VV{oP8pLLt<|NaXN-lm z8t=It;I**4)!pLfBTycQQhGaJ3m`W*$qnZf!eT(jD+QM=?Z@4n=3_4MtOgEKcM**zbVoCY*U?$OKgiidV5TjGtMyUDIc= z+Nh8h>~lC>LT+#rRSK~vo*_Spftw-JP+3z_%eR+%+M@q*U0kN=Eh**GkiF#-sT|Ucz*Pgi2YcodWxmdeW;j~jg(12Iwe{7o*MjZ_%_7c~UvyzA zaL4R90Iz4RZtvXc5n6$I{(^ql=$&5;KhJRk;tr9vW>F4%8{zg5+MympjuIe=I}UQP zPE-Nz&L# zd`Es_q>N0IYl8ccq^bYA|BFeZM?_tIlzcpYz<2^9!re!Xl26b~SV8_*5Pv=+{{-h7 zVDocea)6v5Ujlf(L*Jzb>3j73E#xb-3wVD6arj;I1Bk+ZNI!y4D-Wlse~o**O#Qb+ zFccul`0Ji{qMATAuX_F)%383a1WIjTn7AUMne~fkWqkfd!;$55hfgMhq^l1#BRAy7 zQs6THpDw7!v7_u16RJYfL~Zj2soXT6VHm1Xs9 z{hS`BU(geGA_F5ub|wbCL!d(gm?B?-3Gz?)J_g@*e(6TRgvFF~g})q19%?|}d)gNa zw3c@Qh(Vqa8UWd*d0Rl$c$x(r;xF&?wN=(YUIR`uAKMmkIsBG3$j0*>1dAVP-Hk)? z2{v<1x!qc3HdxE}0D+~r*ic+-Eiu?jt#+ry>B=c8bBG#J92eYO?CzZD_6wB*t)7|Q zz@i#}CdmG~8zDUfoCHjWcOePe&BEnhh-d&84g4&EvI3}PfTp?tUq|8f zhzbXQ3fd~#{T%|l4w4PrDd;7UOmz4Jnrx@o#Pb~JF*qj|QvgO9lf&dPc}zY%MSr9} z(bJom@yrCKkSU@+b2x;rfW{LcLDnH&=+71o zbX4gJfNAXKv)kgI1NQ}oIEk6Y53z!o%uHdX(qHJW^f&tZW~P#v&Qvj#^bZar4rBTU zKf>5@Z!6fTf}|FA^MW&#=Z~<6)~I#1SY0BghY4C68ybyDt9*WtF<-kCoWjpP9CiN6&7o46;$T>KL{x2uJFsXrl;n6;OoA$x-pEMN*_NS$ zI65Y3foDaBTgd+kz4IOHxSzGu!M*aRo=BikM)fzE?&ui>&8n!r$jCTw8iGYBy=qNw zLV`A^S>W$5xz3nBrFQm$rnZh{E6!iL;pSU=w%@(;fjxT(BLSnu^L7rdoq{HpeEZ6C9QY30Kh{~~>Ztg)dsFtMaQ+W~Qn zK^`E!7RTVvAuM^_Df(sRYe0r`s& ze-C_KtS#&)6n+Kgc^v~)A-&87=6VjxIjn#T1#=TElqGPeTYR0}Lumvng4rlo5d-rG4x^X32Xb0WAG4XcgW1AtW$t9Q zG25BDn7cWw;&2>?<2kJ6Z~})l98TnL5{HvHJbF8GFVZvjF*}+2nO)33m zLTwzLz~Mp;7jd|X!>c%aC5P8>_-cMyN`S=vLPDWBPgGQy#U6-#K-ozfc(Yz8X%j%0 zFL3Ku`=Z7Yp*f}h2h>w|c|Qt#&H(t#yyGrbP|O)ht?dvm1$CZKISu6)Lm?9kq2OhY zTj)D4l{2uZ*e%C!x z$VSV+T!gLD2vH}1M=+o~%Xx#rU+rEl8iSybhF|TkhpcJx@z!_Bu#3X&P(L>4;lh%s zhLH%p^XM2H>nF@-5anY&<#1LHbBx1!enfJB*?~C=YD<*#6Qr`2`I7l3hYcJg+k>$g z<|G3p9DU3;%(u*U95!;;#9?zE^8=X4KXN#mPT{ZxBFNC|AmGm9e+`<9GWf}lf10}m zvU^?4o`EgU7Sgwdo$o(bW(005i|i~|O*WpJofZvli?;BRl%XB4k!&m&`fL;{Wuw^` zR>sO%1*_z+lfy0!=WsZe!+9JANH5^&z3AmfV zj~Grq_Rq+9DH%@6yDK9OyQZtrFGO92)0_T`9?BhgONo!<48P+~$3B3*!=|bbPhkUp zT5Em6Ih3Kp>^L@)%|bD(o;9#W*2J3GY}SJGpvlh6i7XhDM;<)@uLg|jYKW47N$L^X z;ZELu8YFK32Z%S(rY{WkIe3l36&x<%@Kg>@=WsE#L4DYOvKQ@EIPLto5_=uA2P3~iztcwMiEamV-4hl&U53%`d0nBbZ(zAtg2D#P=Xz*;=-4HD%H?NUxYLM|Kb(r)F?&NSq*~>QbGya$9 zMPXYA**Ug_!!rhOon6c>h2Rmpgl%Qp*ml;(c5t|w!!;bPp47g3o@{NHUO_> zyzkB7Ssb1%{GS8x2+)`WI;X3(nb$m35DKaGEagkk!6Xrq0CV|cFvZ*63?AbU`(pl} zsgZ5X0*xg87NZt|YKNt&fGl$(L^1kp8NQ{zvj&k|#`LQ>_9Au-gyGqX*;VXn4$tNA zJPyzAV=rMZF0+RZ0r8mJp8_1dVSYS z>;G?6rn8^%Clw6eK!0%{`^AWbr@>wRhUKf3*>71ebeC~>c`y3|dy2y=IDD?KIscBr zQ}!43ccDCx{f&Yd0TtMvLFH-L2$iS(qmr z7jXE(|MhxPi5$g96la$lj!quP4E&(UyQr_3O z41Aq|F=`915d(C=QB07OjMPCXbWqOWEBFr9@`4)!T?Bn{-fz(s`tKX+G)bmNruJ6| zNv2Dxpr9X~Lzc_{jZsJV55v>5Pr@^^d%>lDmu0|(%K}^9 z1a`g^o_}?+Iq(c@0XqSngDqjp*mKxMwwYbXE&_w573`P}wv#tk*cI?B>`L|q_8;)H z>*w$UYpTR0sgrmmRI*F5U-GWxQ^{A7lag;G-%CzOehQIinvkTB(ILx1E)2Om z*6{Z5j_?=5kA!~}elq;q@bAM3HcBX_d5ES}UC`ohzL$ZICXJ zo-4grx=Ol6da3jp=|*Xv^bYA(>D|(MrT0nimp&|gM*6JuHR&sY_6??VUJYJqAcgb_*CGskHliVZklrNWe%g>Wj`9<B9Z6hy%)LKHEIctwIDQIV`j zQKTw#ifn~L;Zo!(CMb#&C5kddqhhsUz2XMNO^RC-n-sl@&5A9G2NVx0_A6dgysUUt zaZqtY@s8p>#RrOy6kjNQR7NPHl%tfXO1sjjEL0XNrz>lf^~zbw`N{^RTiK-SR9>iD zt6ZnNTDe|%o$`9+jmkTeTb0|CcPZ~t?ojSj?o#eiKCRrRJP;cnn--f9J1#aW_Wan( zW7o#6i@iGbXzbUq-^6|w`@^V-qiRRhkD4`V&ZxUb?H={$sK-Y=sgkRbRijlYs#KLp zWmaXYtg1p)k*Zi#s+ysyR@JELRE?@8RkLcL%C8Ejx>Uo>lty5jCx=nSv zsz=qQIvp1hCyk4VlgBCJ65sC>iOz()Q#$9^-^^}y-eM$K2LqVdX4%r^%d$X)z_=d>X74>WCL+UrwrxJ__GZUH_COn+*NW$KPml9q{_+1mKQEO5(<1`LUjwVktUQ?(k)-2VWtGQUSTC-kr zhi0p0o8~UfJ(?Ywotj;m2Q&|9p4Ysnd0F$S=AhGCZ10GCGoeUkfgArh@_~b=pAs}hr0GQa?)lJoW3;U$x=d zNUc;Gqm^rw+ELn6txlV+9jndM>a|9#SzD()SG!sJvi42whuY)X6S`Xzs()~(k)oyMf;(<;*zr>#!A zFYWQP7t>x&do}G~+UseD)80yZJMDPdiL`&FolN^K?Nr+7v|rMGOP8f<)1B#)(-)*K zO<$FMP5RC0x2A7Q-;~~)epmWE>G!4YN`El@;q-UXzs|rJ85y>Wf{Y0nMHwX-Wf_$j zRT(uI^%=7==433*Se>ykV|T`ZjAt^Q&3HcJ(~NI3e#rPKscg=B&)Qndf9SWqLAOGOx<~N9I$R&u6}v`Eur~nFll9 z$$UTaqs&h-k7XXuJeB!l=1-YFXN6`(WJ$ARS<0+YS;<*rvUFKTvW{kbo%Mazk6Axw z{h`NtRv)4_>udG%^$Yap=)L-7`YZJ7^w;RG)8C-KS$~^;lfF;CMZZn|g#Ic0Ui|_6 zbNUzcujmiz-_XCMe@FkG{yRg8p~O&W2pHBHHW~IBJ~RAaB*sW%v{7!1HO3iJj9O#5 zajY@RXfQgAmB!h|CS!-O+qlwrq46T)YU4WN)yDP4>x|bMZ!|t=JY+m&iZLacMw?Pi zX{NEJOw)MNMAKB$bW^pd*5o!VGA%K+o0ghZn9ehuZ=$A)Ojnz3Gu>y}ZF<`Dis`WF zi0NI^2d2+V$4w_pUztvtel{~^nR$#^XU;HZnxWj)Y&AQ~Ip)dcspd*^mATqnYpyrX zGS4y3Ghc3g#C$AUm0gs*G`lbRVD_=>;}&8WWzkvkEz>PaEbW%1mVjlsk@0b^*rkZ zR?d2{^=<3N*3;JCZLzi_+gMwc&1gH{w#K&Jc9ZQ6+e5ZJwiC9Kc8y(U&#-6O_4XWl zxxKvU}_;_Qm!#dxza`@3Jqq-(c^v-)n!&{;K_`{d@Z<2jhrvNF6eV z(vjdua-=v?9XdyjV}@gqW2qzHSnlX{Y;-*0c;9i-8ST_LUCvTxqtoMDjBq8 zu18#txt?(CaqV^OcRl0!BquB*;L>T~V6&fJ{b zyxfA^3As~qXXMuA&di;c+mPFs+nmegZqD7A`(W}k^g4?+xhS2f0qAs{;vg0K}bP(K~#aVKvfW5peaZyFcr88$_mO0CKgl_)E6u+ hIKO}vTvo85;O2rYf{Ba>Jlw(mlgt#qgP#R={ulgMj7tCj diff --git a/chap2/chap2.xcodeproj/xcuserdata/son-yeongbin.xcuserdatad/xcschemes/xcschememanagement.plist b/chap2/chap2.xcodeproj/xcuserdata/son-yeongbin.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index bd604b7..0000000 --- a/chap2/chap2.xcodeproj/xcuserdata/son-yeongbin.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,14 +0,0 @@ - - - - - SchemeUserState - - chap2.xcscheme_^#shared#^_ - - orderHint - 0 - - - - From 1989a565f888e00de0b5438cb13fdb9bddf0b46b Mon Sep 17 00:00:00 2001 From: ybin4548 Date: Fri, 9 Jan 2026 12:38:57 +0900 Subject: [PATCH 3/8] =?UTF-8?q?=ED=95=84=EC=88=98=20=EB=AC=B8=EC=A0=9C=204?= =?UTF-8?q?.=20name=20=EB=B3=80=EA=B2=BD=20=EC=A1=B0=EA=B1=B4=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- chap2/chap2/main.swift | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/chap2/chap2/main.swift b/chap2/chap2/main.swift index 1d73ada..64decbe 100644 --- a/chap2/chap2/main.swift +++ b/chap2/chap2/main.swift @@ -213,9 +213,11 @@ protocol Introducible{ class Robot: Introducible{ var name: String{ didSet{ - print("name 변경 알림") - print("변경 이전 값: \(oldValue)") - print("변경 이후 값: \(name)") + if oldValue != name{ + print("name 변경 알림") + print("변경 이전 값: \(oldValue)") + print("변경 이후 값: \(name)") + } } } var batterySts: Int = 50 @@ -272,6 +274,7 @@ arr.append(robot) arr.append(cat) arr.append(dog) /* robot name 변경 */ +robot.name = "피규어" robot.name = "옵티머스" /* 배열 순회하며 고유 메서드 출력 */ for idx in arr{ @@ -287,6 +290,7 @@ for idx in arr{ + /* 필수 문제 5. 우리는 간단한 **택배 도착 예측 시스템**을 만들고 있다고 가정합니다. From a5100d75f4c9c10457cee90cf875b090ef50e018 Mon Sep 17 00:00:00 2001 From: ybin4548 Date: Fri, 9 Jan 2026 17:19:22 +0900 Subject: [PATCH 4/8] =?UTF-8?q?=EB=8F=84=EC=A0=84=EB=AC=B8=EC=A0=9C1.=20re?= =?UTF-8?q?fuel()=20=EC=88=98=EC=A0=95,=20=EB=8F=84=EC=A0=84=EB=AC=B8?= =?UTF-8?q?=EC=A0=9C3.=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EC=BB=A8=EB=B2=A4?= =?UTF-8?q?=EC=85=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- chap2/chap2/main.swift | 49 +++++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/chap2/chap2/main.swift b/chap2/chap2/main.swift index 64decbe..581d1be 100644 --- a/chap2/chap2/main.swift +++ b/chap2/chap2/main.swift @@ -391,22 +391,22 @@ class Car{ private let brand: String private let model: String private let year: String - public var engine: Engine + var engine: Engine private var isDrive: Bool = false private var battery: Int = 50 - public var fuel: Int = 95 + var fuel: Int = 95 - public func drive() { + func drive() { isDrive = true fuel -= 10 print("Car 주행 중...") } - public func stop(){ + func stop(){ isDrive = false print("Car 멈춤") } - public func isDriving(){ + func isDriving(){ if isDrive == true{ print("주행 중입니다.") }else{ @@ -414,7 +414,7 @@ class Car{ } } - public func charge(){ + func charge(){ if battery == 100{ print("배터리 충전이 완료된 상태입니다.") }else{ @@ -423,20 +423,22 @@ class Car{ } } - private func isFull(){ - if fuel >= 100{ - print("연료가 가득찼습니다.") - } + private func isFull() -> Bool{ + return fuel >= 100 } - public func refuel(){ - if fuel >= 100{ - isFull() - }else if (fuel + 20) >= 100{ + func refuel(){ + if isFull(){ + print("이미 연료가 가득 찼습니다.") + return + } + fuel += 20 + if fuel > 100 { fuel = 100 - isFull() - }else { - fuel += 20 - print("현재 연료의 양은 \(fuel)입니다.") + } + if isFull(){ + print("연료가 가득찼습니다.") + }else{ + print("연료가 충전되었습니다. 현재 연료량은 \(fuel)입니다.") } } @@ -488,9 +490,12 @@ print(hybridcar.engine.engineName) //hybridcar.isDriving() //hybridcar.charge() //hybridcar.refuel() +//hybridcar.refuel() +//hybridcar.refuel() //hybridcar.drive() //print(hybridcar.fuel) + /* 7. 상속을 이용한 기능 추가, 프로토콜을 추가하여 기능 추가의 장,단점 1. 상속 - 장점: 부모 클래스의 프로퍼티, 메소드를 바로 사용가능함.(생산성, 재사용성이 높음) @@ -612,7 +617,7 @@ class A{ init(name: String){ self.name = name } - var B: B? + var b: B? deinit{ print("\(name) is deinitialized")} } @@ -621,7 +626,7 @@ class B{ init(age: Int) { self.age = age } - weak var A: A? + weak var a: A? deinit{ print("\(age) is deinitialized")} var closure: (()->Void)? @@ -630,8 +635,8 @@ class B{ var a: A? = A(name: "A") // A RC: 1, B RC: 0 var b: B? = B(age: 26) // A RC: 1, B RC: 1 -a?.B = b // A RC: 1, B RC: 2 -b?.A = a // A RC: 1, B RC: 2 +a?.b = b // A RC: 1, B RC: 2 +b?.a = a // A RC: 1, B RC: 2 b?.closure = { [weak a] in print("\(a?.name ?? "없음")") } // A RC: 1, B RC: 2 From 2fa897754bf16f3ccce74e328aed6ee52e31d7d7 Mon Sep 17 00:00:00 2001 From: ybin4548 Date: Mon, 12 Jan 2026 11:02:42 +0900 Subject: [PATCH 5/8] Add README.md --- README.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..c9a2f41 --- /dev/null +++ b/README.md @@ -0,0 +1,22 @@ +# 프로그래밍 기초 주차 과제 + +> 과제 수행 방식 및 코드 구조에 대한 안내입니다. + +--- + +## 과제 작성 가이드라인 + +본 프로젝트는 가독성과 실행 확인의 편의성을 위해 다음과 같은 원칙으로 작성되었습니다. + +### 1. 코드 구조: `main` 파일 통합 관리 +- **이유**: 문제별로 파일을 분리할 경우 전체적인 실행 여부 체크와 요구사항 수렴 판단이 어려울 수 있다고 판단하였습니다. +- **가독성 보완**: 줄의 길이가 길어져 가독성이 떨어질 수 있는 점을 고려하여, **문제별 요구사항에 대한 상세 주석**을 첨부하였습니다. + +### 2. 풀이 순서 +1. **필수 문제** +2. **도전 문제** + +### 3. 요구사항 체크 리스트 +- 각 문제의 요구사항은 지문의 `[ ]` 항목을 기준으로 삼아 꼼꼼히 구현하였습니다. + +--- From 26193a7839fd3a300e2c3a4a081e73bdf7de80c9 Mon Sep 17 00:00:00 2001 From: ybin4548 Date: Mon, 12 Jan 2026 19:50:18 +0900 Subject: [PATCH 6/8] =?UTF-8?q?=ED=95=84=EC=88=98=20=EB=AC=B8=EC=A0=9C=202?= =?UTF-8?q?=20=EC=88=98=EC=A0=95=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- chap2/chap2/main.swift | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/chap2/chap2/main.swift b/chap2/chap2/main.swift index 581d1be..6f19f28 100644 --- a/chap2/chap2/main.swift +++ b/chap2/chap2/main.swift @@ -36,7 +36,6 @@ func calculate(calClosure: (Int, Int) -> String){ let result = calClosure(20,20) print(result) } - calculate(calClosure : sum) //방법 2. 계산 인자와 클로저를 파라미터로 받음(함수 호출 시에 인자를 지정하여 사용 가능) func calculate(val1 : Int, val2 :Int ,calClosure: (Int,Int)->String){ @@ -87,22 +86,29 @@ calculate(val1: 20, val2: 30, calClosure: sum) /* 1. for-in -> map 변경*/ let numbers = [1,2,3,4,5] var result = [String]() -result = numbers.map{String($0)} +//result = numbers.map{String($0)} +result = numbers.map(String.init)//재제출. map{}사용 -> map(String.init) 사용 가능 print(result) /* 2. 고차함수 체이닝 */ let num:[Int] = [1,2,3,4,5,6,7,8,9,10] -var res:[String] = num.filter{$0 % 2 == 0}.map{String($0)} +//var res:[String] = num.filter{$0 % 2 == 0}.map{String($0)} +var res = num + .filter{ $0.isMultiple(of: 2)} + .map(String.init) //재제출. isMultiple(of:)사용 ,map{} -> map(String.init) 사용 print(res) /* 3. 고차함수 생성 (map, filter, reduce 사용X */ +//func myMap(_ arr:[Int], toStr: (Int) -> String) -> [String]{ +// var myres: [String] = [] +// for idx in arr{ +// myres.append(toStr(idx)) +// } +// return myres +//} func myMap(_ arr:[Int], toStr: (Int) -> String) -> [String]{ - var myres: [String] = [] - for idx in arr{ - myres.append(toStr(idx)) - } - return myres -} + arr.map(toStr) +} //재제출. 고자함수 생성 시 클로저 간소화(return 생략 !) let arr2 = myMap([1,2,3,4,5]){ //result는 위에서 사용 중이라 arr2로 대체했습니다. String($0) } @@ -495,7 +501,6 @@ print(hybridcar.engine.engineName) //hybridcar.drive() //print(hybridcar.fuel) - /* 7. 상속을 이용한 기능 추가, 프로토콜을 추가하여 기능 추가의 장,단점 1. 상속 - 장점: 부모 클래스의 프로퍼티, 메소드를 바로 사용가능함.(생산성, 재사용성이 높음) From f9fa9a8d3acec3ff398ade2e49c210bfcac73bd4 Mon Sep 17 00:00:00 2001 From: ybin4548 Date: Mon, 12 Jan 2026 20:10:09 +0900 Subject: [PATCH 7/8] =?UTF-8?q?=ED=95=84=EC=88=98=20=EB=AC=B8=EC=A0=9C=203?= =?UTF-8?q?.=20=EC=88=98=EC=A0=95(=EA=B3=A0=EC=B0=A8=ED=95=A8=EC=88=98?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- chap2/chap2/main.swift | 92 +++++++++++++++++++++++++++++------------- 1 file changed, 64 insertions(+), 28 deletions(-) diff --git a/chap2/chap2/main.swift b/chap2/chap2/main.swift index 6f19f28..df617c6 100644 --- a/chap2/chap2/main.swift +++ b/chap2/chap2/main.swift @@ -132,54 +132,90 @@ print(arr2) */ /* 1. `a` 함수 작성 */ -func a(arr: [Int])->[Int]{ - var iArr: [Int] = [] - for idx in 0..[Int]{ +// var iArr: [Int] = [] +// for idx in 0.. [Int]{ //재제출. 함수 a 고차함수를 이용하도록 변경 + arr.enumerated() + .filter{(idx,_) in + !idx.isMultiple(of: 2) + } + .map{ (_,value) in + value } - } - return iArr } let iArray = [1,2,3,4,5] print(a(arr: iArray)) /* 2. `b` 함수 작성 */ -func b(arr: [String])->[String]{ - var sArr: [String] = [] - for idx in 0..[String]{ +// var sArr: [String] = [] +// for idx in 0.. [String]{ //재제출. 함수 b 고차함수를 이용하도록 변경 + arr.enumerated() + .filter{(idx,_) in + !idx.isMultiple(of: 2) + } + .map{ (_,value) in + value } - } - return sArr } let sArray: [String] = ["가","나","다","라","마"] print(b(arr: sArray)) /* 3. `c` 함수 작성 */ -func c(arr: [T])->[T]{ - var cArr: [T] = [] - for idx in 0..(arr: [T])->[T]{ +// var cArr: [T] = [] +// for idx in 0..(arr: [T]) -> [T]{ //재제출. 함수 c 고차함수를 이용하도록 변경 + arr.enumerated() + .filter{(idx,_) in + !idx.isMultiple(of: 2) + } + .map{ (_,value) in + value } - } - return cArr } print(c(arr: iArray)) print(c(arr: sArray)) /* 4. `d` 함수 작성 */ -func d(arr: [T])->[T]{ - var dArr: [T] = [] - for idx in 0..(arr: [T])->[T]{ +// var dArr: [T] = [] +// for idx in 0..(arr: [T]) -> [T]{ //재제출. 함수 d 고차함수를 이용하도록 변경 + arr.enumerated() + .filter{(idx,_) in + !idx.isMultiple(of: 2) + } + .map{ (_,value) in + value } - } - return dArr } print(d(arr: iArray)) print(d(arr: [1.0,2.0,3.0,4.0,5.0])) From 0044fe9c1dbfd59307198c28aa544a88387a427b Mon Sep 17 00:00:00 2001 From: ybin4548 Date: Mon, 12 Jan 2026 20:12:03 +0900 Subject: [PATCH 8/8] =?UTF-8?q?=ED=95=84=EC=88=98=20=EB=AC=B8=EC=A0=9C=204?= =?UTF-8?q?.=20=EC=88=98=EC=A0=95(=EB=B0=B0=EC=97=B4=20=EC=88=9C=ED=9A=8C?= =?UTF-8?q?=20for=EB=AC=B8=EC=97=90=EC=84=9C=20forEach=20=EA=B3=A0?= =?UTF-8?q?=EC=B0=A8=ED=95=A8=EC=88=98=EB=A1=9C=20=EB=B3=80=EA=B2=BD)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- chap2/chap2/main.swift | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/chap2/chap2/main.swift b/chap2/chap2/main.swift index df617c6..113392f 100644 --- a/chap2/chap2/main.swift +++ b/chap2/chap2/main.swift @@ -319,20 +319,33 @@ arr.append(dog) robot.name = "피규어" robot.name = "옵티머스" /* 배열 순회하며 고유 메서드 출력 */ -for idx in arr{ - print(idx.introduce()) - if let r = idx as? Robot{ +//for idx in arr{ +// print(idx.introduce()) +// if let r = idx as? Robot{ +// r.batteryCharge() +// } else if let c = idx as? Cat{ +// c.meow() +// } else if let d = idx as? Dog{ +// d.bark() +// } +//} +arr.forEach{ //재제출. 기존: arr배열을 for문을 돌며 고유 메서드 출력 -> forEach 고차 함수를 사용하여 고유 메서드 출력 + if let r = $0 as? Robot{ r.batteryCharge() - } else if let c = idx as? Cat{ + return + } + if let c = $0 as? Cat{ c.meow() - } else if let d = idx as? Dog{ + return + } + if let d = $0 as? Dog{ d.bark() + return } } - /* 필수 문제 5. 우리는 간단한 **택배 도착 예측 시스템**을 만들고 있다고 가정합니다.