일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- NextJs
- UIKit
- 알고리즘
- react
- 코드트리
- 프론트엔드
- iOSDeveloper
- SWIFT
- AppleDeveloperAcademy
- react-query
- 코딩테스트
- TypeScript
- Xcode
- Front-end
- 회고
- error
- 프로젝트
- globalcommunity
- frontend
- ios
- 프로그래머스
- 코드트리챌린지
- velog
- git
- Apple Developer Academy
- 코딩테스트실력진단
- 자바스크립트
- JavaScript
- tshaped
- swiftUI
Archives
- Today
- Total
Moon Work
[Swift] Swift 기본 문법 정리 5-1: 왜 Swift에는 Sturct와 Class로 나뉘어 있을까. 본문
시작하며
다른 블로그들을 참조하며 Swift의 class와 struct를 공부하던 중 struct가 상속이 안된다는 특징을 가지고 있는게 마음에 걸렸다. 상황에 따라 다르겠지만 struct로 주로 개발한다는 내용을 듣고 다형성 구현에 뭔가 다른 방법이 있는 것 같았고 그러던 중 새로 알게된 것이 POP(Protocol Oriented Programming)이다. 이 글을 통해 class와 struct에 대한 가벼운 비교와 protocol이라는 Swift만의 개념을 통한 POP에 대해 정리해보려 한다.
Struct 란
Struct는 다른 언어들과 비슷하게 특정 기능, 혹은 역할을 하기 위한 데이터, 기능을 하나로 묶어 사용자가 새로운 데이터 타입을 생성할 수 있게 해준다. 기본적으로 아래와 같은 구조를 가진다.
struct StructName {
var structProperty: String
func structMethod(){}
}
Struct 특징
- 구조체는 값(value) 타입으로 다른 구조체에 할당하더라도 주소가 이동되는 참조 타입과 다르게 값이 복사된다.
- 타입 이름은 대문자 카멜케이스를 사용한다.
- 구조체는 상속이 안된다.
- (property와 method가 함께 있는데 property만 해도 여러가지 종류가 있어서 다음번에 다룰 예정이다.)
- 기본 타입(Bool, Int, Array, Dictionary, Set) 모두 구조체로 구현되어 있다.
struct BasicStruct {
let name: String = "moon" //변경 불가
var nickName: String = "moonkey" //변경 가능
func basicMethod(){
print("/(name) is name") //moon is name
}
}
var person: BasicStruct = BasicStruct()
person.name = "austin" // 불가능
person.nickName = "austin" // 가능
Class 란
Class는 Struct와 비슷하게 특정 기능과 속성을 묶은 타입을 생성하게 해주지만 몇가지 다른 특징을 가진다.
class BasicClass {
var name: String = "moon"
func basicFunc(){
print("name is /(name)")
}
}
var person: BasicClass = BasicClass()
Class 특징
- 클래스는 struct와 다르게 참조 타입이다. 따라서 값이 아닌 주소 값이 복사된다.
- Swift의 class는 다중 상속이 허용되지 않는다.
- 상속을 받을 때는 [클래스이름]: [부모클래스이름]으로 상속 받는다.
- 기본 property에 대해 초기값을 지정한 경우가 아니라면 이니셜아이저( init() )를 사용하여 초기화해주어야 한다. 초기화 하기 전에 self를 통해 클래스 자신의 값에 접근하게 될 경우 에러가 발생한다.
- 참조값이 더 이상 사용되지 않을 때 deinit() 메소드를 통해 메모리에서 삭제되기 전에 처리할 코드를 넣어줄 수 있다.
- 상속 받았을 경우 super를 통해 부모클래스에 접근할 수 있다.
class Person {
var name: String
init(name: String){
self.name = name
}
func printName(){
print("\(name) is my name")
}
}
class Student: Person {
init(studentName: String){
super.init(name: studentName)
}
func goToSchool(){
print("go to school")
}
}
var moon: Student = Student(studentName: "austin")
moon.goToSchool()
moon.printName()
Struct vs Class
- 구조체는 init 메서드 없이도 자동으로 초기화 함수를 만들 수 있다.
- 클래스는 상속이 가능하고 (다중 상속 X), 구조체는 불가능하다.
- 구조체는 값 타입이고 클래스는 참조타입이다.
- 타입캐스팅은 클래스 인트턴스에만 허용된다.
- deinit은 클래스의 인스턴스만 허용된다.
protocol과 POP로 왜 Struct를 사용하는지 다음편에서 ➡️
'Swift' 카테고리의 다른 글
[Swift] Swift 기본 문법 정리 5: Property (0) | 2023.02.01 |
---|---|
[Swift] Swift 기본 문법 정리 4: Protocol 📑 (0) | 2023.01.30 |
[Swift] Swift 기본 문법 정리 3: 클로저 (2) | 2022.12.21 |
[Swift] Swift 기본 문법 정리 2: 함수 (0) | 2022.12.16 |
[Swift] Swift 기본 문법 정리 1: Xcode Setting, types (0) | 2022.12.15 |