잡초의 일지

[Swift] Object | Class | Data , Property , Method 본문

[코딩] 배우는것/Swift

[Swift] Object | Class | Data , Property , Method

JabCho 2020. 7. 13. 01:48
728x90
반응형
SMALL

Object = Data + Method

object는 struct나 class 형태로 구현할 수 있다.

이곳에서는 class로 구현한다. struct와 개념은 똑같지만, 기능적인 차이가 있다.

Class

구조체 클래스
값 타입 참조 타입
복사 참조(공유)
Stack(빠르다) Heap(느리다)

두 타입이 할당되는 메모리 공간이 달라서 달라지는것이다.

 

구조체 쓰면 좋은 경우 클래스 쓰면 좋은 경우
1. 두 objecct를 비교하는 경우 1. 두 오브젝트의 인스턴스 자체가 같음을 확인할 때
2. 복사된 객체들이 독립된 상태로 관리되어야 하는 경우 2. 하나의 객체가 필요하고, 여러 대상에 의해 접근되고 변경이 필요한 경우
3. 코드에서 오브젝트의 데이터를 여러 스레드에 걸쳐 사용할 경우(안전)  

 

Class 상속 쓰는 방법

A는 B이다 라는 명제가 참이면 사용해도 된다.

예를들어, 사람 이라는 클래스와 학생이라는 클래스가 있다면, 학생->사람 은 참인 명제이다. 사람->학생은 거짓이다. 모든 사람이 학생일 수는 없기 때문이다. 따라서 학생 클래스는 사람 클래스를 상속받을 수 있다.

 

사람 : 슈퍼클래스(부모클래스)

학생 : 서브클래스(자식클래스)

 

자식은 한개의 부모클래스만 상속 받는다.

부모는 여러 자식들을 가질 수 있다.

상속의 깊이는 상관 없다.(계속 상속해도 된다. 상속의상속의상속의....)

class Person {
    var firstName: String
    var lastName: String

    init(firstName: String, lastName: String) {
        self.firstName = firstName
        self.lastName = lastName
    }

    func printMyName() {
        print("My name is \(firstName) \(lastName)")
    }
}

class Student: Person {
    var grades: [Grade] = []
}

 

상속받은 자식 클래스는 다른 형태로 생성자를 만들수 있다. (initialize)

 

Designated Initialization Vs Convenience Initialization

designated initialization은 자신의 부모의 designated initialization을 호출해야 함.

convenience initialization은 같은 클래스의 이니셜라이저를 꼭 하나 호출해야 함.

convenience initialization은 궁국적으로 designated initialization을 호출해야 함.

import UIKit

struct Grade {
    var letter: Character
    var points: Double
    var credits: Double
}

class Person {
    var firstName: String
    var lastName: String

    init(firstName: String, lastName: String) {
        self.firstName = firstName
        self.lastName = lastName
    }

    func printMyName() {
        print("My name is \(firstName) \(lastName)")
    }
}

class Student: Person {
    var grades: [Grade] = []
    
    override init(firstName: String, lastName: String) {
        super.init(firstName: firstName, lastName: lastName)
    }
    
    convenience init(student: Student) {
        self.init(firstName: student.firstName, lastName: student.lastName)
    }
    
    
}

// 학생인데 운동선수
class StudentAthlete: Student {
    var minimumTrainingTime: Int = 2
    var trainedTime: Int = 0
    var sports: [String]
    
    init(firstName: String, lastName: String, sports: [String]) {           // initialize 할 때 자식클래스 먼저 하고 그 다음 부모 클래스 한다.
        // Phase 1
        self.sports = sports
        super.init(firstName: firstName, lastName: lastName)
        
        // Phase 2-->프로퍼티 접근이나 자기가 갖고있는 메서드 호출 가능.
        self.train()
    }
    
    
    convenience init(name: String) {        // 간략하게 축소하고 간편하게 쓸 수 있게 함.
        self.init(firstName: name, lastName: "", sports: [])
    }
    
        
    func train() {
        trainedTime += 1
    }
}

// 운동선인데 축구선수
class FootballPlayer: StudentAthlete {
    var footballTeam = "FC Swift"

    override func train() {
        trainedTime += 2
    }
}

let student1 = Student(firstName: "Jason", lastName: "Lee")
let student1_1 = Student(student: student1)
let student2 = StudentAthlete(firstName: "Jay", lastName: "Lee", sports: ["Football"])
let student3 = StudentAthlete(name: "Mike")


 

Class 예시 코드

import UIKit

struct personStruct{
    var firstName: String
    var lastName: String
    
    init(firstName: String, lastName: String) {     // 클래스 객체 생성할때 쓰는 생성 함수 구조체에서도 쓸 수 있다.
        self.firstName = firstName
        self.lastName = lastName
    }
    
    var fullNAme: String{
        return "\(firstName) \(lastName)"
    }
    
   mutating func uppercaseName(){
        firstName = firstName.uppercased()
        lastName = lastName.uppercased()
    }
}



class personClass {
     var firstName: String
     var lastName: String
    
    init(firstName: String, lastName: String) {     // 클래스 객체 생성할때 쓰는 생성 함수
        self.firstName = firstName
        self.lastName = lastName
    }
    
    var fullNAme: String{
         return "\(firstName) \(lastName)"
     }
    
    func uppercaseName(){       // mutating은 클래스에서 사용 안함
         firstName = firstName.uppercased()
         lastName = lastName.uppercased()
     }
}


var personStruct1 = personStruct(firstName: "Alice", lastName: "Kim")
var personStrunt2 = personStruct1

var personClass1 = personClass(firstName: "Alice", lastName: "Kim")
var personClass2 = personClass1

personStrunt2.firstName = "Park"
personStruct1.firstName
personStrunt2.firstName

personClass2.firstName = "Park"
personClass1.firstName
personClass2.firstName




personClass2 = personClass(firstName: "Bob", lastName: "Lee")       // 이 경우는 personClass2를 새로 생성해주는거라 1이랑2랑 서로 다른거 참조하게 됌.
personClass1.firstName
personClass2.firstName

personClass1 = personClass2
personClass1.firstName
personClass2.firstName
728x90
반응형
LIST

'[코딩] 배우는것 > Swift' 카테고리의 다른 글

[Swift] typealias  (0) 2020.08.09
[Swift] Generics 제네릭  (0) 2020.07.14
[Swift] Method  (0) 2020.07.10
[Swift] Object | Structure | Data , Property , Method  (0) 2020.07.10
[Swift] Protocol 프로토콜  (0) 2020.07.10
Comments