swift 클래스

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