iOS프로그래밍기초(Smile Han)/문법 정리

[Swift] 문법 정리 - 클래스

wse46 2024. 11. 10. 22:44
https://youtu.be/R8OWOgCNt4M?si=bldau6gYEZ3seGj2

위 영상을 보고 정리한 글입니다. (22:20 ~ 27:25)

 

Swift에서는 데이터를 프로퍼티(Property)라고 하며 멤버 함수는 메소드(Method)라고 한다.

 

# Swift의 클래스 선언

  • 기본 구조
class 새로운 클래스 이름: 부모 클래스 {
   // 프로퍼티, 클래스 내에 포함되는 변수(var)와 상수(let)를 정의
   // 인스턴스 메서드, 객체가 호출하는 메서드를 정의
   // 타입 메서드(클래스 메서드)
}

 

# 클래스에 property 저장하기

  • 프로퍼티는 초기값이 있거나 init을 이용해서 초기화하거나 옵셔널 변수(상수)로 선언
  • property는 저장 프로퍼티(stored property)와 계산 프로퍼티(calculated)
class Man{
   var age : Int
   var weight : Double
}
  • age, weight는 stored property
//1. 프로퍼티는 초기값이 있거나 
class Man{
   var age : Int = 1
   var weight : Double = 3.5
}
//2. 옵셔널 변수(상수)로 선언
class Man{
   var age : Int?
   var weight : Double!
}
  • 옵셔널 변수는 자동으로 nil값으로 초기화 됨

 

# 메서드 정의

  • 인스턴스(instance) 메서드, 클래스 또는 타입(class or type)메서드
  • 인스턴스 메서드는 인스턴스에서 동작
class Man{
   var age : Int = 1
   var Weight : Double = 3.5
   func display(){   
     print("나이=\(age), 몸무게=\(weight)")
   }
}

 

 

# 인스턴스 만들고 메서드와 프로퍼티 접근

class Man{
   var age : Int = 1
   var weight : Double = 3.5
   func display(){
      print("나이=\(age), 몸무게=\(weight)")
   }
}

var kim : Man = Man() // var kim = Man()
// var kim : Man // 오류, variale 'kim' used before being initialized
kim.display() // 인스턴스.프로퍼티
print(kim.age) // 인스턴스.인스턴스메서드
  • 출력값
    나이=1, 몸무게=3.5
    1

 

# 클래스(class or type) 메서드

  • 클래스.클래스메서드
  • 타입 메서드 또는 클래스 메서드는 클래스 레벨에서 동작하는 것으로, 클래스의 새로운 인스턴스를 생성하는 것과 같은 동작
  • 타입 메서드는 인스턴스 메서드와 동일한 방법으로 선언하지만 class나 static 키워드를 앞에 붙여 선언
  • class 키워드로 만든 클래스 메서드는 자식 클래스에서 override 가능함
class Man{
  var age : Int = 1
  var weight : Double = 3.5
  func display(){
     print("나이=\(age), 몸무게=\(weight)")
  }
  class func cM(){
     print("cM은 클래스 메서드")
  }
  static func scM(){
     print("scM은 클래스 메서드(static)")
  }
}
var kim : Man = Man()
kim.display()
Man.cM()
Man.scM()
  • 출력값
    나이=1, 몸무게=3.5
    cM은 클래스 메서드
    scM은 클래스 메서드(static)

 

# 인스턴스 초기화하기 : init()

  • 클래스, 구조체, 열거혐(enum) 인스턴스가 생성되는 시점에서 해야 할 초기화 작업
  • 인스턴스가 만들어지면서 자동 호출됨
  • init 메서드(생성자)
    init() {
    }
init() {
}
  • designated initializer
    모든 프로퍼티(age, weight)를 다 초기화시키는 생성자
  • 소멸자 : 인스턴스가 사라질 때 자동 호출
    denit{}
class Man{
   var age : Int = 1
   var weight : Double = 3.5
   func display(){
      print("나이=\(age), 몸무게=\(weight)")
   }
   init(yourAge: Int, yourWeight : Double){
      age = yourAge
      weight = yourWeight
   } // designated initializer
}
// var kim : Man = Man() // 오류
var kim : Man = Man(yourAge:10, yourWeight:20.5)
kim.display()
  • 출력값
    나이=10, 몸무게=20.5

# self

  • 현재 클래스 내 메서드나 프로퍼티를 가리킬 때 메서드나 프로퍼티 앞에 self. 을 붙임
  • 아래 소스에서는 self를 붙여도 되고 생략해도 됨
class Man{
   var age : Int = 1
   var weight : Double = 3.5
   init(yourAge: Int, yourWeight : Double){
       age = yourAge //self.age = yourAge
       weight = yourWeight
   }
}

 

  • 아래 소스에서는 매개변수와 구분하기 위해 반드시 self를 써야함
