[Swift] 객체 지향

Boogios·2023년 6월 1일
0
post-thumbnail

Swift의 모든 타입

  1. 구조체 - struct
  2. 열거형 - enum
  3. 클래스 - class

위의 3가지 중 하나의 타입임, 모두의 역할이 다 다름


클래스 Class

  • 캡슐화(encapsulation)
  • 상속(inheritance)
  • 다형성(polymorphism)

객체: 하나 이상의 역할을 수행하는 메서드와 데이터의 묶음, 재사용할 수 있는 독립적인 기능 모듈
속성(property)과 함께 함수(method)로 구성됨

	class MyCar {
    	var price: Float = 0 // 프로퍼티(property) 또는
        var name: String = "Tesla" // 인스턴스 변수(instance variable)라고 부름
        
        init(carPrice: Float, carName: String) {
        	price = carPrice
            name = carName
        }
        
        deinit {
        	// 클래스가 소멸하기 전에 수행하는 곳
        }
        
        func printResult() { // 인스턴스 메서드
        	print("print")
        }
        
        class func getMaxPrice() -> Float { // class 메서드
        	return 1000.00
        }
    }
    

MyCar 클래스의 인스턴스 생성, 초기화하기

	var exampleCar: MyCar = MyCar() // 초기화, init (initialization)
    var exampleCar1: MyCar = MyCar(
    			carPrice: 700.0,
                carName: "Tesla"
            )

클래스가 소멸하기 전에 해야할 일들은 deinit에 작성함
라이프사이클 Life Cycle : init - func - deinit 순으로 실행됨

  • 클래스 안의 메서드 호출, 접근 -> 점 표기법!
    클래스인스턴스.프로퍼티명 or 클래스인스턴스.인스턴스메서드()
	var yourcar = exampleCar1.carName // yourcar 변수에 "Tesla" 값 저장
    
    exampleCar1.carName = "KIA" // 클래스 안의 프로퍼티 값 변경
    
    exampleCar1.printResult() // 클래스 안의 메서드(인스턴스 메서드) 호출
    
    var maxPrice = MyCar.getMaxPrice() // 클래스 메서드 호출

클래스 프로퍼티 (저장 프로퍼티, 연산 프로퍼티)

저장 프로퍼티(stored property) - 상수나 변수에 담기는 값

연산 프로퍼티(computed property) - 계산이나 로직에 따라 처리된 값

연산 프로퍼티는 getter를 생성, 선택적으로 setter도 생성

	class MyCar {
    	var price: Float = 0 // 여기는
        var name: String = "Tesla" // 전부 다
        var tax: Float = 10 // 저장 프로퍼티
        
        var minusTax: Float { // 연산 프로퍼티
        	get { // getter
            	return price - tax
            }
            
            set { // setter (선택 사항)
            	price = newPrice - tax
        	}
        }
        
        init(carPrice: Float, carName: String) {
        	price = carPrice
            name = carName
        }

함수로도 만들어 사용할 수 있지만 코드가 더 깔끔해짐
get, set 하나씩 메서드를 만들어야 하지만 연산 프로퍼티 하나를 적으면 끝!

지연 저장 프로퍼티 - lazy


self

대부분 self는 선택적으로 사용
사용해야하는 상황 -> 프로퍼티나 메서드를 클로저 표현식 내에서 참조할 경우
클로저 표현식에서는 반드시!! self를 사용해야 함!

또한, 함수의 매개변수와 클래스 프로퍼티가 이름이 같을 경우 사용해야함

    // 클래스 안이라고 가정
    var age: Int = 10
    
	func getAge(age: Int) {
    	print(age) // 함수의 매개변수
        print(self.age) // 클래스 프로퍼티
    }

self 사용 여부는 개발자에 따라 다르다! 마음가는대로~ 안써도 되는 상황이면 안쓰려고 생각중!


불투명 반환 타입 some

불투명한 반환 타입은 프로토콜 앞에 some 키워드를 붙임
이걸 쓰면 모든 타입이 반환될 수 있도록 해줌

	func exampleFunc(value: Int) -> some Equatable { // Equatable 은 프로토콜
    	value * 2
    }

이 내용은 추후에 프로토콜 개념을 다룰때 좀 더 자세히 하는걸로!
SwiftUI 에서 자주 쓰인다고 함

profile
iOS Developer

0개의 댓글