본문 바로가기
ios 뽀개기/스위프트 정리

11. 클래스와 구조체

by 인생여희 2017. 12. 4.
반응형



11. 클래스


//: Playground - noun: a place where people can play


import UIKit


//1

//구조체 정의

struct info {

    var name: String

    var age: Int

}



//2

//구조체 인스턴스의 생성 및 초기화

// 프로퍼티 이름(name, age)로 자동 생성된 이니셜라이저를 사용하여 구조체를 생성한다.

var meinfo: info = info(name:"kang", age:24)

meinfo.age = 100     //변경가능

meinfo.name = "sola" //변경가능


let youinfo: info = info(name:"hong", age:55)

// youinfo.age = 200       //변경불가 오류!

// youinfo.name = "dong"   //변경불가




//3 클래스


class Person{

    

    var height: Float = 0.0

    var weight: Float = 0.0

    

}


//3-1

//인스턴스가 생성되고 초기화 된후 프로퍼티 값에 접근하고 싶다면 마침표를 사용하면 된다.

// 구조체와 다르게 클래스의 인스턴스는 참조타입이므로 클래스의 인스턴스를 상수 let으로 선언해도 내부 프로퍼티 값을 변경할 수 있다.


var abcnt: Person = Person()

abcnt.height = 123.4

abcnt.weight = 123.4


let mom: Person = Person()

mom.height = 333.3

mom.weight = 222.2


//4

//생성과 소멸

//인스턴스는 참조 타입이므로 더는 참조할 필요가 없을 때 메모리에서 해제 된다.

// 이과정을 소멸이라고 하는데 소멸되기 직전 deinit이라는 메서드가 호출 된다.

//클래스 내부에 deinit메서드를 구현해주면 소멸되기 직전에 호출 된다, 클래스당 하나만 구현할 수 있다. 매개변수와 반환값을 가질 수 도 있다.

class Person2{

    

    var height: Float = 0.0

    var weight: Float = 0.0

    

    deinit {

        print("person2클래스의 인스턴스가 소멸된다.")

    }

}


var yaya: Person2? = Person2()

yaya = nil // person클래스의 인스턴스가 소멸된다.



/*

 구조체와 클래스 차이

 같은점:

 - 값을 저장하기 위해 프로퍼티 사용가능, 기능 실행을 위해 메서드 정의 가능,

 - 서브스크립트 문법을 통해 구조체 또는 클래스가 갖는 값(프로퍼티)에 접근하도록 서브스크립트를 정의 할 수 있다.

 - 초기화 될때의 상태를 저장하기 위해 이니셜라이저를 정의 할 수 있다.

 - 초기구현과 더불어 새로운 기능을 추가하기 위해 익스텐션 기능을 통해 확장할 수 있다.

 - 특정 기능을 실행하기 위해 특정 프로토콜을 준수할 수 있다.

 

 다른점:

 - 구조체는 상속할 수 없다.

 - 타입캐스팅은 클래스의 인스턴스에서만 허용된다.

 - 디이니셜라이저는 클래스의 인스턴스에서만 활용할 수 있다.

 - 참조 횟수 계산은 클래스의 인스턴스에만 적용된다.

 

 *핵심

  클래스는 참조타입이라서 전달될때 참조(주소)가 전달되고

  구조체는 값이 전달 된다.

 */


struct Myinfo2 {

    let name: String

    var age: Int

}


var naInfo: Myinfo2 = Myinfo2(name: "gildong", age: 60)

naInfo.age = 100


// naInfo의 값을 복사하여 할당한다.


var friendInfo: Myinfo2 = naInfo


print("na age: \(naInfo.age)")  //100

print("na age: \(friendInfo.age)") //100


friendInfo.age = 999


print("na age: \(naInfo.age)")  //100

print("na age: \(friendInfo.age)") //999 friendInfo는 naInfo의 값을 복사해왔기 때무넹 벼개의 값을 갖는다.


// ---------------------------------------------------------------------------------------------------  //


class Animal {

    

    var height: Float = 0.0

    var weigth: Float = 0.0

    

}


var tiger: Animal = Animal()

var rabit: Animal = tiger


print("tiger s heigth \(tiger.height)") //0.0

print("rabit s heigth \(rabit.height)") //0.0


rabit.height = 2.0


print("tiger s heigth \(tiger.height)") //2.0

print("rabit s heigth \(rabit.height)") //2.0


//rabait과 tiger가 참조는 곳이 같아서 하나만 바꿔줘도 전체가 바뀐다.



func changeBasicInfo(_ info: Myinfo2){

    var copiedInfo: Myinfo2 = info

    copiedInfo.age = 1

}


func changeAnimaInfo(_ info: Animal){

    

    info.height = 5.5

}


//이 함수로 전달되는 전달인자는 값이 복사되어서 전달되기 때문에 값만 전달 된다.

changeBasicInfo(naInfo)

print("na age: \(naInfo.age)") //100


//참조값이 전달 되었다.

changeAnimaInfo(tiger)

print("tiger height: \(tiger.height)") //2.2









































반응형

'ios 뽀개기 > 스위프트 정리' 카테고리의 다른 글

swift http 통신 get방식 post 방식 - 일단 기록  (0) 2018.06.13
10. 옵셔널  (0) 2017.12.04
9. 연산자의 종류  (0) 2017.11.15
8. 열거형  (0) 2017.11.15
7. 튜플 배열 딕셔너리 셋 (복습)  (0) 2017.11.14

댓글