애플스위프트(APPLE SWIFT) - 프로퍼티, 메서드, 상속, 초기화, 래퍼런스 타입과 밸류타입

애플의 스위프트 프로그래밍 언어에서, 클래스와 구조체는 데이터를 모델링하기 위한 주요 도구입니다. 각각의 특징과 장단점을 이해하면, 어떤 상황에서 클래스나 구조체를 사용해야 하는지 결정할 수 있습니다.

 

클래스(Class)

클래스는 참조 타입(reference type)입니다. 클래스 인스턴스는 힙 메모리에 저장되며, 인스턴스 자체가 아닌 참조(주소)가 전달됩니다.

class Dog { 
var name: String 
var breed: String 
   init(name: String, breed: String) { 
      self.name = name self.breed = breed
   }
} 

let dog = Dog(name: "Rex", breed: "Labrador") // 여기서 'dog'는 Dog 인스턴스를 참조합니다.

 

구조체(Struct)

구조체는 값 타입(value type)입니다. 구조체 인스턴스는 스택 메모리에 저장되며, 인스턴스의 복사본이 전달됩니다.

struct Cat { 
   var name: String var breed: String 
} 
var cat = Cat(name: "Whiskers", breed: "Siamese") // 여기서 'cat'는 Cat  인스턴스의 복사본을 가집니다.

 

 

프로퍼티(Properties)

저장 프로퍼티(Stored Properties)

값을 저장하는 가장 기본적인 프로퍼티 유형입니다.

struct Point { 
   var x: Int // 저장 프로퍼티 
   var y: Int // 저장 프로퍼티
}

 

계산 프로퍼티(Computed Properties)

실제로 값을 저장하지 않고, 값에 대한 계산을 수행합니다.

struct Rectangle { 
   var width: Double 
   var height: Double
   var area: Double { 
      return width * height
   }
   // 'area'는 계산 프로퍼티입니다. 
}

 

 

메서드(Methods)

인스턴스 메서드(Instance Methods)

특정 클래스 또는 구조체 인스턴스와 연관된 메서드입니다.

class Car { 
var speed = 0
   func accelerate() {
      speed += 10 
   } 
// 'accelerate'는 인스턴스 메서드입니다. 
}

 

 

타입 메서드(Type Methods)

타입 자체에 속한 메서드입니다. static 키워드를 사용하여 정의합니다.

class Math { 
   static func square(of number: Int) -> Int { 
      return number * number
   } // 'square'는 타입 메서드입니다.
 }

 

 

상속(Inheritance)

클래스

클래스는 다른 클래스로부터 상속을 받을 수 있습니다. 이를 통해 코드 재사용, 확장성 및 다형성을 구현할 수 있습니다.

class Animal { 
   var name: String init(name: String) {
       self.name = name
   }
} 
class Dog: Animal {
   var breed: String 
   init(name: String, breed: String) {
      self.breed = breed 
      super.init(name: name)
   } // Dog는 Animal 클래스로부터 상속받습니다.
}

 

구조체

구조체는 상속을 지원하지 않습니다.

 

초기화(Initialization)

클래스와 구조체

생성자를 사용하여 인스턴스가 초기화될 때 필요한 설정을 수행합니다.

 

struct Point { 
   var x: Int 
   var y: Int 
   init(x: Int, y: Int) {
       self.x = x 
       self.y = y
   } // 초기화 메서드 
}

 

 

레퍼런스 타입과 밸류 타입

클래스(레퍼런스 타입)

인스턴스가 참조에 의해 전달되고 공유됩니다.

 

구조체(밸류 타입)

인스턴스가 값에 의해 전달되며, 각각 독립적인 복사본을 가집니다.

var original = Point(x: 10, y: 20) 
var copy = original
copy.x = 30 // 'original'의 x는 10으로 남아있고, 'copy'의 x는 30으로 변경됩니다.

 

이 예시들을 통해 클래스와 구조체의 차이점과 사용 방법에 대해 더 잘 이해하시길 바랍니다.

