[swift] 08. Struct (구조체)


스위프트에는 클래스와 구조체가 있다.

구조체와 클래스는 데이터를 용도에 맞게 프로그래밍 할 때 편리하다. 즉, 사용자 정의 데이터 타입을 만들 수 있다.

구조체는 값 타입이며, 클래스는 참조 타입이라는 차이점을 가지고 있다.

구조체는 다음과 같이 작성할 수 있다.

struct 구조체 이름 {
    프로퍼티와 메서드
}




예제

struct User {
    var nickname: String
    var age: Int

    func information() {
        print("\(nickname) \(age)")
    }
}

var user = User(nickname: "이준혁", age: 22)

print("user.nickname: \(user.nickname)")
print("user.age: \(user.age)")

user.nickname = "김철수"
print("\nuser.nickname: \(user.nickname)")

user.information()

출력 결과

user.nickname: 이준혁
user.age: 22

user.nickname: 김철수
김철수 22

[swift] 07. Optional (옵셔널)


옵셔널이란 값이 있을 수도 있고 없을 수도 있다 라는 의미이다.



다음과 같이 옵셔널 변수를 생성할 수 있다.

var name: String?

옵셔널 변수는 nil(다른 언어에서는 Null)과 같다.

var name: String? = nil




옵셔널 예제 코드

var name: String?

var optionalName: String? = "Gunter" // 값을 선언할 수도 있다.
print("optionalName: \(optionalName)")

// var requiredName: String = optionalName -> error
// 에러가 나는 이유는 옵셔널로 선언된 변수는 코드가 실행되기 전까지 값이 있는지 없는지 알 수가 없기 때문에 대입할 수 없다.

출력 결과

optionalName: Optional("Gunter")






Optional binding (옵셔널 바인딩)

옵셔널 해제 방법


  • 명시적 해제

    • 강제 해제
    • 비강제 해제(옵셔널 바인딩)


  • 묵시적 해제

    • 컴파일러에 의한 자동 해제
    • 옵셔널의 묵시적 해제




명시적 해제

옵셔널 강제 해제

옵셔널 선언된 변수 뒤에 !를 붙이면 강제로 해제하게 된다.
하지만 강제로 해제하는 것은 에러가 발생해 프로그램이 강제 종료될 수 있는 위험이 따른다.


코드

var number: Int? = 3
print(number)
print(number!)

출력 결과

Optional(3)
3


좀 더 안전하게 해제하려면 비강제 해제(옵셔널 바인딩)을 사용하면 된다.




비강제 해제(옵셔널 바인딩)

if를 사용하여 옵셔널 바인딩(추출 방법이다.)


if문을 사용한 옵셔널 바인딩

var number: Int? = 3
if let result = number { // result는 if문 내에서만 사용 가능하다.
    print(result)
}

출력 결과

3



guard를 사용한 옵셔널 바인딩

if만을 사용한 옵셔널 바인딩은 if문 내에서만 바인딩한 변수를 사용할 수 있기 때문에 guard를 사용한다.

func test() {
    let number: Int? = 5
    guard let result = number else { return }
    print(result)
}
test()

출력 결과

5




묵시적 해제

비교 연산자를 사용한 옵셔널 바인딩

비교 연산자를 사용하면 컴파일러가 자동으로 바인딩해 준다.

leet value: Int? = 6
if value == 6 {
    print("value가 6입니다.")
} else {
    print("value 6이 아닙니다.")
}

출력 결과

value가 6입니다.



묵시적 해제

let string = "12"
var stringToInt1: Int? = Int(string) // 문자열이 숫자 외의 문자가 들어가게 되면 nil을 반환하게 된다. 그렇기 때문에 옵셔널 타입으로 선언하기 위해 아래와 같이 !를 써야한다.
var stringToInt2: Int! = Int(string)
print(stringToInt)

출력 결과

13

[swift] 06. Iteration (반복문)


반복적으로 코드가 실행되게 만드는 구문을 말한다.

for-in, while, repeat-while 문이 존재한다.




for-in 문

// for 루프상수 in 순회대상 {}

