본문 바로가기
Swift/기초

32. 스위프트 기초 문법[Type(1) - Class & Structure]

by UDDT 2025. 2. 7.

Swift/기초 카테고리에 업로드한 모든 내용은 KxCoding 기초 강의를 토대로 작성하였습니다.

 

 

⎮ CustomData Type

 스위프트에서 기본적으로 제공하는 다양한 Type이 있지만 우리에게 필요한 모든 Type을 제공하는 것은 아님

따라서 필요한 타입을 직접 만들어서 쓸 수 있음(CustomData Type)

사용자가 Data Type을 만들 때 3가지 타입으로 만들 수 있음 (Enumeration / Structure / Class)

 

⎮ Programming Paradigm

  - 현대적인 프로그래밍 언어는 멀티 패러다임 언어

  - Swift는 그 중 3가지 패러다임을 구현하고 있음(Object-Oriented, Protocol-Oriented, Functional Programing)

  - Object-Oriented Programing : 객체 지향(모든 데이터를 객체로 만들고, 객체의 상태와 동작을 조작해서 원하는 기능 구현)

     * 추상화(Abstraction) : 객체가 가진 여러가지 특징 중, 프로그램이 처리할 특징을 도출하는 과정

        ex) 다이어트 프로그램 : 키, 몸무게, 등록일 등의 데이터를 저장하도록 추상화

  - 클래스(Class) : 추상화의 결과를 코드로 표현하는 것

      객체의 특징과 상태는 속성으로, 객체의 동작은 Method로 구현

      Class는 객체를 만들때 사용하는 설계도 같은 개념

      Class 하나를 만들어두고 필요한 수만큼 객체(Instance)를 만들 수 있음.

      클래스가 만든 하나의 객체를 'Instance'라 부르며,

      모든 Instance는 똑같은 이름의 속성을 가지고 있지만 저장되는 값은 다를 수 있음.

      마찬가지로 똑같은 이름의 Method를 가지고 있더라도, Method의 실행결과는 Instance마다 차이가 있음.

      객체들은 서로 메시지를 보내고(Sender) 받으면서(Receiver) 기능을 수행(Sending Messages)

  - 구조체(Structure)

      객체 지향에서는 보통 Class로 새로운 Type을 구현하지만,

      비교적 작은 데이터를 사용하거나 간편식이 필요할 때는 Structure(구조체)을 사용

      Class가 가진 대부분의 기능을 Structure도 가지고 있음.

      (RXSwift, SwiftUI에서 함수형 프로그래밍 / 프로토콜 지향 프로그래밍에서 새로운 타입을 만들 때는 Structure로 만듦.)

 

⎮ Structure (구조체)

  1. 구조체 문법                                      * 구조체의 이름은 UpperCamelCase로 작성

struct StructName {
    property(속성)
    method(메소드)
    initializer(생성자)       // 구조체는 자동으로 생성자를 제공함(memberwise initializer)
    subscript(서브스크립트)
}

/*
property ~ subscript까지를 member라고 부름. member의 요소는 lowerCamelCase로 작성
멤버는 필요한만큼 선언하고, 불필요한 요소는 생략해도 됨

Type 선언에서 첫번째 Level에는 선언만 와야함.

property(속성) : Global Scope나 Local Scope에서 선언하면 변수, Type 안에서 선언하면 property
method(메소드) : Global Scope나 Local Scope에서 선언하면 함수, Type 안에서 선언하면 method

*/
struct Person {
    // 속성 선언
    var name: String
    var age: Int
    
    // Method 선언
    func speak() {
    	print("Hello")
    }
}

  * 구조체를 선언했다고 해서 Instance가 자동으로 만들어지는 것은 아님. (설계도를 만들었다고해서 상품이 자동으로 나오는 것 X)

 

  2. Instance 만들기(생성자 문법)

let p = Person(name: "Uddt", age: 25)

/*
위처럼 선언하면 새로운 메모리 공간이 만들어지고, 전달한 이름과 나이가 Person이라는 Type으로 저장됨.
새로운 Instance가 생성
p가 Instance의 이름이 되는 것
*/

 

  3. 속성에 접근하기

/*
상수의 이름에 접근할 때

let name = "Paul"
name
*/

/*
속성에 접근할 때는 Instance의 이름으로 접근해야 함.
InstanceName.property
*/
p.name
p.age

 

  4. 메소드에 접근하기

p.speak()

// Hello

  * 호출할 때 이름 앞에 아무 것도 없으면 함수, 만약 .이 있으면 Method

 

⎮ Class (클래스)

  1. 클래스 문법

class ClassName {
    property(속성)
    method(메소드)
    initializer(생성자)         // Class에서는 init이 반드시 필요함
    deinitializer(디이니셜라이저)
    subscript(서브스크립트)
}

/*
property ~ subscript까지를 member라고 부름. member의 요소는 lowerCamelCase로 작성
멤버는 필요한만큼 선언하고, 불필요한 요소는 생략해도 됨

initializer에서는 모든 저장 속성을 초기화 해야함
*/
class Person {
    var name: String
    var age: Int

    func speak() {
        print("Hello")
    }

    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

let p = Person(name: "Uddt", age: 25)

 

  2. 구조체와 동일하게 코드를 작성하면 에러가 발생함.                        * class는 initializer가 필수

  * initializer(생성자) : Instance를 초기화하는 특별한 Method, 특정 조건을 만족할 때만 자동으로 제공.

 

  3. 생성자 추가

init() {
	name = "Uddt"
}

 

  4. name과 age 둘다 초기화해줘야 함.

class Person {
    var name: String
    var age: Int

    func speak() {
        print("Hello")
    }

    init() {
        name = "Uddt"
        age = 25
    }

}

 

  5. Instance 만들기

let p = Person()

/*
 함수와 Method는 이름으로 호출하는데, Initializer는 이름이 없음.
 따라서 호출할 때 Type의 이름으로 호출함
 */

  * 만약 여기서 p = person()이라고 쓰면 함수를 호출하는 코드로 오인지할 수 있음. 글자 표현 규칙을 잘 따라야함

 

  6. 구조체처럼 parameter 2개를 전달받는 Instance로 바꾸기

class Person {
    var name: String
    var age: Int

    func speak() {
        print("Hello")
    }

    init(name: String, age: Int) {
        self.name = name       //self를 붙임으로써, 맨 위의 name 속성으로 접근하도록 명령
        self.age = age         //self를 붙임으로써, 맨 위의 age 속성으로 접근하도록 명령
    }
}

let p = Person(name: "Uddt", age: 25)

  * 만약 parameter 이름과 속성의 이름이 다르다면, self를 붙이지 않아도 됨.

 

최근댓글

최근글

skin by © 2024 ttuttak