study 문법1주차) 클래스와 구조체

잼킹·2020년 11월 23일
2

Swift

목록 보기
2/4
  1. struct / class 기본개념 익히기.
  2. struct / class 각각의 역할과 차이점 알아보기.

구조체

구조체는 struct 키워드로 정의합니다.

struct /*구조체 이름*/ {
	// 프로퍼티와 매서드들
}

클래스

클래스는 class 키워드로 정의합니다.

class /*클래스 이름*/ {
	// 프로퍼티와 매서드들
}

구조체와 클래스의 공통점

  1. 값을 저장하기 위해 프로퍼티를 정의할 수 있다. ex) var someVar = "", let someLet = ""
  2. 기능 실행을 위해 매서드를 정의할 수 있다. ex) func someMethods(){ }
  3. 서브스크립트 문법을 통해 구조체 또는 클래스가 갖는 값(프로퍼티)에 접근하도록 스브스크립트를 정의할 수 있다.
  4. 초기화될 때의 상태를 지정하기 위해 이니셜라이저를 정의할 수 있습니다.
  5. 초기구현과 더불어 새로운 기능 추가를 위해 익스텐션을 통해 확장할 수 있습니다.
  6. 특정 기능을 실행하기 위해 특정 프로토콜을 준수할 수 있습니다.
  7. extension이 가능하다.

구조체와 클래스의 차이점

구조체

  1. 상속이 불가능하다.
  2. 값타입(=value type) (call by value)
    3. swift의(데이터 타입) 뼈대는 구조체로 구성되어있다.

클래스

  1. 상속이 가능하다. (단일 상속만 가능하다)
  2. 참조타입 (=reference type) (call by reference)
  3. deinit(디이니셜라이져)를 통해 클래스의 인스턴스를 소멸할 수 있습니다.
    4. ios의 프레임워크는 클래스로 구성되어있다.
class Hello {
	var name: String = ""
    var year: Int = 0
    
    deinit {
    	// 클래스의 인스턴스를 소멸
    }
}
var study: Hello? = Hello()
study = nil    // 인스턴스가 소멸되어 값이 없기때문에 nil

여기서 알아보아야 할것은 구조체는(swift의 뼈대) 클래스는(ios의 뼈대)라는 것입니다.
xcode상의 화면으로 알아보도록해요.
위에 클래스 뷰 컨트롤러는 UIViewController를 상속받고 있어요
상속은 : 로 받을 수 있답니다.
UIViewController를 커맨드를 눌러 클릭해서 들어가보면
이렇게 클래스로 선언되어있네요!!

swift의 뼈대는 구조체다?? 라는것도 보여드리기 위해 위의 화면에 프로퍼티도 정의해놨는데요.
프로퍼티 타입의 String과 Int를 커맨드를 눌러 들어가보게되면

이렇게 구조체로 정의되어있는것을 볼수있어요.

클래스는 상속이 가능 해서 모든 기능을 물려받기위해(참조) ios프레임워크의 뼈대로
구조체는 값을 할당하는 swift의 뼈대로 사용되고있는것을 알수있습니다!!

그럼 언제 구조체를 쓰고 언제 클래스를 쓰는가??
구조체 - 데이터를 함수의 전달인자로 전달하면 인스턴스가 새로 생성된다.
클래스 - 새로운 인스턴스가 아닌 기존의 인스턴스 참조를 전달한다.
함수의 전달인자뿐만 아니라 새로운 변수에 할당될 때도 마찬가지이다.

애플의 가이드라인에서 다음 조건 중 하나 이상에 해당한다면 구조체의 사용을 권장합니다.

  1. 연관된 간단한 값의 집합을 캡슐화하는 것만이 목적일때
  2. 참조가 아닌 복사를 원할 때
  3. 다른 타입으로부터 상속받거나 자신을 상속할 필요가 없을때
  4. 구조체에 저장된 프로퍼티가 값 타입이며 참조하는 것보다 복사하는 것이 합당할 때
    (클래스는 이 반대로 생각해보면 될거같아요)

Tip
다른 프로그래밍 언어에서는 클래스의 인스턴스를 객체라고 부릅니다.
물론 스위프트에서도 객체라는 표현이 틀린 것은 아니지만, 공식문서에서는 인스턴스라는 용어를 사용합니다.

profile
💻 IOS Dev

0개의 댓글