곡뢀 μ—°μŠ΅μž₯ :-)

ν”„λ‘œνΌν‹°

|

ν”„λ‘œνΌν‹°

ν”„λ‘œνΌν‹°μ˜ λΆ„λ₯˜

  • 역할에 λ”°λ₯Έ λΆ„λ₯˜ : μ €μž₯ν”„λ‘œνΌν‹° / μ—°μ‚°ν”„λ‘œνΌν‹°
  • μ†Œμ†μ— λ”°λ₯Έ λΆ„λ₯˜ : μΈμŠ€ν„΄μŠ€ν”„λ‘œνΌν‹°(일반적으둜 μΈμŠ€ν„΄μŠ€μ— μ†Œμ†λ˜λŠ” ν”„λ‘œνΌν‹°) / νƒ€μž…ν”„λ‘œνΌν‹° (μ˜ˆμ™Έμ μœΌλ‘œ ν΄λž˜μŠ€μ™€ ꡬ쑰체 μžμ²΄μ— μ†Œμ†λ˜μ–΄ 값을 κ°€μ§€λŠ” ν”„λ‘œνΌν‹°)

μ €μž₯ ν”„λ‘œνΌν‹°

  • μž…λ ₯된 값을 μ €μž₯ν•˜κ±°λ‚˜ μ €μž₯된 값을 μ œκ³΅ν•˜λŠ” μ—­ν• 
  • μƒμˆ˜ 및 λ³€μˆ˜λ₯Ό μ‚¬μš©ν•΄μ„œ μ •μ˜κ°€λŠ₯
  • ν΄λž˜μŠ€μ™€ κ΅¬μ‘°μ²΄μ—μ„œλŠ” μ‚¬μš©μ΄ κ°€λŠ₯ν•˜μ§€λ§Œ, μ—΄κ±°ν˜•μ—μ„œλŠ” μ‚¬μš©ν•  수 μ—†μŒ

클래슀 λ‚΄μ—μ„œ μ„ μ–Έλœ λ³€μˆ˜λ‚˜ μƒμˆ˜λ₯Ό 뢀름. μ„ μ–Έμ‹œ μ΄ˆκΈ°κ°’μ„ 할당해주어야함. (μ΄ˆκΈ°κ°’μ„ ν• λ‹Ήν•˜μ§€ μ•ŠμœΌλŸ¬λ©΄ λ°˜λ“œμ‹œ μ˜΅μ…”λ„ νƒ€μž…μœΌλ‘œ μ„ μ–Έν•΄μ£Όμ–΄μ•Ό 함 - ? ν˜Ήμ€ ! μ˜΅μ…”λ„νƒ€μž…μœΌλ‘œ)

cf. ν•˜μ§€λ§Œ κ΅¬μ‘°μ²΄λŠ” 이같은 μ΄ˆκΈ°κ°’μœΌλ‘œλΆ€ν„° μžμœ λ‘­λ‹€. (μ΄ˆκΈ°ν™”λ‚˜ μ˜΅μ…”λ„λ‘œ 지정해주지 μ•Šμ•„λ„ λ¬Έμ œκ°€ μ—†μŒ.) μ΄λŠ” λ©€λ²„μ™€μ΄μ¦ˆ μ΄ˆκΈ°ν™” ꡬ문이 제곡되기 λ•Œλ¬Έμž„ (λ©€λ²„μ™€μ΄μ¦ˆ μ΄ˆκΈ°ν™” ꡬ문 - μΈμŠ€ν„΄μŠ€ 생성 μ‹œ μΈμžκ°’μ„ λ°›μ•„ ν”„λ‘œνΌν‹°μ˜ 값을 μ΄ˆκΈ°ν™”μ‹œμΌœμ£ΌλŠ” 역할을 함)

μ—°μ‚° ν”„λ‘œνΌν‹°

  • νŠΉμ • 연산을 톡해 값을 λ§Œλ“€μ–΄ μ œκ³΅ν•˜λŠ” μ—­ν• 
  • λ³€μˆ˜λ§Œ μ‚¬μš©ν•΄μ„œ μ •μ˜ κ°€λŠ₯
  • 클래슀, ꡬ쑰체, μ—΄κ±°ν˜• λͺ¨λ‘μ—μ„œ μ‚¬μš© κ°€λŠ₯

