클래스

JG Ahn·2024년 10월 8일

swift 기초

목록 보기
12/23

1. 클래스란?

  • 참조 타입
  • 대문자 카멜케이스 사용
  • 다중 상속이 되지 않음

2. 문법

// 기본 형태
class 이름 {
	/* 구현부 */
}
  • 프로퍼티 및 메소드 구현
class Sample{
	//가변 프로퍼티
	var mutableProperty: Int = 100
    
    //불변 프로퍼티
	let immutableProperty: Int = 200
    
    //타입 프로퍼티
    static var typeProperty: Int = 300
    
    //인스턴스 메소드
    func instanceMethod() {
    	print("instance method")
    }
    
    //타입 메소드
    //상속시 재정의 불가 타입 메소드 - static
    static func typeMethod() {
    	print("type mehhod - static")
    }
    
    //상속시 재정의 가능 타입 메소드 - class
    class func classMethod() {
    	print("type method - class")
    }
}
  • 클래스 사용
//인스턴스 생성
var mutableReference: Sample = Sample()

mutableReference.mutableProperty = 200

//불변 프로퍼티는 인스턴스 생성 후 수정 불가
//mutableReference.immutableProperty = 210 //컴파일 오류

let immutableReference: Sample = Sample()

//클래스의 인스턴스는 참조 타입이므로 let으로 선언해도 인스턴스의 프로퍼티 값 변경 가능
immutableReference.mutableProperty = 210

//참조정보 변경 불가
//immutableReference = mutableReference //컴파일 오류

//참조 타입이라도 불변 인스턴스는 생성 후에 수정 불가
//immutableReference.immutableProperty = 200 //컴파일 오류

//타입 프로퍼티 및 메소드
Sample.typeProperty = 300
Sample.typeMethod()

//인스턴스에서 타입 프로퍼티나 타입 메소드 사용 불가
//mutableReference.typeProperty = 400 //컴파일 오류
//mutableReference.typeMethod() //컴파일 오류

3. 초기화

  • 클래스는 인스턴스 생성시 반드시 초기화 필요
  • init 초기화를 제공해야 함
    • 모든 프로퍼티에 default값을 제공하면 init 생략가능
    • 모든 프로퍼티가 optional이면 init 생략가능
  • 클래스는 convenience initializer를 제공

<여러가지 init 방법>

  • 지정 초기화
//일반적인 init
class Person {
	var name: String
    var age: Int
    
    init(name: String, age: Int) {
    	self.name = name
        self.age = age
	}
}

let person = Person(name: "sonny", age: 31)

  • 기본값 초기화
//모든 파라미터에 default값이 있어 초기화하지 않아도 됨
class Person {
	var name: String = "이름없음"
    var age: Int = 0
}

let person = Person()

//
class Person {
	var name: String
    var age: Int
    
    //파라미터에 default값을 직접주지 않고 init으로 초기화
    init() {
		self.name = "이름없음"
        self.age = 15
	}
}
  • 여러개의 init 사용
//다양한 상황에서 초기화 가능하도록 서로 다른 매개변수를 받아들이는 초기화 방법
class Person {
		var name: String
        var age: Int
        
        init(name: String, age: Int) {
        	self.name = name
            self.age = age
        }
        
        init(name: String) {
        	self.name = name
            self.age = 0
        }
        
        init() {
        	self.name = "이름없음"
            self.age = 15
        }
}
  • 보조 초기화(convenience init)
//클래스에서만 사용할 수 있는 기능
//self.init 사용
class Person {
	var name: String
    var age: Int
    
    init(name: String, age: Int) {
    	self.name = name
        self.age = age
    }

	convenience init(name: String) {
   		//name만 받더라도 age 기본값을 설정해줌
    	self.init(name: name, age: 0)
    }
}

ler person = Person(name: "이름만 주어짐")
print(person.age)// 결과 : 0

4. 소멸자

  • 클래스에서만 사용 가능
  • 사용 종료된 인스턴스가 메모리에서 해제될 때 자동호출(직접호출 불가)
//기본 형태
deinit {
	//구현부
}

0개의 댓글