차근차근 개발중

[Swift] 클래스와 구조체 본문

개발/Swift

[Swift] 클래스와 구조체

zaenny 2023. 9. 17. 18:58

📍클래스란?

  • 객체를 찍어내는 틀 / (의미있는) 데이터를 묶음으로 만들려는 것이다.  ex) 붕어빵을 찍어내기 위한 틀 / 붕어빵은 객체라고 한다.
  • 스위프트에서 특별히 클래스의 instance를 객체(Object)라고 부른다.
class Movie{
    var name = "쉰들러리스트"
    var time = 196
    
    func start(){
        print("\(name) 상영이 시작했습니다")
    }
    
     func end(){
         print("\(name) 상영이 끝났습니다.")
    }
    
}

var cgv = Movie()
cgv.name = "블랙스완"
cgv.start()
  •  속성과 메서드 반드시 2가지로 이루어짐.
    • 속성 : 클래스의 변수
    • 메서드 : 클래스의 함수

 

 

📍구조체란?

  • 객체를 찍어내는 틀 
  • 클래스와 마친가지로 메모리에 찍어낸 것을 인스턴스(instance)라고 함
struct Musical{
    var name = "위키드"
    var time = 150
    
    func play(){
        print("공연 중입니다.")
    }
}

 

 

📍클래스와 구조체 비교

  클래스 구조체
공통점 객체를 찍어내는 틀
타입 참조형식(Reference Type) Value Type(값형식)
메모리 저장위치 인스턴스 데이터는 힙에 저장, 변수는 스택에저장
스택에 저장된 변수 안에는 메모리 주소값이 힙의 인스턴스를 가리킴
인스턴스 데이터를 모두 스택에 저장
전달방법 값을 전달하는것이 아니고 저장된 주소를 전달
(값저장 : 힙 / 주소 저장 : 스택)
값을 전달할때 마다 복사본을 생성
관리방식 힙의 공간에 저장
(ARC시스템을 통해 메모리 관리)
스택의 공간에 저장, 사용 완료 후 사라짐
(메모리에서 자동제거)
각형식의 타입예시 클래스, 클로저 기본타입(Int, String), 튜플, 열거형, 컬렉션, 구조체
let/var 선언 인스턴스 상수(let)로 선언하면 가르키는 인스턴스 고정 
(저장 속성은 각 let/var선언에 따름)
인스턴스 상수(let)로 선언시 저장 속성이 전부 상수로 선언됨
⭐️ 가장 큰 차이는 메모리 저장 방식의 차이 ⭐️

 

 

📍인스턴스

  • 인스턴스는 실제로 메모리에 할당되어 구체적 실체를 갖춘 것이라는 의미다
  • 관습적으로 속성을 먼저 쓰고, 메소드를 작성한다
  • 클래스 내부에는 직접 메서드(함수) 실행문이 올 수없다.
    • 실행했을때 표출되는 에러 _ error: expected 'func' keyword in instance method declaration
  •  대문자로 시작, 뒤에 () 소괄호가 온다면, 이제 이것이 인스턴스의 생성이라는 것을 알아야 한다.
Movie()
Movie(name:"타이타닉", time:195)

 

 

📍초기화(Initialization)

구조체/클래스/열거형

class Movie{

    var name : String
    var time : Double
    
    init(name:String, time:Double){
        self.name = name
        self.time = time
    }

}

var movie = Movie.init(name: "우리들의 행복한 시간", time: 130)
var screen = Movie(name: "전우치", time: 140)

//아규먼트레이블 _ 사용하여 초기화

class Movie3{
    var name : String
    var time : Double
    
    init(_ name:String, _ time:Double){
        self.name = name
        self.time = time
    }
}

var movie3 = Movie3("의형제",144)

 

📍초기화 메서드

  •  함수의 구현이 특별한 키워드인 init으로 선언한다.
  •  인스턴스를 생성 과정 : 저장 속성에 대한 초기값을 설정하여 사용가능한 상태가 되는것
  •  생성자 메서드 실행의 목적은, 모든 저장 속성 초기화를 통한 인스턴스 생성하고, 생성자 실행의 종료시점에는 모든 저장 속성에 값이 저장되어 있어야 한다
  • 생성자 실행시, 메모리 내에 실제 인스턴스를 생성하는 복잡한 코드가 (자동)구현된다고 생각하면된다.
  • 실제데이터(속성), 동작(메서드)를 사용하기 위해서 => 초기화 과정이 반드시 필요하다.
  • 오버로딩을 지원한다. 다양한 파라미터 조합으로 생성자를 여러개 구현가능하다.

 

 

📍클래스와 구조체 사용하는 이유

1. 사용하려는 모델의 설계 ex) VO, DAO, Helper Object

2. 애플이 미리 설계한 클래스/ 구조체들을 잘 사용하기 위함  ex) 프레임워크

 

 

📍클래스와 구조체를 사용 할때 

구조체 

  • 연관된 데이터를 단순히 묶고, 묶은 데이터를 참조하는 것보단 복사해서 사용하는 것이 효율적일때 사용한다
  • 구조체에 저장된 저장 속성들이 값 타입이며 참조하는 것보다 복사하는 것이 합당할때 사용한다 

=> 메모리에 오랫동안 저장하지않음 _ 상속없이, 가볍게 사용가능하다(애플은 구조체를 사용하기를 권장함) 

 

클래스 

  • 데이터에서 상속의 구조가 필요할때, serialize해서 전송하거나 파일로 저장할 경우가 발생할때 사용한다. 

=> 메모리에 오랫동안 저장(관리) _ 상속  

'개발 > Swift' 카테고리의 다른 글

[swift] 타입 캐스팅(Type Casting)  (1) 2023.10.08
Comments