struct와 class
- struct와 class는 '프로퍼티'와 '메소드'를 사용하여 구조화된 데이터과 기능을 가질 수 있고, 하나의 사용자정의 데이터 타입을 만드는 것이라고 생각하면 된다.
- 차이점을 보자면 “class는 참조타입이고 ARC로 메모리를 관리한다. struct는 값 타입이다.”
struct
- 여러 변수를 담을 수 있는 컨테이너 개념으로 생각하면 된다.
- 우리가 사용하고 있는 데이터 타입(Int, String 등), 기본 자료형 타입(Array,Set, Int, Float, Double 등)들도 모두 구조체로 이루어져 있다.
- 구조체는 타입을 정의하는 것이기 때문에 UpperCamelCase를 사용한다.
// 인스턴스 : 클래스/구조체/열거형에서 생성된 객체
var jihu: Person = Person();
// 프로퍼티 : 클래스, 구조체, 열거형과 연관있는 정보나 값 등을 의미
struct FixedLengthRange {
var firstValue: Int
let length: Int
}
// 메소드 : 클래스, 구조체, 열거형과 관련된 함수를 의미
class someClass {
func simpleMethod(){
printlm("Simple Method")
}
func sum(a: Int, b: Int) -> Int {
return a+b
}
}
💡 인스턴스/ 프로퍼티 / 메소드
- 인스턴스랑 '상황', '실체' 라는 뜻을 가지고 있다. swift에서는 클래스/구조체/열거형에서 생성된 객체를 "인스턴스"라고 한다.
- 프로퍼티란 '재산', '소유물' 이라는 뜻을 가지고 있다. swift에서는 클래스, 구조체, 열거형과 연관되어 있는 정보/값 등을 의미한다.
- 메소드란 swift에서 클래스, 구조체, 열거형과 관려된 함수라는 의미로 사용된다.
프로퍼티
- 가변 프로퍼티 : var로 선언되어 있어, 추후에 값을 변경할 수 있는 프로퍼티
- 불변 프로퍼티 : let으로 선언되어 있어, 추후에 값을 변경할 수 없는 프로퍼티
- 타입 프로퍼티 : static이라는 키워드를 앞에 사용해서 타입자체에서만 사용할 수 있는 프로퍼티
메소드
- 메소드란 구조체 내부에 있는 함수
- 인스턴스 메소드 : 인스턴스에서 사용할 수 있는 메소드
- 타입 메소드 : static이라는 키워드를 앞에 사용해서 타입자체에서만 사용할 수 있는 메소드
인스턴스
- 인스턴스에서는 타입 프로퍼티나 타입 메소드를 사용할 수 없다. (타입 프로퍼티/메소드는 타입 자체에서만 사용 가능)
- 가변 인스턴스 : var 키워드를 사용해 인스턴스를 생성
- 가변 인스턴스 내부의 가변 프로퍼티는 수정이 가능하지만
- 가변 인스턴스 내부의 불변 프로퍼티는 수정 불가
- 불변 인스턴스 : let 키워드를 사용해 인스턴스 생성
- 가변 인스턴스 내부의 가변 프로퍼티는 수정이 불가능
- 가변 인스턴스 내부의 불변 프로퍼티는 수정 불가능
class
- 여러 변수를 담을 수 있는 컨테이너 개념
- 타입을 정의하기에 UpperCamelCase를 사용해야한다.
- 프로퍼티는 클래스 내부에 있는 값
- 가변 프로퍼티(var), 불변 프로퍼티(let), 타입 프로퍼티(static)
- 메소드는 클래스 내부에 있는 함수
- 인스턴스 프로퍼티(인스턴스에서 사용할 수 있는 메소드), 타입 프로퍼티(static이 아닌 class를 사용한다면 재정의 가능한 타입 메서드를 선언할 수 잇다. 상속 받았을 때 재정의 불가능/ 가능을 static/class 로 구분하게 된다.)📌
- 가변 인스턴스는 var키워드를 사용해서 가변 프로퍼티만 수정 가능
- 불변 인스턴스는 let키워드를 사용하고, 가변 프로퍼티는 클래스 인스턴스가 참조타입이라 프로퍼티의 변경이 가능 (구조체와 다른 부분!!!!!! 따라서 모든 인스턴스는 가변 프로퍼티 수정 가능)
- 타입 프로퍼티와 타입 메서드를 일반 인스턴스에서 호출하면 컴파일 에러.. (구조체와 동일)
struct와 class의 공통점
- 프로퍼티와 메서드를 사용해서 구조화된 데이터와 기능을 가진다.
- 값을 저장할 프로퍼티를 선언할 수 있다.
- 함수적 기능을 하는 메서드를 선언 할 수 있다.
- 초기화 init(생성자)을 정의해서 초기 상태를 설정할 수 있다.
- 확장(extension)이 가능하다.
- 프로퍼티 값에 접근할 때 점(.)을 사용한다.
- 프로토콜 사용이 가능하다.
struct와 class 요약
1. Struct
- 값타입
- 상속 불가능
- 데이터를 전달할 때 값을 복사하여 전달(사본을 전달함) (call by value)
- 즉 같은 구조체를 여러 개의 변수에 할당한 뒤 값을 변경시키더라도 다른 변수에 영향을 주지 않습니다. (값 자체를 복사)
- 레퍼런스 형태가 아니기 때문에 공유 불가능
- 값의 타입을 정의하기 위해 사용
- 스택 메모리 영역에 할당한다(속도가 빠름)
- 항상 새로운 변수로 copy가 일어나기 때문에 멀티 스레드 환경에서 문제 확률이 적음
2. Class
- 참조 타입
- ARC로 메모리를 관리
- 상속 가능
- 같은 클래스 인스턴스를 여러개의 변수에 할당한 뒤 값을 변경시키면 모든 변수에 영향을 준다,데이터를 전달할 때 값의 메모리 위치를 전달(call by reference) (메모리만 복사)
- 레퍼런스 형태로 공유가 가능
- 힙 메모리 영역에 할당
- 타입 캐스팅을 통해 런타임에서 클래스 인스턴스의 타입을 확인할 수 있다.
- Apple 프레임 워크의 대부분의 큰 뼈대는 모두 클래스로 작성
다음 조건 중 1개 이상을 만족하면 구조체를 사용
- 구조체의 주 목적이 관계된 간단한 값을 캡슐화 하기 원할 때
- 구조체의 인스턴스가 참조되기 보다 복사되기를 원할 때
- 구조체가 프로퍼티나 메소드 등을 상속할 필요가 없는 경우
- ex) width, height를 캡슐화해 특정 지형의 크기로 사용하는 것, Double형으로 구성된 x,y,z를 캡슐화 해 3D 좌표 시스템의 point로 사용하는 경우
- 이외의 경우에는 클래스를 사용...!
'iOS > Swift' 카테고리의 다른 글
[iOS] WirdCard Pattern, 와일드카드 패턴 (1) | 2021.11.14 |
---|---|
[iOS]클로저 Closure (0) | 2021.11.07 |
[iOS] Protocol과 Delegate (0) | 2021.10.31 |
[iOS] @IBOutlet과 @IBAction (0) | 2021.10.16 |
[iOS] Life Cycle (0) | 2021.10.16 |
댓글