클래스(Class)
- 클래스를 정의하여 객체를 만들고 사용 가능
- 클래스를 만들어 클래스에서 생성된 객체인 인스턴스를 만들어 사용
- 클래스 안의 변수 프로퍼티(Property)와 클래스 안의 함수 메서드(Method)로 구성
class Name {
var name = "Hyebin" //프로퍼티
//메서드
func my_name() {
print("my name is \(name)")
}
}
//인스턴스 생성
let hyebin : Name = Name()
print(hyebin.name) // Hyebin
hyebin.my_name() // my name is Hyebin
hyebin.name = "yoo"
hyebin.my_name() // my name is yoo
클래스 초기화 (Initialization)
- 인스턴스를 만들 때 자동으로 호출되는 초기화 처리 전용의 메서드
class Name {
var name : String
var age : Int
init(name:String, age:Int) {
self.name = name
self.age = age
}
func my_name() {
print("my name is \(name) and \(age) year's old")
}
}
let name1 : Name = Name(name: "hyebin", age: 25)
let name2 : Name = Name(name: "abc", age: 32)
name1.my_name() //my name is hyebin and 25 year's old
name2.my_name() //my name is abc and 32 year's old
Name 클래스 안의 프로퍼티에 값을 지정하지 않고 init() 함수를 사용해 초기화
self는 자기 자신을 가리키는 것, self. 이 붙은 변수들은 클래스 내의 변수라는 것
클래스 상속 (Inheritance)
- 기존의 클래스의 모든 기능을 이어받아 새로운 클래스를 정의하는 것
- 이미 편리한 클래스가 있다면, 그 클래스를 상속받아 기능을 덧붙여 새로운 클래스 생성 가능
class Name { //부모 클래스
var name = "Hyenbin"
func my_name() {
print("my name is \(name)")
}
}
class Email : Name { //자식 클래스
var email = "123@naver.com"
func myInfo() {
print("my name is \(name) and my email is \(email)")
}
}
let hyebin : Email = Email()
print(hyebin.name) // Hyenbin
print(hyebin.email) //123@naver.com
hyebin.my_name() //my name is Hyenbin
hyebin.myInfo() //my name is Hyenbin and my email is 123@naver.com
구조체 (Struct)
- 인스턴스의 값(프로퍼티)을 저장하거나 기능(메서드)을 제공하고 이를 캡슐화할 수 있는 스위프트가 제공하는 타입(named type)
- 구조체 안의 변수 프로퍼티(Property)와 구조체 안의 함수 메서드(Method)로 구성
struct Name {
var name : String = "Hyebin"
func my_name() {
print("my name is \(name)")
}
}
var hyebin : Name = Name()
print(hyebin.name) //Hyebin
hyebin.my_name() //my name is Hyebin
hyebin.name = "Yoo"
hyebin.my_name() //my name is Yoo
- 클래스와 달리 프로퍼티의 값을 선언하지 않고 인스턴스 선언 시 매개변수로 선언 가능
struct Name {
var name : String
func my_name() {
print("my name is \(name)")
}
}
var hyebin : Name = Name(name: "hyebin")
print(hyebin.name) //Hyebin
hyebin.my_name() //my name is Hyebin
구조체 초기화 (Initialization)
- 구조체 멤버를 파라미터 네임으로 하여 스위프트가 자동으로 초기화 코드를 만들어줌
- 직접 init()을 사용하여 초기화 코드 작성 가능, 초기화 코드 직접 작성 시 자동 초기화 코드 제공 안됨
struct Name {
var name : String = "Hyebin"
var age: Int
func my_name() {
print("my name is \(name) and \(age) year's old")
}
init(name: String){
self.name = name
self.age = 25
}
}
var hyebin : Name = Name(name: "hyebin")
print(hyebin.name) //hyebin
hyebin.my_name() //my name is hyebin and 25 year's old
클래스와 구조체의 공통점
- 프로퍼티와 메소드를 사용하여 구조화된 데이터와 기능을 가짐
- 새로운 사용자 정의 타입을 만들어 줌
- 초기화(init)을 정의하여 초기 상태를 설정 가능
- 확장(extension) 가능
- 프로토콜(protocol) 사용이 가능
- 특정 값에 접근할 수 있는 서브스크립트(subscript) 문법이 사용이 가능
- 프로퍼티 값에 접근하고 싶다면, 점(dot) 문법을 사용
클래스와 구조체의 차이점
- 클래스
- 참조 타입 (Reference Type)
- 참조 타입: 변수나 상수에 값을 할당하거나 함수에 인자로 전달될 때 그 값이 복사되지 않고 참조된다는 의미
- Call by reference : 할당 또는 파라미터 전달 시에 객체를 가리키고 있는 메모리의 주소 값이 복사됩니다.
- Heap Memory 영역에 할당됩니다. 따라서 속도가 느림
- 런타임에 직접 allocate 하며 reference counting 을 통해 deallocate가 필요
- 상속이 가능
- 런타임에 타입캐스팅을 통해 클래스 인스턴스에 따라 여러 동작이 가능
- deinitializer 가 존재, 클래스 인스턴스의 메모리 할당을 해제 가능
- 참조 타입 (Reference Type)
- 구조체
- 값 타입 (Value Type)
- 값 타입: 함수에서 상수나 변수로 전달될 때 그 값이 복사되서 전달된 다는 의미
- Call by value : 할당 또는 파라미터 전달 시 value copy가 발생
- 값 타입이기 때문에 멀티 스레드 환경에서 공유 변수로 인한 문제를 일으킬 확률이 적음
- Stack Memory 영역에 할당되므로 속도가 빠름
- Scope based lifetime : 컴파일 타임에 컴파일러가 언제 메모리를 할당/해제할지 정확히 알고있음
- Data loclity : CPU 캐쉬 히트율이 높음
- 상속이 불가능
- AnyObject로 타입 캐스팅이 불가
- 값 타입 (Value Type)
반응형
'⌨️ Language > swift' 카테고리의 다른 글
[Swift] assert와 guard (0) | 2023.02.06 |
---|---|
[Swift] 타입 캐스팅 (0) | 2023.02.06 |
[Swift] 옵셔널 (Optional) (0) | 2023.02.06 |
[Swift] 열거형 (Enumerations) (0) | 2022.02.08 |
[Swift] 함수(Functions) (0) | 2021.12.02 |
댓글