어흥

[Swift] Structure, Class 본문

iOS

[Swift] Structure, Class

라이언납시오 2020. 8. 27. 17:33
728x90
반응형

1. 차이

Structure Class
Value type Reference type
Copy Share
Stack에 저장 Heap에 저장
Fast Slow

  1) 각각 사용해야 할 때

    [Struct를 써야 할 때]

      1. 두 Object를 같다, 다르다로 비교해야 하는 경우

      2. Copy된 각 객체들이 독립적인 상태를 가져야 하는 경우

      3. 코드에서 오브젝트의 데이터를 여러 쓰레드 걸쳐 사용할 경우(여러 쓰레드가 접근할 경우)

   

    [Class를 써야 할 때]

      1. 두 Object의 인스턴스 자체가 같음을 확인해야 할 때

      2. 하나의 객체가 필요하고, 여러 대상에 의해 접근되고 변경이 필요한 경우 

 

예시 코드)

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: "Jack", age: 25)
let pClass2 = pClass1
pClass2.name = "Hey"

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


var pStruct1 = PersonStruct(name: "Jakop", age: 30)
var pStruct2 = pStruct1
pStruct2.name = "Jessie"

pStruct1.name       //Jakop
pStruct2.name       //Jessie

※주의

- Class와 Structure의 store property Age를 let으로 설정하고 바꾸려고 시도했을 때

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

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

let pClass = PersonClass(name: "Jack", age: 25)
pClass.age = 20			//No Error

let pStruct = PersonStruct(name: "Jakop", age: 30)
pStruct.age = 20		//Error

결과: Structure는 Value type이라서 Error발생, Class는 Reference type이라서 에러 발생x

 

2. Structure

  1) 구성: Object의 형태로, Data + Method로 이루어져 있다.

 

  2) 코드

//1. 강의 이름, 강사 이름, 학생수를 가지는 Struct 만들기(Lecture)
//2. 강의 어레이어와 강사이름을 받아서, 해당 강사의 강의 이름을 출력하는 함수 만들기
//3. 강의 3개 만들고 강사 이름으로 강의 찾기

struct Lecture{
    var lectureName: String
    var teacher: String
    var studentNum: Int
    
    init(lectureName: String, teacher: String, studentNum: Int){
        self.lectureName = lectureName
        self.teacher = teacher
        self.studentNum = studentNum
    }
}

func printLectureName(lectures: [Lecture], name: String){
    for lec in lectures{
        let tname = lec.teacher
        let lname = lec.lectureName
        if tname == name {
            print(lname)
        }
    }
}

let l1 = Lecture(lectureName: "PE",teacher: "Ashe",studentNum:20)
let l2 = Lecture(lectureName: "Science",teacher: "Josh",studentNum:15)
let l3 = Lecture(lectureName: "Math",teacher: "Amily",studentNum:25)

let lectures = [l1,l2,l3]
printLectureName(lectures: lectures, name: "Amily")		//Math
728x90
반응형

'iOS' 카테고리의 다른 글

[Swift] Property, Method  (0) 2020.09.01
[Swift] Protocol  (0) 2020.08.28
[Swift] Closure  (0) 2020.08.26
[Swift] Dictionary, Set  (0) 2020.08.25
[Swift] 배열  (0) 2020.08.25
Comments