for i in 1...4 { // 1 ~ 4 까지 4번 반복
    print(i)
}

let array = [1, 2, 3, 4, 5]
print("\narray: ")
for i in array {
    print(i)
}

출력 결과

1
2
3
4

array: 
1
2
3
4
5




while 문

var number = 5
while number < 10 {
    number += 1
}

print("number: \(number)")

출력 결과

number: 10




repeat while 문

var x = 6
repeat {
    x += 2
} while x < 5

print("x: \(x)")

출력 결과

x: 8

[swift] 05. Conditional (조건문)


주어진 조건에 따라서 에플리케이션을 다르게 동작하도록 하는 것.

if, switch, guard 문이 존재한다.




if 문

let animal = "cat"
if animal == "dog" {   // 조건식이 만족하면 해당 구문 실행
    print("강아지 사료 주기")
} else if animal == "cat" { // 조건식 2를 만족하면 해당 구문 실행
    print("고양이 사료 주기")
} else {    // 아무 조건식도 만족하지 않으면 해당 구문 실행
    print("해당하는 동물 사료가 없움")
}

출력 결과

고양이 사료 주기




switch 문

기본 switch 문

let color = "white"

switch color {
    case "red":
        print("파란색 입니다.")
    case "green":
        print("초록색 입니다.")
    case "blue":
        print("파란색 입니다.")
    case "yellow":
        print("노란색 입니다.")
    default:
        print("찾는 색상이 없습니다.")
}

출력 결과

찾는 색상이 없습니다.


switch문 범위로 사용

let temperature = 30

switch temperature {
    case -20...9:
        print("겨울 입니다.")
    case 10...14:
        print("가을 입니다.")
    case 15...25:
        print("봄 입니다.")
    case 26...35:
        print("여름 입니다.")
    default:
        print("이상 기후입니다.")
}

출력 결과

여름 입니다.

[swift] 04. Function (함수)


함수는 작업의 가장 작은 단위이자 코드의 집합이다.
함수를 사용하는 가장 큰 이유는 반복적인 프로그래밍을 피할 수 있기 때문이다.

함수의 크기에 대해 명시된 규칙은 없으나, 대략 하나의 기능을 하나의 함수로 만드는 것이 가장 바람직하다.




함수 생성 방법

func 함수명(파라미터 이름: 데이터 타입) -> 반환 타입 {

}



매개변수가 존재하는 함수

func sum(a: Int, b: Int) -> Int {
    return a + b
}
sum(a: 5, b: 3)

출력 결과

8



매개변수가 없는 함수

func hello() -> String {
    return "hello"
}
hello()

출력 결과

hello



반환 값이 없는 함수

func printName1() {

}

func printName2() -> Void {

}

func greeting(friend: String, me: String = "gunter") { // me에 기본 매개변수 값 "gunter"를 지정한다.
    print("Hello, \(friend)! I'm \(me)")
}
greeting(friend: "Albert")

출력 결과

Hello, Albert! I'm gunter




전달인자

전달인자 레이블을 사용할 경우 사용자 입장에서 매개변수의 역할을 좀 더 명확하게 표현할 수 있다.
즉 코드의 가독성이 좋아진다.
전달인자를 사용하지 않을 경우 _ 를 사용하면 된다.

전달인자 레이블

func sendMessage(from myName: String, to name: String) -> String {
    return "Hello \(name)! I'm \(myName)"
}

func sendMessage(_ name: String) -> String {
    return "Hello \(name)"
}

sendMessage(from: "Gunter", to: "Json")
sendMessage("권태완")

출력 결과

Hello, Json! I'm Gunter
Hello 권태완




가변 매개변수

가변매개변수로 들어온 인자는 배열처럼 사용할 수 있다.

가변 매개변수 코드

func sendMessage(me: String, friends: String...) -> String { // 가변 매개변수는 맨 뒤, 하나를 지정할 수 있다.
    return "Hello \(friends)! I'm \(me)"
}

sendMessage(me: "Gunter", friends: "Json", "Albert", "Stella")

출력 결과

Hello, ["Josn", "Albert", "Stella"]! I'm Gunter