본문 바로가기

문법관련/Swift16

제너릭 기초(Generic) 정의 💡 Generic: 포괄적인 우리가 사용한는 Swift 표준 라이브러리의 대부분은 제너릭으로 작성되어있다. 그 예시로 Swift의 배열, 딕셔너리가 있다. 예시 제너릭을 좀 더 쉽게 이해하기 위해서 예시를 보자. 아래에 있는 함수는 함수 이름 그대로 정수형 변수 두개의 값을 서로 바꿔주는 함수이다. func swapTwoInts(_ a: inout Int, _ b: inout Int) { let temporaryA = a a = b b = temporaryA } 하지만 해당 함수를 작성하고 String형의 변수 두개의 값을 서로 바꿔주기 위해서는 또 다시 swapTwoStrings라는 함수를 만들어야한다. Double도 마찬가지로 또 함수를 만들어야한다. 이렇게 하면 잘 작동은 되겠지만 3개의 함수.. 2022. 8. 26.
where 키워드를 이용한 반복문 제어 - 정대리 인프런 우선 우리가 알고 있는 반복문은 아래와 같다. import UIKit var myArray : [Int] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] for item in myArray { print("item: \(item)") } // item: 0 item: 1 item: 2 ... 해당 코드는 "myArray라는 Int 배열을 item이라는 곳에 담아서 반복문을 통해서 출력시키겠다." 라는 의미이다. 만약 반복문을 사용할 때 특정한 조건에서 반복을 하고 싶다면 어떻게 해야할까? 그럴 때는 where이라는 키워드를 사용해서 조건을 걸어주면 된다. import UIKit var myArray : [Int] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] for .. 2022. 6. 22.
Protocol (Yagom) 프로토콜 프로토콜은 특정 역할을 수행하기 위한 메서드, 프로퍼티, 이니셜라이저등의 요구사항을 정의한다. (특정 기능이나 속성에 대한 설계도) 쉽게 말하면, 어떤 타입(구조체, 클래스, 열거형)에 "너는 이 기능이 꼭 필요해. 그러니깐 이 기능을 꼭 구현해!" 라고 강요하는 것과 같다. 구조체, 클래스, 열거형은 프로토콜을 채택해서 프로토콜의 요구사항을 실제로 구현할 수 있다. (여기서 채택이란, 어떤 타입이 "나는 이 기능을 수행할거야" 라고 말하는 것) 프로토콜의 정의 protocol 프로토콜 이름 { // 정의부 } 예시를 통해서 살펴보자. //말할 수 있다 라는 기능을 프로토콜로 나타낸 것 protocol Talkable { var topic: String { get set } var laungua.. 2022. 6. 1.
값 타입과 참조 타입( 클래스와 구조체 ) 값 타입(Value) 데이터를 전달할 때 값을 복사하여 전달하는 것 즉, 전달 받은 값을 변경해도 원본 값은 영향을 받지 않는다. 값타입의 예시) 열거형 구조체 배열 문자열 딕셔너리 튜플 따라서 구조체 또는 열거형은 값 타입이다. 값 타입 속성은 기본적으로 인스턴스 메서드 내에서 수정할 수 없기 때문에 "mutating" 키워드를 작성한다. 참조 타입(Reference) 데이터를 전달할 때 값의 메모리 위치를 전달하는 것 즉, 전달 받은 값을 변경하면 원본 값도 변경된다. 참조 타입의 예시) 클래스 클로저 함수 2022. 6. 1.
클로저 (꼼꼼한 재은 씨의 Swift : 문법편 + babbab2) ㅇ출처: 꼼꼼한 재은 씨의 Swift : 문법편 + babbab2티스토리 클로저는 함수에 대해서 알고 배우는 편 좋기때문에 함수를 다 이해하고 살펴보자. Closure 란? 클로저란 보통 익명의 함수, 일회용 함수를 작성할 수 있는 구문이다. 이전에 배운 함수또한 클로저에 속한다. 무슨 말이냐면 클로저는 아래의 사진과 같이 두 종류의 클로저가 있다. 위의 사진에서 Named 클로저는 우리가 앞서 배운 아래의 코드와 같은 함수이다. (클로저이지만 그냥 함수라고 부를 뿐이다.) func doSomething() { print("Somaker") } 그리고 Unnamed 클로저는 앞으로 배울 Closure를 뜻한다. let closure = { print("Somaker") } Swift에서 클로저라고 부르는.. 2022. 5. 26.
함수(2) (꼼꼼한 재은 씨의 Swift : 문법편) 일급 객체로서의 함수 Swift는 함수형 패러다임을 따르고 있다. 즉, Swift라는 언어는 일급 객체에 부합하는 언어이다. 일급 함수의 특성 1. 객체가 런타임에도 생성이 가능해야 한다. 2. 인자값으로 객체를 전달할 수 있어야한다. 3. 반환값으로 객체를 사용할 수 있어야한다. 4. 변수나 데이터 구조안에 저장할 수 있어야한다. 5. 할당에 사용된 이름과 관계없이 고유한 구별이 가능해야한다. 함수가 위 조건을 만족하는 프로그래밍 언어는 함수형 언어가 되며, 함수형 프로그래밍에서는 "함수가 일급 객체"가 될 수 있다. 아래의 몇가지 예시를 통해서 Swift가 왜 함수형 언어이고 왜 일급 객체인지에 대해서 알아보자. 일급 함수의 특성 (1) - 변수나 상수에 함수를 대입할 수 있다. 변수나 상수에 함수를.. 2022. 5. 26.
함수(1) (꼼꼼한 재은 씨의 Swift : 문법편) 사용자 정의 함수 사용자 정의 함수를 정의하는 형식은 다음과 같다. -기본적인 함수- func 함수이름(매개변수1: 타입, 매개변수2: 타입) -> 반환타입 { 실행내용 return 반환값 } -매개변수가 없는 함수- func 함수이름() -> 반환타입 { 실행내용 return 반환값 } -반환값이 없는 함수- func 함수이름(매개변수1: 타입, 매개변수2: 타입) { 실행내용 } 💡 함수이름 - +, -, *, / 과같은 연산자는 사용불가하다. 사용자 정의 함수를 정의한 예시를 살펴보자. -함수의 예시- //매개변수x 반환값x func printHello() { print("안녕") } //매개변수x 반환값o func sayHello() -> String{ let value = "안녕" return .. 2022. 5. 25.
익스텐션 (꼼꼼한 재은 씨의 Swift : 문법편) 익스익스텐션(Extensions)은 이미 존재하는 클래스나 구조체, 열거형 등의 객체에 새로운 기능을 추가하여 확장해주는 구문이다. 익스텐션을 통해서 구현할 수 있는 것들은 대표적으로 아래와 같다. 1. 새로운 연산 프로퍼티를 추가할 수 있다. 2. 새로운 메소드를 정의할 수 있다. 3. 새로윤 초기화 구문을 추가할 수 있다. 4. 기존 객체를 수정하지 않고 프로토콜을 구현할 수있다. (프로토콜은 다음편에서...) 이번편에서는 1 ~ 3까지만 다루어볼 예정이다. (4는 다음 편에) 익스텐션을 사용할 때는 아래와 같이 사용한다. extension { //code } 위의 형태에서 볼 수 있듯이, 익스텐션을 extension 키워드를 사용할 뿐 독립적인 객체를 생성하는 구문이 아니다. 따라서 익스텐션을 객체.. 2022. 5. 19.
열거형 (꼼꼼한 재은 씨의 Swift : 문법편) 열거형이란 하나의 주제로 연관된 데이터들이 멤버로 구성되어 있는 자료형 객체를 말한다. 열거형에서 데이터들은 열거형 객체를 정의하는 시점에 함께 정의된다. 따라서, 데이터를 함부로 삭제하거나 변경할 수 없다. 삭제하거나 변경하려면 객체를 정의하는 구문을 직접 수정해야한다. 열거형의 데이터 멤버들은 정의 개념으로 작성되는 것이므로 타입으로 사용할 수 있을 뿐만 아니라 컴파일러가 미리 인지할 수 있다. 컴파일러가 미리 인지할 수 있고 없고의 차이는 런타임(Run - Time)오류와 컴파일 오류의 차이로 나타난다. 즉, 열거형을 이용하여 데이터 타입을 정의하고 사용하면 오타나 실수가 발생했을 때 그 즉시 컴파일러가 오류를 찾아주므로 잘못된 점을 바로 확인할 수 있다.(컴파일 오류) 하지만 집단 자료형을 사용해.. 2022. 4. 11.
옵셔널과 옵셔널 체인 (꼼꼼한 재은 씨의 Swift : 문법편) 옵셔널 체인을 배우기전 옵셔널에 대한 기본적인 지식을 학습해보자. (출처) Swift에서는 프로그램의 안정성을 높이기 위해서 오류 대신 nil 값을 반환함으로써 개발자에게 문제가 있다는 사실을 알린다. 여기서 nil은 "값이 없음"을 의미한다. 그렇다면 옵셔널이란 무엇일까? 옵셔널이란 값이 없을 수도 있는 상황에서 사용한다. 이때 값이 없다는 것은 nil을 의미하는데 이 nil을 반환하기 위해 필요한 것이 옵셔널이다. 오직 옵셔널 타입만이 nil을 반환할 수 있다. 따라서 오류 발생의 가능성이 조금이라도 있으면 옵셔널로 정의해야 한다. 옵셔널 타입이란 무엇인가? 옵셔널은 nil이거나 nil이 아닌 값만 가질 수 있다. - nil: 실행 과정에서 오류가 발생했을 때 - nil이 아닌 값: 오류가 발생하지 .. 2022. 4. 10.
초기화 구문 (꼼꼼한 재은 씨의 Swift : 문법편) 구조체나 클래스는 모두 정의된 내용을 그대로 사용할 수는 없다. 항상 인스턴스를 생성해서 메모리 공간을 할당받은 다음에 사용해야한다. 이 과정을 바로 초기화라고 한다. 초기화 과정에서 가장 중요한 것은 저장 프로퍼티이다. 모든 저장 프로퍼티는 인스턴스 생성과정에서 초기화되어야하며 이를 위해서 반드시 초기값이 지정되어 있어야한다. 모든 저장 프로퍼티에 초기값이 지정되어 있다면 기본 초기화 구문을 사용하여 인스턴스를 생성할 수 있다. Resolution() Video() SUV() Car() Vehicle() 하지만 우리는 초기화를 배울때 위의 기본 초기화 구문말고 멤버와이즈 초기화 구문이라는 것을 배웠다. 이것은 구조체에서만 사용할 수 있는데 아래의 예제를 살펴보면서 다시 한번 이해해보자. struct R.. 2022. 4. 9.
타입 캐스팅 (꼼꼼한 재은 씨의 Swift : 문법편) 부모 클래스로부터 상속된 자식 클래스는 자기 자신의 타입이기도 하면서, 동시에 부모 클래스의 타입이기도 하다. 이는 부모 클래스의 특성들을 물려받았기 때문으로, 메소드를 오버라이딩했더라도 컴파일러가 클래스의 형태에서 중요하게 여기는 메소드의 이름, 매개변수의 타입 그리고 반환타입이 바뀌지 않는 한 클래스 형식이 달라진 것은 아니다. class Vehicle { var currentSpeed = 0.0 func accelerate() { self.currentSpeed += 1 } } class Car: Vehicle { var gear: Int { return Int(self.currentSpeed / 20) + 1 } func wiper(){ // 창을 닦는다. } } let trans: Vehicle.. 2022. 4. 9.
상속 (꼼꼼한 재은 씨의 Swift : 문법편) 클래스와 구조체의 구분되는 특성 중 하나로 상속(Ingeritance)이라는 것을 들 수 있다. 이는 말 그대로 하나의 클래스가 다른 클래스에게 무엇인가를 물려줄 수 있다는 말이다. 일반 사회 현상에서의 상속과 프로그래밍에서의 상속을 보면 아래와 같다. 일반 사회 - "아들이 아버지로부터 재산을 물려받았다." 프로그래밍 - "Child클래스가 Father클래스를 상속한다." 이 관계를 통해서 객체지향에서 상속을 정의하면 "한 클래스가 다른 클래스에서 정의된 프로퍼티나 메소드를 물려받아 사용하는 것" 과 같다. 상속을 사용하면 이미 만들어진 다른 클래스의 기능이나 프로퍼티를 직접 구현하지 않고도 사용할 수 있다. 다만, 추가로 필요한 기능이나 프로퍼티만 정의하여 사용하면 된다. 이때 기능이나 프로퍼티를 물.. 2022. 4. 3.
메소드 (꼼꼼한 재은 씨의 Swift : 문법편) 메소드는 일종의 함수로서, 클래스나 구조체, 열거형과 같은 객체 내에서 함수가 선언될 경우 말한다. 즉, 메소드는 특정 타입의 객체 내부에서 사용하는 함수라고 할 수 있다. 이 둘의 차이점은 구현 목적이 가는 독립성과 연관성에 있다. 함수는 독립적인 기능을 구현하기 위해서 만들어지는 것이지만, 메소드는 하나의 객체 내에 정의된 다른 메소드와 서로 협력하여 함수적인 기능을 수행한다. 메소드는 크게 인스턴스 메소드와 타입 메소드로 구분된다. 객체의 인스턴스를 생성해야 사용할 수 있는 인스턴스 메소드, 객체의 인스턴스를 생성하지 않아도 사용할 수 있는 타입 메소드이다. 따라서 인스턴스 메소드는 객체 타입 자체로는 호출할 수 없고 반드시 인스턴스를 생성한 후에 호출할 수 있다는 점에서 타입 메소드와 다르다. [.. 2022. 4. 2.
프로퍼티 (꼼꼼한 재은 씨의 Swift : 문법편) 아프로퍼티를 우리말로 번역하면 값을 저장하기 위한 목적으로 클래스와 구조체 내에서 정의된 변수나 상수라고 되어있지만 이는 프로퍼티가 하는 역할의 일부만 설명한 것이다. 프로퍼티의 역할은 클래스나 구조체에서 프로퍼티가 하는 정확한 역할은 값을 제공하는 것이다. 값을 제공하는 것과 저장하는 것은 어떤 차이가 있을까? 값을 저장하는 것이 아니라 제공하는것에 목적이 있다는 것은 프로퍼티중 일부는 값을 저장하지는 않지만 제공하는 특성을 가지고 있다는 것이다. 위에서 설명한거 처럼 프로퍼티에는 값을 저장x + 제공하는 것과 저장 + 제공하는 것이 있는데 이때 저장 + 제공하는 것을 저장 프로퍼티, 저장x + 제공하는 것을 연산 프로퍼티라고 한다. [저장 프로퍼티 vs 연산 프로퍼티] 저장 프로퍼티 1. 입력된 값을.. 2022. 3. 31.
구조체와 클래스의 기본 개념 (꼼꼼한 재은 씨의 Swift : 문법편) [용어 정리] 1. 프로퍼티: 구조체나 클래스 내부에서 정의된 변수나 상수 2. 메소드: 구조체나 클래스 내부에서 정의된 함수 3. 멤버: 프로퍼티, 메소드를 합해서 칭하는 용어 [구조체와 클래스의 공통점] 1. 프로퍼티: 변수나 상수를 사용하여 값을 저장하는 프로퍼티를 정의할 수 있다. 2. 메소드: 함수를 사용하여 기능을 제공하는 메소드를 정의할 수 있다. 3. 서브스크립트: 속성 값에 접근할 수 있는 방법을 제공하는 서브스크립트를 정의할 수 있다. 4. 초기화 블럭: 객체를 원하는 초기 상태로 설정해주는 초기화 블럭을 정의할 수 있다. 5. 확장: 객체에 함수적 기능을 추가하는 확장 구문을 사용할 수 있다. 6. 프로토콜: 특정 형싱의 함수적 표준을 제공하기 위한 프로토콜을 구현할 수 있다. [클래.. 2022. 3. 29.