μ—°μ‚° ν”„λ‘œνΌν‹°λŠ” λ‹€λ₯Έ ν”„λ‘œνΌν‹°μ˜ 값을 μ—°μ‚°μ²˜λ¦¬ν•˜μ—¬ κ°„μ ‘μ μœΌλ‘œ 값을 제곡. μ΄λ•Œ ν”„λ‘œνΌν‹°μ˜ 값을 μ°Έμ‘°ν•˜κΈ° μœ„ν•΄ λ‚΄λΆ€μ μœΌλ‘œ μ‚¬μš©ν•˜λŠ” ꡬ문이 get κ΅¬λ¬Έμž„. ν•¨μˆ˜μ™€ λΉ„μŠ·ν•˜κ²Œ return ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄μ„œ 값을 λ°˜ν™˜ν•˜κ³ , μ—¬κΈ°μ„œμ˜ return값이 ν”„λ‘œνΌν‹°κ°€ μ œκ³΅ν•˜λŠ” 값이 됨.

get ꡬ문을 ν†΅ν•΄μ„œ μ—°μ‚° ν”„λ‘œνΌν‹°κ°€ 값을 λ°˜ν™˜ν•˜λŠ” κΈ°λŠ₯을 ν•œλ‹€.

class/struct/enum 객체λͺ… {
  ...
  var ν”„λ‘œνΌν‹°λͺ…: νƒ€μž… {
    get {
      ν•„μš”ν•œ μ—°μ‚° κ³Όμ •
      return λ°˜ν™˜κ°’
    }
    set(λ§€κ°œλ³€μˆ˜λͺ…) {
      ν•„μš”ν•œ 연산ꡬ문
    }
  }
}
struct UserInfo {
    //μ €μž₯ ν”„λ‘œνΌν‹° : νƒœμ–΄λ‚œ 연도
    var birth : Int!
    
