Swift | 클래스 구조체의 method(함수)
다시 앞 부분에 대해서 정리하자면
속성은 구조체와 클래스가 동일하며
속성에는 총 4가지를 배울 수 있었다
저장속성, 지연 저장속성, 계산속성(읽기/계산), 타입속성(저장/계산), 속성감시자
저장속성은 단순히 말해서 변수를 정의하는 경우 (값을 초기화도 가능하다)
지연 저장속성은 lazy를 붙여서 사용하며 접근할 때 메모리 공간이 생기는데 가끔 사용하거나 큰공간을 차지할 때 사용한다
계산속성의 경우 캡슐화에 도움을 주며 읽기 쓰기형태가 가능하다 get 블럭만 사용한다면 get을 생략하고 사용해도 된다
하지만 큰 이점은 setter를 사용하여 복잡한 계산을 리터럴 하나만 넣으면 가능하다라고 생각한다
타입속성은 전역변수이며 데이터에 저장이된다 공통적으로 사용하는 값인 경우에 많이 사용하고 저장타입 속성은 var/ let이 선언가능하지만 static을 class로 변경하여 상속을 할 수가 없다 계산타입 속성인 경우에는 class 키워드를 사용하여 상속이 가능하였고 var만 선언이 가능하다 그리고 같은 클래스 내 접근을 하려면 static 키워드가 있는것 끼리는 Type + Property를 사용하지 않고 속성으로만 작성하면 되지만 메서드나 생성자의 경우에는 Type + Property를 사용해야한다
마지막으로 속성감시자는 값이 변경될 예정이나 변경된걸 확실하게 알려줄 수 있는 속성이라고 생각을 한다
didSet(oldValue)/ willSet(newValue)파라미터를 사용한다
일반적으로 didSet을 많이 사용한다
class / struct 의
property / method??
- 변수 == 속성(property)
- 함수 == 메서드(method)
| 구조체 | 클래스 | |
| 속성 | 저장 속성, 지연 저장속성 계산속성(읽기 / 쓰기) 타입속성(저장 / 계산) 속성감시자(willset/didset) |
|
| 메서드 | 인스턴스메서드(mutating keyword) 타입 메서드 서브스크립트 생성자(memberwise 생성자 / 지정생성자 / 실패가능생성자) |
인스턴스 메서드 타입메서드 서브스크립트 생성자(지정생성자 / 편의생성자 / 필수생성자 /실패가능생성자->상속과 관련 ) 소멸자 |
인스턴스 메서드
- 인스턴스 메서드?
- 메서드라 메모리 공간 할당 ❌
- 메모리 실행시에 스택 프레임을 만들고 인스턴스의 데이터를 사용 (종료하게 되면 스택 프레임이 사라짐)
- 메서드 접근할 때 인스턴스의 이름으로 접근을 해야함
- EX) class Dog { func sleep() {} }
- => let dog = Dog()
- dog.sleep()
- EX) class Dog { func sleep() {} }
- ⭐️값 타입인 구조체나 열거형의 인스턴스 메서드에서 인스턴스 고유의 (저장)속성을 수정할 수 ❌ (클래스는 사용하지 ❌)
- 수정하고 싶다면 ⭐️mutating keword를 사용하면 된다
- metating func 메서드명() {}
- 메서드라 메모리 공간 할당 ❌
- class : overriding(재정의)을 지원한다
- 상속을 하지 못하게 막고 싶다면 final keyword를 사용하면 된다
- final func 메서드명() {}
- 오버로딩 가능
- class / 구조체 / 열거형 가능
- 클래스

- 구조체

타입 메서드
- 타입 메서드?
- 메서드라 메모리 공간 할당 ❌(데이터 공간에 메모리주소를 가지고 있기만 함) → 함수주소를 저장하는 메모리 공간은 있지만 할당은 다름
- 메모리 실행시에 스택 프레임을 만들고 인스턴스의 데이터를 사용 (종료하게 되면 스택 프레임이 사라짐)
- 인스턴스에 속한 속성이 아닌 타입자체의 속성이라 내부와 외부에 접근하고 싶을 때 타입속성과 동일하게 Type.method()로 접근해야한다
- static과 class 키워드를 사용함
- static : static상속시 재정의 불가능
- class : class 키워드를 사용시 재정의가 가능하다는 의미이다
- 메서드라 메모리 공간 할당 ❌(데이터 공간에 메모리주소를 가지고 있기만 함) → 함수주소를 저장하는 메모리 공간은 있지만 할당은 다름



- 타입 메서드 예시
- Int.random(in:)

//Int.random(in: Range<Int>)
Int.random(in: 1...100)
//Double.random(in: ClosedRange<Double>)
Double.random(in: 1.2...3.7)
서브스크립트
- 서브스크립트?
- 배열이나 딕셔너리에 사용하는 대괄호[]를 만들어서 사용할 수 있음
- 사실상 특별한 형태의 메서드 호출 역할이라고 볼 수 있다 → 메서드를 직접 구현도 가능하다
- 종류
- 1) (인스턴스)서브스크립트
- 함수의 구현이 특별한 키워드 subscript
- 메서드라 메모리 공간 할당 ❌
- 메모리 실행시에 스택 프레임을 만들고 인스턴스의 데이터를 사용 (종료하게 되면 스택 프레임이 사라짐)
- 메서드 접근시에 인스턴스 이름으로 접근 해야한다
- instance[파라미터 타입에 대한 값]
- 파라미터 2개 이상도 커스텀하여 만들 수 있다 (아규먼트 레이블_ 따로 사용을 하지 않는다)
- 2) 타입 서브 스크립트
- 서브스크립트 앞에 static / class 키워드를 붙이면 된다
- 1) (인스턴스)서브스크립트
- 클래스 서브스크립트

- 구조체 서브스크립트

- 열거형

- 서브스크립트 파라미터를 커스텀 할 수 있음

Int/String 사실 구조체?
- o
접근제어
private를 사용하여 캡슐화(은닉화)를 할 수 있다
- 외부에서 접근이 불가능하여 코드 내부의 세부 구현을 숨길 수 있다
- 코드 영역을 분리시켜서 효율적으로 데이터를 관리할 수 있다
- 컴파일 시간이 줄어든다(컴파일러가 해당 변수가 어느범위까지 사용하는지 알 수 있음)
인프런에서 앨런 Swift문법 마스터 스쿨을 보고 정리하였습니다