Swift의 온도

Swift #12 - 구조체와 Enum

IT의 온도 2021. 1. 20. 01:01

 

1. 구조체

 

- 객체지향 프로그래밍

#애플리케이션에서 다루는 데이터와 행위

#클래스로 작성하기

 *클래스와 메소드, 프로퍼티

#클래스 외 다른 선택

 *구조체

 *Enum

 

- 구조체 정의

 *struct [구조체 이름] {}

 *좌표를 다루는 구조체 Point 작성

 *프로퍼티와 메소드

struct Point {
    var x = 0
    var y =0
 
    func description() -> String {
        return "Point : \(x), \(y)"
    }
}
cs

 

- 구조체 사용

#구조체 객체

*객체 생성과 사용
 
var p1 = Point
p1.x = 10
p1.y = 20
 
*프로퍼티를 자동으로 초기화하는 객체 생성
 
var p2 = Point(x:3, x:5)
cs

 

- 구조체 초기화

#구조체 객체 초기화

*초기화가 필요한 프로퍼티
 
struct Point {
    var x : Int
    var y : Int
}
 
*프로퍼티 자동 초기화 Initializer
 
var obj2 = Point(x: 10, y : 10)
 
*Initializer 작성
 
struct Point {
    var x : Int
    var y : Int
    init() {
        self.x = 0
        self.y = 0
    }
}
 
*프로퍼티 자동 초기화 Initializer 사용 불가
 
var obj = Point()
cs

 

#구조체의 Initializer

 *Initializer 없이 프로퍼티 초기화 가능

 

#구조체의 Designated Initializer

 *상속 없으므로 부모 클래스로 초기화 위임 없음

 

#구조체의 Convenience Initializer

 *Convenience 키워드 생략

 *Initializer delegation 작성

 

#구조체의 Initializer

struct MyStruct {
    var value : Int
 
    //Designated Initializer
    init(v : Int) {
        self.value = v
}
 
    //convenience Initializer
    init() {
        self.init(v:0)
    }
}
cs

 

- Mutating

#구조체의 프로퍼티 수정

 *초기화 메소드에서 설정 가능

 *구조체 외부에서 설정 가능

 

#구조체 프로퍼티 수정 메소드

 *메소드 선언에 mutating 추가

 

#구조체 내부에서 데이터 수정

*컴파일 에러 발생
 
struct Point {
    var x = 0
    var y = 0
    func moveTo(x : Int, y : Int)
        self.x = x//에러
        self.y = y//에러
    }
}
 
*메소드에 mutating 선언
 
struct Point {
    var x = 0
    var y = 0
    mutating func moveTo(x : Int, y : Int)
        self.x = x
        self.y = y
    }
}
cs
*원소의 값 : rawValue
*rawValue에서 Enum 생성(옵셔널)
 
var ael = Pet(rawValue: 0)
 
*Enum에서 rawValue 얻기
 
ael.rawValue    
cs

- 다른 구조체 타입 : Array

#배열 : struct Array

*배열 내용 유지 - 새로운 배열 생성 API
 
func map<U>(transform:(T) -> U) -> [U]
func reverse() -> [T]
func filter(includeElement: (T) -> Bool-> [T]
 
*배열 내용 변경 API
 
mutating func insert(newElement: T, atIndex i: Int)
mutating func remove(at index: Int-> T
cs

 

- 정적 메소드와 정적 프로퍼티

*static 키워드
*정적 저장, 정적 계산 프로퍼티
 
struct MyStruct {
    static func staticFunc() {
        print("정적 메소드")
    }
 
    static var staticProperty : Int!
}
 
MyStruct.staticFunc()
MyStrunt.staticProperty = 10
cs

 

 

2. 클래스와 구조체

 

- 클래스와 구조체

#구조체와 클래스 모두 있는 것

 *프로퍼티와 메소드

 *초기화(Initializer)

 

#구조체에는 없고 클래스에 있는 것

 *상속과 재정의 

 *ARC

 

#레퍼런스(Reference) 타입과 밸류(Value) 타입

 *클래스, 구조체, 레퍼런스 타입, 밸류 타입

 

#객체 대입

 *클래스 : 참조 복사

 *구조체 : 복사

*클래스 : 객체 참조 추가
 
let obj1 = MyClass()
let obj2 = obj1
 
*구조체 : 복사
 
let struct1 = MyStructure()
let struct2 = struct1
cs

 

- 레퍼런스 타입(class)

#객체 공유

class MyClass {
    var value = 0
}
 
var obj1 = MyClass()
var obj2 = obj1
 
obj1.value = 10
obj2.value
cs

 

- 밸류 타입(struct)

#객체 복사

struct MyStruct {
    var value = 0
}
 
var obj3 = MyStruct()
var obj4 = obj3
 
obj3.value = 10
obj4.value
cs

 

- Swift의 밸류 타입

#밸류 타입

 *Int, Double, Float, Bool

 *String, Character

 *Array

 *Dictionary

 *Set

 *Struct, Enum

 

- 클래스와 구조체

#클래스와 구조체 중 무엇을 사용할까?

 *iOS, macOS에서 사용하는 프레임워크 - 클래스 종속적인 API

 

#프로토콜 기반의 프로그래밍(POP)

 *WWDC에서의 발표

 *구조체와 프로토콜을 이용한 프로그래밍 기법

 

3. Enum

 

- Enum Type

#열거형(Enumeration Type)

*원소 중 하나의 값
*Enum 정의
 
enum Day {
    case am
    case pm
}
 
enum Pet {
    case cat, dog, other
}
 
*Enum 사용
 
var now : Day
now = Day.am
now = Day.pm
cs

 

- Enum과 switch

*switch와 사용
*타입 정보가 있는 곳 - Enum 이름 생략
 
var now : Day.am
swtich now {
case .am:
    print("오전")
case .pm:
    print("오후")
}
cs

 

- Enum 타입

#Enum 원소 타입

*원소 타입 사용하기
*Int 타입 원소 값 설정 생략
 
enum Pet Int {
    case cat = 0, dog, other
}
 
*Int타입 외 값 설정 생략 불가
 
enum Device : String {
    case phone = "휴대폰", pad = "패드"
}
cs

 

#원소 타입이 있는 Enum

*원소의 값 : rawValue
*rawValue에서 Enum 생성(옵셔널)
 
var ael = Pet(rawValue: 0)
 
*Enum에서 rawValue 얻기
 
ael.rawValue    
cs

 

- Enum : 프로퍼티와 메소드

#프로퍼티(계산)와 메소드

enum Pet : Int {
    case cat, dog
 
    var name : String {
        switch self {
        case.cat:
            return "고양이"
        case.dog:
            return "강아지"
        }
    }
    func description() -> String {
        return self.name
    }
}
cs

 

4. 중첩 타입

 

#타입 내부에 타입 정의

*클래스, 구조체, Enum 내부에 타입 정의
 
struct Rectangle {
    struct Point {
        var x, y : Int
    }
    struct Size {
        var width, height : Int
    }
    var origin : Point
    var size : Size
 
    init() { // 초기화 코드 }
}
cs

 

#중첩 타입 접근

let point = Rectangle.Point(x: 10, y: 10)
let size = Rectangle.Size(width: 100, height: 100)
cs