IOS 프로그래밍

본문 바로가기
사이트 내 전체검색


IOS 프로그래밍
IOS 프로그래밍

2. Swift 문법 기초

페이지 정보

작성자 관리자 댓글 0건 조회 2,787회 작성일 19-11-04 19:13

본문

2. Swift 문법 기초

1. 주석

소스 설명이 필요할 때 사용한다.

필요하지 않는 소스코드를 삭제하지 않고 설명으로 만들 때 사용한다.

​// 한줄 주석

​/*

여러줄 주석

*/

 

2. 변수

 

var 변수명 : 변수타입 = 값

3. 변수타입(원시데이터)

정수​

Integer

Int

예)

var age: Int = 30​

print(age)

실수

Float​

예)

var weight: Float = 70.5​

print(weight)

문자와 변수를 섞어서 출력하기

var age: Int = 30​

print("나의 나이는 \(age) ")

​// Camel 낙타등 타입 : 변수명에 2가지 단어가 들어갈때 중간에 들어가는 단어의 첫글자는 대문자로 쓴다.

​Boolean(Bool)

true(참), false(거짓)

​예) 2가지의 상태로 나타낼 수 있는 것

스위치가 켜졌다, 꺼졌다

내가 밥을 먹었다, 안먹었다

​var haveLunch: Bool = true  또는 false

print("너 점심 먹었냐? \(haveLunch) ")

문자(String)

예) 이름, 주소

var myName : String = "이진관"​

print("나의 이름은 \(myName) ")​

 

​4. 상수

​변하지 않는 수

​예)

​어린이날은 5월 5일

​주민등록번호 앞자리 6글자

let ​상수명: 상수타입 = 값

대박이아빠: 사람 = 이동국​

let  myName: String = "이진관"

print(myName)

var myAge: Int = 21

print(myAge)

myAge = 31

print(myAge)

​// 변수는 값을 변경할 수 있다.

let myAge: Int = 21

print(myAge)

myAge = 31  // Cannot assign to value: 'myAge' is a 'let' constant

print(myAge)

// 상수는 값을 변경할 수 없다.


변수와 상수


변수(variable)는 값을 수정할 수 있고, 상수(constant)는 그렇지 않습니다. 

Swift에서는 언제 어디서 값이 어떻게 바뀔지 모르는 변수보다는 상수를 사용하는 것을 권장하고 있습니다. 그래야 안전하기 때문입니다.


변수는 var로 선언하고, 상수는 let으로 선언합니다.


var name = "Lee Jinkwan"

let homepage = "https://www.leelab.co.kr"


나중에 제가 만약 이름을 바꾸고 싶다면 바꿀 수 있습니다.


name = "이진관"


하지만, 아래와 같이 홈페이지를 바꾸려 한다면 컴파일 에러가 발생합니다.


homepage = "www.leelab.co.kr" // 컴파일 에러!


Cannot assign to value: 'birthyear' is a 'let' constant


let 키워드로 선언된 상수의 값을 변경할 수 없다는 에러입니다. 

이렇게, 바뀌면 안되는 값을 상수로 정의해두면 마음놓고 코딩할 수 있습니다.


Swift는 정적 타이핑 언어입니다. 

변수나 상수를 정의할 때 그 자료형(타입)이 어떤 것인지를 명시해주어야 하는 언어를 말합니다.

예를 들면 .


var name: String = "Lee Jinkwan"

let weight: Float = 78.5

var height: Int = 175


name은 String이고, weight는 Float 이고, height은 Int 타입이 됩니다.

이렇게 변수 또는 상수 이름 뒤에 콜론(:)을 붙이고 자료형을 써주면 된니다. 

이 때 사용하는 : String과 : Int 등을 가지고 타입 어노테이션(Type Annotation)이라고 합니다. 


Swift에서는 타입을 굉장히 엄격하게 다루기 때문에, 다른 자료형끼리는 기본적인 연산조차 되지 않습니다. 

아래와 같이 Int 타입인 height와 Float 타입인 weight을 더하려고 하면 컴파일 에러가 발생합니다.


weight + height // 컴파일 에러!


Binary operator '+' cannot be applied to operands of type 'Int' and 'Float'


일반적인 다른 프로그래밍 언어라면 컴파일에서 에러가 없을 것입니다. 

이럴 때에는 명확하게 다음과 같이 사용해야 합니다.


Int(weight) + height  


처음에는 불편하지만 금방 익숙해질 것입니다.

조금만 응용하면 아래와 같이 숫자를 문자열로 만들 수도 있게 됩니다.


"몸무게가 " + String(weight) + "kg 인 " + name + "입니다." 


Swift에서는 더 간단하게 작성할 수도 있습니다.


"몸무게가 \(weight)kg 인 \(name)입니다." 



타입 추론 (Type Inference)


var name = "Lee Jinkwan"


자료형을 명시하지 않았지만 컴파일 에러가 없습니다.


