공부한 것 꼭꼭 씹어먹기

class, struct, enum 본문

Swift 기초

class, struct, enum

젤라솜 2021. 10. 25. 20:39
반응형
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>()

 

  • 클래스와 구조체의 공통점
    1. 속성(property) 정의
    2. 메소드(method) 정의
    3. 생성자를 통한 초기 설정
    4. extension, protocol 사용 가능
  • 클래스와 구조체의 차이점
    1. 클래스는 참조 타입(reference type)이라서 heap영역에 저장된다. 그래서 ARC로 메모리를 관리한다. 한 클래스로 여러 인스턴스를 만들었을 경우 그 중 하나의 값만 변경해도 모든 인스턴스에 영향을 준다.
    2. 구조체는 값 타입(value type)이라서 stack영역에 저장된다. 그래서 ARC로 메모리관리 안된다. 한 구조체로 여러 인스턴스를 만들때마다 새로운 구조체가 할당된다. 다른 인스턴스에 영향 안줌.
    3. 클래스는 상속(inheritance)이 가능하다.
    4. 클래스는 타입 캐스팅을 통해 런타임에서 클래스 인스턴스의 타입을 확인할 수 있다.
    5. 클래스는 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 구조체 선택 기준 : 대부분의 경우는 클래스를 선택한다?!

- 일반적인 구조체 선택 기준

  1. 몇 가지 간단한 데이터 값을 캡슐화하는 것이 목적일때 ( vo, model 등 )
  2. 할당 및 전달 시 복사가 합리적일때
  3. 모든 속성도 값 타입 - 복사가 맞을때
  4. 상속이 필요 없을때

** 열거형(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 앱 개발 강의를 듣고 공부한 내용을 정리하였습니다.

반응형

'Swift 기초' 카테고리의 다른 글

상속  (0) 2021.10.27
property  (0) 2021.10.26
함수  (0) 2021.10.24
optional  (0) 2021.10.24
switch, for, array, dictionary, set  (0) 2021.10.24
Comments