차근차근 개발중
[Swift] 클래스와 구조체 본문
📍클래스란?
- 객체를 찍어내는 틀 / (의미있는) 데이터를 묶음으로 만들려는 것이다. 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