그런데도 우리는 name이 문자열이라는 것을 알고 있습니다.


Swift 컴파일러도 마찬가지로, 큰 따옴표(")로 감싸진 텍스트는 String 타입인 것을 알고, 숫자는 Int 타입인 것을 인식할 수 있습니다. 

이렇게 타입을 직접 명시하지 않고도 값을 가지고 정적 타이핑을 할 수 있게 해주는 것을 타입 추론(Type Inference)이라고 합니다.



5. 사칙연산(대입문)

​더하기 +

빼기 -

나누기 /

곱하기 *

​일반사칙연산과는 반대

5 + 3 = 8

프로그래밍에서는

A = 3 + 5​

 

 

"3 더하기 5는 A이다" 로 읽는다.

 

let appleNum: Int = 3

let peachNum: Int = 5

print(appleNum + peachNum)

 

print(appleNum / peachNum)

print(appleNum * peachNum) // 0

 

​Int를 Float로 바꾼다.

 

let appleNum: Float = 3

let peachNum: Float = 5

print(appleNum + peachNum)

 

print(appleNum / peachNum)

print(appleNum * peachNum) // 0.6

 

let count: Int = appleNum + peachNum

print(count)

 

// 우측의 값은 좌변의 변수타입에 맞춰서 넣어줘야 한다.

 

 

 

6 조건문 ( if )


논리연산자

같다 : ==

다르다: !=

크다, 작다: >, <

크거나같다, 작거나 같다 : >=, <=


관계연산자

그리고(and) :  &&

또는(or) : ||


 

만약에 ~하면 ~해라

if 조건 {

할일

}

 

  

예)

만약 나이가 20살보다 크다면 성인이시네요

 

let age: = 21

if age > 20 {

print("당신은 성인입니다")

}

 

그렇지 않고 ~ 하다면 ~해라

else if 조건 {

   할일

}

 

let age: = 20

if age > 20 {

print("당신은 성인입니다")

} else if age == 20 {

print("당신은 곧 성인이 되시겠네요")

}

 

그렇지 않다면 ~해라

else {

   할일

}

 

let age: = 5

if age > 20 {

print("당신은 성인입니다")

} else if age == 20 {

print("당신은 곧 성인이 되시겠네요")

} else {

print("당신은 어립니다")​

}​

var age = 19

var student = ""


if age >= 8 && age < 14 {

  student = "초등학생"

} else if age < 17 {

  student = "중학생"

} else if age < 20 {

  student = "고등학생"

} else {

  student = "기타"

}


print(student) // 고등학생 

 

if문의 조건절에는 값이 정확하게 참 혹은 거짓으로 나오는 Bool 타입을 사용해야 합니다. 

위에서 언급한 것과 같이 Swift에서는 타입 검사를 굉장히 엄격하게 하기 때문에, 다른 언어에서 사용 가능한 아래와 같은 코드를 사용하지 못합니다.


var number = 0

if !number { // 컴파일 에러!

  // ...

}


Unary operator '!' cannot be applied to an operand of type 'Int' 


대신, 아래와 같이 써야합니다.


if number == 0 {

  // ...

}


빈 문자열이나 배열 등을 검사할 때에도 명확하게 길이가 0인지를 검사해야 합니다.


if name.isEmpty { ... }

if languages.isEmpty { ... }



switch 문


만약 C나 Java와 같은 프로그래밍 언어를 사용해봤다면 switch는 단순히 값이 '같은지'만을 검사하는 것으로 알고 있을것입니다.

Swift의 switch 구문은 조금 특별합니다. 

패턴 매칭이 가능하기 때문입니다. 

아래 코드는 위에서 작성한 if문을 switch문으로 옮겨본 것입니다.


switch age {

case 8..<14:

  student = "초등학생"

case 14..<17:

  student = "중학생"

case 17..<20:

  student = "고등학생"

default:

  student = "기타"

}


8..<14와 같이 범위 Range 안에 age가 포함되었는지 여부를 검사할 수 있습니다.



7. 반복문

 

 많은 프로그램들이 반복적인 일을 수행하는 용도로 만들어지므로 굉장히 중요한 문법이다. 

사실 문법 자체는 쉽지만 이것을 어떻게 잘 활용하느냐가 코딩을 잘 하는것의 척도가 되므로 창의력을 발휘해서 적재적소에 잘 사용하도록 해야 합니다..


for


for문의 경우 c style 문법과 많이 다르다. 

또한 c style 에는 없는 비교 연산자가 추가되었다. 

처음에는 어색했는데 여러번 보니까 더 직관적인것 같기도 하고 무엇보다 코드가 짧아진다는 장점이 있다.


for [임시 변수] in [범위] {

// to do

}


어떻게 보면 c++11 부터 추가된 for each 문법과 비슷하다. 

단 [임시 변수]에 딱히 값을 저장하지 않고 범위동안 반복만 하고 싶을 때는 임시 변수를 _ 로 생략할 수 있다.



swift 범위 지정자


