본문 바로가기

Programming

기본문법을 마치며... 더 알아보기이제까지 포스팅한 내용 외에 추가적으로 알아가야 할 문법과 개념들을 모아봤습니다.제네릭(Generics)서브스크립트(Subscript)접근수준(Access Control)ARC(Automatic Reference Counting)중첩타입(Nested Types)사용자정의 연산자(Custom Operators) 스위프트 기본문법 강좌는 여기서 마칩니다. 많은 도움이 되었길 소망합니다. yagom Blog : http://blog.yagom.netFacebook : https://fb.com/yagomsoftFacebook Page : https://fb.com/yagompageFacebook Group : https://fb.com/groups/yagomContacts : https://yago.. 더보기
고차함수 고차함수고차함수(Higher-order function)은 '다른 함수를 전달인자로 받거나 함수실행의 결과를 함수로 반환하는 함수'를 뜻합니다.스위프트의 함수(클로저)는 일급시민(first-citizen)이기 때문에 함수의 전달인자로 전달할 수 있으며, 함수의 결과값으로 반환할 수 있습니다. 이번 파트에서는 스위프트 표준라이브러리에서 제공하는 유용한 고차함수에 대해 알아봅니다.mapfilterreducemap, filter, reduce 함수는 스위프트 표준 라이브러리의 컨테이너 타입(Array, Set, Dictionary 등)에 구현되어 있습니다. 소스코드 mapmap함수(메서드)는 컨테이너 내부의 기존 데이터를 변형(transform)하여 새로운 컨테이너를 생성합니다. > 변형하고자 하는 numbe.. 더보기
익스텐션 익스텐션익스텐션(Extension) 은 스위프트의 강력한 기능 중 하나입니다. 익스텐션은 구조체, 클래스, 열거형, 프로토콜 타입에 새로운 기능을 추가 할 수 있는 기능입니다. 기능을 추가하려는 타입의 구현된 소스 코드를 알지 못하거나 볼 수 없다 해도, 타입만 알고 있다면 그 타입의 기능을 확장할 수도 있습니다. 스위프트의 익스텐션이 타입에 추가할 수 있는 기능연산 타입 프로퍼티 / 연산 인스턴스 프로퍼티 타입 메서드 / 인스턴스 메서드이니셜라이저서브스크립트 중첩 타입특정 프로토콜을 준수할 수 있도록 기능 추가 익스텐션은 타입에 새로운 기능을 추가할 수는 있지만, 기존에 존재하는 기능을 재정의 할 수는 없습니다. 클래스의 상속과 익스텐션을 비교해보겠습니다. 이 둘은 비슷해보이지만 실제 성격은 많이 다릅.. 더보기
프로토콜 프로토콜프로토콜(Protocol)은 특정 역할을 수행하기 위한 메서드, 프로퍼티, 기타 요구사항 등의 청사진을 정의합니다. 구조체, 클래스, 열거형은 프로토콜을 채택(Adopted)해서 특정 기능을 수행하기 위한 프로토콜의 요구사항을 실제로 구현할 수 있습니다. 어떤 프로토콜의 요구사항을 모두 따르는 타입은 그 프로토콜을 준수한다(Conform)고 표현합니다. 타입에서 프로토콜의 요구사항을 충족시키려면 프로토콜이 제시하는 청사진의 기능을 모두 구현해야 합니다. 즉, 프로토콜은 기능을 정의하고 제시 할 뿐이지 스스로 기능을 구현하지는 않습니다. 소스코드 정의 문법protocol 키워드를 사용하여 정의합니다.protocol 프로토콜 이름 { /* 정의부 */ } 프로토콜 구현protocol Talkable .. 더보기
assert와 guard assert와 guard애플리케이션이 동작 도중에 생성하는 다양한 연산 결과값을 동적으로 확인하고 안전하게 처리할 수 있도록 확인하고 빠르게 처리할 수 있습니다. 소스코드 Assertionassert(_:_:file:line:) 함수를 사용합니다. assert 함수는 디버깅 모드에서만 동작합니다. 배포하는 애플리케이션에서는 제외됩니다. 주로 디버깅 중 조건의 검증을 위하여 사용합니다.var someInt: Int = 0 // 검증 조건에 부합하므로 지나갑니다 assert(someInt == 0, "someInt != 0") someInt = 1 //assert(someInt == 0) // 동작 중지, 검증 실패 //assert(someInt == 0, "someInt != 0") // 동작 중지, 검증.. 더보기
타입캐스팅 타입캐스팅스위프트의 타입캐스팅은 인스턴스의 타입을 확인하는 용도 또는 클래스의 인스턴스를 부모 혹은 자식 클래스의 타입으로 사용할 수 있는지 확인하는 용도로 사용합니다. is, as를 사용합니다. 소스코드 타입 캐스팅 예제를 위한 클래스 정의class Person { var name: String = "" func breath() { print("숨을 쉽니다") } } class Student: Person { var school: String = "" func goToSchool() { print("등교를 합니다") } } class UniversityStudent: Student { var major: String = "" func goToMT() { print("멤버쉽 트레이닝을 갑니다 신남!") .. 더보기
옵셔널 체이닝 옵셔널 체이닝 옵셔널 체이닝은 옵셔널의 내부의 내부의 내부로 옵셔널이 연결되어 있을 때 유용하게 활용할 수 있습니다. 매 번 nil 확인을 하지 않고 최종적으로 원하는 값이 있는지 없는지 확인할 수 있습니다. 소스코드 예제 클래스class Person { var name: String var job: String? var home: Apartment? init(name: String) { self.name = name } } class Apartment { var buildingNumber: String var roomNumber: String var `guard`: Person? var owner: Person? init(dong: String, ho: String) { buildingNumber = .. 더보기
인스턴스의 생성과 소멸 인스턴스의 생성과 소멸인스턴스를 생성하는 이니셜라이저와 클래스의 인스턴스가 소멸될 때 호출되는 디이니셜라이저 그리고 그와 관련된 것들에 대해 알아봅니다.프로퍼티 초기값이니셜라이저 init디이니셜라이저 deinit 소스코드 프로퍼티 기본값스위프트의 모든 인스턴스는 초기화와 동시에 모든 프로퍼티에 유효한 값이 할당되어 있어야 합니다. 프로퍼티에 미리 기본값을 할당해두면 인스턴스가 생성됨과 동시에 초기값을 지니게 됩니다.class PersonA { // 모든 저장 프로퍼티에 기본값 할당 var name: String = "unknown" var age: Int = 0 var nickName: String = "nick" } // 인스턴스 생성 let jason: PersonA = PersonA() // 기본값.. 더보기
상속 상속스위프트의 상속은 클래스, 프로토콜 등에서 가능합니다. 열거형, 구조체는 상속이 불가능합니다. 스위프트는 다중상속을 지원하지 않습니다. 이번 파트에서는 클래스의 상속에 대해서 알아봅니다 소스코드 클래스의 상속과 재정의상속 문법class 이름: 상속받을 클래스 이름 { /* 구현부 */ } // 기반 클래스 Person class Person { var name: String = "" func selfIntroduce() { print("저는 \(name)입니다") } // final 키워드를 사용하여 재정의를 방지할 수 있습니다 final func sayHello() { print("hello") } // 타입 메서드 // 재정의 불가 타입 메서드 - static static func typeMeth.. 더보기
프로퍼티 - Property 프로퍼티프로퍼티는 클래스, 구조체, 열거형과 연관된 값입니다. 타입과 관련된 값을 저장할 수도, 연산할 수도 있습니다. 소스코드 프로퍼티의 종류인스턴스 저장 프로퍼티타입 저장 프로퍼티인스턴스 연산 프로퍼티타입 연산 프로퍼티지연 저장 프로퍼티이번 파트에서는 지연 저장 프로퍼티를 제외한 저장 프로퍼티와 연산 프로퍼티에 대해 알아봅니다. 정의와 사용프로퍼티는 구조체, 클래스, 열거형 내부에 구현할 수 있습니다. 다만 열거형 내부에는 연산 프로퍼티만 구현할 수 있습니다. 연산 프로퍼티는 var로만 선언할 수 있습니다.연산프로퍼티를 읽기전용으로는 구현할 수 있지만, 쓰기 전용으로는 구현할 수 없습니다. 읽기전용으로 구현하려면 get 블럭만 작성해주면 됩니다. 읽기전용은 get블럭을 생략할 수 있습니다. 읽기, 쓰.. 더보기
클로저 - Closure 클로저클로저는 코드의 블럭입니다. 일급시민(first-citizen)으로, 전달인자, 변수, 상수 등으로 저장, 전달이 가능합니다. 함수는 클로저의 일종으로, `이름이 있는 클로저`라고 생각하면 됩니다. 소스코드 기본 클로저 문법{ (매개변수 목록) -> 반환타입 in 실행 코드 } 클로저의 사용 // sum이라는 상수에 클로저를 할당 let sum: (Int, Int) -> Int = { (a: Int, b: Int) in return a + b } let sumResult: Int = sum(1, 2) print(sumResult) // 3 함수의 전달인자로서의 클로저클로저는 주로 함수의 전달인자로 많이 사용됩니다. 함수 내부에서 원하는 코드블럭을 실행할 수 있습니다.let add: (Int, Int.. 더보기
열거형 - Enumerations 열거형 소스코드 정의 문법스위프트의 열거형은 다른 언어의 열거형과는 많이 다릅니다. 잘 살펴보아야 할 스위프트의 기능 중 하나입니다.enum은 타입이므로 대문자 카멜케이스를 사용하여 이름을 정의합니다각 case는 소문자 카멜케이스로 정의합니다각 case는 그 자체가 고유의 값입니다각 케이스는 한 줄에 개별로도, 한 줄에 여러개도 정의할 수 있습니다 enum 이름 { case 이름1 case 이름2 case 이름3, 이름4, 이름5 // ... } 열거형 사용enum Weekday { case mon case tue case wed case thu, fri, sat, sun } // 열거형 타입과 케이스를 모두 사용하여도 됩니다 var day: Weekday = Weekday.mon // 타입이 명확하다면.. 더보기
클래스 클래스 소스코드 정의 문법클래스는 참조 타입입니다. 타입이름은 대문자 카멜케이스를 사용하여 정의합니다.class 이름 { /* 구현부 */ } 프로퍼티 및 메서드 구현클래스의 타입 메서드는 두 종류가 있습니다. 상속 후 재정의가 가능한 class 타입메서드, 상속 후 재정의가 불가능한 static 타입메서드가 있습니다. 자세한 내용은 상속 부분에서 다시 다룹니다.class Sample { // 가변 프로퍼티 var mutableProperty: Int = 100 // 불변 프로퍼티 let immutableProperty: Int = 100 // 타입 프로퍼티 static var typeProperty: Int = 100 // 인스턴스 메서드 func instanceMethod() { print("inst.. 더보기
C <9>. 반복문(2) do-while 오늘의 주제 1. do-while 반복문 2. 단항연산자와 괄호 아홉번째 시간입니다.^^ 이제까지 반복문과 조건문에 대해 조금 알아보았는데요, 오늘은 반복문 중에 do-while이라는 녀석에 대해서 잠시 알아보도록 할게요~ 더불어서 쪼끔 골치아픈 녀석도 함께 알아봅니다~ 스따뚜~~~~~~~~~~~~ # do-while 일단 뭐 항상 그렇듯이 코드를 한 번 입력해 봅니다^^ 코드 설명은 아래에서~ 일단 실행시키지 마세요!! do-while 반복문은 do { 일단 실행할 조건 } while ( 다음번 실행 조건 ); 이렇게 작성합니다. 일단 먼저 실행 하라(do) 어떠한 조건이 나올 때까지(while) 이거 겠죠?ㅎㅎ 즉, 중괄호 {} 안에 있는 내용은 일단 do-while 반복문이 시작됨과 동시에 실행이 .. 더보기
C <7>. 조건문(2) switch 오늘의 주제 1. switch문 사용해 보기 일곱 번째 시간입니다.^^ 지난 번에는 if 조건문에 대해 알아보았습니다. 이번에는 또다른 조건문인 switch문에 대해 알아보도록 할게요 ㅎ 스따뚜~~~~~~~~~~~~ # switch 자, 일단 만들어 봅시다. 지난번 if문 할 때 만들어 놓았던 프로젝트를 열어 봅시다. 이번에는 switchNumbers() 라는 함수를 만들거예요. 빨간네모를 따라 코드를 작성해 봅시다.ㅎㅎ 위의 코드의 실행 결과 화면입니다. switch문의 작성법은 이렇습니다. switch(대상 변수) { case 정수 혹은 문자 : 실행할 명령문 break; case 정수 혹은 문자 : 실행할 명령문 break; case 정수 혹은 문자 : 실행할 명령문 break; default : .. 더보기