학습 기록/swift

A Swift Tour - Object and Class 객체와 클래스

romi__ 2024. 10. 15. 19:47

/date 24.10.15.

 

 

스위프트 공식 문서와 비공식 한글 번역 문서를 참고했습니다.

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/guidedtour/

 

Documentation

 

docs.swift.org

https://bbiguduk.gitbook.io/swift/welcome-to-swift/swift-a-swift-tour

 

Swift 둘러보기 (A Swift Tour) | Swift

Swift 의 기능과 구문을 살펴봅니다. 전통적으로 새로운 언어의 첫번째 프로그램은 "Hello, world!" 를 출력해야 한다고 합니다. Swift 에서는 이것을 한줄로 표기할 수 있습니다: 이 구문은 다른 언어

bbiguduk.gitbook.io

 

오늘의 목표: Simple Values부터 Object and Class까지

 

 

 

📌 Simple Values

- Hello World!

print("Hello World!")

 

 

main()도, 세미콜론도 필요하지 않음

 

 

- var 변수, let 상수

let explicitDouble: Double = 70
let theNumber: Float = 4

 

colon 뒤에 type을 specify 해서 설정해 줄 수 있음

 

 

- \ ( ) : values를 strings에 포함 가능하게 함. 별도의 변환이 필요하지 않음!

- """ : string을 여러 줄 작성 가능하게 함

let apples = 3
let oranges = 5
let quotation = """
			Renee has five grapefruits.
            Sabrina has 7 bananas.
            And I have \(apples) apples and \(oranges) oranges.
            """

 

 

- new variable에 배열 혹은 딕셔너리를 배정할 경우, type 설정이 필수적

let emptyArray: [String] = []
let emptyDictionary: [String : Float] = [ : ]

 

 

 

📌 Control Flow

- optional value를 if문에서 활용할 수 있다: ?(물음표)를 type뒤에 작성

var optionalName: String? = "Gabi"
var greeting = "Hello!"
if let name = optionalName {
	greeting = "Hello, \(name)"
}
else {
	greeting = "Hi there!"
}

 

name = optionalName이 Nil이 아닌 경우(=존재할 경우), greeting이 "Hello, Gabi"로 출력. Nil이면 skip

 

 

- ??: default value

let informalGreeting = "Hi \(nickname ?? fullName)"

 

optional value인 nickname이 없다면 default value인 fullname이 출력됨

 

 

- Switches support any kind of data and a wide variety of comparison operations

let vegetable = "red pepper"
switch vegetable {
	case "celery":
    	print("Add some raisins and make ants on a log.")
    case let x where x.hasSuffix("pepper"):
    	print("Is it a spicy \(x)?") //"Is it a spicy red pepper?"
    default:
    	print("Everything tastes good in soup.")
}

 

조건에 맞으면 바로 빠져나오기 때문에 따로 break를 걸 필요는 없다.

 

 

 

- 반복문: while, for

var m = 2
repeat { m*=2 } while m < 100 //m=128

 

m < 0인 경우처럼 loop condition이 애당초 false일 경우는 오류를 발생시키는 것이 아니라 그저 반복문이 실행되지 않는 결과를 낳는다.

 

 

 

 

📌 Functions and Closures

- Parameter와 Return type은 ->로 구분

func greet(person: String, day: String) -> String {
	return "Hello \(person), today is \(day)."
}

 

person, day parameter를 string으로 받고 그 결괏값을 string으로 돌려줌

 

 

- tuple의 사용

func calculateStatistics(scores: [Int]) -> (min: Int, max: Int, sum: Int) {
	//생략...min, max, sum 구하는 for문
    return (min, max, sum)
}

let statistics = calculateStatistics(scores: [5, 3, 100, 3, 9])
print(statistics.sum)
print(statistics.2) //두 print의 결과는 동일 (120)

 

 

- 함수는 중첩 가능하다(can be nested)

중첩된 함수(안쪽 함수)가 본인 밖에서 선언된 변수에 접근 가능

 

 

- 함수는 1급 객체다(first-class type)

1급 객체: 변수를 통해 참조 가능 / 함수의 매개변수로 전달 가능 / 함수의 반환값으로 사용 가능

func makeIncrementer() -> (Int -> Int) {
	func addOne(number: Int) -> Int {
    	return 1 + number
    }
    return addOne //makeIncrementer()의 반환값이 addOne이라는 함수
}

 

func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool {
	for items in list {
    	if condition(item) {
        	return true
        }
    }
    return false
    func lessThanTen(number: Int) -> Bool {
    	return number < 10
    }
}

 

함수는 본질적으로 closure클로저와 같다

 

 

 

 

📌 Objects and Classes

- 클래스 생성과 점 구문

class Shape {
	var numberOfSides = 0
    func simpleDescription() -> String {
    	return "A shape with \(numberOfSides) sides."
    }
}

 

<class 클래스 이름>의 형태로 클래스 생성

클래스는 설계도 내지는 템플릿. 어떤 객체가 가져야 할 속성과 메서드를 정의한다.

 

var shape = Shape()

 

클래스 이름 뒤 소괄호를 붙여서 클래스의 인스턴스* 생성

인스턴스는 클래스를 기반으로 실제 데이터를 가진 객체를 의미한다.

 

class NamedShape {
	var numberOfSides: Int = 0
    var name: String
    
    init(name: String) {
    	self.name = name
    }
}

 

* init(생성자) : 인스턴스의 초기 상태 설정. NamedShape 클래스에서 이름(name)을 문자열로 받을 수 있도록 초기값 설정

* self: 현재 인스턴스 자신을 가리킴

* self.name은 인스턴스 속성, 등호 뒤 name은 init의 매개변수. 클래스의 속성인 name에 함수로 전달받은 name을 전달하는 것. self를 사용하지 않으면 둘 다 함수의 매개변수로 인식될 수 있다.

 

 

 

- 하위 클래스(subclass): 클래스 이름 뒤 콜론으로 구분

* 상위 클래스(superclass): 다른 클래스에 물려줄 기본적인 속성과 메서드를 정의. 보통 더 일반적인 개념이라고 할 수 있다

class Animal { 
	//상위 클래스로 animal 생성
	var name: String //이름을 저장하는 속성
    init(name: String) {
    	self.name = name
    }
    func sound() {
    	print("Animal is running.")
  	} //method
}

class Dog: Animal {
	//Animal의 속성과 method를 그대로 사용 가능 + override로 재정의 가능
	override func sound() {
    	print("the dog barks.")
    }
   	func run() {
    	print("\(name) is running!")
    } //추가적으로 run()을 정의
}

 

만약 override 없이 method를 재정의한다면 컴파일러가 에러로 이를 감지하게 된다.

 

 

 

- getter / setter

* getter : 프로퍼티의 값을 읽을 때 호출되는 함수

* 프로퍼티에 값을 설정할 때 호출되는 함수

** 프로퍼티? 클래스 안에서 정의된 변수로 클래스의 인스턴스가 갖는 데이터

class car {
	//중략
    var carDescription: String {
    	get {
        	return "the car is \(color)"
        }
        set(newDescription) {
        	let details = newDescription.split(separator: "")
            //중략
        }
 }

 

setter에서 괄호 안에 새로운 값의 이름을 지정해줄 수 있다. 지정하지 않을 시 newValue로 자동으로 지정됨