A...B  :  A, B를 포함한 A부터 B까지 범위


A..<B :  A를 포함하고 B를 포함하지 않은 A부터 B까지 범위



예를 들어 배열에 있는 값들을 출력한다고 하자. 아래와 같이 간단히 작성할 수 있다.


let members = ["JS", "MS", "JH", "HD", "DH", "HC"]


for member in members {

print(member)

// JS

// MS

// JH

// HD

// DH

// HC

}



범위 지정자를 사용해서 같은 동작을 하는 코드를 작성해보자.


for i in 0..<members.count {

print(members[i])

// JS

// MS

// JH

// HD

// DH

// HC

}



stride


반복문을 만들다보면 1씩 증가하거나 감소하는 것이 아니라 원하는 수치만큼 증가하거나 감소하는 반복문이 필요할 때가 있다. 

예를 들어 1부터 100까지 짝수를 출력하는 프로그램을 만들 때 1부터 100까지 1씩 증가하는 반복문에서 짝수인지 검사하여 출력하는 것보다 1부터 100까지 2씩 증가하는 반복문이 더 효율적이다. 


c style for문에서는 증감부에 증감할 값을 적어서 구현했는데 swift에서도 비슷한 기능을 가진 stride함수를 제공한다. 

stride를 사용해서 1부터 100까지 짝수를 출력하는 예제를 보자.


stride(from: to: by:) // open range


stride(from: through: by:) // closed range


for evenNumber in stride(from: 2, through: 100, by: 2) {

print(evenNumber)

}



100을 포함하기 때문에 stride의 두번째 인자로 to: 대신 through: 를 사용하였다.



while


c style while문과 크게 다른점은 없다. 조건문이 참인 동안 블록 안의 코드를 반복한다.



while [조건문] {

// to do

}



do-while과 같은 동작을 하는 repeat-while도 있지만 do->repeat으로 바꼈을 뿐 같은 내용이다.


print("----- For 반복문 -----");

// 사용법 : for ~ in ~ { ... }

// for ( 초기값; 조건식; 증감값 ) : 3.0 버전 이후로는 사용불가

 

for i in 1...3 {

    print(i);

}

print();

 

var str = "swift";

for char in str.characters {

    print(char);

}

print();

 

// 루프변수를 사용하지 않을 경우 생략가능함 '_'이용

for _ in 1...3 {

    print("변수 생략");

}

print();

 

// 중첩도 가능

// 구구단 예제 (2단까지 출력)

print("구구단");

for i in 1..<3 {

    for j in 1..<10{

        print("\(i) X \(j) = \(i * j)");

    }

    print();

}

 

print("----- While 반복문 -----");

// while 구문

var n = 1;

while n < 100 {

    n = n * 2;

}

print("n = \(n)");

 

// repeat ~ while 구문

// 원래는 do ~ while 구문으로 사용하였지만

// 3.0 버전 이후로 명칭을 변경

// 조건문에 관계없이 무조건 한번은 실행

var num = 101;

repeat {

    num = num * 2;

} while num < 100;

print("num = \(num)");



8. 배열(Array)과 딕셔너리(Dictionary)

배열과 딕셔너리는 모두 대괄호([])를 이용해서 정의할 수 있습니다. .

var languages = ["Swift", "Objective-C", "Python"]
var capitals = [
  "한국": "서울",
  "일본": "도쿄",
  "중국": "베이징",
]
배열과 딕셔너리에 접근하거나 값을 변경할 때에도 대괄호를 사용합니다. 

languages[0] // Swift
languages[1] = "Ruby"

capitals["한국"] // 서울
capitals["프랑스"] = "파리"

다른 상수와 마찬가지로 배열과 딕셔너리를 let으로 정의하면 값을 수정할 수 없습니다. 
물론 값을 추가하거나 빼는 것도 불가능합니다.

위에서 정의해본 languages와 capitals의 타입은  대괄호 안에 어떤 타입을 받을 것인지를 명시합니다.

var languages: [String] = ["Swift", "Objective-C", "Python"]
var capitals: [String: String] = [
  "한국": "서울",
  "일본": "도쿄",
  "중국": "베이징",
]

만약 빈 배열이나 빈 딕셔너리를 정의하고 싶다면, 이번에도 대괄호를 씁니다. 

var languages: [String] = []
var capitals: [String: String] = [:]

빈 배열로 선언하는 것을 조금 더 간결하게 하고싶다면, 이렇게 할 수 있어요.

var languages = [String]()
var capitals = [String: String]()

타입 뒤에 괄호(())를 쓰는 것은 생성자Initializer를 호출하는 것입니다.

 

댓글목록

등록된 댓글이 없습니다.


개인정보취급방침 서비스이용약관 모바일 버전으로 보기 상단으로

TEL. 063-469-4551 FAX. 063-469-4560 전북 군산시 대학로 558
군산대학교 컴퓨터정보공학과

Copyright © www.leelab.co.kr. All rights reserved.