Upload
donggyu-park
View
246
Download
5
Embed Size (px)
Citation preview
5. Swift 기초 - 기초 함수
창원대학교 정보통신공학과 박동규
2015. 12
함수 Function
• 프로그램의 기본적인 구성요소
• 어떤 작업을 수행하는 문장의 그룹
• 하나의 프로그램은 여러 개의 함수들이 모여서 이루어진다
• 프로그램에서 레고 블럭과 같은 요소
• 가독성의 증대, 유지관리가 쉽다.
함수
Add10(x)
함수
Add10(x)
num=10
함수
Add10(x)num=10
함수
Add10(x)
함수
Add10(x) num=20
함수
Add10(x)
num=20
Swift의 함수
Swift의 함수
Swift의 함수
Swift의 함수함수명
Swift의 함수
Swift의 함수
Swift의 함수
매개변수(인자,파라메터)
Swift의 함수
Swift의 함수
Swift의 함수
반환값
Swift의 함수
Swift의 함수
Swift의 함수
함수 몸체
Swift의 함수
Swift의 함수
Swift의 함수
함수 호출- 매개변수가 2개 이상이면 함수의 두번째 매개변수부터는 반드시 레이블을 붙여서 호출해야 한다
다중 반환값
• C/C++/Objective-C/Java 등의 언어에서는 함수가 하나의 리턴값만을 가질 수 밖에 없어 불편함.
• 튜플(tuple)을 사용하면 여러 개의 값을 한꺼번에 반환할 수 있다.
• 함수의 예를 통해 알아보자
튜플을 이용한 반환
홍길동의 나이와 이름, 키를 반환하는 함수
swap 함수
swap 함수
swap 함수
tuple을 이용하여 반환값을 받아온다
튜플 재조합
함수 중복정의와 매개변수
함수 중복정의
C로 만든 Swap 함수#include<stdio.h>
voidswap(){inttemp;temp=*num1;*num1=*num2;*num2=temp;}
intmain(intargc,constchar*argv[]){intn1=100,n2=200;printf("Before:n1=%d\n",n1);printf("Before:n2=%d\n",n2);swap();printf("After:n1=%d\n",n1);printf("After:n2=%d\n",n2);return0;}
C로 만든 Swap 함수#include<stdio.h>
voidswap(){inttemp;temp=*num1;*num1=*num2;*num2=temp;}
intmain(intargc,constchar*argv[]){intn1=100,n2=200;printf("Before:n1=%d\n",n1);printf("Before:n2=%d\n",n2);swap();printf("After:n1=%d\n",n1);printf("After:n2=%d\n",n2);return0;} 포인터 연산자를 이용하여 외부 변수값에 접근함
C로 만든 Swap 함수#include<stdio.h>
voidswap(){inttemp;temp=*num1;*num1=*num2;*num2=temp;}
intmain(intargc,constchar*argv[]){intn1=100,n2=200;printf("Before:n1=%d\n",n1);printf("Before:n2=%d\n",n2);swap();printf("After:n1=%d\n",n1);printf("After:n2=%d\n",n2);return0;} 포인터 연산자를 이용하여 외부 변수값에 접근함
&n1,&n2
C로 만든 Swap 함수#include<stdio.h>
voidswap(){inttemp;temp=*num1;*num1=*num2;*num2=temp;}
intmain(intargc,constchar*argv[]){intn1=100,n2=200;printf("Before:n1=%d\n",n1);printf("Before:n2=%d\n",n2);swap();printf("After:n1=%d\n",n1);printf("After:n2=%d\n",n2);return0;} 포인터 연산자를 이용하여 외부 변수값에 접근함
&n1,&n2
C로 만든 Swap 함수#include<stdio.h>
voidswap(){inttemp;temp=*num1;*num1=*num2;*num2=temp;}
intmain(intargc,constchar*argv[]){intn1=100,n2=200;printf("Before:n1=%d\n",n1);printf("Before:n2=%d\n",n2);swap();printf("After:n1=%d\n",n1);printf("After:n2=%d\n",n2);return0;} 포인터 연산자를 이용하여 외부 변수값에 접근함
&n1,&n2
int*num1,int*num2
C로 만든 Swap 함수#include<stdio.h>
voidswap(){inttemp;temp=*num1;*num1=*num2;*num2=temp;}
intmain(intargc,constchar*argv[]){intn1=100,n2=200;printf("Before:n1=%d\n",n1);printf("Before:n2=%d\n",n2);swap();printf("After:n1=%d\n",n1);printf("After:n2=%d\n",n2);return0;} 포인터 연산자를 이용하여 외부 변수값에 접근함
&n1,&n2
int*num1,int*num2
C++로 만든 Swap 함수#include<iostream>usingnamespacestd;
voidswap(){inttemp;temp=num1;num1=num2;num2=temp;}
intmain(intargc,constchar*argv[]){intn1=100,n2=200;cout<<"Before:n1="<<n1<<endl;cout<<"Before:n2="<<n2<<endl;swap();cout<<"After:n1="<<n1<<endl;cout<<"After:n2="<<n2<<endl;
return0;}
C++로 만든 Swap 함수#include<iostream>usingnamespacestd;
voidswap(){inttemp;temp=num1;num1=num2;num2=temp;}
intmain(intargc,constchar*argv[]){intn1=100,n2=200;cout<<"Before:n1="<<n1<<endl;cout<<"Before:n2="<<n2<<endl;swap();cout<<"After:n1="<<n1<<endl;cout<<"After:n2="<<n2<<endl;
return0;}
참조 연산자 & 를 이용하여 쉽게 변수값에 접근함
C++로 만든 Swap 함수#include<iostream>usingnamespacestd;
voidswap(){inttemp;temp=num1;num1=num2;num2=temp;}
intmain(intargc,constchar*argv[]){intn1=100,n2=200;cout<<"Before:n1="<<n1<<endl;cout<<"Before:n2="<<n2<<endl;swap();cout<<"After:n1="<<n1<<endl;cout<<"After:n2="<<n2<<endl;
return0;}
참조 연산자 & 를 이용하여 쉽게 변수값에 접근함
n1,n2
C++로 만든 Swap 함수#include<iostream>usingnamespacestd;
voidswap(){inttemp;temp=num1;num1=num2;num2=temp;}
intmain(intargc,constchar*argv[]){intn1=100,n2=200;cout<<"Before:n1="<<n1<<endl;cout<<"Before:n2="<<n2<<endl;swap();cout<<"After:n1="<<n1<<endl;cout<<"After:n2="<<n2<<endl;
return0;}
참조 연산자 & 를 이용하여 쉽게 변수값에 접근함
n1,n2
C++로 만든 Swap 함수#include<iostream>usingnamespacestd;
voidswap(){inttemp;temp=num1;num1=num2;num2=temp;}
intmain(intargc,constchar*argv[]){intn1=100,n2=200;cout<<"Before:n1="<<n1<<endl;cout<<"Before:n2="<<n2<<endl;swap();cout<<"After:n1="<<n1<<endl;cout<<"After:n2="<<n2<<endl;
return0;}
참조 연산자 & 를 이용하여 쉽게 변수값에 접근함
n1,n2
int&num1,int&num2
C++로 만든 Swap 함수#include<iostream>usingnamespacestd;
voidswap(){inttemp;temp=num1;num1=num2;num2=temp;}
intmain(intargc,constchar*argv[]){intn1=100,n2=200;cout<<"Before:n1="<<n1<<endl;cout<<"Before:n2="<<n2<<endl;swap();cout<<"After:n1="<<n1<<endl;cout<<"After:n2="<<n2<<endl;
return0;}
참조 연산자 & 를 이용하여 쉽게 변수값에 접근함
n1,n2
int&num1,int&num2
Swift로 만든 Swap 함수1
importFoundation
funcswap(n1:Int,n2:Int)->(Int,Int){return(n2,n1)}
varn1=100varn2=200
print("Before:n1=\(n1)")print("Before:n2=\(n2)")
(n1,n2)=swap(n1,n2)
print("After:n1=\(n1)")print("After:n2=\(n2)")
Swift로 만든 Swap 함수1
importFoundation
funcswap(n1:Int,n2:Int)->(Int,Int){return(n2,n1)}
varn1=100varn2=200
print("Before:n1=\(n1)")print("Before:n2=\(n2)")
(n1,n2)=swap(n1,n2)
print("After:n1=\(n1)")print("After:n2=\(n2)")
튜플을 반환하는 방식으로 간단하게 구현가능
Swift로 만든 Swap 함수1
importFoundation
funcswap(n1:Int,n2:Int)->(Int,Int){return(n2,n1)}
varn1=100varn2=200
print("Before:n1=\(n1)")print("Before:n2=\(n2)")
(n1,n2)=swap(n1,n2)
print("After:n1=\(n1)")print("After:n2=\(n2)")
튜플을 반환하는 방식으로 간단하게 구현가능
Swift로 만든 Swap 함수2importFoundation
funcswap(inouta:Int,inoutb:Int){lettemporaryA=aa=bb=temporaryA}
varn1=100varn2=200
print("Before:n1=\(n1)")print("Before:n2=\(n2)")
swap(&n1,&n2)
print("After:n1=\(n1)")print("After:n2=\(n2)")
Swift로 만든 Swap 함수2importFoundation
funcswap(inouta:Int,inoutb:Int){lettemporaryA=aa=bb=temporaryA}
varn1=100varn2=200
print("Before:n1=\(n1)")print("Before:n2=\(n2)")
swap(&n1,&n2)
print("After:n1=\(n1)")print("After:n2=\(n2)")
Swift로 만든 Swap 함수2importFoundation
funcswap(inouta:Int,inoutb:Int){lettemporaryA=aa=bb=temporaryA}
varn1=100varn2=200
print("Before:n1=\(n1)")print("Before:n2=\(n2)")
swap(&n1,&n2)
print("After:n1=\(n1)")print("After:n2=\(n2)")
게
Swift로 만든 Swap 함수2importFoundation
funcswap(inouta:Int,inoutb:Int){lettemporaryA=aa=bb=temporaryA}
varn1=100varn2=200
print("Before:n1=\(n1)")print("Before:n2=\(n2)")
swap(&n1,&n2)
print("After:n1=\(n1)")print("After:n2=\(n2)")
게
inout과 & 연산자를 사용하여 외부값을 참조할 수 있음
inout
• 매개변수 중에서 함수내에서 변경된 매개변수가 함수 호출이 종료된 시점에서도 계속 유지되기를 원한다면 inout 키워드를 사용한다
• 매개변수의 값은 함수 안으로 전달되어 변경되고, 함수에서 나와서 원래의 값을 대체함
• 인수를 입출력 파라메터로 넘길때 변수의 이름 앞에 앰퍼샌드(&)를 붙인다
BONUS : Swift로 만든 Swap -함수사용이 필요하지 않음
importFoundation
varn1=100varn2=200
print("Before:n1=\(n1)")print("Before:n2=\(n2)")
(n1,n2)=(n2,n1)//튜플사용
print("After:n1=\(n1)")print("After:n2=\(n2)")
BONUS : Swift로 만든 Swap -함수사용이 필요하지 않음
importFoundation
varn1=100varn2=200
print("Before:n1=\(n1)")print("Before:n2=\(n2)")
(n1,n2)=(n2,n1)//튜플사용
print("After:n1=\(n1)")print("After:n2=\(n2)")
BONUS : Swift로 만든 Swap -함수사용이 필요하지 않음
importFoundation
varn1=100varn2=200
print("Before:n1=\(n1)")print("Before:n2=\(n2)")
(n1,n2)=(n2,n1)//튜플사용
print("After:n1=\(n1)")print("After:n2=\(n2)")
(Int, Int) 튜플을 (Int, Int) 튜플에 복사함
정리
• Swift의 함수는 튜플타입 반환을 허용한다
• 함수의 두번째 매개변수부터는 반드시 레이블을 붙여야 한다
• Swift 2.0 이상
• 함수이름의 중복정의를 허용한다
• inout을 통해서 함수내에서 매개변수의 수정을 허용한다