2024. 3. 8. 12:12ㆍ카테고리 없음
클래스 선언
class Rectangle {
}
클래스 객체 생성
var a = Rectangle()
해당 문법을 통해 객체를 생성하지 않는다. 자바와 다르게 new를 사용하지않는다.
객체를 생성할 때 var 를 사용했는데 let을 사용해도 되고 선언했을떄의 차이는 변수, 상수의 차이다.
소스파일의 단위와 클래스 정의 단위가 다르다.
즉 하나의 클래스를 여러 소스파일에 작성할 수 있고 여러 클래스를 하나의 소스파일에 작성할 수 있다.
프로퍼티
2가지 종류
1. 저장 프로퍼티
2. 계산 프로퍼티
class Person {
let thisYear = 2024
var birthYear = 0
var age: Int {
get{
return thisYear - birthYear
}
set{
birthYear = thisYear - newValue
}
}
}
해당 예제에서 thisYear과 birthYear은 저장 프로퍼티로 값을 저장하는 역할을 하고
age같은경우 newValue에 따라 birthYear을 초기화시켜주는 역할을 하는 계산 프로퍼티이다.
저장 프로퍼티에서 알아야할 사항
계산 프로퍼티에서 몇가지 유의할 점
1. set같은경우 생략하여 읽기전용으로 만들수있다.
2. 원래 set( newValue )인데 set내부에서 newValue를 사용한다면 생략가능하다.
3. set( newValue )에 newValue말고 다른 이름을 사용할 수 있다.
4. 계산 프로퍼티에는 자료형 추론이 안돼 get이 반환하는 자료형과 같은 자료형을 명시해줘야한다.
5. set을 생략하는 경우 get를 안써도 상관없고 return도 생략할 수 있다.(계산프로퍼티에 자료형을 명시하기때문에 가능하다)
메소드
self 포인터로 객체 자신을 참조할 수 있음.
func으로 정의할 수 있음
타입 멤버? 인스턴스 멤버?
static을 사용하는 경우 타입 멤버,
static이 없는 경우 인스턴스 멤버가 된다.
static을 사용하는 타입멤버는 해당 객체에 인스턴스 멤버를 접근할 수 없고
인스턴스 멤버는 해당 객체에 타입멤에 접근할 수 는 있지만 클래스명을 붙여서 접근 가능하다.
프로퍼티 변경 감시
저장 프로퍼티같은 경우 willSet 과 didSet으로 저장 프로퍼티의 값 변경 이후 특정 동작을 취하도록 만들수있다.
class Rectangle{
var height = 0 {
willSet{
print("변경예정 : \(newValue)")
}
didSet{
print("변경후 : \(oldValue)")
}
}
}
var rect = Rectangle()
rect.height = 10
이러한 결과가 나온다.
프로퍼티 늦은 초기화
class Person {
var phone = Phone()
}
class Phone{
var number : String
init(){
print("객체생성")
number = "010-1234-5678"
}
}
이러한 코드가 있을때 Person 객체를 생성하면 Phone 객체가 함께 생성된다.
하지만 lazy 키워드를 사용하면 Person객체에서 Phone 프로퍼티를 사용하는 시점에 Phone 객체가 생성되도록 만들 수 있다.
class Person{
lazy var phone = Phone()
}
let john = Person()
john.phone