class Person { 
   var name: String init(name: String) {
    self.name = name
   }
} 
var person: Person? = Person(name: "Alice") 
let personName = person?.name // person이 nil이 아니면 name을 반환, 아니면 nil 반환

애플스위프트(APPLE SWIFT) - 옵셔널(Optional)

Swift에서 옵셔널(Optional)은 변수가 '값이 없음'을 안전하게 처리할 수 있도록 하는 기능입니다. 기본적으로 모든 변수는 값이 있어야 하지만, 옵셔널을 사용하면 변수가 값이 없는 상태, 즉 nil을 가질 수 있습니다.

옵셔널의 정의와 사용 이유

정의 : 옵셔널은 값이 있거나 없을 수 있는 변수를 정의합니다. ?를 변수 타입 뒤에 붙여서 선언합니다.

var optionalNumber: Int? = 5 
optionalNumber = nil // 이제 nil 값을 가질 수


 

사용 이유: 옵셔널은 프로그램에서 null 참조로 인한 오류를 방지하기 위해 사용됩니다. Swift에서는 기본적으로 모든 변수가 non-optional로 간주되므로, 옵셔널을 명시적으로 선언해야 합니다. 이렇게 하면 개발자가 값의 존재 여부를 더 명확하게 인식하고, 오류를 더 쉽게 방지할 수 있습니다.

 

장단점

장점:

   안전성 증가: nil 값의 가능성을 코드에 명시적으로 표현하여, 오류를 예방합니다.

   명확성: 값의 존재 여부를 코드를 통해 명확하게 표현할 수 있습니다.

단점:

   복잡성 증가: 옵셔널 값에 접근하기 위한 추가적인 코드가 필요합니다.

   오용 가능성: 옵셔널을 잘못 사용하면 예상치 못한 오류가 발생할 수 있습니다.

 

옵셔널 사용법

 

1. 옵셔널 바인딩(Optional Binding)

예제:

var optionalName: String? = "John Doe" 
if let name = optionalName { 
   print("Hello, \(name)")
} else { 
   print("No name provided")
}


옵셔널 바인딩은 옵셔널에 값이 있는지 확인하고, 값이 있을 경우 이를 임시 상수나 변수로 추출하는 방법입니다.

 

 

2. 옵셔널 체이닝(Optional Chaining)

예제:

옵셔널 체이닝은 옵셔널 내부의 속성, 메서드, 서브스크립트에 접근할 때 사용되며, nil을 반환할 수 있는 과정에서 사용됩니다.

 

 

3. 옵셔널 강제 언래핑(Forced Unwrapping)

예제: 

var optionalAge: Int? = 30 
print("Age is \(optionalAge!)") // Age is 3

 

옵셔널은 Swift의 안전성과 명확성을

강제 언래핑은 옵셔널 값이 확실히 존재한다고 확신할 때 사용합니다. !를 사용하여 옵셔널 값을 강제로 추출합니다. 값이 nil이면 런타임 오류가 발생합니다.

옵셔널은 Swift의 안전성과 명확성을 증가시키는 중요한 기능입니다. 옵셔널 바인딩, 옵셔널 체이닝, 강제 언래핑 등을 적절히 사용하여 안전하고 효율

 
 
 
 

애플스위프트(APPLE SWIFT) - 함수(function), 매개변수와 반환값, 클로저(Closures)

Swift에서 함수를 사용하는 이유는 코드의 재사용성을 높이고, 복잡한 작업을 단순화하여 코드의 가독성과 유지 보수성을 향상시키기 위함입니다. 함수는 특정 작업을 수행하는 독립적인 코드 블록으로, 여러 곳에서 호출되어 재사용될 수 있습니다. 이하에서는 Swift에서 함수의 정의와 호출 방법, 매개변수와 반환 값의 사용, 그리고 클로저에 대해 상세하게 설명드리겠습니다.

 

함수 정의 및 호출

