본문 바로가기

분류 전체보기

(54)
Swift - Any와 AnyObject 📕 Any와 AnyObject 뭐가 다른걸까 Swift언어는 타입을 특정하지 않는 그런 타입을 제공합니다. 그렇다면 제네릭쓰면 되잖아요. 다릅니다 달라요 📚 Any Any 타입은 기본 타입(Int, String, Double, Bool 등등), class, struct, enum, function 까지 모두 포함하여 어떤 타입의 인스턴스도 표현할 수 있는 타입을 말합니다. 옵셔널타입도 포함됩니다. 즉, 내가 변수에 어떠한 타입이 들어올 지 모르거나 혹은 계속해서 서로 다른 타입의 데이터가 들어온다거나 혹은 배열에 여러 타입을 담아줘야 하는 경우에 사용을 할 수 있는 것이라고 생각이 됩니다. var dontKnowDataType: Any = "Timmy" // String dontKnowDataType =..
Swift - Singly Linked Lists(단방향 연결리스트) 📗 연결리스트란? 구현은 다 해놓고선 바빠서 글을 올리지 못했던 자료구조에 대해 글을 올려본다. 📚 배열 먼저, 배열은 아주 사용하기 편리한 자료구조이다. (swift에서 사용되는 배열은 동적배열로 여기서 말하는 배열은 정적배열이다.) 배열의 장점은 메모리 공간 안에 데이터가 나란히 저장되어 있다. 따라서 내가 배열을 사용할 때 index를 통해 데이터 접근이 가능하며 index를 알고 있다면 데이터에 대한 접근이 매우 빠르다. 배열은 컴파일되기 전에 사용할 메모리의 크기를 정해줘야하며 배열 중간에 원소를 삽입의 경우 메모리 크기를 늘린 배열을 선언 후 이 배열에 값을 다시 복사해주는 연산이 필요하다. 배열 중간에 원소를 삭제하는 경우 삭제한 공간만큼 앞으로 땡겨주는 연산이 필요하다. 즉, 원소들을 재배..
Swift Optional(2) 전에 한 번 Optional에 다뤘지만 좀 더 자세히 다뤄보려한다. 먼저 Optional 이란 대체 뭘까? Optional은 대체 왜 생긴걸까? 내가 구현한 코드에서 변수를 선언하고 초기화를 해주지 않았다. 그 후, 해당 변수의 접근했더니 코드가 실행 중지됐다. 그 이유는, 변수를 선언하여 메모리에는 사용할 것이라고 예약은 했지만 실제로는 값이 존재하지않아 잘못된 접근으로 중지돼버린 것이다. 이를 방지하기 위해 변수 선언으로 할당된 메모리의 위치에 임시적인 타입의 값인 nil을 담아 값이 존재하지 않아도 실제로 값이 없는 Null을 만나는게 아닌 값이 없음을 나타내는 nil을 만나게 되어 실제로 앱이 꺼지게되는 에러를 방지하기 위해 만든 임시타입이 바로 Optional 이다. Optional의 정식 표기..
Swift 문자열 출력 방식에 대한 테스트 여러 연산이 이루어진 후 문자열을 출력해줘야하는 문제가 있다고 가정을 해보겠다. 부득이하게 문자열을 문자열의 배열 형태로 연산이 진행되다가 마지막에 문자열의 형태로 출력을 해줘야 하는 상황에서 나의 생각은 '출력할 때 print(_ :termination: "")의 형태로 출력을 해준다면 문자열을 출력한 것처럼 보여질 것이다' 였다. 문제의 정답은 맞았지만 문득 나는 궁금해졌다. 그렇다면 시간 상으로는 '문자열 처럼 보여지게 출력하는 것과 문자열로 타입을 변환해주는 것 이 둘중에 어떤 것이 더 빠를까?' 라는 것이 궁금했던 것이고 나는 해당 생각을 토대로 시간을 계산해봤다. let arr = Array(repeating: "a", count: 10000) let clock = ContinuousClock..
Swift @discardableResult Swift에는 @discardableResult 이라는 attribute(속성)가 있다 직역하면 버릴 수 있는 결과 라는 의미로 해당 attribute(속성)을 함수에 선언해주면 함수의 return 값을 받지 않아도된다. 즉, 컴파일러에게 return값을 사용하지 않을 수 있다는 속성에 대한 정보를 알려주는 것이다. return 값을 받아야하는 상황 받지 않아도되는 상황 모두 있는 경우에 선언해주면 되겠다. 이러한 함수가 있다고 하자 func myFullName(lastName: String, firstName: String) -> (lastName: String, firstName: String) { print("성은 \(lastName)이고 이름은 \(firstName)입니다.") return (la..
Swift 배열(Array)의 Capacity 및 reserveCapacity Swift에서 사용되는 배열은 .insert(_:at:) 혹은 .append(_:) 작업을 대비하기 위해 특정 양의 메모리를 미리 할당한다 배열에 원소를 추가할 때 해당 배열이 사용하고 있는 메모리의 총량(capacity)이 넘어가면 배열은 더 큰 메모리 영역을 할당하고 배열이 복사되며 원소가 추가된다. 배열의 capacity를 확인해보면 capacity를 초과해서 append되는 경우 기존 capacity의 2배 만큼의 메모리를 재할당하는 것을 볼 수 있다 그 이유는, c++의 vector, JAVA의 ArrayList 등 여러 프로그래밍 언어에서 사용되는 데이터구조인 동적배열에서는 amortized constant-time performance 라는 전략을 사용한다. 정확히는 알고리즘의 시간복잡도를 ..
Swift Function-Deep 함수의 표기법 함수의 표기법은 말그대로 함수를 표기하는 방법. 1) 파라미터가 없는 경우 () 소괄호 없이 표기 // 파라미터가 없는 함수 func printSomething() { print("어쩌구저쩌구") } // 표기할 때는 () 소괄호 없이 표기 printSomething // 함수를 변수에 담는 경우도 동일하게 표기 var something = printSomething // 변수에 담은 함수를 호출 시에는 변수명 뒤에 () 소괄호 표기 something() 2) 파라미터가 있는 경우 아규먼트 레이블까지 표기 // 파라미터가 있는 함수 func printMyName(name: String) { print("제 이름은 \(name)입니다.") } // 파라미터가 있는 경우 아규먼트 레이블까지 표기 printM..
Swift defer 이번에는 Swift에서 사용되는 문법인 defer에 대해 알아보려 합니다. defer란? "defer"는 보통 함수 안에서 작성되는 클로저로 무조건 함수가 끝나는 시점에 실행되는 구문 일반적으로 마무리 작업에 사용되어 함수가 종료되기 전에 작업이 안정적으로 수행되도록 합니다. defer 사용법에 대해 알아보겠습니다. func testDefer() { defer { print("defer :: first") } print("testDefer") } 결과를 보니 defer는 print문이 먼저 실행된 후 실행이 된 것을 확인할 수 있습니다. defer 클로저는 함수 안에서 여러번 호출이 가능합니다. func testDefer2() { defer { print("defer :: first") } defer {..