일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- c언어
- 스위프트
- 파이썬
- 데이터셋 만들기
- 카카오
- SwiftUI
- 소수
- coco 데이터셋
- 카카오 2021
- swift
- 머신러닝
- 최솟값 만들기
- Siwft
- 카카오 2020
- swift 배열
- fast.ai
- 카카오 2019
- roboflow
- swift 시작
- ios 개발 시작
- 프로그래머스
- 날씨 앱
- 카카오 2018
- Python
- Kakao
- supervisely
- 문제
- 이미지학습
- 프로그래머스 답
- kakao 2018
Archives
- Today
- Total
잡초의 일지
[Swift] Object | Class | Data , Property , Method 본문
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