예제:

func greet(name: String) -> String { 

   return "Hello, \(name)!" 

} 

let message = greet(name: "Steve") 

print(message) // "Hello, Steve!" 출력

 

이 예제에서 greet 함수는 name이라는 문자열 매개변수를 받고, 인사말을 포함한 문자열을 반환합니다.

함수는 func 키워드를 사용하여 정의하며, 필요에 따라 매개변수를 받고 반환 값을 가질 수 있습니다.

 

 

매개변수와 반환 값

예제:

func sum(a: Int, b: Int) -> Int {

   return a + b

} 

print(sum(a: 5, b: 3)) // 8 출력

 

sum 함수는 두 개의 정수 매개변수를 받아 그 합을 반환합니다.

함수는 인자를 전달받아 내부 로직에서 사용할 수 있으며, 실행 후에는 결과를 반환할 수 있습니다.

 

 

클로저 (Closures)

예제:

let multiply = {

   (a: Int, b: Int) -> Int in return a * b

} 

print(multiply(2, 3)) // 6 출력

 

이 클로저 예제에서는 두 개의 정수를 곱하는 기능을 가진 클로저가 정의되고, 두 개의 값을 곱하는데 사용됩니다.

클로저는 자체적으로 완결된 블록의 기능을 갖는 코드 블록입니다. 함수와 유사하지만 이름이 없고, 주변의 상수와 변수를 캡처할 수 있습니다.

 

Swift의 함수와 클로저는 코드를 모듈화하고 간결하게 유지하는 데 큰 도움을 줍니다. 잘 정의된 함수와 클로저는 코드의 재사용성을 높이고, 복잡한 로직을 이해하기 쉽게 만들어 줍니다.

애플스위프트(APPLE SWIFT) - 배열(Arrays), 집합(Sets), 사전(Dictionaries)

Swift에서 컬렉션 타입은 다양한 데이터를 효율적으로 관리하고 사용하기 위해 사용됩니다. 각 컬렉션 타입은 특정한 용도와 특성을 가지고 있으며, 이를 이해하는 것이 중요합니다. 아래에 각 컬렉션 타입의 사용 이유와 함께 간단한 예제를 제공하겠습니다.

 

배열 (Arrays)

예제:

var fruits = ["Apple", "Banana", "Cherry"]
fruits.append("Orange") // 요소 추가 
print(fruits[1]) // "Banana" 출력

배열은 순서가 있는 리스트로, 동일한 타입의 여러 값을 순서대로 저장합니다. 배열은 인덱스를 통해 값에 접근할 수 있으며, 이는 데이터를 순차적으로 저장하고 검색할 때 유용합니다.

 

 

집합 (Sets)

예제:

var numbers: Set = [1, 2, 3, 4, 5]
numbers.insert(6) // 새로운 요소 추가 
print(numbers.contains(3)) // true 출력 (3이 집합 안에 있는지 확인)

집합은 중복 없이 유일한 값들을 저장하는데 사용됩니다. 집합은 순서를 보장하지 않으며, 주로 중복을 허용하지 않는 유니크한 아이템의 컬렉션을 관리할 때 사용합니다.

 

 

사전 (Dictionaries)

예제:

var capitals = ["Korea": "Seoul", "Japan": "Tokyo", "France": "Paris"]
capitals["USA"] = "Washington D.C." // 새로운 키-값 쌍 추가
print(capitals["Japan"]) // "Tokyo" 출력

사전은 키-값 쌍으로 데이터를 저장합니다. 각 키는 고유해야 하며, 키를 통해 값을 빠르게 검색할 수 있습니다. 사전은 데이터에 대한 빠른 접근이 필요할 때 사용됩니다.

이러한 각 컬렉션 타입은 Swift에서 데이터를 구조화하고 관리하는 데 필수적인 역할을 합니다. 상황에 따라 적절한 컬렉션 타입을 선택하여 사용하는 것이 중요합니다.

+ Recent posts