본문 바로가기

대학교 - 강의/iOS프로그래밍기초

iOS프로그래밍기초 6주차 레포트

금일 강의는 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 //초기값 13.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 propertygetter

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 propertysetter.

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