연산자 사용자 정의 연산자 토큰으로 사용되는 =, ->, //, /*, */ 등과 전위 연산자 , !, ? 등은 Swift에서 예약한 상태이므로 재정의할 수 없으며 사용자 정의 연산자로 사용될 수 앖다. 전위 연산자 정의와 구현 prefix operator ** prefix func **(value: Int) -> Int { return value * value } 후위 연산자 정의와 구현 postfix operator ** postfix func **(value: Int) -> Int { return value * value } 중위 연산자 정의와 구현 중위 연산자는 우선순위 그룹precedenceGroup을 명시해줄 수 있음 precedenceGroup 우선순위_그룹_이름 { higherThan: 더..
[시작] - 참조 타입의 경우 하나의 인스턴스가 참조를 통해 여러 곳에서 접근되므로 메모리 해제 시점이 매우 중요하다.- 인스턴스가 적절한 시점에 메모리에서 해제되지 않으면 메모리 자원을 낭비하게 되며, 이는 성능 저하로 이어진다.- Swift는 프로그램 메모리 사용을 관리하기 위해 ARC(Automatic Reference Counting)라는 것을 사용한다. [ARC란] - Automatic Reference Counting - 자동으로 메로리를 관리해줌- 더이상 필요하지 않은 클래스의 인스턴스를 메모리에서 해제하는 식으로 작동한다. - 가바지 컬렉션 기법과의 차이 : ARC는 컴파일 시 참조를 계산하므로, 인스턴스가 언제 메모리에서 해제될지 예측하기 쉽고 메모리 관리를 위한 추가 자원을 할당할 필요..
[시작] - 특정 패턴과 결합하여 조건을 추가하는 역할 [where 절의 활용] - 패턴과 결합하여 조건을 추가하거나, - 타입에 대한 제약을 추가할 때 사용 let tuples: [(Int, Int)] = [(1, 2), (1, -1), (1, 0), (0, 2)]for tuple in tuples { switch tuple { case let (x, y) where x == y: print("x = y") case let (x, y) where x == -y: print("x = -y") case (let x, let y) where x > y: print("x > y") case (1, _): print("x = 1") case (_, 2): print("y = 2") default: print("..
[시작] - 패턴에 익숙해지면 코드의 양을 줄이면서 문법을 더 잘 활용할 수 있게 된다. - 패턴 : 단독 또는 복합 값의 구조를 나타내는 것 - 패턴 매칭 : 코드에서 어떤 패턴의 형태를 찾아내는 행위- 대부분의 패턴은 switch, if, guard, for 등의 키워드와 함께, 두 개 이상의 키워드가 합을 이루어 동작한다. - 크게 두 종류로 나눌 수 있다. : 값을 해체(추출)하거나 무시하는 패턴 | 와일드카드 / 식별자 / 값 바인딩 / 튜플 패턴 : 패턴 매칭을 위한 패턴 | 열거형 케이스/ 옵셔널 / 표현 / 타입캐스팅 패턴 [와일드카드 패턴] - 와일드카드 식별자(_, underscore)를 사용하여 '이 자리에 무엇이 오든지간에 상관하지 마라'는 뜻을 알림 : 와일드카드 식별자가 위치한 ..
[시작] - 특정 데이터 타입을 하나의 클래스나 구조체 안에 구현할 수 있다. -> 중첩 타입 : 클래스나 구조체 내부에 열거형을 선언하여 자신의 내부에서만 사용할 수 있게. : 외부와의 혼선을 피하기 위해.- 타입 내부에 새로운 타입을 정의하고 싶다면, 자신의 정의 내부에 새로운 타입을 정의하고 구현하면 된다. [중첩 데이터 타입] class Person { enum Job { case none case planner case designer case developer } var job: Job = .none } class Developer: Person { enum Platform { case android case ios case web } var platform: Platform init(_ pl..
[시작] - 스위프트의 표준 라이브러리에서 타입과 관련된 부분은 대부분 클래스가 아닌 구조체로 구현됨 - 프로토콜, 익스텐션, 제네릭 등을 활용하여 상속을 받지 못하는 구조체로 다양한 공통 기능을 구현함 [프로토콜 초기 구현] - 프로토콜 지향 프로그래밍의 핵심 개념- 프로토콜을 익스텐션에서 구현함 : 저장 프로퍼티는 익스텐션에서 구현할 수 없으므로 각각의 타입에서 직접 구현해야 함- 프로토콜 초기 구현 : 프로토콜의 요구사항을 익스텐션을 통해 구현하는 것.- 익스텐션에서 구현한 기능을 사용하고 싶지 않다면 각각의 타입에서 재정의하면 된다. protocol SelfPrintable { func printSelf()}extension SelfPrintable where Self: Container { fu..
[시작] - 타입에 유용하게 대응하기 위한 기능 - 재사용하기 쉽고 코드의 중복을 줄일 수 있음- 깔끔하고 추상적인 표현이 가능함 제네릭을 사용하고자 하는 타입 이름 제네릭을 사용하고자 하는 함수 이름(함수 매개변수...) - 제네릭을 사용하지 않고 Any 타입으로 함수를 만들었을 때 발생할 수 있는 문제 : Swift는 강타입 언어이므로 Any 타입으로 함수를 만들었으면 Any 타입만 함수에 들어갈 수 있다. 매개변수를 Any타입으로 바꾸어주어야 하는 과정이 불필요하게 추가되는 것이다. [제네릭 함수] func swapValues(_ first: inout T, _ second: inout T) { let temp: T = first first = second second = temp} var a: I..
[시작] - 구조체, 클래스, 열거형, 프로토콜 타입에 새로운 기능을 추가할 수 있음 - 타입만 안다면 해당 타입의 기능을 확장할 수 있음- 익스텐션이 타입에 추가할 수 있는 기능들 : 연산 타입 프로퍼티 / 연산 인스턴스 프로퍼티 : 타입 메서드 / 인스턴스 메서드 : 이니셜라이저 : 서브스크립트 : 중첩 타입 : 특정 프로토콜을 준수할 수 있도록 기능 추가- 기존에 존재하는 기능을 재정의할 수는 없음- 외부에서 가져온 타입에 내가 원하는 기능을 추가하고자 할 때 사용 [상속과 익스텐션 비교] 상속 익스텐션 확장 수직 확장 (특정 타입을 물려받아 하나의 새로운 타입을 정의하고 추가 기능을 구현) 수평 확장 (기존의 타입에 기능을 추가) 사용 클래스 모든 타입 재졍의 가능 불가능 [문법] - 일반 123..
[프로토콜이란] - 프로토콜 Protocol : 특정 역할을 하기 위한 메서드, 프로퍼티, 기타 요구사항 등의 청사진 - 구조체, 클래스, 열거형은 프로토콜을 채택하여 특정 기능을 실행하기 위한 프로토콜의 요구사항을 실제로 구현할 수 있음 : 해당 프로토콜을 준수Conform함- 프로토콜은 정의를 하고 제시를 할 뿐 스스로 기능을 구현하지 않음- Java의 인터페이스와 비슷한 개념? [프로토콜 정의] - protocol 키워드를 사용 123protocol 프로토콜 이름{ 프로토콜 정의}cs - 프로토콜을 채택하려면 타입 이름 뒤에 콜론을 붙여준 후 채택할 프로토콜 이름을 쉼표로 구분하여 명시해줌 - 클래스가 다른 클래스를 상속받는다면 상속받을 클래스 이름 다음부터 채택할 프로토콜을 나열해줌 [프로토콜 요..
[시작] - Swift는 데이터 타입 안전을 위하여 서로 다른 타입끼리의 값 교환을 엄격하게 제한함 - 암시적 데이터 타입 변환을 지원하지 않음 : C언어에서의 (int)10.4f와 Swift에서의 Int(10.4)는 서로 같지 않음 [기존 언어의 타입 변환과 스위프트의 타입 변환] - Swift에서는 기존 값을 전달인자로 받은 생성자를 통해 새로운 타입의 인스턴스를 생성함 - 이를 타입 변환 또는 타입캐스팅이라고 칭하지 않음- 생성자를 통해 새로운 인스턴스를 생성하는 과정일 뿐임 [스위프트 타입캐스팅] - Swift의 타입캐스팅은 인스턴스의 타입을 확인하거나 자신을 다른 타입의 인스턴스인 것처럼 가장할 수 있는 방법으로 사용 가능함 - is와 as 연산자로 구현 - 자식 클래스는 부모 클래스인 것처럼 ..