클래스의 정의와 객체 생성
- 클래스 정의
class ClassName {
}
- 객체 생성
var object = ClassName()
- 소스 코드 파일과 클래스
- 소스 파일 단위와 클래스 정의 단위는 서로 다름
- 하나의 소스 코드 파일에 다수의 클래스 작성
- 하나의 클래스를 개별 소스 코드 파일 생성
- 햐나의 클래스를 다수의 소스 코드파일에 작성 (extension)
프로퍼티
--> 객체의 데이터, 저장/계산 프로퍼티, 값을 저장하고 읽는 행위
- 저장 프로퍼티
- 데이터를 저장하는 용도
- 데이터 읽기/쓰기 행위
- 객체 생성시 초기화, 초기화 방법 필요
class MyClass {
//초기값을 설정한 프로퍼티
var intProperty = 0
//초기값을 설정하지 않은 옵셔널 프로퍼티
var floatProperty = Float?
//에러 - 초기화되지 않은 프로퍼티 : initializer 필요
var strProperty : String
}
- 계산 프로퍼티
- 데이터 저장 안함
- 프로퍼티 읽기 / 쓰기 코드 작성
저장 프로퍼티
- 저장 프로퍼티 사용
- 프로퍼티에 값 저장
- 프로퍼티의 값 얻어오기
var obj = MyClass()
obj.intProperty = 10
obj.floatProperty = 3.1
let val = obj.floatProperty
val // Optional(3.1)
계산 프로퍼티
- 계산 프로퍼티
- 값을 얻어오기(get)
- 값을 설정하기(set) - 정의
var [프로퍼티 이름] : [타입] { //생략불가
get {
return RETURN_VALUE //타입과 일치
}
se(newValue) {
//블록 안에서 newvalue이름 그래도 사용하는 경우(newValue)생략 가능
다른 이름으로 변경가능하며 이 경우는 생략 불가
}
}
- 저장 프로퍼티와 계산 프로퍼티
class Person {
let thisYear = 2020
var birthYear : Int = 1994
var age : Int {
get{
return thisYear - birthYear
}
set (newValue) {
birthYear = thisYear - newValue
}
}
}
var age = Person()
print("올해 : \(age.thisYear)")
print("생일 : \(age.birthYear)")
print("AGE : \(age.age)")
올해 : 2020
생일 : 1994
AGE : 26
- 계산 프로퍼티 : 읽고 쓰기
- 읽고 쓰기 가능 : get/set 모두 작성
- 읽기(get) 전용 : get 선언 생략 가능
- 쓰기(set) 전용은 없음
메소드
--> 클래스 내에 작성하는 함수
- 메소드 사용
- 객체 생성 후 사용
- 외부 파라미터 이름 사용
class Counter { //클래스 선언
var count = 0
func increment(){
count+=1
}
func increment(amount: Int) {
count += amount
}
func increment(amount: Int, times: Int){
count += amount * times
}
}
let counter = Counter() //객체 생성
counter.increment()
print("\(counter.count)")
counter.increment(amount: 5) //1+5
print("\(counter.count)")
counter.increment(amount: 3, times: 5) //6 + 3 * 5
print("\(counter.count)")
- Slef 포인터
- 객체 자신을 참조하는 포인터
- 프로퍼티 이름과 파라미터이름이 겹칠 때 (필히 사용. 그외에는 생략가능)
class Counter { //클래스 선언
var count = 0
func setCount(count: Int){
self.count = count
}
}
let counter = Counter() //객체 생성
print("\(counter.count)") //0
counter.setCount(count: 20)
print("\(counter.count)") //20
타입 메소드, 타입 프로퍼티
- 인스턴스 메소드
- 객체 생성, 객체의 사용(obj.method)
- 인스턴스 멤버(메소드 / 프로퍼티) 접근 가능
- 타입 멤버 (메소드 / 프로퍼티) 접근 불가 - 타입 메소드
- 객체 생성하지 않고 사용
- 인스턴스 멤버( 메소드 / 프로퍼티) 접근 불가
- 타입 멤버(메소드 / 프로퍼티) 접근 가능
- static -> 객체 선언x
class MyClass {
var property = 0
static var staticProperty = 0
//타입 메소드
static func typeMethod() {
// property = 2 //에러. 타입 메소드에서 프로퍼티 접근 불가
staticProperty = 1 // Ok
print("Type method works")
}
func intanceMethod() {
property = 1 // 인스턴스 메소드에서 프로퍼티 접근 가능
//staticProperty = 1 // 에러
print("Instance method works")
}
}
//인스턴스 메소드 사용
var obj = MyClass()
obj.intanceMethod()
//타입 메소드 사용
MyClass.typeMethod()
- 타입 프로퍼티
- 계산 프로퍼티, 저장 프로퍼티 가능
- 객체 생성하지 않고 사용
class Rectangle {
var width : Int = 0
//게산 타입 프로퍼티
static var name : String {
return "사각형"
}
//저장 타입 프로퍼티
static var edge = 4
}
//프로퍼티 사용
var obj = Rectangle()
obj.width = 10
//타입 프로퍼티 접근
Rectangle.edge //4
Rectangle.name //사각형
- 프로퍼티 변경 감시
- 프로퍼티 변경 전 : willSet
- 프로퍼티 변경 후 : didSet
- Initializer의 초기화 때는 동작 안함
class Rectangle {
var height : Int = 0 {
willSet(newValue){
print("사각형 높이 변경 예정 : \(newValue)")
}
didSet(oldValue){
print("사각형 높이 변경 완료. 이전값 : \(oldValue)")
}
}
}
var obj = Rectangle()
obj.height = 30
- 프로퍼티 늦은 초기화
- 다른 클래스 타입의 프로퍼티 초기화
//프로퍼티 초기값으로 객체 생성
class Person {
var phone = Phone()
}
class Phone {
var number : String
init(){
print("Phone 객체 생성")
number = "080-7130-4922"
}
}
let obj = Person()
print(obj.phone.number)
- 프로퍼티의 늦은 초기화 : lazy
class Person {
lazy var phone = Phone()
}
class Phone {
var number : String
init(){
print("Phone 객체 생성")
number = "080-7130-4922"
}
}
let Mai = Person()
Mai.phone // 이때 Phone 객체를 생성하여 초기화 됨