Moon Work

[Swift] Swift 기본 문법 정리 5-1: 왜 Swift에는 Sturct와 Class로 나뉘어 있을까. 본문

Swift

[Swift] Swift 기본 문법 정리 5-1: 왜 Swift에는 Sturct와 Class로 나뉘어 있을까.

moonkey 2022. 12. 26. 23:41

시작하며

다른 블로그들을 참조하며 Swift의 class와 struct를 공부하던 중 struct가 상속이 안된다는 특징을 가지고 있는게 마음에 걸렸다. 상황에 따라 다르겠지만 struct로 주로 개발한다는 내용을 듣고 다형성 구현에 뭔가 다른 방법이 있는 것 같았고 그러던 중 새로 알게된 것이 POP(Protocol Oriented Programming)이다. 이 글을 통해 class와 struct에 대한 가벼운 비교와 protocol이라는 Swift만의 개념을 통한 POP에 대해 정리해보려 한다. 

 

 

Struct 란

Struct는 다른 언어들과 비슷하게 특정 기능, 혹은 역할을 하기 위한 데이터, 기능을 하나로 묶어 사용자가 새로운 데이터 타입을 생성할 수 있게 해준다. 기본적으로 아래와 같은 구조를 가진다. 

struct StructName {
	var structProperty: String
    
	func structMethod(){}
}

Struct 특징

  • 구조체는 값(value) 타입으로 다른 구조체에 할당하더라도 주소가 이동되는 참조 타입과 다르게 값이 복사된다.
  • 타입 이름은 대문자 카멜케이스를 사용한다.
  • 구조체는 상속이 안된다. 
  • (property와 method가 함께 있는데 property만 해도 여러가지 종류가 있어서 다음번에 다룰 예정이다.)
  • 기본 타입(Bool, Int, Array, Dictionary, Set) 모두 구조체로 구현되어 있다. 
struct BasicStruct {
	let name: String = "moon"			//변경 불가
	var nickName: String = "moonkey"	//변경 가능
    
	func basicMethod(){
		print("/(name) is name")		//moon is name
	}
}

var person: BasicStruct = BasicStruct()
person.name = "austin"	// 불가능
person.nickName = "austin"	// 가능

 

 

 

Class 란

Class는 Struct와 비슷하게 특정 기능과 속성을 묶은 타입을 생성하게 해주지만 몇가지 다른 특징을 가진다. 

class BasicClass {
	var name: String = "moon"
    
    func basicFunc(){
    	print("name is /(name)")
    }
}
var person: BasicClass = BasicClass()

 

Class 특징

  • 클래스는 struct와 다르게 참조 타입이다. 따라서 값이 아닌 주소 값이 복사된다. 
  • Swift의 class는 다중 상속이 허용되지 않는다. 
  • 상속을 받을 때는 [클래스이름]: [부모클래스이름]으로 상속 받는다. 
  • 기본 property에 대해 초기값을 지정한 경우가 아니라면 이니셜아이저( init() )를 사용하여 초기화해주어야 한다. 초기화 하기 전에 self를 통해 클래스 자신의 값에 접근하게 될 경우 에러가 발생한다. 
  • 참조값이 더 이상 사용되지 않을 때 deinit() 메소드를 통해 메모리에서 삭제되기 전에 처리할 코드를 넣어줄 수 있다. 
  • 상속 받았을 경우 super를 통해 부모클래스에 접근할 수 있다.
class Person {
    var name: String
    init(name: String){
        self.name = name
    }
    func printName(){
        print("\(name) is my name")
    }
}
class Student: Person {
    init(studentName: String){
        super.init(name: studentName)
    }
    func goToSchool(){
        print("go to school")
    }
}
var moon: Student = Student(studentName: "austin")
moon.goToSchool()
moon.printName()

 

 

 

Struct vs Class 

  • 구조체는 init 메서드 없이도 자동으로 초기화 함수를 만들 수 있다. 
  • 클래스는 상속이 가능하고 (다중 상속 X), 구조체는 불가능하다.
  • 구조체는 값 타입이고 클래스는 참조타입이다. 
  • 타입캐스팅은 클래스 인트턴스에만 허용된다. 
  • deinit은 클래스의 인스턴스만 허용된다. 

 

protocol과 POP로 왜 Struct를 사용하는지 다음편에서 ➡️