🍃 출처 : 앨런 swift 문법 마스터 스쿨
- swift는 객체 지향 언어이기 때문에 클래스의 사용이 필수적.
✨ 객체지향이란 : 프로그램을 단순히 데이터와 처리 방법으로 나누는 것이 아니라, 프로그램을 수많은 '객체(object)'라는 기본 단위로 나누고 이들의 상호작용으로 서술하는 방식이다. 객체란 하나의 역할을 수행하는 '메소드와 변수(데이터)'의 묶음으로 봐야 한다.
- 클래스를 정의하여 객체를 만들고 사용할 수 있다.
- 클래스를 하나 만들게 된다면, 클래스에서 생성된 객체인 인스턴스를 만들어 실제 작업에 쓰일 수 있게 한다.
class Dog{ var name = "강아지" var weight = 0.0 } func sit() { print("앉았습니다.") } func layDown() { print("누웠습니다.") } var bori = Dog() var choco = Dog() bori.name // "강아지" bori.weight // 0
✨ 클래스의 변수 : 속성(property) ✨ 클래스의 함수 : 메서드 (method)
- 클래스를 선언하였다면, 우리가 클래스를 쓸 수 있게 해주어야 한다.
var bori = Dog()
이 과정이 클래스를 실제로 쓸 수 있도록 인스턴스를 만들어 주는 과정
즉, 변수 broi는 Dog이라는 클래스 데이터 타입을 가지게 되는 것
- 인스턴스의 값(프로퍼티)를 저장하거나, 기능(메서드)를 제공하고, 이를 캡슐화 할 수 있음
- 클래스처럼 인스턴스를 만들어서 실제 작업에서도 쓸 수 있음
struct Bird { var name = "새" var weight = 0.5 func fly() { print("날아갑니다.") } } var aBird = Bird() aBird.name // 새 aBird.weight // 0.5 aBird.fly() // 날아갑니다.
- 클래스의 코드와 거의 비슷, class 였던 것을 struct로 바꾼 정도
- 이처럼, 클래스와 구조체는 선언하고 사용하는 방법까지 매우 비슷
✨ 구조체의 변수 : 속성 (property) ✨ 구조체의 함수 : 메서드 (method)
- 구조체 또한 클래스와 같이 var aBird = Bird() 로 인스턴스를 선언해준다.
- 둘 다 메모리에 찍어낸 것을 인스턴스 (instance) 라고 한다.
ex) 각각 카카오톡 실제 목록 하나하나
- 인스턴스는 실제로 메모리에 할당되어 구체적 실체를 갖춘 것이다.
- swift에서는 클래스의 인스턴스를 특별히 ⭐️객체(object)라고 한다.
📓 가장 큰 차이점은 메모리 저장 방식의 차이
1) class (클래스)- 참조 형식 (reference type), 메모리 주소를 참조한다 - instance를 heap에 저장하고, 메모리 주소값이 heap을 가리킨다. - (복사 시) 값을 전달하는 것이 아니고, 저장된 메모리 주소를 전달 - heap의 공간에 저장, ARC 시스템을 통해 메모리관리
2) struct (구조체)
- 값 형식 (value type) - instnace를 모두 stack에 저장 - (복사 시) 값을 전달할 때 마다 복사본 생성 (다른 메모리공간 생성) - stack의 공간에 저장, 스택 프레임 종료 시 메모리에서 자동 제거
✨ 차이점 예시
class PersonClass {
var name = "사람"
var age = 0
}
struct AnimalClass {
var name = "동물"
var age = 0
}
let pClass = PersonClass()
let aStruct = AnimalClass()
pClass.name = "사람1"
aStruct.name = "동물"
pClass.name //사람1
aStruct.name // ⛔️ 컴파일 에러 !!!! var 로 선언해야 함
- class 에서의 let : 메모리 주소를 바꿀 수는 없지만, 속성을 바꿀 수는 있음
- sturct에서의 let : 속성 바꿀 수 없음
ㅡ
✨ 접문법 / 명시적 멤버 표현식의 정확한 의미
1) 내부의 요소, 즉 클래스, 구조체의 **인스턴스 멤버에 접근**한다
2) **멤버** : 속성, 메서드를 표현
bBird.fly()
bBird.name
Int.random(in: 1...10)
✨ 관습적인 부분에 대한 이해
- 일반적으로 클래스, 구조체 선언할 때 모두
1) 속성 2)메서드 순서대로 작성.
- 클래스 내부에는 직접 메서드 실행문이 올 수 없다. (정의문만 올 수 있음)
ㅡ
- 인스턴스를 만들 때 자동으로 호출되는 초기화 처리 전용의 메소드
class Dog { var name = "강아지" var weight = 0.4 func sit() { print("앉았습니다.") } } var bori = Dog() bori.name var choco = Dog() choco.name
🎧 언제나 이렇게 틀이 찍혀 나오므로 늘 다시 선언해야 한다. 하지만 여러 인스턴스를 만들고 원하는 인수까지 지정해 줄 수 있다면 매우 편리해질 것. 이럴 때 사용하는 것이 바로 초기화
class Dog { var name: String var weight: Double init(n: String, w:Double) { self.name = n self.weight = w } } var bori = Dog(n: "보리", w: 15.0) bori.name //보리 bori.weight //15.0
🎧 클래스 안 속성들에게 값을 지정해 주지 않고, init() 메서드를 이용하여 초기화 함 init 메서드 안의 self는 자기 자신을 가리키는 값, 즉 self. 가 붙은 변수들은 클레스 내의 변수라는 것 ! ( 메서드 안에서 동일한 파라미터로 인식해버리기 때문에)