swift study 10. 클래스와 구조체 (Class & Struct) / 초기화(Initialization)

jess·2022년 7월 11일
0

Swift

목록 보기
10/19
post-thumbnail

🍃 출처 : 앨런 swift 문법 마스터 스쿨

📓 클래스 (Class)

  • 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)

  • 인스턴스의 값(프로퍼티)를 저장하거나, 기능(메서드)를 제공하고, 이를 캡슐화 할 수 있음
  • 클래스처럼 인스턴스를 만들어서 실제 작업에서도 쓸 수 있음
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)메서드 순서대로 작성.
   - 클래스 내부에는 직접 메서드 실행문이 올 수 없다. (정의문만 올 수 있음)

📓 초기화 (Initialization)

  • 인스턴스를 만들 때 자동으로 호출되는 초기화 처리 전용의 메소드
    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. 가 붙은 변수들은
클레스 내의 변수라는 것 !
( 메서드 안에서 동일한 파라미터로 인식해버리기 때문에)

0개의 댓글