**문자 관련 자료형
1. 자료형 : 0개 이상의 문자의 모임
=> 문자를 순서대로 저장하고 마지막에 null을 저장
=> 한줄의 문자열 상수는 " "안에 작성, 여러 줄 문자열 상수를 만들고자 할 경우 """ 문자열 """
=> 문자열 템플릿(보간) : 문자열 안에 다른 변수의 데이터를 문자열로 삽입
- "문자열 상수 \(변수 및 상수) .."
- 변수나 상수가 저장하고 있는 내용을 문자열로 치환하여 삽입
- 다른 언어에서는 String 클래스의 format 이라는 메소드가 이 역할을 수행
=> String 클래스에 한해서는 아직도 Objective-C의 클래스인 NSString을 조금 더 많이 활용
2. 문자 : 1개의 문자 - Character
=> Swift에서는 변수를 만들 때 자료형을 Character로 명시하면 문자
- var 또는 let 변수명 = “A” //String
- var 또는 let 변수명:Character = “A” //Character
3. 제어문자(Escape Sequence)
=> 거의 모든 프로그래밍언어에서 사용하는 것으로 \다음에 하나의 문자를 추가해서 의미를 부여한 것
- \0 : null - nil(자료구조)
- \n : line feed(줄 바꿈)
- \r : garage return(커서를 맨 앞으로 보내는 것)
=> GUI Programming에서 줄바꿈을 하기 위해서 \n을 입력했는데 줄바꿈이 안되면 \r\n으로 입력
- \t : 탭
- \\, \’, \”, \:, \’
=> 정규식을 입력할 때 \를 포함하고자 하면 \\\\ 해야 함
- 콤마나 공백의 경우도 언어에 따라서는 반드시 \와 함께 해야 하는 경우가 있음
- \u{16진수 2자리}, \u{16진수 4자리}, \u{16진수 8자리}
=> 16진수 1개는 4비트 : 한글이나 특수문자를 바이트 코드로 직접 입력할 때 사용
- 직접입력해야 하는 경우는 인코딩 때문
=> 예제 소스
import UIKit
//var는 변수를 만들때 사용
//자료형 추론으로 변수 생성
//자료형 명시하지 않음
var str = "Hello, playground"
//자료형 명시를 이용하여 String 생성
var msg:String = "Swift"
//Character는 반드시 자료형을 명시
var ch:Character = "T"
//값을 변경할 수 없는 상수를 생성
let temp = "HI"
//var로 만든것은 변경 가능
//let으로 만든것은 변경 불가
str = "Hi Playground"
//temp = "Hello"
//상수와 변수 구분
//변수는 2개 이상의 스레드에서 동시에 사용하는 것이 위험, 상수는 상관없음
//콘솔에 출력 - iOS에서는 NSLog가 더 효율적
print(str)
debugPrint(msg)
=> 결과 출력
Hi Playground
"Swift"
**형변환과 자료형 검사
=> 스위프트는 서로 다른 타입의 변수나 상수끼리의 연산을 허용하지 않음
- 정수형이라도 int와 int32는 연산되지 않음
1. 정수, 실수, Bool, String, Character 사이의 형 변환
=> 변환하고자하는 자료형(데이터)로 형변환
=> 생성자를 호출하여 데이터의 자료형 변환
=> var n1:Int = 32, var n2:Int32 = 27 일때,
n1 + n2 는 에러 - swift는 동일한 데이터 형태라도 자료형이 다르면 에러 발생
n1 + Int(n2)의 형태로 연산 - 한쪽 데이터를 다른쪽으로 변환해야 연산 가능
2. 그 외 자료형의 형변환 : as 연산자 사용
=> 상속받은 관계인 경우 형변환 가능 - 상위 클래스 자료형으로 만든것을 하위 클래스 자료형으로 변환시 주로 사용
- UIView view = UIButton();
- view.멤버 -> UIView의 멤버만 호출할 수 있음
- (view as Button).멤버 -> UIButton의 멤버를 호출 할 수 있음
- 오버라이딩된 멤버 호출시 형변환을 안해도 됨
=> Optional(nil을 저장할수 있는 자료형 - 원래 자료형을 wrapping)을 원래 자료형으로 되돌릴때도 사용
=> Swift의 자료형을 Objective-C의 자료형으로 변환하거나 Objective-C의 자료형을 Swift의 자료형으로 변환시도 사용됨
3. 자료형 확인(데이터 is 자료형)
=> 데이터의 자료형과 뒤에 설정한 자료형이 같으면 true, 다르면 false
=> 자료형으로 변환 가능하면 true
4. 소스 작성시 nil 여부 확인과 자료형 확인 작업은 중요
=> swift나 Kotlin이 nil 여부 확인과 번거로움 감소를 위해 Optional을 추가
- 실제 개발자는 nil 검사나 자료형 확인후 작업을 권장
- 클라이언트 프로그램에서는 비추천, 서버 프로그래머들은 nil 검사, 자료형 검사, 예외처리 코드를 작성
5. 숫자 데이터의 형변환
var x : Int = 43
var y : Int32 = 27
print(x + Int(y)) //2개의 자료형이 다르면 연산 불가(형변환하여 연산)
6. API 제공 데이터는 우리가 만드는 자료형과 다를수 있으므로 원하는 자료형으로 변환하여 사용할 수 있어야 함
**Operator(연산자)
=> 연산을 수행할 수 있도록 해주는 부호나 명령어
=> 산술, 논리 연산으로 분류
- 산술 연산 : 숫자데이터를 가지고 수행하는 연산
- 논리 연산 : boolean데이터를 가지고 수행하는 연산
=> swift는 연산자 좌우의 공백이 일치해야 함
- 왼쪽 공백시 오른쪽도 공백이 있어야하고, 왼쪽에 없으면 오른쪽에도 없어야 함
1. 기본할당(assignment) 연산자 : =
=> 오른쪽의 데이터를 왼쪽의 변수에 대입해주는 연산자
=> 왼쪽에는 변수만, 오른쪽에는 표현식(값, 변수, 상수, 연산식, 메소드 호출 구문등)이 오면 됨
2. 산술 연산자
=> %, *, /, +, -
=> %는 정수 데이터에만 사용
=> 실수의 나머지 연산은 truncatingRemainder라는 메소드를 이용
=> &+, &-, &* 은 오버플로우를 허용하는 연산
1) Overflow
=> 크기가 정해진 데이터의 모임에서 크기를 벗어나는 데이터를 추가하고자 하는 경우 발생
- 정해진 Stack의 크기를 넘어서는 것을 StackOverflow라고 함
=> 저장할 수 있는 숫자의 표현 범위를 위쪽으로 넘어선 것
- 보통은 예외를 발생시키지만 상황에 따라 가장 작은 수에서 다시 시작하는 경우도 있음
2) Underflow
=> 데이터의 모임에 데이터가 없는데 꺼낼 때
=> 숫자의 표현범위를 아래쪽으로 넘어선 것
3. 연산자 실습
//Int8은 음수를 포함하여 저장
//-128~+127까지만 저장 가능
var n1 : Int8 = 120
var n2 : Int8 = 8
//print(n1+n2); //예외 발생
//Overflow가 발생하더라도 연산을 수행
var result : Int8 = n1 &+ n2
print(result); //출력값 : -128
//실수의 나머지 구하기
var mod = 1.7.truncatingRemainder(dividingBy: 1.5)
print(mod)
4. 비교 연산자(<, <=, >, >=, ==, !=)
=> 동일한 자료형의 데이터를 가지고 비교하여 결과를 Bool로 리턴하는 연산자
=> 상수는 자동으로 형변환을 수행, 변수는 반드시 자료형을 일치시켜서 수행
=> 참조를 비교하는 ===, !== 연산자도 제공
- 동일한 데이터를 가지고 인스턴스를 생성해서 ==로 비교하면 true가 리턴, ===로 비교시 false가 리턴
5. boolean 논리 연산자
=> boolean 데이터를 가지고 연산하여 boolean으로 결과를 리턴하는 연산자
- !(NOT), &&(AND), ||(OR)
=> !은 하나의 데이터를 받아서 결과를 반대로 리턴하는 연산자(true->false, false->true)
=> &&는 둘다 true일때만 true를 리턴하는 연산자, 첫번째 데이터의 결과가 false이면 뒤 데이터는 확인하지 않음
=> ||는 둘다 false일때만 false를 리턴하는 연산자, 첫번째 데이터의 결과가 true이면 뒤 데이터는 확인하지 않음
=> ! > && > ||
6. 비트 논리 연산
=> 정수 데이터를 이진수로 변환하여 연산을 수행, 결과를 10진 정수데이터로 리턴하는 연산자
=> -(2의 보수연산자)
=> ~(1의 보수연산자) : 0->1, 1->0 결과는 부호를 변경하고 절대값을 1더하거나 빼면 됨
=> &(and) : 둘다 1일때만 1이고, 나머지 경우는 0
=> |(or) : 둘 다 0일때만 0이고, 나머지 경우는 1
=> ^(xor) : 같으면 0, 다르면 1
var n1:Int8 = 11 //0000 1011
var n2:Int8 = 12 //0000 1100
print(n1 & n2) //8
print(n1 | n2) //15
print(n1 ^ n2) //7
7. shift 연산자
=> 정수 데이터를 이진수로 변환해서 연산을 수행한 후 정수 데이터로 리턴
- << : 왼쪽으로 밀기 - 1번 밀 때마다 2배씩 증가
- >> : 오른쪽으로 밀기 - 1번 밀 때마다 1/2로 감소
8. 삼항 연산자
=> 조건 ? true일때 표현식 : false일 때 표현식
9. 복합 할당 연산자(연산자 =)
=> += 은 왼쪽 변수의 데이터에 오른쪽 변수의 값을 더하여 왼쪽 변수에 대입
10. swift 3부터는 ++, --연산자가 없어짐
11. nil 연산자(표현식1 ?? 표현식2)
=> 표현식 1이 nil이면 표현식 2를 수행
=> default를 만들어주는 기능
- 변수 = 표현식1 ?? 표현식2
- 표현식 1이 nil일때 표현식2를 사용
=> 센서의 값을 가져올때 센서가 없다면 뒤의표현식의 값을 대입
//nil연산자 예시
var n : Int?
print(n ?? 10) //n값이 없으므로 10
n = 7
print(n ?? 10) //n값이 있으므로 7
12. 범위 연산자
- start ... end : start부터 end까지의 순서열
- start ..< end : start부터 end전까지
=> start를 생략하면 O
=> end를 생략할 수 있지만 순서열에서는 생략하지 않고 list에서 범위를 나타낼 때 생략시 맨 마지막 인덱스가 됨
=> 무조건 왼쪽에서 오른쪽으로 수행되므로 왼쪽의 숫자가 작아야 함
=> 반대로 수행시 reversed()를 호출
var range = 11...13 //11, 12, 13
for i in range{
print(i)
}
var list = ["제어문", "클래스"]
print(list[0...])
**Control Statement(제어문)
=> 명령의 흐름을 변경할 수 있는 명령어
=> 제어문은 중첩 가능
1. 분류
1) 분기
=> 값에의한 분기 : switch
=> 조건에 의한 분기 : if
2) 반복 - loop, iteration, cursor
=> iteration, cursor(데이터의 모임을 순서대로 순회) : for ~ in
=> loop : while, repeat~while
3) 기타 제어문
=> break : 반복문 내부에서 분기문과 같이 사용하여 반복문을 종료하는 명령어
=> continue : 반복문 내부에서 분기문과 같이 사용하여 다음 반복으로 이동하는 명령어
=> return : 함수의 수행을 종료하고 함수를 호출한 곳으로 제어권을 이동
4) guard
=> if와 반대 형태로 동작하는 제어문으로 조건에 맞지 않으면 return
=> if는 조건에 맞지 않을때 무엇인가를 수행하는 용도, guard는 종료한다는 의미로 사용
2. if
1) 단순 if
if 표현식{
표현식의 결과가 true일 때 수행할 내용
}
=> 표현식의 괄호는 필요없음(관습적으로 하는 것)
2) if~else
if 표현식{
표현식의 결과가 true일때 수행
}else if{
표현식의 결과가 false일때 수행
}
3) if ~ else if ~ else
=> else if는 갯수에 제한 없음
=> else는 생략 가능
if 표현식{
표현식의 결과가 true일때 수행할 내용
}else if 표현식{
위 표현식이 false, 이 표현식이 true일때 수행할 내용
}else{
위 표현식의 결과가 false일때 수행할 내용
}
3. switch
=> 값에 의한 분기인데 범위 연산자 가능
=> case에 where를 추가할 수 있음
=> default가 필수
=> 기본적으로 break가 없어도 fallthrough(아래 구문으로 내려가는 것)가 안됨
- 아래로 내려가고자 하는 경우 fallthrough를 입력
=> 비교할 때 튜플(Tuple - 여러개의 값의 모임) 사용 가능
4. 분기문 실습
//정수
var score = 90;
//A, B, C, D, F와 같은 학점 판별
//기본적으로 fallthrough가 되지 않음(break가 필수가 아님)
//default가 필수
//case에서 where을 이용하여 조건 설정 가능
switch(score){
case 90...100:
print("A")
case 80..<90:
print("B")
case 70..<80 where score % 2 == 0:
print("C이면서 짝수")
case 60..<70 where score % 2 == 1:
print("D이면서 홀수")
default:
print("F")
}
//튜플 생성
var data = ("박문석", 90)
switch data {
case(data.0, 0..<60):
print("\(data.0)은 불합격입니다.")
default:
print("\(data.0)은 합격입니다.")
}
5. while
=> 어떤 조건이 false가 될 때까지 수행하도록 하고자 할 때 사용
=> 반복해야 할 횟수는 알지 못하지만 조건은 알고 있을 때 사용
=> 목적은 repeat ~ while과 동일하지만 의미상 repeat ~ while은 반드시 한번은 한다라는 내용이 포함되어 있음
=> 표현식
while 표현식{
표현식이 false가 아닐때 수행할 내용
}
6. repeat ~ while
=> while과 사용법은 유사
repeat{
표현식이 false가 아닐때 수행할 내용
}while(표현식)
=> 반드시 한번은 수행해야 하는 경우를 이 표현법으로 작성시 가독성이 높은 프로그램으로 간주
7. for ~ in
=> 횟수를 알고 있는 반복이나 데이터의 모임을 순서대로 사용하고자 할때 사용됨 : for~each
=> Array, Dictionary, Set, String, 순서열 등에서 사용
for 임시변수 in 데이터모임{
데이터의 모임을 순서대로 임시변수에 대입하고 수행할 내용
}
=> 임시변수를 사용하지 않을 시, 생략은 안되고, _입력
//swift 에서는 for의 용도가 이전의 for~each : 빠른 열거
var str : String = "Swift"
//문자열도 문자의 모임으로 간주 - for 사용가능
for ch in str{
print(ch)
}
8. 반복문의 중첩
=> 반복문 앞에 레이블 추가 가능
=> break나 continue 할때 레이블명을 같이 작성시 레이블에 해당하는 반복문을 종료하거나 패스
OUTER : for i in 0...3{
for j in 0...10{
//break //j에 해당하는 반복문 종료
break OUTER //OUTER의 반복문 종료
}
9. guard
=> else가 필수
guard 표현식 else{
표현식이 false일 때 수행할 내용
}
if !(표현식){
내용
}
=> 위의 두 구문은 구문 해석상 동일
1) 차이점
=> if는 무엇인가 작업을 수행, guard는 종료하는 역할을 수행하는 경우가 많음
=> 대부분의 경우 { }안에 들어가는 문장은 return
func division(split:Int, divide:Int) -> Int{
return split / divide
}
print(division(split: 10, divide: 3))
//0으로 나눌경우 에러 발생
//print(division(split: 10, divide: 0))
func guarddivision(split:Int, divide:Int) -> Int{
//divide가 0이면 괄호안의 내용 수행
guard divide != 0 else{
print("0으로 나눌수 없음")
return 0
}
return split / divide
}
print(guarddivision(split: 10, divide: 0))
**swift 운영체제 버전 확인
=> UIDevice.current.systemVersion으로 운영체제 버전을 가져올수 있음
- 플랫폼종류.버전의 형태의 문자열로 리턴
- 이 방법을 사용하는 경우 버전에 해당하는 숫자가 존재하는 지 확인해서 사용
- 11버전 이상을 확인 하려면 11, 12, 13이 있는지 확인
=> 제어문을 이용해서 확인할 수 있는 방법을 제공
if #available(플랫폼 종류 버전, *){
버전 이상일때만 동작
}
//11버전 이상일 때
if #available(iOS 11.0, *){
버전 이상일때만 동작
}
=> 스마트폰은 API가 자주 변경되고, 코드 작성시 운영체제 버전에 따라 다른 API를 사용하는 경우가 많으므로 위 구문은 중요
//운영체제 버전 확인
print("운영체제 버전: ", UIDevice.current.systemVersion)
//운영체제 버전이 12이상일때와 그렇지 않을때의 작업
if #available(OSX 12.0, *){
print("운영체제가 12.0 일때 수행할 구문")
}else{
print("운영체제가 12.0 미만일때 수행할 구문")
}
**Optional
=> optional은 자료형명이 아니라 일반 자료형을 nil을 저장할 수 있도록 래핑할 때 사용하는 이름
=> Swift의 자료형들은 기봊거으로 nil을 저장할 수 없음
- 이러한 swift의 자료형에 nil을 저장할 수 있도록 하는 것을 Optional Wrapping이라고 함
- 반대로 Optional Wrapping된 데이터를 swift의 자료형으로 변경하는 것을 Optional Unwrapping이라고 함
=> Optional Wrapping을 하고자 할 경우 자료형명 뒤에 ?를 붙이면 됨
- Optional Wrapping 된 데이터는 다른 데이터와 연산을 할 수 없음
- Optional Wrapping된 변수에만 nil 저장 가능
//var str = nil //이 구문은 에러
//swift에서는 일반 자료형 변수에 nil 대입 불가
var str : String?
str = nil
var n : Int?
n = 30
print(n) //출력의 결과가 30은 아니지만 에러는 아님
//Optional 데이터는 다른 데이터와 연산 불가
//print(n + 20)
1. 옵셔널 해제
=> 명시적 해제
- 강제 해제와 비강제 해제
=> 묵시적 해제
- 컴파일러에 의해서 해제되는 것과 변수 선언시 ? 대신 !을 이용하여 해제
2. 강제 해제
=> 옵셔널 데이터 뒤에 !를 추가하여 강제로 옵셔널을 해제
=> 여기에 대한 책임은 개발자가 짐
=> 잘못될 가능성이 있으므로 개발자가 확인하고 사용해야 한다는 것
=> 권장 형태는 nil인지 확인하고 nil이 아니면 그 경우에만 강제 해제
var n : Int?
n = 30
print(n) // 출력의 결과가 30은 아니지만 에러는 아님
//Optional 데이터는 다른 데이터와 연산을 할 수 없습니다.
//print(n + 20)
//강제해제를 해서 연산을 수행
print(n! + 20)
n = nil
//nil은 강제로 해제가 되지 않기 때문에 확인하고 해제
if n != nil{
print(n! + 20)
}
3. 비강제 해제
=> apple이 제공하는 샘플 코드에서 많이 등장
=> if 나 guard 구문에서 변수나 상수를 생성하고 값을 대입하면 값이 nil이면 false를 리턴하고 그렇지 않으면 true를 리턴
if var 또는 let 이름 = 데이터{
//데이터가 nil이 아닐 때 수행하는 구문
}else{
//데이터가 nil일 때 수행하는 구문
}
=> nil 일 가능성이 있는 메소드 호출을 할 때 많이 이용
4. 컴파일러에 의한 자동 해제
=> Optional 타입에 ==, != 를 이용해서 비교하면 자동해제되서 비교
//컴파일러에 의한 해제 : == 나 != 연산자 사용 시
var z : Int = 70
if z == 70{
print("일치")
}else{
print("불일치")
}
5. 묵시적 해제
=> Optional 변수를 선언할 때 ? 대신에 !를 사용하면 변수를 사용할 때 자동으로 !가 해제
=> iOS Framework에서 인터페이스 빌더(IB - 스토리보드)에서 디자인 한 뷰를 뷰 컨트롤러 클래스에 드래그해서 변수를 생성하면 !를
붙여서 생성하기 때문에 Optional을 해제하지 않고 사용이 가능합니다.
=> 이 경우도 일종의 강제 해제기 때문에 nil 인지 확인하고 사용하는 것을 권장
=> 인터페이스 빌더에서 디자인 한 뷰를 연결한 변수는 반드시 생성되므로 확인없이 사용 - IBOutlet 이라는 단어가 앞에 붙어 있음
//사용할 때 강제 해제 - 비추천
var temp : Int! = 30
//특별한 경우가 아니면 Optional은 var 로 선언
//Optional을 사용하는 이유 중 하나가
//nil을 대입해서 메모리 해제를 하기 위해서 입니다.
**특수 자료형 : swift의 자료형이 아니라 Objective-C 의 자료형
=> Objective-C의 자료형 명은 NS가 앞에 붙음
- Swift : String, Objective-C :NSString
- Objective-C는 Mutable과 없는 것으로 구분
- NSString(수정 불가능), NSMutableString(수정 가능)
=> Any : C언어의 void * - 모든 자료형의 데이터를 저장할 수 있는 자료형
- 저장을 할 때는 어떤 종류의 데이터이건 저장 할 수 있지만 사용시 반드시 강제 형 변환하여 사용
=> AntObject : Java의 Object
- 모든 인스턴스의 참조를 저장할 수 있는 자료형
- 저장시 모든 종류의 인스턴스 저장가능, 사용시 반드시 강제 형변환하여 사용
=> Selector : Swift에서는 함수가 일급 객체(함수도 하나의 자료형)
- 함수 단위로 대입하는 것이 가능하지만 Objective-C는 함수가 일급 객체아 아니므로 함수를 아무곳에나 대입 불가
- 위 문제 해결을 위해 C언어의 함수 포인터처럼 사용가능한 개념 도입
- 형태 : #selector(함수 나 메소드) 형태로 생성
=> 자바는 완전한 객체 지향 언어 : (모든 존재하는 것은 객체 or 클래스 내부에 존재
- 대입의 단위도 무조건 객체 또는 클래스만 가능
- 모든 클래스는 Object 클래스로부터 상속 받아야 함
- Swing, Java F/X or 안드로이드에서 이벤트 핸들링시 실제로 보면 이벤트 발생시 호출되는 것은 함수
- 자바에서는 함수 개념이 없어 클래스를 만들어 함수를 메소드로 선언하고 다시 객체(Listener)를 만들어서 대입
- 사용할 것은 메소드 1개 임에도 불구하고 다른 메소드를 같이 대입해야 함
**Function(함수)
=> 독립적으로 실행할 수 있는 코드 블럭
=> 함수를 실행(call)하면 독립적인 메모리 공간이 하나 할당되고, 그 안에서 필요한 데이터들을 저장
- 수행이 끝나면 할당된 메모리 공간을 소멸시키고 호출한 곳으로 돌아감(return)
- 이 때 사용되는 메모리 공간의 자료구조가 stack이라서 보통 함수가 할당받은 메모리를 stack이라고 함
- 기본적으로는 stack의 크기가 한정되어 있고, 이 크기를 넘어서서 데이터를 저장하면 StackOverflow가 발생
- 예전 시스템 메모리 크기는 1MB여서 Stack의 크기도 1MB(수정 불가)
- 현재 시스템은 메모리 크기가 훨씬 크므로 stack의 크기도 조정가능(IDE에 옵션 있음)
=> 스택의 크기가 한정되어 있으므로 하나의 함수에 너무 많은 코드를 작성하는 것은 바람직하지 않음
=> 함수는 클래스나 인스턴스에 소속되지 않은 것을 의미, 클래스나 인스턴스에 소속된 함수는 메소드
=> 메시지가 오면 리시버가 셀렉터를 호출
- 메시지는 이벤트가되고, 리시버를 메소드를 호출하는 대상(클래스, 인스턴스)이고, 셀렉터가 호출되는 함수
- 다형성(Polymorphsim) : 동일 메시지에 대하여 다르게 반응하는 성질
동일 코드가 상황에 따라 다른 메소드를 호출하는 것
=> 요즘 프로그래밍 언어의 분류
- 함수형 프로그래밍 언어 : Java를 제외한 거의 모든 프로그래밍 언어(C언어를 제외한 나머지는 객체지향 개념 탑재)
-> 함수가 클래스나 인스턴스 안에 없고, 외부에 존재할 수 있는 언어
-> 함수를 만들수는 있지만 빅데이터 처리나 GUI 이벤트 처리가 아니면 대부분 객체 지향 개념을 사용
- 완전한 객체 지향 언어 : Java
1. 함수를 사용하는 이유 - 클래스를 사용하는 이유, 디자인 패턴을 적용하는 이유
=> 재사용성 증가
=> 코드 분리시 가독성이 높아지고 유지보수가 편리
2. 함수의 종류
=> Maker Function : 프로그래밍 언어나 프레임워크가 제공하는 함수
=> User Define Function : 개발자가 필요에 의해 만든 함수
=> 3rd Party Function : 다른 개발자가 만들어준 함수
3. 함수를 생성(선언)
func 함수명(매개변수명 : 자료형 ...) -> 자료형{ 함수내용 }
=> ( )안의 데이터를 argument(매개변수)라고 하고, 상황에 따라 아무것도 없을 수 있음
=> 자료형을 return type이라고 하는데, 함수 리턴시 가지고 가는 데이터의 자료형으로 데이터를 가지고 가지 않는다면 void라고 기재
=> 함수명(매개변수명 : 자료형 ...) -> 자료형 부분을 함수의 원형이라고 함
- API Document를 보면 원형부분만 보여주고 설명
- API 에서는 함수의 내용은 보여주지 않고 원형만 보여주고 설명
=> 함수를 공부할 때는 원형을 보고 함수를 호출하는 것을 먼저 공부
- 작업을 하고자하면 그 작업을 가지고 함수의 원형을 만들수 있어야 함
- 함수의 내용을 채워나가야 함
=> 함수를 만들때는 이름은 다른것과 구분만 되면되고, 어떤 데이터를 받아서 어떤 결과를 만들것인지 생각해야 함
- 내가 받아야 하는 데이터가 argument가 되는 것이고, 결과가 리턴 타입이 됨
- 함수명을 보면 이 함수가 어떤 역할을 할지를 알수 있게 만드는 것이 좋음
- 함수의 코드가 너무 길면 코드를 분리하여 별도 함수를 만들고 호출하는 방식으로 구현
4. 함수를 호출
=> 리턴이 없는 경우 : 함수명(매개변수명:데이터...)
=> 리턴이 있는 경우 : 변수나 상수명 = 함수명(매개변수명:데이터...)
- 리턴되는 데이터를 저장하고 사용
=> swift는 매개변수를 대입할 때 매개변수명을 기재해야 함
- 가독성을 높이기위해서 매개변수 명을 입력
- 안드로이드 스튜디오(인텔리J)가 java문법이 아님에도 이 기능 사용
=> iOS SDK의 매개변수 명은 길기 때문에 외워 쓰는 것은 불가능
- 이름이 매개변수에 대한 설명이므로 이름을 보면 함수의 역할과 어떤 데이터를 가지고 작업하는 지 알수 있음
//매개변수가 없고, 출력도 없는 함수
func disp() -> Void{
print("Hello Function")
}
//disp 호출
disp()
//매개변수 1개 출력 있는 함수(메시지를 입력받아서 출력하는 함수)
func inputDisp(msg : String) -> String{
print(msg)
return msg
}
var result : String = inputDisp(msg: "메롱메롱")
print(result)
result = inputDisp(msg: "헤롱헤롱")
print(result)
//문자열과 정수 1개씩 받아서 문자열을 정수만큼 출력하는 함수
func printString(msg : String, num : Int){
for _ in 0..<num{
print(msg)
}
}
printString(msg: "매개변수가 2개", num: 7)
//매개변수가 2개 이상이면 각 매개변수의 역할을 알기가 어려우므로 이름을 같이 사용
//기존의 서버프로그래밍에서는 매개변수가 2개 이상이면 클래스나 맵으로 묶어서 하나로 만들어 대입 권장
//2개가 넘어가면 순서의 문제가 발생하므로 순서에 상관없이 이름만으로 사용하기 위해 묶어서 사용하는 것을 권장
//apple은 묶어서 대입시 개발자가 어떤 데이터를 묶어서 주어야하는지 어려우므로 묶지않고 나열하는 방식
'수업 정리' 카테고리의 다른 글
90일차 수업 정리(Swift - Function, 구조체, Class, Method) (0) | 2020.08.12 |
---|---|
Swift 에러 정리 (1) | 2020.08.11 |
88일차 수업정리(iOS - 자료형) (0) | 2020.08.10 |
87일차 수업정리(Android - 오디오 재생, 맵 데이터 읽어오기) (0) | 2020.08.07 |
퀵소트(작성중) (0) | 2020.08.05 |