금일 강의는 Class, Overloading, Override, failable initializer와 같은 클래스와 메서드들의 심화과정을 실습코드들과 함께 배워보았다.
아래 코드들은 강의중 교수님께서 실습코드로 사용하신 코드를 조금의 변형과 함께 실습한 코드들이다.
프로퍼티는 초기값이 있거나 옵셔널 변수(상수)로 선언
class Man1{
var age : Int =1 //stored property는 초기값이 있어야 함
var weight : Double =3.5
}
class Man2{
var age : Int? //stored property는 초기값이 있어야 함, nil
var weight : Double !
}
var kim = Man1()
print(type(of:kim)) //Man1
var lee = Man2()
print(lee.age) //nil
인스턴스 만들고 메서드와 프로퍼티 접근
class Man{
var age : Int =1
var weight : Double =3.5
func display(){ //인스턴스 메서드
print("나이=\(age), 몸무게=\(weight)")
}
}
var gim : Man = Man()
gim.display() //나이=1, 몸무게=3.5
var kim = Man()
kim.display() //인스턴스.인스턴스메서드
print(kim.age) //인스턴스.프로퍼티 1
클래스 (class or type) 메서드
class Man{
var age : Int =1
var weight : Double =3.5
func display(){
print("나이=\(age), 몸무게=\(weight)")
}
class func cM(){
print("cM은 클래스 메서드.")
//main.swift:9:25: error: instance member 'age' cannot be used on type 'Man'
//print("나이=\(age), 몸무게=\(weight)")
}
static func scM(){
print("scM은 클래스 메서드(static)")
}
}
Man.cM() //클래스 메서드는 클래스가 호출
Man.scM() //클래스 메서드는 클래스가 호출
//인스턴스가 생성 안되어도 호출 가능함!
인스턴스 초기화하기 : init()
class Man{
var age : Int //초기값 1과 3.5는 생략 가능함
var weight : Double //designated initializer, 모든 프로퍼티를 초기화 시키기 때문
func display(){
print("나이=\(age), 몸무게=\(weight)")
}
init(yourAge: Int, yourWeight : Double){
age = yourAge
weight = yourWeight //error: return from initializer without initializing all stored properties
//weight를 초기화 시키지 않았던 경우.
} //designated initializer
}
//var kim : Man = Man() //오류
//init()을 하나라도 직접 만들면 default initializer는 사라짐
var kim : Man = Man(yourAge:10, yourWeight:10.5)
//나이=10, 몸무게=10.5
kim.display()
self
class Man{
var age : Int =1
var weight : Double =30.5
func display(){
print("나이=\(age), 몸무게=\(weight)")
}
init(age: Int, weight : Double){
self.display() //나이=1, 몸무게=30.5
self.age = age //프로퍼티 = 매개변수
self.weight = weight
self.display() //나이=10, 몸무게=20.5
}
}
var kim : Man = Man(age:10, weight:20.5)
computed property의 getter
class Man{
var age : Int =1 // stored property
var weight : Double =3.5 // stored property
var manAge : String{ //메서드 같지만 d computed property임
//get{ 생략가능
return ("만 나이는 \(age-1)살 입니다")
//}
}
func display(){
print("나이=\(age), 몸무게=\(weight)")
}
init(Myage: Int, weight : Double){
age = Myage
self.weight = weight
}
}
var kim : Man = Man(Myage:10, weight:20.5)
kim.display() //나이=10, 몸무게=20.5
print(kim.manAge) //만 나이는 9살 입니다
computed property의 setter.
class Man{
var age : Int =1
var weight : Double =3.5
var manAge : Int{
get{
return age -1
}
set{ //(newValue)인 경우 ()생략가능!
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
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
}
init(){
}
}
var kim : Man = Man(age:10, weight:20.5) //1
var kim1 : Man = Man(age:10) //2
var kim2 : Man = Man()
kim.display() //나이=10, 몸무게=20.5
kim1.display() //나이=10, 몸무게=3.5
kim2.display() //나이=1, 몸무게=3.5
failable initializer가 있는 클래스의 인스턴스 생성
class Man{
var age : Int
var weight : Double
func display(){
print("나이=\(age), 몸무게=\(weight)")
}
init?(age: Int, weight : Double){
if age <=0 {
return nil
}
else {
self.age = age
}
self.weight = weight
} // failable initializer
}
var kim : Man = Man(age:10, weight:20.5)!
kim.display() //나이=10, 몸무게=20.5
var lee : Man? = Man(age:0, weight:3.5)
if let lee1 = lee{
lee1.display() //공백. nil이 리턴되었기때문
}
if let han = Man(age:2,weight:111){
han.display() //나이=2, 몸무게=111.0
}
var kim1 : Man? = Man(age:1,weight:30.5)
kim1!.display() //나이=1, 몸무게=30.5
나이와 몸무게가 음수이면 nil을 반환하는 failable initialize 구현
class Man{
var age : Int
var weight : Double
func display(){
print("나이=\(age), 몸무게=\(weight)")
}
init?(age: Int, weight : Double){
if age <=0 {
return nil
}
else {
self.age = age
}
if weight <=0{
return nil
}
else {
self.weight = weight
}
} // failable initializer
}
if let kim = Man(age:10,weight:10){kim.display()} //나이=10, 몸무게=10.0
if let kim1 = Man(age:0,weight:-20){kim1.display()}
var kim : Man = Man(Myage:10, weight:20.5)
kim.display() //나이=10, 몸무게=20.5
print(kim.manAge) //만 나이는 9살입니다
상속
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 kim : Man = Man(age:12, weight:20.5)
kim.display() //나이=12, 몸무게=20.5
var lee : Student = Student(age:12,weight:65.2)
lee.display() //나이=12, 몸무게=65.2 : Man에게 모든것을 상속받음
print(lee.age) //12
super
class Cat{
var age : Int
var weight : Double
func display(){
print("나이=\(age), 몸무게=\(weight)")
}
init(age: Int, weight : Double){
self.age = age
self.weight = weight
}
}
class Pet : Cat {
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 nabi : Pet = Pet(age:3,weight:7.2,name:"나비")
nabi.displayS() //이름=나비, 나이=3, 몸무게=7.2
nabi.display() //나이=3, 몸무게=7.2
override
class Cat{
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 Pet : Cat {
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 gil : Cat = Cat(age:5,weight:10)
var nabi : Pet = Pet(age:2,weight:6.2,name:"나비")
gil.display() //나이=5, 몸무게=10.0
nabi.display() //display메서드가 두개이지만, 자식메서드가 우선
//이름=나비, 나이=2, 몸무게=6.2
'대학교 - 강의 > iOS프로그래밍기초' 카테고리의 다른 글
| iOS프로그래밍기초 9주차 레포트 (0) | 2021.10.31 |
|---|---|
| iOS프로그래밍기초 7주차 레포트 (0) | 2021.10.16 |
| iOS프로그래밍기초 5주차 레포트 (0) | 2021.10.02 |
| iOS프로그래밍기초 4주차 레포트 (0) | 2021.09.26 |
| iOS프로그래밍기초 3주차 레포트 (0) | 2021.09.18 |