Swift

    Swift - 꼬리 재귀 함수

    꼬리 재귀 함수는 앞에서 다뤘던 재귀 함수의 단점을 보완하였는데, 일반적인 재귀 함수는 스택이 쌓이고, 호출되지 않을 경우 쌓인 스택을 하나씩 제거합니다. 하지만 꼬리 재귀 함수는 함수를 호출하면서 스택을 재사용하기 때문에 일반적인 재귀 함수에서 발생하는 스택 오버플로우를 예방할 수 있습니다. (값이 매우 커 재귀 함수 호출을 많이 해야 하는 경우 오버플로우 발생 가능성 높음) // 일반적인 재귀 함수 func factorial(num: Int) -> Int { if num == 1 { return 1 } return factorial(num: num - 1) * num } // 꼬리 재귀 함수 func factorial(num: Int, result: Int) -> Int { if num == 1 { ..

    재귀함수

    재귀함수(Recursive Call) 재귀함수란 함수에서 해당 함수를 반복적으로 호출하는 함수를 말하며 대표적인 예시로는 팩토리얼 함수가 있으며 아래 진행방식과 코드로 작성된다. 팩토리얼 함수 진행방식 1! = 1 2! = 1! x 2 3! = 2! x 3 코드 func factorial(num: Int) -> Int { if num < 2 { return num } return factorial(num: num - 1) * num } print(factorial(num:3)) // 6 위 팩토리얼 코드가 동작하는 과정을 살펴보면 3을 num 파라미터로 전달하여 factorial 함수를 호출했으므로 1. factorial(num:2) * 3 2. factorial(num:1) * 2 3. factoria..

    CoreData (1)

    CoreData Apple의 데이터 관리 프레임 워크로 iOS, macOS, watchOS, tvOS 앱에서 데이터를 관리하는데 사용된다. CoreData는 객체 그래프 관리 및 지속성 프레임워크로써 데이터의 CRUD를 처리하며 데이터를 메모리와 디스크 간에 효율적으로 관리한다. CoreData는 Database가 아닌 프레임워크!! (CoreData ≠ Database) CoreData 생성(이미 생성된 프로젝트에 추가) 1. 커맨드 + n 후 Data Model 추가 (이름은 자유롭게 설정) 2. 아래의 Add Entity로 새로운 Entity 생성 (추후 Entity 이름으로 접근하기 때문에 기억하고 있어야 함) 3. Attribute 추가 (Entity가 데이터의 집합, Attribute는 그 집..

    Swift문법 - 이니셜라이저 델리게이션

    이니셜라이저 델리게이션 이니셜라이저 안에 다른 이니셜라이저를 호출하는 것 초기화 코드에서 중복을 최대한 제거하고 모든 속성을 효율적으로 초기화 하기 위해서 사용한다. 값형식과 참조형식에서 서로 다른 규칙으로 구현된다. 값형식은 상속 불가 이니셜라이저 하나기때문에 상대적으로 단순함 값 형식 커스텀 이니셜라이저 안에서 self.init으로 다른이니셜라이저 호출가능 ```swift struct Test { var first: String var second: String init(value1: String, value2: String) { first = value1 second = value2 } init(value: String) { self.init(value1: value, value2: value) }..

    Swift문법 - required initializers

    모든 자식 클래스에서 반드시 구현하도록 강제하는 이니셜라이저 필수 초기화가 필요할때 사용한다. init 키워드 앞에 required 리콰이어드 키워드를 사용 재정의 해야한다. 슈퍼클래스와 동일한 이니셜라이저를 서브클래스에서 구현하는것은 오버라이딩 오버라이딩 키워드 추가 반드시 재정의 해야함 오버라이드 기능을 기본적으로 포함하고있음 모든속성이 기본값을 가지고 있고 이니셜라이저를 직접 구현하지 않았기떄문에 상속 : 모든 subclass에게 특정 initializer의 구현을 강제화할 목적으로 사용하는 것이 required initializer이다. super class의 required initializer는 무조건 구현해야 한다. class SomeClass { required init() { } } su..

    Swift문법 - Class Initializer

    Class Initializer 클래스에서는 2가지 이니셜라이저가 제공된다 Designated 이니셜라이저 - 지정 생성자 convenience 이니셜라이저 - 간편 생성자 Designated Initializer (지정 생성자) 클래스의 모든 저장 프로퍼티를 초기화할수 있는 생성자 키워드는 따로 없고 기존 init과 동일하게 사용 init 사용시에 클래스 프로퍼티가 모두 초기화 되야한다. class Test { var first: String var second: String init(first: String, second: String) { self.first = first self.second = second } } Convenience Initializer (간편 생성자) 가능한 중복을 없애기 위..

    Swift문법 - Memberwise Initialer

    Memberwise Initialer 구조체에서만 사용하고 자동으로 제공하는 생성자 구조체에서 저장 프로퍼티의 타입만 지정해주고 인스턴스를 생성할때 자동완성으로 파라미터를 받도록 해주는 이니셜라이저 저장 속성이 var로 선언되어있을때 제공 (기본값이 선언되어있어도 사용 가능) 저장 속성이 let으로 선언되어있으면 기본값이 없을때만 제공 구조체 내부에서 init을 구현하면 멤버와이즈 이니셜라이저는 더이상 제공되지 않음 익스텐션에서 init을 구현하면, 멤버와이즈 이니셜라이저와 파라미터를 받는 이니셜라이저 둘다 사용 가능. // let 사용시 초기값 없을때 struct Test { let first: String let second: String } let test = Test(first: "a", seco..

    Swift문법 - Inheritance

    Inheritance (상속) 한 클래스가 가지고 있는 프로퍼티와 메소드를 다른 클래스에게 그대로 사용할수있게 해주는것 클래스에서만 사용 가능하고, 구조체에서는 사용할 수 없다. 단일 상속만 가능하다. 상속 받은 클래스 : 자식 클래스 (Subclass, Child class) 물려준 클래스 : 부모 클래스 (Superclass, Parents class) 다른 클래스로부터 상속받지 않은 클래스 : 기반클래스(Base class) 클래스 계층 제일 위에 있는 클래스 - 루트 클래스, 베이스 클래스 바로 아래 있는 클래스들은 베이스클래스를 상속한다. 상속관계에서 위에 있는 클래스를 슈퍼클래스, 페어런트 클래스 아래쪽에 있는 클래스는 서브클래스, 차일드 클래스라고 부른다. 슈퍼클래스는 여러개의 서브클래스들에..