애플사의 새로운 프로그래밍 언어인 Swift 언어에 대해 개발자들의 관심이 커지고 있습니다. 본 발표에서는 실제 예제를 통해서 Swift의 함수와 메소드에 대해 알아보고, 튜플을 이용한 다중 변수 리턴기능과 제너릭등에 대한 재미있는 기능도 알아보겠습니다.
2014년 7월 19일 모바일 앱 개발자 포럼 발표자료를 공유합니다.
Sorry. for koreans only. I'll add english short description. or just visit http://wtfjs.com
아오 썅.
정정사항입니다.
객체 동일비교는 항상 valueOf 결과물로 나온 비교로 하는 데다가,
객체와 배열은 valueOf 해봐야 객체로 나오기 때문에
객체와 배열은 == 하나 === 하나 같은 비용으로 비교합니다.
[1,2,3]==[1,2,3] 은 false가 되므로
[1,,,2]==[1,undefined,undefuned,2] 는 무조건 false로 나옵니다.
http://github.com/ipkn/crow
Crow 프로젝트에서 사용한 C++11 기법들을 실제 구현에 대한 설명을 포함하여 자세히 설명한 발표자료입니다.
C++11 features used in Crow
video:
http://youtu.be/MixS9c3mE6U
https://vimeo.com/119627253
Sorry. for koreans only. I'll add english short description. or just visit http://wtfjs.com
아오 썅.
정정사항입니다.
객체 동일비교는 항상 valueOf 결과물로 나온 비교로 하는 데다가,
객체와 배열은 valueOf 해봐야 객체로 나오기 때문에
객체와 배열은 == 하나 === 하나 같은 비용으로 비교합니다.
[1,2,3]==[1,2,3] 은 false가 되므로
[1,,,2]==[1,undefined,undefuned,2] 는 무조건 false로 나옵니다.
http://github.com/ipkn/crow
Crow 프로젝트에서 사용한 C++11 기법들을 실제 구현에 대한 설명을 포함하여 자세히 설명한 발표자료입니다.
C++11 features used in Crow
video:
http://youtu.be/MixS9c3mE6U
https://vimeo.com/119627253
[C++ Korea] Effective Modern C++ Study item14 16 +신촌Seok-joon Yun
[C++ Korea] Effective Modern C++ Study item14 16 +신촌
Item 14 : Declare functions noexcept if they won't emit exceptions. +윤석준
Item 15 : Use constexpr whenever possible. +이동우
Item 16 : Make const member functions thread safe. +제한재
본 자료는 14.12.20 KGUG(Korea Git User Group) 주최 대학생 대상 Git 교육인
“Getting Started with git” 에서 발표된 “Git Basic Commands” 의 발표내용을 담고 있습니다.
본 자료는 크리에이티브 커먼즈 저작자표시-비영리-변경금지(CC BY-NC-ND) 3.0 Unported 라이선스에 따라 이용할 수 있습니다.
본 자료에 사용 된 이미지들은 Creative Common License 를 따르며 이미지 출처는 해당 이미지 하단에 기제 되어 있습니다.
2019년 5월 23일 창원대학교 정보통신공학과 특강자료 입니다.
* 일 시 : 2019년 5월 23일 (목) 13:00 ~
* 장 소 : 창원대학교 51호관 328호실
* 강연자 : 한국전자통신연구원(ETRI) 김성수 책임연구원
* 주 최 : 창원산업진흥원
* 주 관 : 창원시 스마트모바일앱지원센터
이번 강의에서는 지난 7개월간 이어진 강의의 마지막 편으로 파이썬이 각광받고 있는 이유와 장점에 대해서 다루어 봅니다.
그리고 저의 개인적인 강의 경험도 알려드릴까 합니다.
- 강의 키노트 자료는 다음 링크를 통해 다운 받으세요
https://drive.google.com/drive/folders/1UrrO4_ch4xcIErbExstwpUVY6vFvPdkW
- 강의 소스코드는 다음 링크를 통해 다운 받으세요
https://github.com/dongupak/Basic-Python-Programmingwjd
코딩 스타일은 파이썬의 아주 중요한 요소중 하나입니다.
이번 강의에서는 PEP-8 의 코딩 스타일 가이드 라인에 대해 자세히 살펴보고 pyCharm의 리포맷 기능에 대해서도 알아보겠습니다.
- 강의 키노트 자료는 다음 링크를 통해 다운 받으세요
https://drive.google.com/drive/folders/1UrrO4_ch4xcIErbExstwpUVY6vFvPdkW
- 강의 소스코드는 다음 링크를 통해 다운 받으세요
https://github.com/dongupak/Basic-Python-Programmingwjd
이번 강의에서는 방대한 파이썬 표준 라이브러리의 내용과 기능을 살펴보고 파이썬 외부 라이브러리에 대해서도 살펴보겠습니다.
- 강의 키노트 자료는 다음 링크를 통해 다운 받으세요
https://drive.google.com/drive/folders/1UrrO4_ch4xcIErbExstwpUVY6vFvPdkW
- 강의 소스코드는 다음 링크를 통해 다운 받으세요
https://github.com/dongupak/Basic-Python-Programmingwjd
이번 강의에서는 파이썬의 패키지를 만들고 활용하는 방법을 알아보겠습니다.
대규모 프로젝트를 수행하기 위해서는 이미 잘 만들어진 코드를 활용하는 것이 중요한데요, 잘 만들어진 코드를 활용하는 방법이 모듈을 사용하는 것입니다.
그러나 모듈의 수가 많아지면 폴더(디렉토리) 아래에 계층적으로 두는 것이 더욱 편리합니다.
한 폴더에 유사한 성격의 여러 모듈을 두고 이 폴더를 가져오는 방식으로 개발을 하는데 이 폴더를 패키지라고 합니다. 본 강의에서는 예제를 통해서 파이썬의 패키지 만드는 방법을 살펴보도록 하겠습니다.
- 강의 키노트 자료는 다음 링크를 통해 다운 받으세요
https://drive.google.com/drive/folders/1UrrO4_ch4xcIErbExstwpUVY6vFvPdkW
- 강의 소스코드는 다음 링크를 통해 다운 받으세요
https://github.com/dongupak/Basic-Python-Programmingwjd
이번 강의에서는 람다함수를 필터 함수와 맵 함수에서 사용하는 방법에 대해 살펴보겠습니다.
- 강의 키노트 자료는 다음 링크를 통해 다운 받으세요
https://drive.google.com/drive/folders/1UrrO4_ch4xcIErbExstwpUVY6vFvPdkW
- 강의 소스코드는 다음 링크를 통해 다운 받으세요
https://github.com/dongupak/Basic-Python-Programmingwjd
이번 강의에서는 람다함수에 대해 알아보겠습니다.
앞서 배운 함수를 이용하면 필요한 기능의 재사용이 가능하기 때문에, 함수를 정의한 후 필요할 때마다 호출하여 사용하면 편리한데 이러한 방식으로 프로그램을 하는 방식을 모듈화 프로그래밍 이라고 한다.
그러나 가끔씩은 함수를 만들지 않고 함수화된 기능만을 불러 사용하고자 할 경우가 있는데, 이렇게 하면 프로그램을 단순하게 만들 수 있다.
즉 1회용으로 함수를 만들고 싶은데 def xxx(): 과 같은 이름을 짓는 것이 번거롭게 느껴질 경우에 사용하는 것이 람다함수 혹은 람다표현식이다.
- 강의 키노트 자료는 다음 링크를 통해 다운 받으세요
https://drive.google.com/drive/folders/1UrrO4_ch4xcIErbExstwpUVY6vFvPdkW
- 강의 소스코드는 다음 링크를 통해 다운 받으세요
https://github.com/dongupak/Basic-Python-Programmingwjd
이번 강의에서는 파이썬 클래스의 상속에 대해 알아보겠습니다. 소프트웨어 개발시에는 예전에 만들어진 코드를 이용하여 새로운 기능을 개발하는 경우가 많은데요, 클래스의 상속 기능을 사용하면 부모 클래스에서 만들어둔 기능과 속성을 물려받을 수 있습니다.
상속은 객체지향 프로그래밍의 매우 뛰어난 기능으로 이 강의에서는 상속에 대해 알아봅니다. 또한 상속받은 자식이 부모 클래스를 호출하기 위해 사용하는 super() 함수에 대해서도 알아봅니다.
- 강의 키노트 자료는 다음 링크를 통해 다운 받으세요
https://drive.google.com/drive/folders/1UrrO4_ch4xcIErbExstwpUVY6vFvPdkW
- 강의 소스코드는 다음 링크를 통해 다운 받으세요
https://github.com/dongupak/Basic-Python-Programmingwjd
이번 강의에서는 파이썬에서 클래스를 정의하는 문법과 self 에 대해 살펴보도록 하겠습니다.
그리고 .(마침표)연산자를 이용하여 인스턴스에서 메소드를 호출하는 방법도 살펴보겠습니다.
- 강의 키노트 자료는 다음 링크를 통해 다운 받으세요
https://drive.google.com/drive/folders/1UrrO4_ch4xcIErbExstwpUVY6vFvPdkW
- 강의 소스코드는 다음 링크를 통해 다운 받으세요
https://github.com/dongupak/Basic-Python-Programmingwjd
슬라이싱(slicing)이란 리스트나 튜플, 문자열의 항목을 잘라서 일부만을 가져오는 기능을 말합니다.
보통 list[시작 : 끝] 과 같이 시작항목과 끝 항목의 인덱스를 지정하는 방식으로 사용하는데요, 시작 항목은 포함되지만 끝 항목은 포함되지 않습니다.
이번 강의에서는 파이썬의 슬라이싱을 이용하는 방법을 다양한 예제와 애니메이션으로 살펴보도록 하겠습니다.
- 강의 키노트 자료는 다음 링크를 통해 다운 받으세요
https://drive.google.com/drive/folders/1UrrO4_ch4xcIErbExstwpUVY6vFvPdkW
- 강의 소스코드는 다음 링크를 통해 다운 받으세요
https://github.com/dongupak/Basic-Python-Programmingwjd
이번 강의에서는 파이썬의 iterator에 대해 알아보겠습니다.
리스트, 집합, 딕셔너리와 같은 타입이나, 문자열은 for - in 구문을 통해서 반복적으로 하나씩 데이터를 꺼내서 처리할 수 있는데, 이와 같이 여러 개의 데이터를 포함한 타입중에서 반복적으로 하나하나 꺼내어 처리가능한 컬렉션이나 Sequence 들을 순환가능(Iterable) 객체라고 합니다.
iterator는 next() 함수를 구현한 객체를 말하며 next() 함수는 순환가능한 객체의 다음 원소를 반환하는 일을 합니다.
파이썬은 list, dict, set, bytes, tuple, range형이 iterable 형 객체입니다.
- 강의 키노트 자료는 다음 링크를 통해 다운 받으세요
https://drive.google.com/drive/folders/1UrrO4_ch4xcIErbExstwpUVY6vFvPdkW
- 강의 소스코드는 다음 링크를 통해 다운 받으세요
https://github.com/dongupak/Basic-Python-Programmingwjd
이번 동영상 강의에서는 리스트 함수에 대해 살펴보도록 하겠습니다. 앞 장 강의에서 min(), max()와 같은 간단한 리스트 함수를 살펴보았는데요, 이번 강의에서는 all(), any(), bool(), filter() 등의 고급 함수의 기능과 그 사용예를 살펴봅니다.
- 강의 키노트 자료는 다음 링크를 통해 다운 받으세요
https://drive.google.com/drive/folders/1UrrO4_ch4xcIErbExstwpUVY6vFvPdkW
- 강의 소스코드는 다음 링크를 통해 다운 받으세요
https://github.com/dongupak/Basic-Python-Programmingwjd
이번 강의에서는 파이썬의 리스트 메소드에 대해 살펴보겠습니다.
파이썬의 리스트는 다양한 메소드를 제공하는데, 이 메소드를 통해 리스트의 원소를 변경하거나, 삭제, 추가, 병합, 정렬등의 기능을 할 수 있습니다.
또한, 파이썬의 기본 함수에서는 리스트의 원소의 길이, 최대값, 최소값, 분할을 위한 다양한 함수가 제공됩니다. 예제와 실습을 통해 index(), extend(), insert(), sort(), reverse()등의 메소드와 사용법을 알아보겠습니다.
15. Swift의 함수
import Foundation
func Add10(num: Int) -> (Int) {
var result = num + 10;
return result
}
var n = 21
println("Before Add10(10), n = (n)")
16. Swift의 함수
import Foundation
func Add10(num: Int) -> (Int) {
var result = num + 10;
return result
}
var n = 21
println("Before Add10(10), n = (n)")
17. Swift의 함수
import Foundation
func Add10(num: Int) -> (Int) {
var result = num + 10;
return result
}
var n = 21
println("Before Add10(10), n = (n)")
n = Add10(n)
18. Swift의 함수
import Foundation
func Add10(num: Int) -> (Int) {
var result = num + 10;
return result
}
var n = 21
println("Before Add10(10), n = (n)")
n = Add10(n)
println("After Add10(10), n = (n)")
19. Swift의 함수
import Foundation
func Add10(num: Int) -> (Int) {
var result = num + 10;
return result
}
var n = 21
println("Before Add10(10), n = (n)")
n = Add10(n)
println("After Add10(10), n = (n)")
Before Add10(10), n = 21
20. Swift의 함수
import Foundation
func Add10(num: Int) -> (Int) {
var result = num + 10;
return result
}
var n = 21
println("Before Add10(10), n = (n)")
n = Add10(n)
println("After Add10(10), n = (n)")
Before Add10(10), n = 21
After Add10(10), n = 31
45. 튜플 Tuple
(1, 2, 3) // (Int, Int, Int)
(3.14, 1.414) // (Double, Double)
(123, “Busan”, “Seagull”) // (Int, String, String)
…
() 안에 ,(쉼표)를 이용해서 동일한 형, 또는 서로 다음 형
의 자료값을 묶어 하나의 자료형으로 취급할 수 있음
60. Swift로 만든 Swap 함수1
import Foundation
!
func swap(n1:Int, n2:Int) -> (Int, Int){
return (n2, n1)
}
!
var n1 = 100
var n2 = 200
!
println("Before : n1 = (n1)")
println("Before : n2 = (n2)")
!
(n1, n2) = swap(n1, n2)
!
println("After : n1 = (n1)")
println("After : n2 = (n2)")
튜플을 반환하는 방식으로 간단하게 구현가능
61. Swift로 만든 Swap 함수1
import Foundation
!
func swap(n1:Int, n2:Int) -> (Int, Int){
return (n2, n1)
}
!
var n1 = 100
var n2 = 200
!
println("Before : n1 = (n1)")
println("Before : n2 = (n2)")
!
(n1, n2) = swap(n1, n2)
!
println("After : n1 = (n1)")
println("After : n2 = (n2)")
튜플을 반환하는 방식으로 간단하게 구현가능
62. Swift로 만든 Swap 함수2
import Foundation
!
func swap(inout a: Int, inout b: Int)
{
let temporaryA = a
a = b
b = temporaryA
}
!
var n1 = 100
var n2 = 200
!
println("Before : n1 = (n1)")
println("Before : n2 = (n2)")
!
swap(&n1, &n2)
!
println("After : n1 = (n1)")
println("After : n2 = (n2)")
63. Swift로 만든 Swap 함수2
import Foundation
!
func swap(inout a: Int, inout b: Int)
{
let temporaryA = a
a = b
b = temporaryA
}
!
var n1 = 100
var n2 = 200
!
println("Before : n1 = (n1)")
println("Before : n2 = (n2)")
!
swap(&n1, &n2)
!
println("After : n1 = (n1)")
println("After : n2 = (n2)")
64. Swift로 만든 Swap 함수2
import Foundation
!
func swap(inout a: Int, inout b: Int)
{
let temporaryA = a
a = b
b = temporaryA
}
!
var n1 = 100
var n2 = 200
!
println("Before : n1 = (n1)")
println("Before : n2 = (n2)")
!
swap(&n1, &n2)
!
println("After : n1 = (n1)")
println("After : n2 = (n2)")
65. Swift로 만든 Swap 함수2
import Foundation
!
func swap(inout a: Int, inout b: Int)
{
let temporaryA = a
a = b
b = temporaryA
}
!
var n1 = 100
var n2 = 200
!
println("Before : n1 = (n1)")
println("Before : n2 = (n2)")
!
swap(&n1, &n2)
!
println("After : n1 = (n1)")
println("After : n2 = (n2)")
inout과 & 연산자를 사용하여 외부값을 참조할 수 있음
66. inout
• 매개변수 중에서 함수내에서 변경된 매개변수가 함수 호
출이 종료된 시점에서도 계속되기를 원한다면 inout 키
워드를 파라메터 정의할 때 사용한다
• 파라메터의 값은 함수 안으로 전달되어 변경되고, 함수에
서 나와서 원래의 값을 대체함
• 인수를 입출력 파라메터로 넘길때 변수의 이름 앞에 앰퍼
샌드(&)를 붙인다
76. 함수 레이블
func join(s1: String, s2: String, joiner: String) -> String {
return s1 + joiner + s2
}
join("hello", "world", ", ")
vs
func join(string s1: String, toString s2: String, withJoiner joiner: String)
-> String {
return s1 + joiner + s2
}
join(string: "hello", toString: "world", withJoiner: ", ")
join 함수를 통해 매개변수로 입력된 String을 조합할 수 있다
레이블링을 통해 매개변수의 역할을 명확하게 이해할 수 있다.
Objective-C와의 호환성을 확보할 수 있다
77. variadic 함수
• 함수구문에서 함수에 전달되는 매개변수의 개수를 정확
하게 알 수 없을 경우에 사용하는 문법이 적용된 함수
func arithmeticMean(numbers: Double...) -> Double {
var total: Double = 0
for number in numbers {
total += number
}
return total / Double(numbers.count)
}
arithmeticMean(1, 2, 3, 4, 5)
// 다섯 정수의 산술평균 3.0을 반환함
arithmeticMean(3, 8, 19)
// 3,8,19의 산술평균 10.0을 반환함
78. variadic 함수
• 함수구문에서 함수에 전달되는 매개변수의 개수를 정확
하게 알 수 없을 경우에 사용하는 문법이 적용된 함수
func arithmeticMean(numbers: Double...) -> Double {
var total: Double = 0
for number in numbers {
total += number
}
return total / Double(numbers.count)
}
arithmeticMean(1, 2, 3, 4, 5)
// 다섯 정수의 산술평균 3.0을 반환함
arithmeticMean(3, 8, 19)
// 3,8,19의 산술평균 10.0을 반환함
79. 함수 타입
• 함수타입의 상수나 변수를 만들어 함수를 할당할 수 있음
두 개의 Int 값을 매개변수로 취하며 Int 값을 반환하는 함수 타입 변
수 mathFuntion을 선언하고, 이 변수가 addTwoInts 함수를 참조(refer)하
도록 한다.
!
var mathFunction: (Int, Int) -> Int = addTwoInts
80. 함수 타입
import Foundation
!
func addTwoInts(a: Int, b: Int) -> Int {
return a + b
}
!
var mathFunction: (Int, Int) -> Int = addTwoInts
!
println("Result: (mathFunction(2, 3))")
Result: 5
함수 타입 변수 mathFunction
81. 함수 타입
import Foundation
!
func addTwoInts(a: Int, b: Int) -> Int {
return a + b
}
!
var mathFunction: (Int, Int) -> Int = addTwoInts
!
println("Result: (mathFunction(2, 3))")
Result: 5
함수 타입 변수 mathFunction
82. Swift 언어의 함수 타입
import Foundation
!
func addTwoInts(a: Int, b: Int) -> Int {
return a + b
}
!
var mathFunction: (Int, Int) -> Int = addTwoInts
var newMathFunction: (Int, Int) -> Int
!
newMathFunction = mathFunction
println("Result: (mathFunction(2, 3))")
println("Result: (newMathFunction(3, 3))")
Result: 5
Result: 6
두 개의 Int 값을 취하며 Int 값을 반환하는 함수 타입 변수 mathFuntion
을 newMathFunction 변수가 참조한다
83. C 언어의 함수 타입
#include <stdio.h>
!
int addTwoInts(int a, int b) {
return a + b;
}
!
int main(int argc, const char * argv[]) {
int (*mathFunction)(int, int) = &addTwoInts;
int (*newMathFunction)(int, int);
newMathFunction = mathFunction;
printf("Result : %dn", (*mathFunction)(2,3));
printf("Result : %dn", (*newMathFunction)(3,3));
return 0;
}
Result: 5
Result: 6
84. C 언어의 함수 타입
…
int addTwoInts(int a, int b) {
return a + b;
}
!
int main(int argc, const char * argv[]) {
int (*mathFunction)(int, int) = &addTwoInts;
int (*newMathFunction)(int, int);
newMathFunction = mathFunction;
…
85. C 언어의 함수 타입
…
int addTwoInts(int a, int b) {
return a + b;
}
!
int main(int argc, const char * argv[]) {
int (*mathFunction)(int, int) = &addTwoInts;
int (*newMathFunction)(int, int);
newMathFunction = mathFunction;
…
86. C 언어의 함수 타입
…
int addTwoInts(int a, int b) {
return a + b;
}
!
int main(int argc, const char * argv[]) {
int (*mathFunction)(int, int) = &addTwoInts;
int (*newMathFunction)(int, int);
newMathFunction = mathFunction;
…
C 언어의 함수
87. C 언어의 함수 타입
…
int addTwoInts(int a, int b) {
return a + b;
}
!
int main(int argc, const char * argv[]) {
int (*mathFunction)(int, int) = &addTwoInts;
int (*newMathFunction)(int, int);
newMathFunction = mathFunction;
…
C 언어의 함수
88. C 언어의 함수 타입
…
int addTwoInts(int a, int b) {
return a + b;
}
!
int main(int argc, const char * argv[]) {
int (*mathFunction)(int, int) = &addTwoInts;
int (*newMathFunction)(int, int);
newMathFunction = mathFunction;
…
89. C 언어의 함수 타입
…
int addTwoInts(int a, int b) {
return a + b;
}
!
int main(int argc, const char * argv[]) {
int (*mathFunction)(int, int) = &addTwoInts;
int (*newMathFunction)(int, int);
newMathFunction = mathFunction;
…
90. C 언어의 함수 타입
…
int addTwoInts(int a, int b) {
return a + b;
}
!
int main(int argc, const char * argv[]) {
int (*mathFunction)(int, int) = &addTwoInts;
int (*newMathFunction)(int, int);
newMathFunction = mathFunction;
…
함수 포인터
91. C 언어의 함수 타입
…
int addTwoInts(int a, int b) {
return a + b;
}
!
int main(int argc, const char * argv[]) {
int (*mathFunction)(int, int) = &addTwoInts;
int (*newMathFunction)(int, int);
newMathFunction = mathFunction;
…
함수 포인터
92. C 언어의 함수 타입
…
int addTwoInts(int a, int b) {
return a + b;
}
!
int main(int argc, const char * argv[]) {
int (*mathFunction)(int, int) = &addTwoInts;
int (*newMathFunction)(int, int);
newMathFunction = mathFunction;
…
93. C 언어의 함수 타입
…
int addTwoInts(int a, int b) {
return a + b;
}
!
int main(int argc, const char * argv[]) {
int (*mathFunction)(int, int) = &addTwoInts;
int (*newMathFunction)(int, int);
newMathFunction = mathFunction;
…
94. C 언어의 함수 타입
…
int addTwoInts(int a, int b) {
return a + b;
}
!
int main(int argc, const char * argv[]) {
int (*mathFunction)(int, int) = &addTwoInts;
int (*newMathFunction)(int, int);
newMathFunction = mathFunction;
…
함수 포인터
95. C 언어의 함수 타입
…
int addTwoInts(int a, int b) {
return a + b;
}
!
int main(int argc, const char * argv[]) {
int (*mathFunction)(int, int) = &addTwoInts;
int (*newMathFunction)(int, int);
newMathFunction = mathFunction;
…
함수 포인터
96. C 언어의 함수 타입
…
int addTwoInts(int a, int b) {
return a + b;
}
!
int main(int argc, const char * argv[]) {
int (*mathFunction)(int, int) = &addTwoInts;
int (*newMathFunction)(int, int);
newMathFunction = mathFunction;
…
함수 포인터
함수 포인터를 다른 함수 포인터에 복사할 수 있음
98. 함수를 파라메터로 사용
func printMathResult(mathFunction: (Int, Int) -> Int, a: Int, b: Int) {
println("Result: (mathFunction(a, b))")
}
printMathResult(addTwoInts, 3, 5)
// prints "Result: 8"
99. 함수를 파라메터로 사용
func printMathResult(mathFunction: (Int, Int) -> Int, a: Int, b: Int) {
println("Result: (mathFunction(a, b))")
}
printMathResult(addTwoInts, 3, 5)
// prints "Result: 8"
100. 함수를 파라메터로 사용
func printMathResult(mathFunction: (Int, Int) -> Int, a: Int, b: Int) {
println("Result: (mathFunction(a, b))")
}
printMathResult(addTwoInts, 3, 5)
// prints "Result: 8"
101. 함수를 파라메터로 사용
func printMathResult(mathFunction: (Int, Int) -> Int, a: Int, b: Int) {
println("Result: (mathFunction(a, b))")
}
printMathResult(addTwoInts, 3, 5)
// prints "Result: 8"
Result: 8
102. 함수의 반환
func stepForward(input: Int) -> Int {
return input + 1
}
func stepBackward(input: Int) -> Int {
return input - 1
}
func chooseStepFunction(backwards: Bool) -> (Int) -> Int {
return backwards ? stepBackward : stepForward
}
103. 함수의 반환
func stepForward(input: Int) -> Int {
return input + 1
}
func stepBackward(input: Int) -> Int {
return input - 1
}
func chooseStepFunction(backwards: Bool) -> (Int) -> Int {
return backwards ? stepBackward : stepForward
}
Int형 값을 매개변수로 받아 Int 값을
반환하는 함수
104. 함수의 반환
func stepForward(input: Int) -> Int {
return input + 1
}
func stepBackward(input: Int) -> Int {
return input - 1
}
func chooseStepFunction(backwards: Bool) -> (Int) -> Int {
return backwards ? stepBackward : stepForward
}
Int형 값을 매개변수로 받아 Int 값을
반환하는 함수
Int형 값을 매개변수로 받아 Int 값을
반환하는 함수
105. 함수의 반환
func stepForward(input: Int) -> Int {
return input + 1
}
func stepBackward(input: Int) -> Int {
return input - 1
}
func chooseStepFunction(backwards: Bool) -> (Int) -> Int {
return backwards ? stepBackward : stepForward
}
Int형 값을 매개변수로 받아 Int 값을
반환하는 함수
Int형 값을 매개변수로 받아 Int 값을
반환하는 함수
106. 함수의 반환
func stepForward(input: Int) -> Int {
return input + 1
}
func stepBackward(input: Int) -> Int {
return input - 1
}
func chooseStepFunction(backwards: Bool) -> (Int) -> Int {
return backwards ? stepBackward : stepForward
}
반환형- Int형을 매개변수로 받아
Int 값을 반환하는 함수
Int형 값을 매개변수로 받아 Int 값을
반환하는 함수
Int형 값을 매개변수로 받아 Int 값을
반환하는 함수
107. 함수의 반환
func stepForward(input: Int) -> Int {
return input + 1
}
func stepBackward(input: Int) -> Int {
return input - 1
}
func chooseStepFunction(backwards: Bool) -> (Int) -> Int {
return backwards ? stepBackward : stepForward
}
반환형- Int형을 매개변수로 받아
Int 값을 반환하는 함수
Int형 값을 매개변수로 받아 Int 값을
반환하는 함수
Int형 값을 매개변수로 받아 Int 값을
반환하는 함수
108. 함수의 반환
func stepForward(input: Int) -> Int {
return input + 1
}
func stepBackward(input: Int) -> Int {
return input - 1
}
func chooseStepFunction(backwards: Bool) -> (Int) -> Int {
return backwards ? stepBackward : stepForward
}
반환형- Int형을 매개변수로 받아
Int 값을 반환하는 함수
Int형 값을 매개변수로 받아 Int 값을
반환하는 함수
Int형 값을 매개변수로 받아 Int 값을
반환하는 함수
109. 함수의 반환
func stepForward(input: Int) -> Int {
return input + 1
}
func stepBackward(input: Int) -> Int {
return input - 1
}
func chooseStepFunction(backwards: Bool) -> (Int) -> Int {
return backwards ? stepBackward : stepForward
} 매개변수 backwards가 true이면
stepBackward 함수가, false이면
stepForward 함수가 반환된다
반환형- Int형을 매개변수로 받아
Int 값을 반환하는 함수
Int형 값을 매개변수로 받아 Int 값을
반환하는 함수
Int형 값을 매개변수로 받아 Int 값을
반환하는 함수
111. 중첩 함수
• 함수 내부에 다른 함수를 중첩할 수 있다
func stepForward(input: Int) -> Int {
return input + 1
}
func stepBackward(input: Int) -> Int {
return input - 1
}
112. 중첩 함수
• 함수 내부에 다른 함수를 중첩할 수 있다
func chooseStepFunction(backwards: Bool) -> (Int) -> Int {
!
!
!
!
!
}
func stepForward(input: Int) -> Int {
return input + 1
}
func stepBackward(input: Int) -> Int {
return input - 1
}
113. 중첩 함수
• 함수 내부에 다른 함수를 중첩할 수 있다
func chooseStepFunction(backwards: Bool) -> (Int) -> Int {
!
!
!
!
!
}
func stepForward(input: Int) -> Int {
return input + 1
}
func stepBackward(input: Int) -> Int {
return input - 1
}
114. 중첩 함수
• 함수 내부에 다른 함수를 중첩할 수 있다
func chooseStepFunction(backwards: Bool) -> (Int) -> Int {
!
!
!
!
!
}
115. 중첩 함수
• 함수 내부에 다른 함수를 중첩할 수 있다
func chooseStepFunction(backwards: Bool) -> (Int) -> Int {
!
!
!
!
!
}
func stepForward(input: Int) -> Int { return input + 1 }
func stepBackward(input: Int) -> Int { return input - 1 }
return backwards ? stepBackward : stepForward
116. 제너릭스 Generics
• 함수의 자료형에 상관없이 일관된 알고리즘만으로 효율
적으로 함수 작성이 가능함
• Swift의 많은 기본 라이브러리들이 제너릭으로 작성되어
있다. 예) Array, Dictionary 타입등
118. 제너릭스
• swap 함수의 값이 Int, Double, String과 같이 다양하다
func swapTwoInts(inout a: Int, inout b: Int) {
119. 제너릭스
• swap 함수의 값이 Int, Double, String과 같이 다양하다
func swapTwoInts(inout a: Int, inout b: Int) {
let temporaryA = a
120. 제너릭스
• swap 함수의 값이 Int, Double, String과 같이 다양하다
func swapTwoInts(inout a: Int, inout b: Int) {
let temporaryA = a
a = b
121. 제너릭스
• swap 함수의 값이 Int, Double, String과 같이 다양하다
func swapTwoInts(inout a: Int, inout b: Int) {
let temporaryA = a
a = b
b = temporaryA
122. 제너릭스
• swap 함수의 값이 Int, Double, String과 같이 다양하다
func swapTwoInts(inout a: Int, inout b: Int) {
let temporaryA = a
a = b
b = temporaryA
}
123. 제너릭스
• swap 함수의 값이 Int, Double, String과 같이 다양하다
func swapTwoInts(inout a: Int, inout b: Int) {
let temporaryA = a
a = b
b = temporaryA
}
func swapTwoDoubles(inout a: Double, inout b: Double) {
124. 제너릭스
• swap 함수의 값이 Int, Double, String과 같이 다양하다
func swapTwoInts(inout a: Int, inout b: Int) {
let temporaryA = a
a = b
b = temporaryA
}
func swapTwoDoubles(inout a: Double, inout b: Double) {
let temporaryA = a
125. 제너릭스
• swap 함수의 값이 Int, Double, String과 같이 다양하다
func swapTwoInts(inout a: Int, inout b: Int) {
let temporaryA = a
a = b
b = temporaryA
}
func swapTwoDoubles(inout a: Double, inout b: Double) {
let temporaryA = a
a = b
126. 제너릭스
• swap 함수의 값이 Int, Double, String과 같이 다양하다
func swapTwoInts(inout a: Int, inout b: Int) {
let temporaryA = a
a = b
b = temporaryA
}
func swapTwoDoubles(inout a: Double, inout b: Double) {
let temporaryA = a
a = b
b = temporaryA
127. 제너릭스
• swap 함수의 값이 Int, Double, String과 같이 다양하다
func swapTwoInts(inout a: Int, inout b: Int) {
let temporaryA = a
a = b
b = temporaryA
}
func swapTwoDoubles(inout a: Double, inout b: Double) {
let temporaryA = a
a = b
b = temporaryA
}
128. 제너릭스
• swap 함수의 값이 Int, Double, String과 같이 다양하다
func swapTwoInts(inout a: Int, inout b: Int) {
let temporaryA = a
a = b
b = temporaryA
}
func swapTwoStrings(inout a: String, inout b: String) {
func swapTwoDoubles(inout a: Double, inout b: Double) {
let temporaryA = a
a = b
b = temporaryA
}
129. 제너릭스
• swap 함수의 값이 Int, Double, String과 같이 다양하다
func swapTwoInts(inout a: Int, inout b: Int) {
let temporaryA = a
a = b
b = temporaryA
}
func swapTwoStrings(inout a: String, inout b: String) {
let temporaryA = a
func swapTwoDoubles(inout a: Double, inout b: Double) {
let temporaryA = a
a = b
b = temporaryA
}
130. 제너릭스
• swap 함수의 값이 Int, Double, String과 같이 다양하다
func swapTwoInts(inout a: Int, inout b: Int) {
let temporaryA = a
a = b
b = temporaryA
}
func swapTwoStrings(inout a: String, inout b: String) {
let temporaryA = a
a = b
func swapTwoDoubles(inout a: Double, inout b: Double) {
let temporaryA = a
a = b
b = temporaryA
}
131. 제너릭스
• swap 함수의 값이 Int, Double, String과 같이 다양하다
func swapTwoInts(inout a: Int, inout b: Int) {
let temporaryA = a
a = b
b = temporaryA
}
func swapTwoStrings(inout a: String, inout b: String) {
let temporaryA = a
a = b
b = temporaryA
func swapTwoDoubles(inout a: Double, inout b: Double) {
let temporaryA = a
a = b
b = temporaryA
}
132. 제너릭스
• swap 함수의 값이 Int, Double, String과 같이 다양하다
func swapTwoInts(inout a: Int, inout b: Int) {
let temporaryA = a
a = b
b = temporaryA
}
func swapTwoStrings(inout a: String, inout b: String) {
let temporaryA = a
a = b
b = temporaryA
}
func swapTwoDoubles(inout a: Double, inout b: Double) {
let temporaryA = a
a = b
b = temporaryA
}
133. 제너릭스
• swap 함수의 값이 Int, Double, String과 같이 다양하다
func swapTwoInts(inout a: Int, inout b: Int) {
let temporaryA = a
a = b
b = temporaryA
}
func swapTwoStrings(inout a: String, inout b: String) {
let temporaryA = a
a = b
b = temporaryA
}
func swapTwoDoubles(inout a: Double, inout b: Double) {
let temporaryA = a
a = b
b = temporaryA
}
134. 제너릭스
• swap 함수의 값이 Int, Double, String과 같이 다양하다
func swapTwoInts(inout a: Int, inout b: Int) {
let temporaryA = a
a = b
b = temporaryA
}
func swapTwoStrings(inout a: String, inout b: String) {
let temporaryA = a
a = b
b = temporaryA
}
func swapTwoDoubles(inout a: Double, inout b: Double) {
let temporaryA = a
a = b
b = temporaryA
}
매개변수는 다르지만 함수의 로직은 동일함
자료형 개수 만큼의 함수가 필요하다.
매우 불편하다
137. 제너릭 함수
func swapTwoValues<T>(inout a: T, inout b: T) {
let temporaryA = a
a = b
b = temporaryA
}
하나의 함수를 통해서
모든 종류의 자료형에 대한 알고리즘을
만들 수 있다.
138. 제너릭 함수
func swapTwoValues<T>(inout a: T, inout b: T) {
let temporaryA = a
a = b
b = temporaryA
}
var someInt = 3
var anotherInt = 107
swapTwoValues(&someInt, &anotherInt)
// someInt is now 107, and anotherInt is now 3
!
var someString = "hello"
var anotherString = "world"
swapTwoValues(&someString, &anotherString)
// someString is now "world", and anotherString is now "hello"
하나의 함수를 통해서
모든 종류의 자료형에 대한 알고리즘을
만들 수 있다.
139. 제너릭 함수
func repeat<ItemType>(item: ItemType, times: Int) -> ItemType[] {
var result = ItemType[]()
for i in 0..times {
result += item
}
return result
}
var repeat_knock = repeat("knock", 4)
var repeat_ten = repeat(10, 4)
!
println("repeat_knock = (repeat_knock)")
println("repeat_ten = (repeat_ten)")
140. 제너릭 함수
func repeat<ItemType>(item: ItemType, times: Int) -> ItemType[] {
var result = ItemType[]()
for i in 0..times {
result += item
}
return result
}
var repeat_knock = repeat("knock", 4)
var repeat_ten = repeat(10, 4)
!
println("repeat_knock = (repeat_knock)")
println("repeat_ten = (repeat_ten)")
repeat_knock = [knock, knock, knock, knock]
repeat_ten = [10, 10, 10, 10]
141. 메소드 Method
• 메소드는 클래스나 구조체 타입에 의존적인 함수로 클래
스와 구조체의 인스턴스는 메소드를 정의할 수 있다.
• 또한 타입 자체에 관여하는 타입 메소드를 정의할 수 있
다
142. 메소드
class Counter {
var count = 0
func increment() {
count++
}
func incrementBy(amount: Int) {
count += amount
}
func reset() {
count = 0
}
}
let counter = Counter()
// 초기 counter값은 0입니다
counter.increment()
// counter값은 이제 1입니다
counter.incrementBy(5)
// counter값은 이제 6입니다
counter.reset()
// counter값은 이제 0입니다
145. 메소드와 레이블
import Foundation
!
func say(name:String, msg:String) {
println("(name) say (msg)")
}
!
say("Henry","Hi,Swift")
함수
146. 메소드와 레이블
import Foundation
!
func say(name:String, msg:String) {
println("(name) say (msg)")
}
!
say("Henry","Hi,Swift")
함수 메소드
147. 메소드와 레이블
import Foundation
!
func say(name:String, msg:String) {
println("(name) say (msg)")
}
!
say("Henry","Hi,Swift")
import Foundation
!
class Hello {
var name: String = ""
func say(name:String, msg:String){
println("(name) say (msg)")
}
}
!
var hello = Hello()
hello.say("Henry", "Hi,Swift")
함수 메소드
148. 메소드와 레이블
import Foundation
!
func say(name:String, msg:String) {
println("(name) say (msg)")
}
!
say("Henry","Hi,Swift")
import Foundation
!
class Hello {
var name: String = ""
func say(name:String, msg:String){
println("(name) say (msg)")
}
}
!
var hello = Hello()
hello.say("Henry", "Hi,Swift")
함수 메소드
149. 메소드와 레이블
import Foundation
!
func say(name:String, msg:String) {
println("(name) say (msg)")
}
!
say("Henry","Hi,Swift")
import Foundation
!
class Hello {
var name: String = ""
func say(name:String, msg:String){
println("(name) say (msg)")
}
}
!
var hello = Hello()
hello.say("Henry", "Hi,Swift")
함수 메소드
150. 메소드와 레이블
• 함수의 경우 매개변수마다 레이블
을 달 필요는 없다.
• 메소드의 경우 두번째 이상의 레이
블에 대해서는 반드시 레이블을 달
아야 한다
• Objective-C의 영향을 받은 것
• 매개변수의 역할을 정확하게 알 수
있어, 에러를 줄일 수 있다.
151. 메소드와 레이블
• 함수의 경우 매개변수마다 레이블
을 달 필요는 없다.
• 메소드의 경우 두번째 이상의 레이
블에 대해서는 반드시 레이블을 달
아야 한다
• Objective-C의 영향을 받은 것
• 매개변수의 역할을 정확하게 알 수
있어, 에러를 줄일 수 있다.
메소드
152. 메소드와 레이블
• 함수의 경우 매개변수마다 레이블
을 달 필요는 없다.
• 메소드의 경우 두번째 이상의 레이
블에 대해서는 반드시 레이블을 달
아야 한다
• Objective-C의 영향을 받은 것
• 매개변수의 역할을 정확하게 알 수
있어, 에러를 줄일 수 있다.
import Foundation
!
class Hello {
var name: String = ""
func say(name:String, msg:String){
println("(name) say (msg)")
}
}
!
var hello = Hello()
hello.say("Henry", msg:"Hi,Swift")
메소드
153. 메소드와 레이블
• 함수의 경우 매개변수마다 레이블
을 달 필요는 없다.
• 메소드의 경우 두번째 이상의 레이
블에 대해서는 반드시 레이블을 달
아야 한다
• Objective-C의 영향을 받은 것
• 매개변수의 역할을 정확하게 알 수
있어, 에러를 줄일 수 있다.
import Foundation
!
class Hello {
var name: String = ""
func say(name:String, msg:String){
println("(name) say (msg)")
}
}
!
var hello = Hello()
hello.say("Henry", msg:"Hi,Swift")
Henry say Hi,Swift
메소드
154. 레이블
class Counter {
var count: Int = 0
func incrementBy(amount: Int, numberOfTimes: Int) {
count += amount * numberOfTimes
}
}
let counter = Counter()
Counter.incrementBy(5, numberOfTimes: 3)
// Counter value is now 15
155. 레이블
class Counter {
var count: Int = 0
func incrementBy(amount: Int, numberOfTimes: Int) {
count += amount * numberOfTimes
}
}
let counter = Counter()
Counter.incrementBy(5, numberOfTimes: 3)
// Counter value is now 15
메소드의 매개변수인 numberOfTime 를 호출시의
레이블로 사용할 수 있다. 이 레이블을 통해 두번째
매개변수의 목적을 명확하게 알 수 있다
156. 레이블
class Counter {
var count: Int = 0
func incrementBy(amount: Int, #numberOfTimes: Int) {
count += amount * numberOfTimes
}
}
let counter = Counter()
Counter.incrementBy(5, numberOfTimes: 3)
// Counter value is now 15
157. 레이블
class Counter {
var count: Int = 0
func incrementBy(amount: Int, #numberOfTimes: Int) {
count += amount * numberOfTimes
}
}
let counter = Counter()
Counter.incrementBy(5, numberOfTimes: 3)
// Counter value is now 15
numberOfTime 와 같은 매개변수 이름을
레이블로 사용할 수 있다.(디폴트 매개변수명)
이때 매개변수의 이름에 #을 붙여서 이를 명시적으로
만들 수 있다-Objective-C의 문법과 동일함.
158. 레이블
import Foundation
!
class Hello {
…
func say(name:String, msg:String, ofCount n:Int){
for index in 1...n {
println("(name) say (msg)")
}
}
}
…
hello.say("Henry", msg:"Hi,Swift", ofCount:3)
159. 레이블
import Foundation
!
class Hello {
…
func say(name:String, msg:String, ofCount n:Int){
for index in 1...n {
println("(name) say (msg)")
}
}
}
…
hello.say("Henry", msg:"Hi,Swift", ofCount:3)
위 메소드의 ofCount는 레이블이며, n은 매개변수이다
레이블과 매개변수는 다를 수 있다
160. 함수 레이블(익명 레이블)
import Foundation
!
class Hello {
…
func say(name:String, _ msg:String, _ n:Int){
for index in 1...n {
println("(name) say (msg)")
}
}
}
…
hello.say("Henry","Hi,Swift", 3)
161. 함수 레이블(익명 레이블)
레이블 대신 _(언더바)를 사용하여 레이블을 생력할 수 있다.
import Foundation
!
class Hello {
…
func say(name:String, _ msg:String, _ n:Int){
for index in 1...n {
println("(name) say (msg)")
}
}
}
…
hello.say("Henry","Hi,Swift", 3)
162. self 속성
• self는 내재적인 속성으로 모든 인스턴스가 가지고 있다.
• self는 인스턴스 자체를 지시한다
func increment() {
self.count++
}
163. self 속성
• self는 내재적인 속성으로 모든 인스턴스가 가지고 있다.
• self는 인스턴스 자체를 지시한다
func increment() {
self.count++
}
위와같이 메소드에 self를 반드시 달 필요는 없으며
self. 가 없을 경우 Swift는 현재 인스턴스의 메소드나 속성을
가리키는 것으로 가정한다
165. self 속성
struct Point {
var x = 0.0, y = 0.0
func isToTheRightOfX(x: Double) -> Bool {
return x > x
}
}
166. self 속성
struct Point {
var x = 0.0, y = 0.0
func isToTheRightOfX(x: Double) -> Bool {
return x > x
}
}
self.
167. self 속성
struct Point {
var x = 0.0, y = 0.0
func isToTheRightOfX(x: Double) -> Bool {
return x > x
}
}
self.
위와 같은 메소드에서 x > x라고 할 경우 x가 매개변수 x인지
Point의 멤버 변수 x인지를 알 수 없다
self.x > x 를 통해서 self.x 는 멤버변수 x임을 알 수 있다
168. mutating 키워드
struct Point {
var x = 0.0, y = 0.0
mutating func moveByX(deltaX: Double, y deltaY: Double) {
x += deltaX
y += deltaY
}
}
var somePoint = Point(x: 1.0, y: 1.0)
somePoint.moveByX(2.0, y: 3.0)
println("The point is now at ((somePoint.x), (somePoint.y))")
169. mutating 키워드
struct Point {
var x = 0.0, y = 0.0
mutating func moveByX(deltaX: Double, y deltaY: Double) {
x += deltaX
y += deltaY
}
}
var somePoint = Point(x: 1.0, y: 1.0)
somePoint.moveByX(2.0, y: 3.0)
println("The point is now at ((somePoint.x), (somePoint.y))")
메소드 moveByX를 통해 인스턴스의 속성을 변경시키고자 할 경우
mutating 키워드를 사용하여 인스턴스의 속성 x, y를 변경
170. 용어정리
• C나 C++와 같은 프로그래밍 언어에서는 일반적으로 클
래스의 인스턴스를 객체(오브젝트)라고 한다.
• Swift는 다른 언어와 달리 클래스와 구조체의 기능이 유
사하다. 클래스와 구조체의 인스턴스 모두 함수를 가질
수 있다.
• 이 때문에 Swift에서는 객체라는 용어보다 일반적인
인스턴스라는 용어를 사용한다
171. 클래스와 구조체
• 클래스(class)와 구조체(struct)는 모두 범용적이고 가
변적인 프로그램의 구성 성분이다
• 클래스와 구조체 모두 상수, 변수, 함수를 가지는데, 이때
문법은 동일하다.
172. 클래스와 구조체의 유사성
• 값을 저장할 속성을 정의한다
• 기능을 위한 메소드를 정의한다
• subscript 구문을 사용하여 이들의 값에 접근할 수 있도록
subscript를 제공한다
• 초기상태를 설정하기 위한 초기설정자를 제공한다
• 기본 구현내용을 확장하기 위한 기능을 제공한다
• 어떤 표준적인 기능을 제공하는 프로토콜을 따른다
173. 클래스와 구조체의 차이점
• 클래스는 구조체가 가지지 못한 다음 기능을 가진다
• 한 클래스의 특성을 상속받는 기능이 가능하다
• 클래스 인스턴스를 형을 검사하고 번영하여 런타임시
에 형변환을 할 수 있다
• 할당된 임의의 리소스를 해지하는 deinitializer를 가
진다
• 클래스 인스턴스는 참조 카운터를 하나이상 허용한다
174. 정리
• Swift의 함수는 C언어의 함수보다 간결하면서도 쉽다
• 튜플타입을 사용하여 함수를 유연성있게 사용할 수 있다
• Objective-C의 레이블 기능을 메소드에서도 사용할 수
있도록 하여 호환성을 확보하였다
• 제너릭 타입은 자료형에 무관한 유연한 코딩이 가능하다
• Swift의 철학은 간결하면서도 안전한 프로그램을 추구한
다