class Man{
   var age : Int = 1
   var weight : Double = 3.5
   func display(){
      print("나이=\(age), 몸무게=\(weight)")
   }
   init(age: Int, weight : Double){
       self.age = yourAge
       self.weight = yourWeight
   } 
}
var kim : Man = Man(age:10, weight:20.5)
kim.display()

 

 

# stored property와 calculated property

  • calculated property는 property가 설정되거나 검색되는 시점에서 계산 또는 파생된 값
  • 계산 프로퍼터는 게터(getter) 메서드와 계산을 수행하기 위한 코드를 포함하고 있는 세터(setter) 메서드를 생성하여 구현
class Man{
   var age : Int = 1
   var weight : Double = 3.5
   var manAge : Int{ // 메서드 같지만 저장 프로퍼티임
      get{
         return age-1
      }
   }
   func display(){
      print("나이=\(age), 몸무게=\(weight)")
   }
   init(age: Int, weight : Double){
       self.age = age
       self.weight = weight
   } 
}
var kim : Man = Man(age:10, weight:20.5)
kim.display()
print(kim.manAge)
  • manAge는 계산 프로퍼티로 저장 프로퍼티 age의 값에서 1을 뺀 값으로 하겠다.
  • 출력값
    나이=10, 몸무게=20.5
    9

 

# calculated property의 getter

class Man{
   var age : Int = 1
   var weight : Double = 3.5
   var manAge : Int{ // 메서드 같지만 계산 프로퍼티임
      // get{
         return age-1
      // }
   }
   func display(){
      print("나이=\(age), 몸무게=\(weight)")
   }
   init(age: Int, weight : Double){
       self.age = age
       self.weight = weight
   } 
}
var kim : Man = Man(age:10, weight:20.5)
kim.display()
print(kim.manAge)
  • 출력값
    나이=10, 몸무게=20.5
  • manAge는 계산 프로퍼티로 저장 프로퍼티 age의 값에서 1을 뺀 값
  • setter가 없으면 get{ }는 생략할 수 있으며 변경하지 않더라도 var로 선언해야 함

# calculated property의 setter

class Man{
   var age : Int = 1
   var weight : Double = 3.5
   var manAge : Int{ // 메서드 같지만 계산 프로퍼티임
      get{
         return age-1
      }
      set(USAAge){
         age = USAAge + 1
      }
   }
   func display(){
      print("나이=\(age), 몸무게=\(weight)")
   }
   init(age: Int, weight : Double){
       self.age = age
       self.weight = weight
   } 
}
var kim : Man = Man(age:10, weight:20.5)
kim.display()
print(kim.manAge) //9, getter 호출
print(kim.age)    //10
kim.manAge = 3    //setter 호출
print(kim.age)    //4
  • 출력값
    나이=10, 몸무게=20.510
    4
    9
  • setter가 있으면 get{ }는 생략 불가
  • 매개변수명은 newValue가 기본
    set(newValue){
        age = newValue + 1
    }
  • Shorthand Setter Declaration
    setter의 매개변수명이 newValue인 경우에만 이렇게 "(newValue)" 생략 가능
    set{
        age = newValue + 1
    }

# calculated property의 getter와 setter

class Man{
   var age : Int = 1
   var weight : Double = 3.5
   var manAge : Int{ 
      get{ return age-1 }
      set{ age = newValue + 1 }
   }
   func display(){
      print("나이=\(age), 몸무게=\(weight)")
   }
   init(age: Int, weight : Double){
       self.age = age
       self.weight = weight
   } 
}
var kim : Man = Man(age:10, weight:20.5)
kim.display()
print(kim.manAge) //9, getter 호출
print(kim.age)    //10
kim.manAge = 3    //setter 호출
print(kim.age)    //4
  • 출력값
    나이=10, 몸무게=20.510
    4
    9
  • getter와 setter를 갖는 calculated protperty manAge

 

# method overloading : 생성자 중첩

  • 매개변수의 개수와 자료형이 다르지만 이름이 같은 함수를 여려개 정의
  • 매개변수가 다른 두생성자를 통해 두 가지 방법으로 인스턴스를 만들 수 있음
class Man{
   var age : Int = 1
   var weight : Double = 3.5
   func display(){
       print("나이=\(age), 몸무게=\(weight)")
   }
   init(age: Int, weight : Double){ // #1
       self.age = age
       self.weight = weight
   } 
  init(age: Int){ // #2
      self.age = age
  }
}
var kim : Man = Man(age:10, weight:20.5) // #1
var kim1 : Man = Man(age:10) // #2
kim.display()
kim1.display()
  • 출력값
    나이=10, 몸무게=20.5
    나이=10, 몸무게=3.5