About Swift – “클래스(2) 메서드의 종류와 프로퍼티의 종류”
About Swift – “클래스(2) 메서드의 종류와 프로퍼티의 종류”
개요
예전에, 인스턴스는 메모리에 실제로 할당된 객체이고, 프로퍼티란 클래스 내에 포함되는 변수와 상수라고 말씀드렸습니다. 프로퍼티는 초기값이 있어야 하거나, init을 이용해 초기화하거나, 자동으로 nil로 초기화되는 옵셔널 변(상)수로 선언되어야 합니다. 그렇지 않으면, 오류가 날 것입니다.
프로퍼티의 종류에는 저장 프로퍼티와, 계산 프로퍼티가 있습니다.
메서드의 종류에는 인스턴스 메서드, 클래스or타입 메서드가 있습니다.
인스턴스 메서드
인스턴스 메서드는 인스턴스에서 동작합니다.
class Man{
var age : Int = 19
var weight : Double = 85
var birthday : Int = 20050209
func display(){
print("나이=\(age)살")
print("체중=\(weight)킬로그램")
print("생일=\(birthday)")
}
}
var smith : Man = Man()
smith.display() // 메서드에 접근!
print(smith.birthday) // 프로퍼티에 접근!
인스턴스가 만들어져야지만 동작합니다. 인스턴스.프로퍼티
로 프로퍼티에 접근하고, 인스턴스.인스턴스메서드
로 메서드에 접근하는 예제입니다.
클래스 메서드
class Man{
var age : Int = 19
var weight : Double = 85
var birthday : Int = 20050209
func display(){
print("나이=\(age)살")
print("체중=\(weight)킬로그램")
print("생일=\(birthday)")
}
class func classMethod(){
print("this is class method.")
}
class func staticClassMethod(){
print("this is static method.")
}
}
var smith : Man = Man()
smith.display() // 인스턴스가 호출하는 인스턴스 메서드
Man.classMethod() // 클래스가 호출하는 클래스 메서드
Man.staticClassMethod() // 클래스가 호출하는 static 클래스 메서드
클래스(타입) 메서드는 인스턴스 메서드와 동일한 방법으로 선언하는 것을 볼 수 있습니다. 하지만, class 메서드나 static이라는 키워드를 붙여서 선언합니다.
class 키워드로 만든 클래스 메서드는 자식 클래스에서 override가 가능합니다.
프로퍼티의 조건
프로퍼티는 선언될 때 다음의 조건을 따라야 합니다.
- 초기값이 있거나,
- init을 이용해서 초기화를 하거나,
- 자동으로 nil로 초기화되는 옵셔널 변수(상수)로 선언되어야 합니다.
class Man{
var age : Int = 5
var weight : Double = 1.2
var birthday : Int = 12032456
func display(){
}
}
위와 같이 초기값이 있어야 하거나,
class Man{
var age : Int!
var weight : Double!
var birthday : Int?
func display(){
}
}
위와 같이 옵셔널 변수나 상수로 선언되어야 합니다.
아래의 경우, 오류가 날 것입니다. 옵셔널 변수로 선언되지도 않았고 초깃값이 있지도 않고, init으로 초기화하지 않았기 때문입니다.
class Man{
var age : Int
var weight : Double
var birthday : Int
func display(){
print("나이=\(age)살")
print("체중=\(weight)킬로그램")
print("생일=\(birthday)")
}
}
이제 init()으로 초기화하는 방법을 알아봅시다.
init()으로 인스턴스 초기화하기
class Man{
var age : Int
var weight : Double
var birthday : Int
func display(){
print("나이=\(age)살")
print("체중=\(weight)킬로그램")
print("생일=\(birthday)")
}
init(yourAge: Int, yourWeight: Double, yourBirthday: Int){
age = yourAge
weight = yourWeight
birthday = yourBirthday
}
}
var smith : Man = Man(yourAge:19, yourWeight:50, yourBirthday:20200313)
smith.display()
위는 init으로 초기화한 경우입니다. 이 경우에는, 초기값이 없어도 오류가 나지 않습니다.
stored property란?
computed property는 프로퍼티가 설정되거나 검색되는 시점에서 계산, 또는 파생된 값을 일컫습니다. 계산 프로퍼티 안에는 값을 리턴하는 게터 메서드, 값을 대입하는 세터 메서드가 있습니다.
class Man{
var age : Int = 1 // stored property
var weight : Double = 3.5 // stored property
var manAge : Int{ //stored property
get{
return age-1
}
}
func display(){
print("나이=\(age), 몸무게=\(weight)")
}
init(age: Int, weight : Double){
self.age = age
self.weight = weight
}
}
var kim : Man = Man(age:10, weight:20.5)
kim.display()
print(kim.manAge)
4줄의 코드를 보면, 그것은 메서드와 같아 보이지만 computed property입니다. manAge는 계산 프로퍼티로, age 값에서 1을 뺀 값으로 하겠다는 의미입니다.
class Man{
var age : Int = 1
var weight : Double = 3.5
var manAge : Int{ //메서드 같지만 계산 프로퍼티임
//get{
return age-1
// }
}
func display(){
print("나이=\(age), 몸무게=\(weight)")
}
init(age: Int, weight : Double){
self.age = age
self.weight = weight
}
}
var kim : Man = Man(age:10, weight:20.5)
kim.display()
print(kim.manAge)
위의 코드를 살펴봅시다. get{} 부분이 주석처리가 되어있는 것을 볼 수 있는데, setter가 없으면 get{}은 생략할 수 있습니다. 그리고, 생략한 경우에는 var로 선언해야 합니다.
class Man{
var age : Int = 1
var weight : Double = 3.5
var manAge : Int{
get{
return age-1
}
set(USAAge){
age = USAAge + 1
}
}
func display(){
print("나이=\(age), 몸무게=\(weight)")
}
init(age: Int, weight : Double){
self.age = age
self.weight = weight
}
}
var kim : Man = Man(age:10, weight:20.5)
kim.display()
print(kim.manAge) //9, getter호출
print(kim.age) //10
kim.manAge = 3 //setter호출
print(kim.age) //4
//set{
//age = newValue + 1
//}
위는 setter의 코드입니다. set{}로, 매개변수명은 newValue라는 키워드를 기본으로 사용합니다. 아래의 주석과 같인 setter의 매개변수명이 newValue인 경우, newValue를 생략할 수 있습니다.
method overloading – 생성자 중첩
매개변수의 개수, 자료형은 모두 다르나
이름이 같은 함수를 여러 개 정의합니다.
그러면, 매개변수가 다른 두 생성자를 통해 두 가지 방법으로 인스턴스를 만들 수 있습니다.
class Man{
var age : Int = 1
var weight : Double = 3.5
func display(){
print("나이=\(age), 몸무게=\(weight)")
}
init(age: Int, weight : Double){ //1
self.age = age
self.weight = weight
}
init(age: Int){ //2
self.age = age
}
}
var kim : Man = Man(age:10, weight:20.5) //1
var kim1 : Man = Man(age:10) //2
//var kim2 : Man = Man()
//init가 없다면 인스턴스 만드는 방법
kim.display()
kim1.display()