[Swift Programming]구조체와 클래스Swift 프로그래밍2022. 7. 8. 17:34
Table of Contents
구조체
1. 정의
struct 구조체이름 {
(프로퍼티와 메서드)
}
//예시
struct Info{
var name : String
var major : String
}
2. 구조체 인스턴스 생성 및 초기화 & 프로퍼티 값 변경
var Student1 : Info = Info(name:"김가은",major:"컴퓨터과학과")
print(Student1.name) //출력 : 김가은
print(Student1.major) // 출력 : 컴퓨터과학과
//프로퍼티 값 변경 , let으로 선언시 변경 불가
Student1.name = "Kim Ga eun"
print(Student1.name) // 출력 : Kim Ga eun
클래스
- 스위트의 클래스는 부모클래스가 없더라도 상속 없이 단독으로 정의가 가능합니다.
1. 정의
- 클래스의 프로퍼티는 정의시 초기값을 지정해줘야 한다. 간단히 방법 2가지를 소개하겠다.
(1)프로퍼티 정의 시 초기값을 직접 입력해 주는 방법
class ClassName { // 클래스 이름
var propertyName : String = "" // 프로퍼티 또는 메소드
var optionalName : String?
func methodName(){
print("hi")
}
}
(2)프로퍼티 정의 시 초기값을 직접 입력해 주는 방법
class ClassName {
var propertyName : String
var optionalName : String?
// 이니셜라이저
init(propertyName : String){
self.propertyName = propertyName
}
func methodName(){
print("hi")
}
}
2. 클래스 인스턴스 생성 & 사용
//인스턴스 생성
var Instance :ClassName = ClassName(propertyName : "property01")
// 이니셜라이저를 사용하지 않았을 떈
// var Instance :ClassName = ClassName()로 적어도 가능
//프로퍼티 및 메소드에 접근시, .을 이용하여 접근
print(Instance.propertyName)
print(Instance.optionalName)
Instance.methodName()
3. 클래스 인스턴스 소멸
- 클래스 인스턴스는 참조 타입이므로 더 이상 참조할 필요가 없을 때 메모리에서 해제가 된다. ⇒ 소멸
- deinit 메서드
- 소멸되기 직전에 deinit 메서드가 호출됨
class ClassName { // 클래스 이름 var propertyName : String = "ppro" // 프로퍼티 또는 메소드 var optionalName : String? func methodName(){ print("hi") } deinit { print("클래스 인스턴스가 곧 소멸됩니다.") } } var Instance :ClassName? = ClassName() Instance = nil // 출력 : "클래스 인스턴스가 곧 소멸됩니다."
구조체와 클래스 차이
1. 공통점
- 프로퍼티, 메서드 사용 가능
- 이니셜라이저 정의 가능
- 구조체 또는 클래스가 갖는 값에 접근 가능
- 익스텐션을 통해 확장 가능
- 특정 프로토콜 준수 가능
2. 차이점
- 구조체는 상속이 불가능
- 타입 캐스팅은 클래스의 인스턴스에만 허용 가능
- 디이니셜라이저는 클래스의 인스턴스에만 활용 가능
- 참조 횟수 계산은 클래스 인스턴스에만 적용
3. 값 타입과 참조 타입
- 구조체 ⇒ 값 타입 (전달될 값이 복사되어 전달)
- 생성된 새 인스턴스에는 전달하려는 값이 복사되어 들어간다.
var Info01 : Info = Info(name: "Gani", major: "컴과") Info01.major = "컴퓨터과학과" var Info02 : Info = Info01 print(Info01.major) //출력 : "컴퓨터과학과" print(Info02.major) // 출력 : "컴퓨터과학과" => 바뀐 Info01.major 값이 복사되어 전달됨 Info02.major = "자연대 컴퓨터과학과" print(Info01.major) //출력 : "컴퓨터과학과" print(Info02.major) //출력 : "자연대 컴퓨터과학과" => Info02만 바뀐 것을 알 수 있다
- 클래스 ⇒ 참조타입 (전달될 값의 주소가 전달)
- 생성된 새 인스턴스가 아닌, 기존 인스턴스 참조를 전달한다.
class ClassName { // 클래스 이름 var propertyName : String = "" // 프로퍼티 또는 메소드 var optionalName : String? func methodName(){ print("hi") } } var ClassInfo_01 : ClassName = ClassName() ClassInfo_01.propertyName = "propertyName" var ClassInfo_02 : ClassName = ClassInfo_01 print(ClassInfo_01.propertyName) // 출력 : propertyName print(ClassInfo_02.propertyName) // 출력 : propertyName 바뀐 값으로 출력됨 ClassInfo_02.propertyName = "No Name" print(ClassInfo_01.propertyName) // 출력 : No Name print(ClassInfo_02.propertyName) // 출력 : No Name // ClassInfo_02.propertyName가 주소를 참조하고 있기 때문에, ClassInfo_01.propertyName 값도 같이 바뀐 것을 알 수 있다.
- 스위프트의 기본 데이터 타입은 모두 구조체입니다.
- String, Bool, Int 등등
* 야곰님의 스위프트 프로그래밍 3판 책으로 공부하며 정리해본 글입니다.
'Swift 프로그래밍' 카테고리의 다른 글
[Swift Programming] 인스턴스 생성 및 소멸 (0) | 2022.07.26 |
---|---|
[Swift Programming] 프로퍼티와 메서드 (0) | 2022.07.12 |
completion handler VS async/await (0) | 2022.07.07 |
[Swift Programming] 옵셔널 (0) | 2022.07.07 |
@gani+ :: Gani_Dev :)
꾸준히 기록할 수 있는 사람이 되자 !