IOS- 6

김정현·2023년 3월 13일
0

IOS 개발공부 일지

목록 보기
6/27

구조체와 클래스

구조체

구조체는 struct 키워드로 정의한다. 구조체를 정의한다는 것은 새로운 타입을 생성해주는 것과 마찬가지로 첫 글자를 대문자로 사용한다.

struct Basic{           //B는 대문자로
var mutableproperty: Int = 100         //mutableproperty은 가변 프로퍼티      
let immutableproperty: Int = 100        // immutableproperty는 불변 프로퍼티
} 

var mutable: Basic = Basic()    //Basic이라는 하나의 타입이 됨(구조체로 인하여) 
                                //let으로 선언하면 인스턴스 변경 불가능
                                //mutable이라는 새로운 가변 인스턴스를 생성함
mutable.mutableproperty = 200     
mutable.immutableproperty = 200 //불가능 프로퍼티                 
                                
                                        
                                       
  • 메서드는 어떤 타입 안에 들어있는 함수를 뜻한다.
  • 프로퍼티는 어떤 타입 안에 들어있는 인스턴스 변수, 상수를 말한다.
  • static을 붙이면 타입 메서드, 타입 프로퍼티가 됨
    -> 타입은 struct로 내부에서 지정해준 타입 자체의 함수라던가 프로퍼티를 호출할 수 있음.
    (구조체 밖에서도 실행가능하다?)
Basic.(static으로 정의한 것)  

인스턴스라는 말이 그 구역 안에서만 사용할 수 있다는 뜻인듯?

클래스

class라는 키워드를 사용하여 정의한다.
구조체와 매우 유사하지만 구조체는 값타입인 반면에 클래스는 참조타입이다.
클래스를 생성하고 인스턴스를 생성한 뒤 인스턴스에서클래스 안에 구조체의 프로퍼티 값에 접근하고 싶다면 . 을 사용하면 된다. (구조체도 마찬가지)

class person {
     var height: Float = 0.0
     var weight: Float = 0.0
     
var KIM: person = person()      //인스턴스를 생성함
KIM.height = 175.5            
KIM.weight = 67.0         //. 를 통해 프로퍼티에 접근함 
  • 클래스는 상속이 가능하다.(상복 받을때 클래스 이름 뒤에 :를 써주고 부모클래스 이름을 명시)
    -상속은 뒤에 나옴
  • 타입을 정의할 때 static은 재정의 불가하고 class로 정의하면 재정의가 가능하다.
static func  ~~     //재정의 가능
vs
class func ~~       //재정의 불가
  • 구조체 안에서 let으로 불변상태로 만들면 인스턴스에서도 프로퍼티를 변경할 수 없지만 인스턴스에서 let으로 지정한 값은 변경이 가능하다.
struct Basic{           
var mutableproperty: Int = 100          
*var immutableproperty: Int = 100   //구조체 안에서 var라면 인스턴스에서 변경 가능
}

var mutable: Basic = Basic()    //Basic이라는 하나의 타입이 됨(구조체로 인하여) 
                                //let으로 선언해도 인스턴스 변경 가능
                                //mutable이라는 새로운 가변 인스턴스를 생성함
mutable.mutableproperty = 200     
mutable.immutableproperty = 200 //변경 가능
*let으로 설정됐다면 변경 불가

구조체와 클래스의 차이

구조도 비슷하고 프로퍼티를 정의할 수 있는점에서 같은 점이 굉장히 많다. 그러나 큰 차이점들이 존재한다.

  • 구조체는 상속할 수 없다
  • 타입 캐스팅은 클래스의 인스턴스에서만 가능하다.
  • 디이니셜라이저는 클래스의 인스턴스에서만 가능하다.

-> 클래스가 참조될 필요가 없을때 소멸하는데, 그때 클래스 내부에 deinit 메서드를 구현함으로써 소멸하기 전 메서드를 호출하는것

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

-> 둘을 구분 짓는 가장 큰 차이점은 값과 참조 타입이라는 점인데, 그렇기 떄문에 당연하게도 참조 횟수 계산은 클래스에서만 가능하다.

결론적으로 구조체는 구조체 내부에서 값을 지정한 후, 외부에서 구조체내부의 같은 프로퍼티를 이용해 생성됐더라도 두 개의 인스턴스가 서로 값에 영향을 주지 못한다.
그러나 클래스는 클래스 내부 프로퍼티를 '참조' 하는것이기 때문에 외부 인스턴스에서 값이 서로 영향을 준다.

0개의 댓글