Swift

Swift | class vs struct - 1

iOSDEv 2024. 1. 30. 10:19
클래스 vsv 구조체
  구조체 클래스
형식 value type(값형식)
== 기본타입 / 튜플 / 열거형 / 컬렉션 / 구조체
reference type(참조타입)
== 클래스 / 클로져
저장공간 인스턴스 데이터를 모두 스택에 저장 인스턴스 데이터를 힙에 저장 변수자체는 스택에 저장
복사시 값을 전달 할 때 다른 메모리 공간에 생성하고 복사본을 생성  값을 전달하는 것이 아닌 메모리에 저장된 주소를 전달
메모리관리 스택의 공간에 저장 스택 프레임 종료시 메모리에서 자동제거 힙의 공간에 저장되고 ARC시스템을 통해 메모리 관리
소멸자 소멸자가 없음 소멸자가 있음(deinit)
상속 상속 불가능 상속 가능
생성자 관련 멤버와이즈 이니셜라이저 제공 편의 생성자 
let 선언시 값이 부동으로 변하지 않는 상수로 선언됨 인스턴스 상수로 선언하게되면 주소값이 변하지 않는다는 의미이고 내부의 property의 값은 변경이 가능함

 

클래스와 구조체 사용법

기본적으로 사용할 때 생성할 때 앞부분에 class / struct 붙이고 대문자로 명명하는것 빼곤 동일하다
(하지만 차이가 있긴하기 때문에 추후에 알아 볼것이다)
클래스만들기

데이터 = 전역 변수 및 타입속성이 저장

 

클래스의 변수와 함수는 속성 메서드라고 불린다
데이터 = 전역 변수 및 타입속성이 저장

객체 생성하기

 

  • 클래스를 인스턴스(객체)화 하면 참조타입이라 힙에 저장이 된다
    • 변수에 저장하므로 변수는 스택에 저장되지만 세부 내용(Restaurant / name / bestmenu / bell / goOut)은 힙에 저장된다 
    • 세부내용을 자세히 보면 클래스 주소나 메모리 관리RC나 property의 저장된 타입에 대한 내용이 담겨있다
    • 소괄호를 열고 닫는 행위 자체가 인스턴스 생성이라는 것을 인지해야한다
  • 구조체 경우 인스턴스하면 값타입 이므로 스택에 저장이 된다
    • 변수에 저장하므로 변수는 스택에 저장되고 세부 내용(Restaurant / name / bestmenu / bell / goOut)도 스택에 저장된다
객체 생성의 속성 접근하기

 

 

구조체 속성을 값 변경 한다면?? 각각 다른 데이터이기 때문에 다르게 값이 나온다

a a2
레스토랑 -> 치킨 레스토랑

 

 

구초제가 클래스보다 더 가볍다

 

클래스와 구조체에서 let을 정의한다면?
  • 클래스
    • 주소값이 변경하지 않는 의미(속성은 변경이 가능하다)
  • 구조체
    • 값이 변경되지 않는다는 의미(속성을 바꿀 수 없음)

 

초기화(init) == 생성자 메서드

클래스와 구조체는 모든 저장 속성을 초기화 해야한다 
생성자 실행 종료시점에는 모든 속성의 초기값이 저장되어 있어야하는 이유는 초기화 하지 않으면 컴파일단계에서 에러가 나기 때문이다
인스턴스화(restaurant1) 할 때 반드시 생성자(초기화) 저장속성을 초기화 해야한다 하지 않을 시 오류남

 

만약 속성이 Optional이라면?

 

초기부터 기본값을 명시적으로 세팅도 가능하지만 보통 잘 하지 않을것 같음

 

Identity Operators(식별 연산자)
: 두개의 참조가 같은 인스턴스를 가리키고 있는지를 비교하는 방법

 

 

객체 지향 프로그래밍
언제 클래스와 구조체를 사용해야할까?

 

  • 데이터의 관점 : 여러개의 데이터를 묶어서 사용할 때
    • 구조체 : 메모리에 오랫동안 저장하지 않고 상속 없이 가볍게 사용할 때 (많이 사용함) - 애플에서 권장
    • 클래스 : 오랫동안 메모리에 저장하며 관리해야하고 상속을 해야하는 경우
  • 구조체 사용할 때
    • 연관된 데이터를 단순히 캡슐화 하는 목적
    • 캡슐화한 데이터를 참조보다 값을 복사해서 사용할 때
    • 구조체에 저장된 저장 속성이 값타입이고 참조보다 복사를 사용할 때
  • 클래스 사용할 때
    • 데이터에서 상속의 구조가 필요
    • 해당 모델을 serialize 하여 전송하거나 파일로 저장할 때

 

객체 지향
OOP 4대 특징(Object- Oriented Programming)

 

1. 추상화(abstraction) : 모델링
-공통적인 특성을 가지고 하나(class)로 만드는것
-공통적인 특성을 가지고 클래스로 정의하는 자체가 추상화의 개념이다
-예를 들어 가게에서 공통적으로 가질 수 있는 속성 => 가게 이름 / 메뉴 / 위치 등..

 

2. 캡슐화(encapsulation) : 모델링 / 정보은닉 / 데이터 캡슐화
-대표적으로 은닉화 private / public으로 분류하여 객체 외부에서 사용할 수 있게끔 데이터 접근을 허용할것인지 아닌지가 가능
-연관있는 속성과 메서드를 하나의 클래스로 묶어서 활용

 

3. 상속성(inheritance) : 재사용 / 확장
-부모클래스에서의 속성과 메서드를 자식클래스에서 그대로 받아서 사용하는 개념
-상속을 통하면 재사용되기 때문에 생산성이 높아짐

 

4. 다형성(polymorphism) : 사용편의 / 동적바인딩
- 쉽게 예시를 들자면 오버라이팅 / 오버로드를 들 수 있다
-하나의 객체가 여러가지 타입의 형태로 사용할 수 있고 다양한 메서드 형태로 동작을 할 수 있음
-하나의 객체는 다양한 방식으로 동작이 가능함(동적 바인딩 / method dispatch)

 

 

인프런에서 앨런 Swift문법 마스터 스쿨을 듣고 정리했습니다