11. 클래스
//: Playground - noun: a place where people can play
import UIKit
//1
//구조체 정의
struct info {
var name: String
var age: Int
}
//2
//구조체 인스턴스의 생성 및 초기화
// 프로퍼티 이름(name, age)로 자동 생성된 이니셜라이저를 사용하여 구조체를 생성한다.
var meinfo: info = info(name:"kang", age:24)
meinfo.age = 100 //변경가능
meinfo.name = "sola" //변경가능
let youinfo: info = info(name:"hong", age:55)
// youinfo.age = 200 //변경불가 오류!
// youinfo.name = "dong" //변경불가
//3 클래스
class Person{
var height: Float = 0.0
var weight: Float = 0.0
}
//3-1
//인스턴스가 생성되고 초기화 된후 프로퍼티 값에 접근하고 싶다면 마침표를 사용하면 된다.
// 구조체와 다르게 클래스의 인스턴스는 참조타입이므로 클래스의 인스턴스를 상수 let으로 선언해도 내부 프로퍼티 값을 변경할 수 있다.
var abcnt: Person = Person()
abcnt.height = 123.4
abcnt.weight = 123.4
let mom: Person = Person()
mom.height = 333.3
mom.weight = 222.2
//4
//생성과 소멸
//인스턴스는 참조 타입이므로 더는 참조할 필요가 없을 때 메모리에서 해제 된다.
// 이과정을 소멸이라고 하는데 소멸되기 직전 deinit이라는 메서드가 호출 된다.
//클래스 내부에 deinit메서드를 구현해주면 소멸되기 직전에 호출 된다, 클래스당 하나만 구현할 수 있다. 매개변수와 반환값을 가질 수 도 있다.
class Person2{
var height: Float = 0.0
var weight: Float = 0.0
deinit {
print("person2클래스의 인스턴스가 소멸된다.")
}
}
var yaya: Person2? = Person2()
yaya = nil // person클래스의 인스턴스가 소멸된다.
/*
구조체와 클래스 차이
같은점:
- 값을 저장하기 위해 프로퍼티 사용가능, 기능 실행을 위해 메서드 정의 가능,
- 서브스크립트 문법을 통해 구조체 또는 클래스가 갖는 값(프로퍼티)에 접근하도록 서브스크립트를 정의 할 수 있다.
- 초기화 될때의 상태를 저장하기 위해 이니셜라이저를 정의 할 수 있다.
- 초기구현과 더불어 새로운 기능을 추가하기 위해 익스텐션 기능을 통해 확장할 수 있다.
- 특정 기능을 실행하기 위해 특정 프로토콜을 준수할 수 있다.
다른점:
- 구조체는 상속할 수 없다.
- 타입캐스팅은 클래스의 인스턴스에서만 허용된다.
- 디이니셜라이저는 클래스의 인스턴스에서만 활용할 수 있다.
- 참조 횟수 계산은 클래스의 인스턴스에만 적용된다.
*핵심
클래스는 참조타입이라서 전달될때 참조(주소)가 전달되고
구조체는 값이 전달 된다.
*/
struct Myinfo2 {
let name: String
var age: Int
}
var naInfo: Myinfo2 = Myinfo2(name: "gildong", age: 60)
naInfo.age = 100
// naInfo의 값을 복사하여 할당한다.
var friendInfo: Myinfo2 = naInfo
print("na age: \(naInfo.age)") //100
print("na age: \(friendInfo.age)") //100
friendInfo.age = 999
print("na age: \(naInfo.age)") //100
print("na age: \(friendInfo.age)") //999 friendInfo는 naInfo의 값을 복사해왔기 때무넹 벼개의 값을 갖는다.
// --------------------------------------------------------------------------------------------------- //
class Animal {
var height: Float = 0.0
var weigth: Float = 0.0
}
var tiger: Animal = Animal()
var rabit: Animal = tiger
print("tiger s heigth \(tiger.height)") //0.0
print("rabit s heigth \(rabit.height)") //0.0
rabit.height = 2.0
print("tiger s heigth \(tiger.height)") //2.0
print("rabit s heigth \(rabit.height)") //2.0
//rabait과 tiger가 참조는 곳이 같아서 하나만 바꿔줘도 전체가 바뀐다.
func changeBasicInfo(_ info: Myinfo2){
var copiedInfo: Myinfo2 = info
copiedInfo.age = 1
}
func changeAnimaInfo(_ info: Animal){
info.height = 5.5
}
//이 함수로 전달되는 전달인자는 값이 복사되어서 전달되기 때문에 값만 전달 된다.
changeBasicInfo(naInfo)
print("na age: \(naInfo.age)") //100
//참조값이 전달 되었다.
changeAnimaInfo(tiger)
print("tiger height: \(tiger.height)") //2.2
'ios 뽀개기 > 스위프트 정리' 카테고리의 다른 글
swift http 통신 get방식 post 방식 - 일단 기록 (0) | 2018.06.13 |
---|---|
10. 옵셔널 (0) | 2017.12.04 |
9. 연산자의 종류 (0) | 2017.11.15 |
8. 열거형 (0) | 2017.11.15 |
7. 튜플 배열 딕셔너리 셋 (복습) (0) | 2017.11.14 |
댓글