class Man{
var age : Int = 1
var weight : Double = 3.5
func display(){
print("나이=\(age), 몸무게=\(weight)")
}
class func cM(){
print("cM은 클래스 메서드입니다.")
}
static func scM(){
print("scM은 클래스 메서드(static)")
}
}
var kim : Man = Man()
kim.display() //인스턴스 메서드는 인스턴스가 호출
Man.cM() //클래스 메서드는 클래스가 호출
Man.scM()
// 나이=1, 몸무게=3.5
// cM은 클래스 메서드입니다.
// scM은 클래스 메서드(static)
https://docs.swift.org/swift-book/LanguageGuide/Initialization.html
class Man{
var age : Int = 1 // 초기값 1과 3.5는 생략 가능
var weight : Double = 3.5
func display(){
print("나이=\(age), 몸무게=\(weight)")
}
init(yourAge: Int, yourWeight : Double){
age = yourAge
weight = yourWeight
} //designated initializer
}
//var kim : Man = Man() //오류
//init()을 하나라도 직접 만들면 default initializer는 사라짐
var kim : Man = Man(yourAge:10, yourWeight:20.5)
kim.display()
class Man{
var age : Int = 1
var weight : Double = 3.5
func display(){
print("나이=\(age), 몸무게=\(weight)")
}
init(yourAge: Int, yourWeight : Double){
age = yourAge
weight = yourWeight
} //designated initializer
}
//var kim : Man = Man() //init()호출 : 오류
var kim : Man = Man(yourAge:10, yourWeight:20.5)
//init(yourAge: Int, yourWeight : Double)호출
kim.display()
- 아래 소스에서는 self를 붙이거나 생략해도 됨
class Man{ var age : Int = 1 var weight : Double = 3.5 init(yourAge: Int, yourWeight : Double){ age = yourAge //self.age = yourAge weight = yourWeight } }
- 아래의 소스에서는 매개변수와 구분하기 위해 반드시 써야함
class Man{ var age : Int = 1 var weight : Double = 3.5 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()
computed property(계산 프로퍼티)는 property가 설정되거나 검색되는 시점에서 계산 또는 파생된 값
계산 프로퍼티 내에는
-> 값을 리턴하는 getter 메서드
-> 값을 대입하는 setter 메서드
manAge는 계산 프로퍼티로 저장 프로퍼티 age의 값에서 1을 뺀 값으로 하겠다는 것임
class Man{
var age : Int = 1 // stored property
var weight : Double = 3.5 // stored property
var manAge : Int{ //메서드 같지만 computed 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)
// 실행결과
나이=10, 몸무게=20.5
9
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)
// 실행결과
나이=10, 몸무게=20.5
9
set(newValue){
age = newValue + 1
}
set{
age = newValue + 1
}
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
// 실행결과
나이=10, 몸무게=20.5
9
10
4
class Man{
var age : Int = 1
var weight : Double = 3.5
var manAge : Int{
get{ return age-1 }
set{ age = newValue + 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
// 실행결과
나이=10, 몸무게=20.5
9
10
4
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()
// 실행결과
나이=10, 몸무게=20.5
나이=10, 몸무게=3.5
.so 나 .dylib
.a
https://docs.swift.org/swift-book/LanguageGuide/Inheritance.html
상속된 클래스는 부모 클래스의 모든 기능을 상속받으며, 자신만의 기능을 추가
상속받은 클래스들을 하위 클래스(subclass) 또는 자식 클래스(child class)
하위 클래스가 상속받은 클래스는 부모 클래스(parent class) 또는 상위 클래스(super class)
- class 자식:부모 {
}
- 부모 클래스는 하나만 가능
- 콜론 다음이 여러 개이면 나머지는 프로토콜
class Man{
var age : Int = 1
var weight : Double = 3.5
func display(){
print("나이=\(age), 몸무게=\(weight)")
}
init(age: Int, weight : Double){
self.age = age
self.weight = weight
}
}
class Student : Man {
//비어있지만 Man의 모든 것을 가지고 있음
}
var kim : Man = Man(age:10, weight:20.5)
kim.display()
var lee : Student = Student(age:20,weight:65.2)
lee.display()
print(lee.age)
// 실행결과
나이=10, 몸무게=20.5
나이=20, 몸무게=65.2
20
class Man{
var age : Int
var weight : Double
func display(){
print("나이=\(age), 몸무게=\(weight)")
}
init(age: Int, weight : Double){
self.age = age
self.weight = weight
}
}
class Student : Man {
var name : String
func displayS() {
print("이름=\(name), 나이=\(age), 몸무게=\(weight)")
}
init(age: Int, weight : Double, name : String){
self.name = name
super.init(age:age, weight:weight) // 이 줄을 안쓰면??
} //error:'super.init' isn't called on all paths before returning from initializer
}
var lee : Student = Student(age:20,weight:65.2,name:"홍길동")
lee.displayS()
lee.display()
// 실행결과
이름=홍길동, 나이=20, 몸무게=65.2
나이=20, 몸무게=65.2
부모와 자식에 display()라는 메서드가 있어서 Student클래스는 display() 메서드가 두 개임
Student클래스의 인스턴스 lee가 display()를 호출할 때, 자식클래스가 새로 만든 display() 메서드가 우선적으로 호출되려면 func 앞에 override키워드 씀
class Man{
var age : Int = 1
var weight : Double = 3.5
func display(){
print("나이=\(age), 몸무게=\(weight)")
}
init(age: Int, weight : Double){
self.age = age
self.weight = weight
}
}
class Student : Man {
var name : String = "김소프"
override func display() {
print("이름=\(name), 나이=\(age), 몸무게=\(weight)")
}
init(age: Int, weight : Double, name : String){
super.init(age:age, weight:weight)
self.name = name
}
}
var lee : Student = Student(age:20,weight:65.2,name:"홍길동")
lee.display()
// 실행결과
이름=홍길동, 나이=20, 몸무게=65.2
출처:iOS프로그래밍기초 (22-2학기)한성현교수님 강의 내용 변형 및 요약 7주차