    //μ—°μ‚° ν”„λ‘œνΌν‹° : μ˜¬ν•΄κ°€ λͺ‡λ…„도인지 계산
    var thisYear : Int! {
        get {
            let dateFormat = DateFormatter()
            dateFormat.dateFormat = "yyyy"
            return Int(dateFormat.string(from: <#T##Date#>))
        }
    }
    
    //μ—°μ‚° ν”„λ‘œνΌν‹° : μ˜¬ν•΄ - νƒœμ–΄λ‚œ 연도 + 1
    var age : Int {
        get {
            return (self.thisYear - self.birth) + 1
        }
    }
}

let info = UserInfo(birth: 1980)
print(info.age)

지연 μ €μž₯ν˜• ν”„λ‘œνΌν‹° lazy

μ €μž₯ν˜• ν”„λ‘œνΌν‹°μ˜ 값이 κ³§λ°”λ‘œ 지정될 수 μ—†μ„λ•Œ μ‚¬μš©ν•œλ‹€. κΌ¬λŠ” μΈμŠ€ν„΄μŠ€κ°€ λ§Œλ“€μ–΄μ Έμ•Ό μ•Œ 수 μžˆλŠ” νƒ€μž…μ˜ 외적 μš”μ†Œμ— ν”„λ‘œνΌν‹°κ°€ μ˜μ‘΄ν•˜λŠ” κ²½μš°λ„ μžˆλ‹€. 이런 ν™˜κ²½μ„ κ°€λ¦¬μΌœ 지연 λ‘œλ”©μ΄λΌκ³  λΆ€λ₯Έλ‹€. μ§€μ—°λ‘œλ”©μ˜ 관점은 ν”„λ‘œνΌν‹°μ˜ 값이 ν•„μš”ν•  λ•Œ κ³„μ‚°ν•œλ‹€λŠ” 의미이고, 이 μ§€μ—°μœΌλ‘œ 인해 ν”„λ‘œνΌν‹°μ˜ 값을 κ³„μ‚°ν•˜λŠ” 일도 μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™” μ΄ν›„λ‘œ 미뀄진닀.

struct Town {
    let region = "South" //let - μ €μž₯용 ν”„λ‘œνΌν‹°, μ½κΈ°μ „μš©
    var population = 5_422
    var numberOfStopLights = 4
    
    enum Size {
        case small
        case medium
        case large    }

    /*
     지연 μ €μž₯ν˜• ν”„λ‘œνΌν‹° - ν”„λ‘œνΌν‹°μ˜ 값이 ν•„μš”ν•΄μ•Ό κ³„μ‚°ν•œλ‹€.
     이 μ§€μ—°μœΌλ‘œ 인해 ν”„λ‘œν„°ν”Όμ˜ 값을 κ³„μ‚°ν•˜λŠ” 일도 μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™” μ΄ν›„λ‘œ 이뀄진닀.
     λ”°λΌμ„œ κ·Έ 값이 λ‚˜μ€‘μ— λ³€κ²½λ˜λ―€λ‘œ 지연 ν”„λ‘œνΌν‹°λŠ” var둜 μ„ μ–Έν•΄μ•Όν•œλ‹€.
     */
    
    lazy var townSize: Size = {
        switch self.population{
        case 0...10_000:
            return Size.small
        case 10_001...100_000:
            return Size.medium
        default:
            return Size.large
        }
    }()

  • townSize ν”„λ‘œνΌν‹°μ˜ νƒ€μž…μ€ Size둜 μ„ μ–Έν–ˆλ‹€. 예λ₯Όλ“€μ–΄ myTown.townSize = Size.small과같은 μ‹μœΌλ‘œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— 이 ν”„λ‘œνΌν‹°μ˜ 값은 μ§€κΈˆ λ°”λ‘œ μ„€μ •ν•œ 것이 μ•„λ‹ˆλ‹€.

ν•¨μˆ˜ - ν•¨μˆ˜μ˜ 쀑첩과 μ˜μ—­ / guard let

|

ν•¨μˆ˜

ν•¨μˆ˜μ˜ 쀑첩과 μ˜μ—­

μ€‘μ²©λ˜λŠ” ν•¨μˆ˜λŠ” λ‹€λ₯Έ ν•¨μˆ˜ μ•ˆμ—μ„œ μ„ μ–Έλ˜κ³  κ΅¬ν˜„λœλ‹€. λ”°λΌμ„œ μ„ μ–Έλœ κ³³ λ°–μ—μ„œλŠ” μ‚¬μš© ν•  수 μ—†κ³  ν•¨μˆ˜κ°€ λ‹€λ₯Έ ν•¨μˆ˜ μ•ˆμ—μ„œλ§Œ μ–΄λ–€ 일을 ν•΄μ•Όν•  λ•Œ μ˜λ―Έκ°€ μžˆλ‹€.

func areaOfTriangleWith(base: Double, height: Double) -> Double {
    let numerator = base * height
    func divide() -> Double{
        return numerator / 2
    }
    return divide ()
}

areaOfTriangleWith(base: 5.0, height: 4.0)
//ν•¨μˆ˜ 자체λ₯Ό 리턴할 수 μžˆλ‹€.
//λ‹€λ₯Έ κ³³μ—μ„œ(μ„ μ–Έν•œ ν•¨μˆ˜ λ°–μ˜ μ‹œμ•Ό) divide()λ₯Ό ν˜ΈμΆœν•˜λ©΄ μ—λŸ¬λ‚¨

guard let / ν•¨μˆ˜μ—μ„œ 쀑도에 λΉ μ Έλ‚˜μ˜€κΈ°

guard let을 μ‚¬μš©ν•΄μ„œ μ˜΅μ…”λ„ λ°”μΈλ”©ν•˜κ³  ν•¨μˆ˜ 쀑간에 λΉ μ Έλ‚˜μ˜€κΈ°

func greetingMiddleName(fromfullname name:(String, String?, String)) {
	guard let middle = name.1 else {
    	print("Hey there!")
    	return
	}
	print ("Hey (middle) there!")
}
greetingMiddleName(fromfullname: ("Matt",nil,"Mathew")) //Hey there!
greetingMiddleName(fromfullname: ("Matt","Danger","Mathew")) //Hey Danger there!

guard let - middle name은 νŠœν”Œμ˜ 인덱슀1번째 값인 μ˜΅μ…”λ„μ΄λ‹€.

μ˜΅μ…”λ„ 바인딩이 된 후에 middle이 nil값이 μ•„λ‹ˆλΌλ©΄ guardλ¬Έ λ°–μ˜ β€œHey (middle) there!” κ°€ μ‹€ν–‰λ˜κ³ , nil이라면 β€œHey there!” ꡬ문이 싀행됨.

##

TIL_20171106

|

였늘 배운/λŠλ‚€ 것

  • 사닀리 κ²Œμž„ step3 PR을 λ³΄λƒˆλ‹€. 비둝 λ‹€μ‹œ μˆ˜μ •ν•΄μ•Όν•˜κ³  mergeλŠ” μ•ˆλμ§€λ§Œ PR 보내기가 였늘의 λͺ©ν‘œμ˜€λŠ”데 λΏŒλ“―ν•˜λ‹€!
  • split(), map(String.init) - λΈ”λ‘œκ·Έμ°Έκ³ 
  • ν„°λ―Έλ„μ—μ„œ μŠ€μœ„ν”„νŠΈνŒŒμΌ μ‹€ν–‰ν•˜κΈ°

  • ν‘Έμ‹œλŠ” ν•œκΊΌλ²ˆμ— ν•˜λ”λΌλ„ 컀밋은 μ΅œλŒ€ν•œ μž‘μ€ λ‹¨μœ„λ‘œ ν•˜λΌλŠ” 리뷰λ₯Ό λ°›μŒ

μ•žμœΌλ‘œ ν•  것

  • λ‚˜λ§Œμ˜ μ»€λ°‹λ‘œκ·Έκ·œμΉ™ λ§Œλ“€κΈ° (μž‘μ€ λ‹¨μœ„λ‘œ μͺΌκ°œμ„œ 컀밋할 수 μžˆλ„λ‘)
  • 슀트럭트,클래슀 - ν”„λ‘œνΌν‹°μ™€ μ΄ˆκΈ°ν™”
  • 객체 λ‚΄, 외뢀쀑 μ–΄λ””μ—μ„œλ§Œ μ‚¬μš©λ˜λŠ” λ©”μ†Œλ“œμΈμ§€ νŒλ‹¨ν•΄μ„œ λ‹€μ–‘ν•œ μ ‘κ·Όμžλ₯Ό ν™œμš©ν•˜μž
  • μ§€ν‚¬λΈ”λ‘œκ·Έμš© μ €μž₯μ†Œλ„ 브랜치λ₯Ό λ‚˜λˆ μ„œ μž‘μ—…ν•˜μžβ€¦

ν„°λ―Έλ„μ—μ„œ xcode ν”„λ‘œμ νŠΈ 파일 μ‹€ν–‰ν•˜κΈ°

|

ν„°λ―Έλ„μ—μ„œ xcode ν”„λ‘œμ νŠΈ 파일 μ‹€ν–‰ν•˜κΈ°

μ‚¬λ‹€λ¦¬κ²Œμž„ 진행도쀑에 readLine()을 ν†΅ν•΄μ„œ μž…λ ₯받은 ν•œκΈ€μ„ 좜λ ₯μ‹œμΌœλ΄€λŠ”λ°, ν•œκΈ€μ΄ 말도 μ•ˆλ˜κ²Œ 좜λ ₯이 됐닀. (예λ₯Όλ“€μ–΄, β€œλ¬΄μ§€β€λ₯Ό μž…λ ₯ν–ˆλŠ”λ° 좜λ ₯은 β€œγ…γ…œγ…ˆγ…£β€ μ΄λŸ°μ‹μœΌλ‘œβ€¦)

JKμ—κ²Œ μ§ˆλ¬Έν–ˆλ”λ‹ˆ ν„°λ―Έλ„λ‘œ 싀행해보라고 ν•˜μ…¨λŠ”λ° ν„°λ―Έλ„λ‘œ ν”„λ‘œμ νŠΈ νŒŒμΌμ„ μ‹€ν–‰ν•˜λŠ”κ±΄ λͺ°λžλ˜ 방법이라 정리겸 ν¬μŠ€νŒ…μœΌλ‘œ 남겨본닀!

  • 이 방법은 μŠ€μœ„ν”„νŠΈ 파일 λΉŒλ“œ 후에 진행해야 ν•œλ‹€.

  • Xcode의 λ„€λΉ„κ²Œμ΄ν„°μ—μ„œ ν”„λ‘œλ•νŠΈ νŒŒμΌμ„ μ„ νƒν•œλ‹€.

  • 선택 ν›„ 였λ₯Έμͺ½μ˜ μœ ν‹Έλ¦¬ν‹° νƒ­μ—μ„œ full pathλ₯Ό μ•Œμ•„λ‚Έλ‹€.

  • ν•΄λ‹Ή 경둜 폴더λ₯Ό μ—°λ‹€ (νŒŒμΈλ”μ—μ„œ)

  • ν”„λ‘œμ νŠΈμ‹€ν–‰νŒŒμΌ(이름이 ν”„λ‘œμ νŠΈ 이름과 λ˜‘κ°™μ€ 파일)을 μš°ν΄λ¦­ν•˜κ³ , 정보 κ°€μ Έμ˜€κΈ°λ₯Ό ν΄λ¦­ν•œ ν›„ μœ„μΉ˜λ₯Ό λ³΅μ‚¬ν•œλ‹€. (Xcode의 μœ ν‹Έλ¦¬ν‹° νƒ­μ—μ„œ μ•Œμ•„λ‚Έ full path둜 κ³§λ°”λ‘œ 해도 될 것같은데, λ‚˜μ€‘μ— λ‹€μ‹œ ν•œ 번 μ‹œλ„ν•΄λ΄μ•Όκ² λ‹€)

  • μ•„λž˜μ˜ 터미널 λͺ…λ Ήμ–΄λ‘œ μ‹€ν–‰ν•΄λ³Έλ‹€. readLine()같은 μž…λ ₯λ°›λŠ” ν•¨μˆ˜λ“€λ„ 터미널 μœ„μ—μ„œ λ™μž‘ν•œλ‹€.

$cd λ³΅μ‚¬ν•œκ²½λ‘œ //λͺ…λ Ήμ–΄λ‘œ ν”„λ‘œμ νŠΈ 파일이 μžˆλŠ” 곳으둜 이동

$./ νŒŒμΌμ΄λ¦„ //λͺ…λ Ήμ–΄λ‘œ μ‹€ν–‰!

TIL_20171103

|

였늘 배운 / λŠλ‚€ 것

  • 객체지ν–₯
    • β€˜κ°μ²΄β€™λΌλŠ” 것을 잘 μ΄ν•΄ν•˜λ €λ©΄ 사물을 λ°”λΌλ³΄λŠ” 관점이 μ΅œλŒ€ν•œ 객관적이고 κ·Έ λŒ€μƒμ˜ 속성을 ν•˜λ‚˜ν•˜λ‚˜ 잘게잘게 μͺΌκ°œμ„œ 곡톡점을 μ°Ύμ•„λ‚΄κ³  κ·Έ κΈ°μ€€μœΌλ‘œ λΆ„λ₯˜ν•˜λŠ” 것을 μž˜ν•œλ‹€λ©΄ 쑰금 μˆ˜μ›”ν•  것 κ°™λ‹€
    • 객체지ν–₯적인 ν”„λ‘œκ·Έλž˜λ°μ΄λΌλŠ”κ²ƒμ€ β€˜μ£Όμ²΄β€™κ°€ β€˜κ°μ²΄β€™μ—κ²Œ λ©”μ‹œμ§€λ₯Ό λ³΄λ‚΄λŠ” 것
  • λ‹¨μœ„ν…ŒμŠ€νŠΈ
  • μ‹€μ œ 개발 업무 μ‹œκ°„μ€ μ–΄λ–»κ²Œ κ΅¬μ„±λ˜λŠ”κ²Œ 이상적인가?
    • κ°œλ°œμ—…λ¬΄μ‹œκ°„ 100% μ€‘μ—μ„œ
      • 10%λŠ” planning
      • 25%λŠ” μ•ˆμ •ν™” / 디버깅
      • 65% κ°€ κ°œλ°œμ‹œκ°„
        • κ·Έ κ°œλ°œμ‹œκ°„μ˜ 75%λŠ” μ½”λ”©(90%) λ””μžμ΄λ‹(10%)으둜 이루어지고
        • 25%λŠ” λ―ΈνŒ…, μ½”λ“œλ¦¬λ·°, λ¬Έμ„œμž‘μ—… λ“±μ˜ μ—…λ¬΄λ‘œ 이루어짐
  • μ‚¬λ‹€λ¦¬κ²Œμž„ step2 진행 / merge
  • guard let / 슀트럭트 곡뢀 - μ‹€μ œ λ―Έμ…˜μ— μ μš©ν•˜λ©΄μ„œ 곡뢀함
  • μ‚¬λ‹€λ¦¬κ²Œμž„ step3 μ§„μž…! λ“œλ””μ–΄ 슀트럭트λ₯Ό μ μš©ν•΄λ³Ό 수 μžˆμ„λ“―..!

μ•žμœΌλ‘œ ν•  것

  • μ‚¬λ‹€λ¦¬κ²Œμž„ step3 μ›”μš”μΌ(11/6)에 PR 보내기
  • 객체지ν–₯의 사싀과 μ˜€ν•΄ λŒ€μ—¬ν•˜κ³  읽기!