Swift
Extension - 2
1. Adding Initializer // 년,월,일을 파라미터로 받아서 날짜를 생성하는 생성자를 익스텐션으로 추가해보겠습니다. extension Date { init?(year: Int, month: Int, day: Int) { let cal = Calendar.current var comp = DateComponents() comp.year = year comp.month = month comp.day = day guard let date = cal.date(from: comp) else { return nil } self = date } } Date(year: 2020, month: 12, day: 14) // UI컬러 클래스에 새로운 생성자를 추가해보곘습니다. // extension으로 클래스..
Extension - 1
안녕하세요:) 이번에는 익스텐션으로 형식을 확장하는 방법에 대해서 알아보도록 하겠습니다. 1. Extension 형식을 확장하는데 사용합니다. 속성, 메소드, 생성자 같은 멤버들을 형식에 추가하는 것입니다. 익스텐션으로 확장할 수 있는 대상은 클래스, 구조체, 열거형, 프로토콜입니다. 기존 멤버를 오버라이딩 하는 것은 불가능합니다. 오버라이딩이 필요하다면 상속을 통해 서브클래싱 해야합니다. extension Type { computedProperty computedTypeProperty instanceMethod typeMethod initialzier subscript NestedType } extension Type: Protocol, ... { requirements } struct Size { v..
Required Initializer & Failable Initializer
꾸벅:) 모든 서브클래스에서 구현해야 하는 필수 생성자와 초기화 실패를 옵셔널로 처리하는 방법에 대해서 알아보도록 하겠습니다. 1. Required Initializer(필수 생성자) required init(param) { // 문법 } class Figure { var name: String required init(name: String) { // required를 사용하면 서브클래스에서 반드시 동일한 생성자를 직접 구현해야 합니다. self.name = name } func draw() { print("draw \(name)") } } class Rectangle: Figure { var width = 0.0 var height = 0.0 init() { width = 0.0 height = 0...
Class Initializer
안녕하세요:) 오늘은 클래스에서 구현하는 특별한 생성자에 대해서 알아보도록 하겠습니다 +..+ 1. Class Initializer Designated Initializer(지정 생성자)와 Convenience Initializer(간편 생성자)로 구분됩니다. Designated Initializer는 메인 생성자입니다. 메인 생성자는 클래스가 가진 모든 속성을 초기화해야 합니다. Designated Initializer의 수에는 제한이 없습니다. Convenience Initializer는 다양한 초기화 방법을 구현하기 위한 유틸리티 성격의 생성자입니다. Convenience Initializer는 반드시 모든 속성을 초기화해야 하는 것은 아닙니다. 보통은 필요한 속성만 초기화 한 다음에 클래스에 있는..
Initializer & Memberwise Initializer
안녕하세요:) 이번에는 생성자와 인스턴스 초기화, 구조체가 제공하는 Memberwise Initializer에 대해서 알아보도록 하겠습니다~ 1. Initializer (생성자) 새로운 인스턴스를 생성하는 것을 초기화라고 합니다. 초기화를 담당하는 것이 생성자입니다. class Position { var x = 0.0 var y: Double var z: Double? // 속성을 옵셔널로 선언, 기본값을 저장하지 않으면 자동으로 nil로 초기화됩니다. // var z: Double? = nil init() { y = 0.0 // Initializer를 추가하고 속성에 기본값을 저장하면 정상적으로 초기화됩니다. } } let p = Position() class..
AnyObject & Overloading
안녕하세요:) 오늘은 Swift가 제공하는 범용 자료형과 오버로딩을 통해 동일한 이름을 가진 멤버를 구현하는 방법에 대해서 알아보도록 하겠습니다! 1. Any & AnyObject (범용 자료형) 범용 자료형은 코드의 유연성을 높여주는 장점이 있습니다. 남용할 경우 코드의 가독성이 떨어지고 코드의 유지 보수가 힘들어집니다. Any는 모든 형식을 저장할 수 있고, AnyObject는 모든 클래스 형식을 저장할 수 있습니다. var data: Any = 1 data = 2.3 // Any로 선언하면 형식에 관계없이 모든 자료형을 저장할 수 있습니다. data = "Str" data = [1, 2, 3] // AnyObject는 참조 형식만 저장할 수 있습니다. var obj: AnyObject = NSStr..
Type Casting
안녕하세요:) 오늘은 Type Casting을 통해 인스턴스의 형식을 확인하고 다른 형식으로 캐스팅하는 방법을 알아보도록 하겠습니다. 1. Type Casting 타입 캐스팅은 인스턴스 형식을 확인하거나 다른 형식으로 인스턴스를 처리할 때 사용됩니다. 다운 캐스팅에서도 사용됩니다. expr is Type 두 피연산자의 형식이 동일하면 true 왼쪽 피연산자의 형식이 오른쪽 피연산자의 형식과 동일한 상속 계층에 있고, 오른쪽 피연산자가 슈퍼클래스라면 true가 리턴됩니다. 나머지의 경우 false class Figure { let name: String init(name: String) { self.name = name } func draw() { print("draw \(n..
Upcasting & Downcasting
안녕하세요:) 오늘은 인스턴스를 동일한 클래스 계층에 존재하는 다른 클래스 형식으로 처리하는 방법에 대해서 알아보도록 하겠습니다. 1. Upcasting 동일한 클래스 계층에서 수행되는 Upcasting은 안전하고 항상 성공합니다. class Figure { let name: String init(name: String) { self.name = name } func draw() { print("draw \(name)") } } class Rectangle: Figure { var width = 0.0 var height = 0.0 override func draw() { super.draw() print("🍏 \(width) x \(height)") } } class Square: Rectangle {..
Inheritance & Overriding
안녕하세요:) 오늘은 클래스에서 상속을 통해 Super Class로부터 멤버를 상속하는 방법과 Super Class로부터 상속한 멤버를 재정의 하는 방법에 대해서 알아보도록 하겠습니다! 1. Inheritance(상속) 클래스 계층에서 가장 위를 Base Class 또는 Root Class라고 합니다. 상속 관계에서 가장 위에 있는 클래스는 Super Class 또는 Parent Class라고 합니다. 아래쪽에 있는 클래스는 Subclass 또는 Child Class라고 합니다. 다중 상속은 불가능합니다. 다른 클래스를 상속하는 것을 Subclassing이라고 합니다. Subclass는 Super Class에 선언되어 있는 멤버들을 상속하고, 상속된 멤버들을 자유롭게 사용할 수 있습니다. class Cl..
Subscript
오늘은 Subscript에 대해서 알아보겠습니다. 1. Subscript 서브스크립트는 컬렉션 같은 집합의 특정 요소에 접근하는 문법을 의미합니다. 서브스크립트를 이용해 값에 접근하거나 값을 할당할 수 있습니다. 파라미터 수와 형식에는 제한이 없습니다. 대부분 두 개 이하의 파라미터를 사용합니다. 입출력 파라미터, 파라미터 기본값을 지정할 수 없습니다. 파라미터는 생략이 불가능합니다. class List { var data = [1, 2, 3] subscript(index: Int) -> Int { get { return data[index] } set { data[index] = newValue } } } var l = List() l[0] // 1 l[1] = 123 // set 블록 실행 l[0, ..