반응형
Notice
Recent Posts
Recent Comments
Link
공부한 것 꼭꼭 씹어먹기
class, struct, enum 본문
반응형
class Circle {
let pi = 3.1415926535
var radius = 10.0
// 프로퍼티를 이렇게 바로 초기화 해줘도 되지만 생성자 함수에서 초기화 해줘도 된다.
var radius: Double
init() {
radius = 10.0
}
init(radius: Double) {
self.radius = radius
}
func area() -> Double {
return radius * radius * pi
}
}
let circle = Circle() // Circle.init()과 같다. init()은 생성자 함수이다.
let circle2 = Circle().init(radius: 20.0) // 두번째 생성자로 만들었을때
circle.area()
** 변수, 상수를 만드는 또다른 방법 : 생성자 활용하기
var weight = Int(65)
var message = String("Hello")
var evenNumbers = [Int](arrayLiteral:2,4,6,8)
var oddNumbers = Array<Int>()
- 클래스와 구조체의 공통점
- 속성(property) 정의
- 메소드(method) 정의
- 생성자를 통한 초기 설정
- extension, protocol 사용 가능
- 클래스와 구조체의 차이점
- 클래스는 참조 타입(reference type)이라서 heap영역에 저장된다. 그래서 ARC로 메모리를 관리한다. 한 클래스로 여러 인스턴스를 만들었을 경우 그 중 하나의 값만 변경해도 모든 인스턴스에 영향을 준다.
- 구조체는 값 타입(value type)이라서 stack영역에 저장된다. 그래서 ARC로 메모리관리 안된다. 한 구조체로 여러 인스턴스를 만들때마다 새로운 구조체가 할당된다. 다른 인스턴스에 영향 안줌.
- 클래스는 상속(inheritance)이 가능하다.
- 클래스는 타입 캐스팅을 통해 런타임에서 클래스 인스턴스의 타입을 확인할 수 있다.
- 클래스는 deinit(소멸자)를 통해 클래스 인스턴스의 메모리 할당을 해제할 수 있다.
struct Circle {
var radius = 0
}
var aaa = Circle()
var bbb = aaa
bbb.radius = 10
// 구조체는 aaa의 값만 복사한다. 즉, aaa.radius = 0이고 bbb.radius = 10이다.
// 메모리는 새로운 Circle의 인스턴스를 새로 생성하여 bbb라는 변수에 그 주소값를 할당한다.
// 하지만 Circle이 클래스라면 bbb에 aaa를 할당할때 aaa가 참조하던 주소값을 bbb에 주기 때문에
// bbb.radius = 10하는 순간 aaa와 bbb의 radius가 모두 10이 된다.(같은 인스턴스를 참조함)
** 소멸자를 통한 리소스 정리
class Circle {
var radius = 0
init() { print("Initializer called") }
deinit { print("Deinitializer called") }
}
var circle: Circle? = Circle() // 인스턴스를 생성한 순간 init() 함수가 불려짐
circle = nil // 인스턴스가 더이상 필요하지 않기때문에 deinit이 불려짐
** 클래스 or 구조체 선택 기준 : 대부분의 경우는 클래스를 선택한다?!
- 일반적인 구조체 선택 기준
- 몇 가지 간단한 데이터 값을 캡슐화하는 것이 목적일때 ( vo, model 등 )
- 할당 및 전달 시 복사가 합리적일때
- 모든 속성도 값 타입 - 복사가 맞을때
- 상속이 필요 없을때
** 열거형(Enumeration) : 비슷한 값을 그룹으로 만들어 정해진 값을 한정해서 쓸 때 유용
enum AppleOS { // 열거형은 하나의 새로운 타입이 되기 때문에 대문자로 시작해야함
case iOS
case macOS
case tvOS
case watchOS
}
// 각 case에 값을 할당할 수도 있음(swift에서는 int뿐 아니라 string등 다양한 타입의 원시값을 가질수있음)
enum AppleOS: Int {
case iOS = 0
case macOS = 1
case tvOS = 2
case watchOS =3
}
var osType: AppleOS = AppleOS.macOS // 또는 var osType: AppleOS = .iOS 이렇게 써도됨
// 만약 두번째 enum처럼 값을 할당한 경우에는
print(osType.rawValue) // 1 이 출력된다.
func printAppleDevice(osType: AppleOS) {
switch osType {
case .iOS:
print("iPhone")
case .macOS:
print("iMac")
case .tvOS:
print("Apple TV")
case .watchOS:
print("apple watch")
}
} // 열거형일때는 정해진 case만 존재하기 때문에 default안써도 에러 안난다(에러날 가능성이 없음)
printAppleDevice(osType: .watchOS)
패스트캠퍼스 ios 앱 개발 강의를 듣고 공부한 내용을 정리하였습니다.
반응형
Comments