[Swift] Class & Struct

임승섭·2023년 5월 28일
0

Swift

목록 보기
5/35

Class (클래스)

객체지향 프로그래밍 (프로그래밍 패러다임)

클래스 : 붕어빵 틀

객체 (실제 데이터) : 각 붕어빵

class Dog { 		// 대문자로 시작
	var name = "강아지"	// 변수와 함수를 묶음으로 다룬다
    var weight = 0
    
    func sit() {
    	print("\(name)이 앉다.")
    }
    
    func layDown() {
    	print("누웠다.")
    }
    
    // 각 변수와 함수를 '멤버'라고 한다 '.' 찍어서 사용 가능
    
    // 클래스 내의 변수 -> "속성(property)"
    // 클래스 내의 함수 -> "메서드(method)"
}

var bori = Dog()	// 실제 찍어낸 데이터 (객체 생성)
bori.name			// 객체 속성에 접근
        
var choco = Dog()	
choco.name = "초코"	// 데이터 변경
choco.name			 // 변경된 데이터	

Struct (구조체)

클래스와 크게 다른 개념x

struct Bird {
	var name = "새"
    var weight = 0.0
    
    func fly() {
    	print("날아간다")
    }
}

var aBirt = Bird()	 // instance 생성
aBird.name = "참새"	// instance 속성에 접근

  • 하나하나 찍어낸 것 : 인스턴스 (실제로 메모리에 할당되어 구체적 실체를 갖춘 것)

  • 클래스의 instance는 객체(object)라고 부른다

  • 메모리 저장 방식의 차이 (자료 참고)

  • 메모리 관련 내용은 따로 정리

  • 둘 차이는 강의자료


Initialization (초기화)

생성자(initializer) 사용

class Dog { 		
	// 타입만 선언한다
	var name: String	
    var weight: Double
   
    // 생성자 (initializer)
    init(n: String, w: Double) {
    	name = n
        weight = w
    }
    
/*  // 같은 명칭을 사용하고 싶을 때 self 사용. 일반적으로 같지 않아도 그냥 self 사용 가능하다
    init(name: String, weight: Double) {
    	// 실제 인스턴스의 값 -> self
    	self.name = name
        self.weight = weight
    }
*/    

	func sit() {
    	print("\(self.name)이 앉았습니다")	// self.name으로 사용 가능
    }
}

var bori = Dog(n: "보리", w: 15.0)
bori.name			// 보리
bori.weight			// 15.0

var choco = Dog(n: "초코", w: 7.0)
choco.name			// 초코
choco.weight		// 7.0


// 동일한 코드
var dog3 = Dog.init(~~~)
var dog3 = Dog(~~~)
  • 모든 저장 속성을 초기화 해야 한다
  • 즉, 생성자 실행 종료시점에는 모든 속성의 초기값이 저장되어 있어야 한다
  • 인스턴스 초기화 완료 -> 메모리에 정상적으로 인스턴스 생성

속성이 Optional인 경우

class Dog3 {
	var name: String?
    var weight: Int
    
    init(weight: Int) {
    	// self.name = "강아지"	// 기본값을 제시해주는 것도 가능 -> 출력 시 Optional("강아지")
        self.weight = weight
    }
    
    
/*  // 함수 인자 자체로 초기값(기본값)을 세팅해줄 수도 있다
	init(name: String = "강아지", weight: Int) {
    	self.name = name
        self.weight = weight
    }
*/
    
    func sit() {
    	print("\(name)이 앉았습니다")
    }
}


var dog777 = Dog3(weight: 10)
dog777.name				// nil (값이 없어도 상관은 없지만 nil로 초기화가 된다.)
dog777.weight			// 10
  • Optional type을 가진 변수는 반드시 초기화값이 있을 필요는 없다
    기본적으로 nil로 초기화

Example

// 도서 관리 프로그램
class Book {
	var name: String
    var price: Int
    var publisher: String
    var author: String
    var totalPage: Int
    
    init(n: String, p: Int, pub: String, a: String, t: Int) {
    	self.name = n
        self.price = p
        self.publisher = pub
        self.author = a
        self.totalPage = t
    }

var book1 = Book(n: "스위프트", p: 30000, pub: "애플", a: "잡스", t: 200)
var book2 = Book(n: "코틀린", p: 25000, pub: "안드로이드", a: "봉구", t: 300)


// 영화 정보 프로그램
class Movie {
	var name: String
    var genre: String
    var mainActor: String
    var director: String
    var day: String
    
    init(n: String, g: String, m: String, d: String, day: String) {
    	self.name = n
        self.genre = genre
        self.mainActor = m
        self.director = d
        self.day = day
    }

}

Class vs. Struct

구분structclass
메모리 관련값 저장 in Stack
복사 전달
메모리에서 자동 제거
값 저장 in Heap
주소 전달
ARC로 관리
typevalue typereference type
let / varlet 선언(인스턴스)
-> 저장 속성이 모두 상수로 선언
let 선언(인스턴스)
-> 가르키는 인스턴스 고정
initializermemberwise 자동 제공편의 생성자 존재
property in method메서드 내에서 속성 변경 불가능
(단, mutating 키워드로 가능)
메서드 내에서 속성 변경 가능
deinitializer소멸자 없음소멸자 있음
상속 가능여부불가능가능

OOP의 특징

  • 추상화 (모델링)
    • 실제 구체적인 것들 중 관찰자가 관심있는 부분만 가지고 재조합한다
    • 공통적인 특성을 뽑아내서 하나의 분류(class)로 만든 것
    • (의미있는 데이터를 묶음으로 만든다)
  • 캡슐화 (데이터 캡슐화)
    • 연관이 있는 속성과 메서드를 하나의 '클래스'로 묶어서 활용
    • 은닉화 : 접근제어자(private, public) 사용해 객체 외부에서 내부 데이터 접근 통제 가능
  • 상속성 (재사용, 확장)
    • 부모 클래스의 속성과 메서드 자식 클래스에서 물려받음
  • 다형성
    • 하나의 객체가 여러가지 타입으로 저장.
    • 다양한 방식으로 동작 가능 (

0개의 댓글