- 객체지향 용어
- Swift
- 멤버 변수 = 프로퍼티(Property)
- 멤버 함수 = 메소드(Method)
- Objective-C
- 멤버 변수 = 인스턴스(Instance)
- 멤버 함수 = 메소드(method)
- 객체 인스턴스
- 실제로 메모리에 할당된 객체(object)
- 객체의 구성
- 데이터 변수(data variable) or 속성(property)
- 함수 or 메서드(method)
- Swift
- 클래스
- 기본 클래스 선언 방식
class 새로운 클래스 이름: 부모 클래스 { // 프로퍼티 => 클래스 내에 포함되는 변수(var)와 상수(let)를 정의한다. // 인스턴스 메서드 => 객체가 호출하는 메서드를 정의한다. // 타입(type) 메서드(클래스 메서드) => 클래스가 호출하는 메서드를 정의한다. }
- 클래스에 property 추가하기
-
Property는
ㄴ 초기값이 있거나 ㄴ init을 이용해서 초기화하거나 ㄴ 옵셔널 변수(상수)로 선언
-
property는 저장 프로퍼티(stored property)과 계산 프로퍼티(computed property)가 있다.
class Ho{ let age : Int = 21 // stored property 는 초기값이 있어야한다. var weight : Double = 3.4 var height : Double? // 옵셔널 변수는 자동으로 =nil }
-
- 메서드(Method)
- 인스턴스(instance) 메서드, 클래스 또는 타입(class or type)메서드
- 인스턴스 메서드는 인스턴스에서 동작
class Ho{ let age : Int = 21 // stored property 는 초기값이 있어야한다. var weight : Double = 70 var height : Double? // 옵셔널 변수는 자동으로 =nil func display(){ print("나이 = \(age), 몸무게 = \(weight), 키 = \(height)") } //나이 = 21 몸무게 = 70 키 = nil } var x : Int var shin : Ho = Ho() // : Ho 생략가능 + 디폴트 생성자 print(shin.age) // 21 shin.display() //인스터스 메서드는 인스턴스가 호출
- 인스턴스(instance) 메서드, 클래스 또는 타입(class or type)메서드
- 클래스(class or type) 메서드
- 타입 메서드 / 클래스 메서드 = 클래스 레벨에서 동작 ㄴ 클래스의 새로운 인스턴스를생성하는 것과 같은 동작
- 타입 메서드는 인스턴스 메서드와 동일한 방법으로 선언하지만 class 나 static 키워드를 앞에 붙여서 선언
- class키워드로 만든 클래스 메서드는 자식 클래스에서 override가능
class Ho{ let age : Int = 21 var weight : Double = 70 var height : Double? func display(){ print("나이 = \(age), 몸무게 = \(weight), 키 = \(height)") } class func Hy(){ //override 가능 print("Hy은 클래스 메서드 입니다.") } static func Shh(){ print("Shh은 클래스 메서드(static)") } } var x : Int var shin : Ho = Ho() // : Ho 생략가능 + 디폴트 생성자 print(shin.age) shin.display() //인스턴스 메서드는 인스턴스가 호출 Ho.Hy() //클래스 메서드는 클래스가 호출 Ho.Shh() //클래스 메서드는 클래스가 호출
- 인스턴스 초기화 : init()
- 클래스, 구조체, 열거형(enum) 인스턴스가 생성되는 시점에서 해야 할 초기화 작업
class Ho{ let age : Int // 초기값이 없어도 init()으로 인해 없어도 가능하다 var weight : Double var height : Double func display(){ print("나이 = \(age), 몸무게 = \(weight), 키 = \(height)") } init(hoAge : Int, hoWeight : Double, hoheight : Double){ age = hoAge weight = hoWeight height = hoheight } //designaed initializer = 모든 프로퍼티(age,weight,height)를 다 초기화 시키는 생성자 } var shin : Ho = Ho(hoAge : 21, hoWeight : 70, hoheight : 170) shin.display()
- Self
- 현재 클래스 내 메서드나 프로퍼티를 가리킬 때 메서드나 프로퍼티 앞에 붙인다.
class Ho{ let age : Int var weight : Double var height : Double func display(){ print("나이 = \(age), 몸무게 = \(weight), 키 = \(height)") } init(age : Int, weight : Double, height : Double){ self.age = age //self.age = 클래스 메서드 가리킨다. self.weight = weight //weight = init 메소드안 지역변수를 가리킨다. self.height = height } } var shin : Ho = Ho(age : 21, weight : 70, height : 170) shin.display()
- Stored property 와 Computed property
- computed property(계산프로퍼티)는 property가 설정되거나 검색되는 시점에서 계산 또는 파생된 값
- 값을 리턴하는 게터(getter) 메서드
class Ho{ let age : Int // stored property var weight : Double // stored property var height : Double var manAge : Int{ // computed property //setter가 없으면 get{ }는생략할수 있으며 변경하지않더라도 var로 선언해야함 get{ // get{} 생략가능 return age-1 } } func display(){ print("나이 = \(age), 몸무게 = \(weight), 키 = \(height)") } init(age : Int, weight : Double, height : Double){ self.age = age self.weight = weight self.height = height } //designaed initializer } var shin : Ho = Ho(age : 21, weight : 70, height : 170) shin.display() print(shin.manAge) //20
- 값을 대입하는 세터(setter) 메서드
class Ho{ var age : Int var weight : Double var height : Double var manAge : Int{ get{ return age-1 } //set 과 같이 사용 할 땐 get{}생략 불가 set(USAAge){ age = USAAge + 1 } //(USAAge)대신 (newValue) 사용시 set의 괄호 생략가능 } func display(){ print("나이 = \(age), 몸무게 = \(weight), 키 = \(height)") } init(age : Int, weight : Double, height : Double){ self.age = age self.weight = weight self.height = height } //designaed initializer } var shin : Ho = Ho(age : 21, weight : 70, height : 170) shin.display() print(shin.manAge) //20, getter 호출 print(shin.age) //21 shin.manAge = 19 //setter 호출 print(shin.age) //20
- computed property(계산프로퍼티)는 property가 설정되거나 검색되는 시점에서 계산 또는 파생된 값
-
Method Overloading : 생성자 중첩
class Ho{ var age : Int var weight : Double = 70 var height : Double = 170 func display(){ print("나이 = \(age), 몸무게 = \(weight), 키 = \(height)") } init(age : Int, weight : Double, height : Double){ self.age = age self.weight = weight self.height = height } //designaed initializer init(age : Int){ //매개변수의 개수와 자료형이 다른 같은 이름의 함수를 여러 개 정의 self.age = age } } var shin : Ho = Ho(age : 21, weight : 70, height : 170) var shin1 : Ho = Ho(age : 20) //20 //overloading 호출 shin.display() shin1.display() }
- Failable Initializers(실패 가능한 생성자: init?)
-
init?로 만든 인스턴스는 옵셔널형으로 만들어져서,
사용하려면 옵셔널을 언래핑해야 해서 제일 마지막에 “!”사용
- 오류 상황에 nil을 리턴하는 조건문이 있다 [return nil]
class Ho{ var age : Int var weight : Double = 70 var height : Double = 170 func display(){ print("나이 = \(age), 몸무게 = \(weight), 키 = \(height)") } init?(age : Int, weight : Double, height : Double){ if age <= 0 || weight <= 0 || height <= 160 { return nil } else{ self.age = age self.weight = weight self.height = height } } } var shin : Ho? = Ho(age : 21, weight : 70, height : 170) // 옵셔널 형으로 선언 if let shin1 = shin{ //옵셔녈 바인딩 shin1.display() //나이 = 21, 몸무게 = 70.0, 키 = 170.0 } var shin2 : Ho? = Ho(age : 0, weight : 70, height : 170) if let shin3 = shin2{ shin3.display() //nil } if let shin4 = Ho(age : 19, weight : 70, height : 150){ //인스턴스 생성과 동시에 옵셔널 바인딩 shin4.display() //nil } //강제 언래핑 하는 방법은 충돌이 발생해 위험하다. var shin5 : Ho = Ho(age : 21, weight : 70, height : 170)! //인스턴스 생성하면서 바로 강제 언래핑 shin5.display() var shin6 : Ho? = ho(age : 21, weight : 70, height : 170) //옵셔널 인스턴스를 사용시 강제 언래핑 shin6!.display()
-