본문 바로가기
모바일앱/Swift

구조체와 클래스의 차이점

by GeekCode 2021. 10. 11.
반응형

구조체와 클래스

지금까지 기본적인 Basic Type과 그것들을 어떻게 저장하는지 배웠다.

 

이 값들을 많이 저장 할 때, 서로 관계하는 값들을 한꺼번에 관리하거나 표현하고 싶을 때 어떻게 할까?

iOS강의 정보라면 강사정보, 강의 이름, 학생 수 등등 낱개 관리가 아니라 덩어리로 관리한다.

관계가 있는 여러 데이터를 묶어서 표현

Object = Data + Method

 

 

Structure VS Class

Structure Class
Value Types Reference Types
Copy Share
컴퓨터 안에 할당 되는 공간
Stack
컴퓨터 안에 할당 되는 공간
Heap

 

import SwiftUI


class PersonClass {
    var name: String
    var age: Int
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

struct PersonStruct {
    var name: String
    var age: Int
    
    init(name: String, age: Int){
        self.name = name
        self.age = age
    }
}



let pClass1 = PersonClass(name: "Jason", age: 5)
let pClass2 = pClass1
pClass2.name = "Hey"

pClass1.name //"Hey"
pClass2.name //"Hey"

var pStruct1 = PersonStruct(name: "Jason", age: 5)
var pStruct2 = pStruct1
pStruct2.name = "Hey"

pStruct1.name //"Jason"
pStruct2.name //"Hey"
더보기

Class는 새로운 변수에 할당 할때 하나의 인스턴스를 가리키고있지만

Struct는 새로운 변수에 할당 할때  기존에 있던 것을 새롭게 복사한 인스턴스를 가리킨다.

 

구조체 실습

더보기
// 문제: 가장 가까운 편의점 찾기
//

// 거리 구하는 함수
// func distance(current: (x : Int, y : Int), target: (x : Int, y : Int)) -> Double {
func distance(current: Location, target: Location) -> Double {

    // 피타고라스
    let distanceX = Double(target.x - current.x)
    let distanceY = Double(target.y - current.y)
    let distance = sqrt(distanceX * distanceX + distanceY + distanceY)
    return distance
}


// 맨 처음 시작시.... 코드
struct Location {
    let x: Int
    let y: Int
}

struct Store {
    let loc: Location
    let name: String
    let deliveryRange = 2.0
    
    //배달가능한지보는 함수
    func isDeliverable(userLoc: Location) -> Bool {
        let distanceToStore = distance(current: userLoc, target: loc)
        return distanceToStore < deliveryRange
    }
}


// 현재 스토어 위치들
////let store1 = (x : 3, y : 5, name : "gs")
////let store2 = (x : 4, y : 6, name : "seven")
////let store3 = (x : 1, y : 7, name : "cu")
let store1 = Store(loc: Location(x : 3, y : 5), name : "gs")
let store2 = Store(loc: Location(x : 4, y : 6), name : "seven")
let store3 = Store(loc: Location(x : 1, y : 7), name : "cu")


// 가장 가까운 스토어를 구해서 프린트 하는 함수
/// func printClosestStore(currentLocation:(x:Int, y:Int), stores:[(x: Int, y:Int, name: String)]) {
// func printClosestStore(currentLocation: Location, stores:[(loc: Location, name: String)]) {
func printClosestStore(currentLocation: Location, stores:[Store]) {

    var closestStoreName = ""
    var closestStoreDistance = Double.infinity
    var isDeliverable = false
    
    for store in stores {
//        let distanceToStore = distance(current: currentLocation, target: (x: store.x, y: store.y))
        let distanceToStore = distance(current: currentLocation, target: store.loc)
        closestStoreDistance = min(distanceToStore, closestStoreDistance)
        if closestStoreDistance == distanceToStore {
            closestStoreName = store.name
            isDeliverable = store.isDeliverable(userLoc: currentLocation)
        }
    }
    print("Closest store: \(closestStoreName), isDeliverable: \(isDeliverable)")
}


//Stores Array 세팅, 현재 내 위치 세팅
//// let myLocation = (x :2, y : 2)
let myLocation = Location(x :2, y : 2)
//let myLocation = Location(x: 2, y: 5)


let stores = [store1, store2, store3]

// printClosestStore 함수를 이용해서 현재 가장 가까운 스토어 출력하기
printClosestStore(currentLocation: myLocation, stores: stores)
//Closest store: gs
//---> Location struct >>> Closest store: gs
//----> Store struct >>> Closest store: gs
//-----> Closest store: gs, isDeliverable: false


//Improve Code
// - make Location struct
// - make Store struct

 

반응형

'모바일앱 > Swift' 카테고리의 다른 글

프로퍼티 vs 메소드  (0) 2021.10.14
프로퍼티 개념  (0) 2021.10.13
프로토콜  (0) 2021.10.13
Struct만들기 도전과제  (0) 2021.10.12
Collection - Closure, Capturing Values  (0) 2021.10.10
Collection - Set  (0) 2021.10.10
Collection - Dictionary  (0) 2021.10.10
Collection - Array  (0) 2021.10.09