평범한 컴공 대학생의 공부일지

Enum(열거형), Struct(구조체), Generic(<>) 본문

iOS Swift

Enum(열거형), Struct(구조체), Generic(<>)

Taram 2024. 6. 13. 12:15

※이 iOS 카테고리의 글 들은 학교 강의와 과제를 기반으로 작성한 것입니다.※


  • 열거형
    정의 : 관련있는 데이터들이 멤버로 구성되어 있는 자료형 객체
    사용하는 경우 - 원치 않는 값이 잘못 입력되는 것을 방지
                          - 입력 받을 값이 한정되어 있을 때
                          - 특정 값 중 하나만 선택하게 할 때
// 기본구조
enum 열거형명{
열거형 정의
}
enum Planet {
case Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
} //하나의 case문에 멤버들 나열하는 것도 가능
//예제
enum Compass {
    case North
    case South
    case East
    case West
}

print(Compass.North) // Compass 열거형의 North 케이스를 출력합니다. 결과: North

var x: Compass // Compass 타입의 변수 x를 선언합니다.
x = Compass.West // Compass 열거형의 West 케이스를 x에 할당합니다.
print(x, type(of: x)) // x의 값과 타입을 출력합니다. 결과: West Compass

x = .East // Compass 타입이 명확하기 때문에 .East로 간단히 East 케이스를 x에 할당합니다.
print(x) // x의 값을 출력합니다. 결과: East

  • 구조체

       - 예제

// struct를 class로 변경해도 같은 결과
struct Resolution { //구조체 정의
	var width = 1024 //프로퍼티
	var height = 768
}
let myComputer = Resolution() //인스턴스 생성
print(myComputer.width) //프로퍼티 접근

 

          여기서 struct를 class로 변경해도 같은 값이 나오는데 그렇다고 해서 이 2가지가 같은 것은 아닙니다.
          Struct와 Class의 차이 점을 뤼튼을 통해 알아보겠습니다.

struct와 class의 차이점

        즉, 같은 값이 나온다고 해서 동일한 것은 아니라는 말이죠. 위에서 말했던 것 처럼 Struct는 memberwise initializer가 자동으로 생성하기 때문에 init을 사용하지 않아도 된다는 차이점도 존재합니다.

class Resolution { //구조체 정의
    var width = 1024 //프로퍼티
    var height = 768
    init(width:Int, height:Int){
        self.width = width
        self.height = height
    }
}
let myComputer = Resolution.init(width:100, height:50) //인스턴스 생성
print(myComputer.width) //프로퍼티 접근, 값: 100
//--------------------------------------------------------------------------
struct Resolution { //구조체 정의
    var width = 1024 //프로퍼티
    var height = 768
    //init(width:Int, height:Int){
    //    self.width = width
    //    self.height = height
    //}
}
let myComputer = Resolution(width:100, height:50) //인스턴스 생성
print(myComputer.width) //프로퍼티 접근, 값: 100

             Class는 .init을 사용하여 멤버 초기화를 해주어야 하지만 Struct는 memberwise initializer가 자동으로 생성되기 때문에 별도로 초기화를 해주지 않아도 된다는 이야기가 됩니다. 또한 Struct는 상속이 불가능하기 때문에 상속을 이용하고 싶다면 꼭 Class를 사용해야 합니다.

class Human {
    var age : Int = 1
}
var kim : Human = Human()
var lee = kim //값 타입
print(kim.age, lee.age)
lee.age = 20
print(kim.age, lee.age)
kim.age = 30
print(kim.age, lee.age)
//1 1
//20 20
//30 30 reference Type, 주소를 복사해서 가지기 때문에 값이 동일함.
//----------------------------------------------------------
struct Human {
    var age : Int = 1
}
var kim : Human = Human()
var lee = kim //값 타입
print(kim.age, lee.age)
lee.age = 20
print(kim.age, lee.age)
kim.age = 30
print(kim.age, lee.age)
//1 1
//1 20
//30 20 value type, 값 타입은 복사할 때 새로운 데이터가 하나 더 생김

             Struct : 값을 복사(value type), Class(reference type) : 주소를 복사 라는 차이가 있기 떄문에 위 예제처럼 출력 결과도 다르게 보이게 됩니다.

             아래는 각 사용시기에 관한 내용입니다.

Struct와 Class의 사용 시기


  • Generic(<>)
    - 정의 : 자료형을 나중에 결정하겠다
    - 요구하는 자료형이 다를 때 함수를 여러 개 사용해야 합니다. 하지만 <>를 사용한다면 코드를 축약시킬 수 있습니다.
func myPrint(a: Int, b: Int) {
    print(b,a)
}
func myPrint(a: Double, b: Double) {
    print(b,a)
} //overloading

myPrint(a:1,b:2)
myPrint(a:2.5,b:3.5)
//2 1
//3.5 2.5
//--------------------------------------------------------------
//<T> 정하지 않은 자료형
func myPrint<T>(a: T, b: T) {
    print(b,a)
}

myPrint(a:1,b:2)
myPrint(a:2.5,b:3.5)
myPrint(a:"안녕하세요.",b:"Taram입니다.")
//2 1
//3.5 2.5
//Taram입니다. 안녕하세요.

            - <>를 사용하여 자료형을 나중에 결정하는 언어 정리
               1) C++

template <typename T>
T add(T a, T b) {
    return a + b;
}


               2) C#

public class GenericClass<T> {
    private T genericMemberVariable;
    public T genericMethod(T genericParameter) {
        return genericMemberVariable;
    }
}


               3) Java

public class Box<T> {
    private T t;
    public void set(T t) { this.t = t; }
    public T get() { return t; }
}


               4) Swift

func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
    let temporaryA = a
    a = b
    b = temporaryA
}


               5) Kotlin

class Box<T>(t: T) {
    var value = t
}