πŸš€
Growth log
  • About me
  • I LEARNED
    • General
      • 개발자 κΏ€νŒ
      • κ·Έλ‘œμŠ€ν•΄ν‚Ή 기초
      • κ°œλ°œμžμ—κ²Œ 도메인 지식은 μ–Όλ§ˆλ‚˜ μ€‘μš”ν• κΉŒ?
      • DTO λ…ΌμŸμ— λŒ€ν•˜μ—¬
      • MSAλž€?
    • Seminar
      • ν…ŒμŠ€νŠΈ 컀버리지 100% - SLASH 21
      • TDDκ°€ μ‹€νŒ¨ν•˜λŠ” 이유 - by μ΄κ·œμ›λ‹˜
      • λŒ€κ·œλͺ¨ νŠΈλž˜ν”½ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„±λŠ₯ νŠœλ‹ λ…Έν•˜μš° λ‹€ μ•Œλ € λ“œλ¦Ό|λΌμΈκ°œλ°œμ‹€λ‘
      • 결제 μ‹œμŠ€ν…œμ˜ SDK와 API λ””μžμΈ - SLASH 21
    • Web
      • SOP와 CORS
    • Spring & OOP
      • DTO vs VO
    • Ruby On Rails
      • Rails lib 디렉토리에 λŒ€ν•˜μ—¬
      • Rails의 concernsλž€?
      • Railsμ—μ„œμ˜ GC μž‘λ™μ›λ¦¬
      • Eager loading vs Lazy loading
      • Rails ν™˜κ²½ ꡬ성
      • ActionCable
      • πŸ“”Perfect ruby on rails
        • MVC νŒ¨ν„΄μΈ Rails
        • Ruby on Rails κΈ°λ³Έ - 컨트둀러
        • Ruby on Rails κΈ°λ³Έ - λ·°
        • Ruby on Rails κΈ°λ³Έ - λͺ¨λΈ
        • μŠ€μΊν΄λ”© κΈ°λŠ₯을 μ‚¬μš©ν•œ Rails 개발 기초
        • λ·° 개발
        • λͺ¨λΈ 개발
        • λͺ¨λΈ 개발 - 낙관적 λ™μ‹œ μ‹€ν–‰ μ œμ–΄
        • λͺ¨λΈ 개발 - μœ νš¨μ„± 검사 κ΅¬ν˜„
        • λͺ¨λΈ 개발 - Association
        • λͺ¨λΈ 개발 - 콜백
        • λͺ¨λΈ 개발 - λ§ˆμ΄κ·Έλ ˆμ΄μ…˜
        • λͺ¨λΈ 개발 - 데이터 μ΄ˆκΈ°ν™”
        • 컨트둀러 개발 - μš”μ²­ 정보 μΆ”μΆœ
        • 컨트둀러 개발 - 응닡
        • 컨트둀러 개발 - μƒνƒœ 관리
        • λΌμš°νŒ… - RESTful
        • λΌμš°νŒ… - RESTful μΈν„°νŽ˜μ΄μŠ€μ˜ μ‚¬μš©μž μ •μ˜ν™”
        • λΌμš°νŒ… - RESTful ν•˜μ§€ μ•Šμ€ 라우트 μ •μ˜
        • ν…ŒμŠ€νŠΈ
        • ν…ŒμŠ€νŠΈ - μ€€λΉ„
        • ν…ŒμŠ€νŠΈ - Unit ν…ŒμŠ€νŠΈ
        • ν…ŒμŠ€νŠΈ - Functional ν…ŒμŠ€νŠΈ
        • ν…ŒμŠ€νŠΈ - Integration ν…ŒμŠ€νŠΈ
        • ν΄λΌμ΄μ–ΈνŠΈ 개발 - Sprockets vs Webpacker
        • ν΄λΌμ΄μ–ΈνŠΈ 개발 - Sprockets
    • Node.js & Express
      • κΈ°λ³Έ κ°œλ…
      • npx
    • Programing Language
      • Java
        • JavaDoc에 λŒ€ν•΄
        • invocation에 λŒ€ν•΄μ„œ
        • μ–΄λ…Έν…Œμ΄μ…˜
        • μΆ”μƒν΄λž˜μŠ€ & μΈν„°νŽ˜μ΄μŠ€
        • Package
        • μ˜€λ²„λ‘œλ”© vs μ˜€λ²„λΌμ΄λ”©
      • Javascript
        • TCP School 훑어보기
          • νƒ€μž…
          • ν˜• λ³€ν™˜
          • λ³€μˆ˜
          • μ—°μ‚°μž
          • 반볡문
          • λ°°μ—΄(array)
          • ν•¨μˆ˜
          • ν•¨μˆ˜ - μŠ€μ½”ν”„μ™€ ν˜Έμ΄μŠ€νŒ…
          • ν•¨μˆ˜ - λ§€κ°œλ³€μˆ˜μ™€ 인수
          • ν•¨μˆ˜ - 미리 μ •μ˜λœ μ „μ—­ ν•¨μˆ˜
          • 객체
          • ν”„λ‘œν† νƒ€μž…
          • DOM
          • BOM - Window 객체
          • 이벀트(event)
      • Ruby
        • πŸ“”νΌνŽ™νŠΈ 루비
    • DB
      • Redis
        • Redis κ°œμš”
      • Index(인덱슀)?
      • DB Transaction & Lock
      • λ™μ‹œμ„± μ œμ–΄μ— κ΄€ν•˜μ—¬
      • Lock(잠금)μ΄λž€?
      • ActiveRecord lock vs with_lock
      • Table lock vs Row lock
      • WHERE 1=1 ꡬ문에 λŒ€ν•˜μ—¬
      • COUNT(*) vs COUNT(indexed column)
      • πŸ“•κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€ μ‹€μ „μž…λ¬Έ
      • πŸ“”SQL 첫걸음
      • πŸ“”λͺ¨λ‘μ˜ SQL
    • Design Patterns
      • Observer pattern
      • Flyweight pattern
      • Singleton pattern
    • OOP
      • πŸ“”μ˜€λΈŒμ νŠΈ
        • 6μž₯ λ©”μ‹œμ§€μ™€ μΈν„°νŽ˜μ΄μŠ€
      • ν΄λž˜μŠ€κ°„ 관계 간단 정리
    • Regex
    • Collaboration
      • Git
      • Sourcetree
  • DAILY REVIEW
    • 2021
      • August
        • 2021-08-25(Wed)
        • 2021-08-23(Mon)
        • 2021-08-11(Wed)
        • 2021-08-04(Wed)
        • 2021-08-03(Tue)
        • 2021-08-02(Mon)
      • July
        • 2021-07-29(Thu)
        • 2021-07-26(Mon)
        • 2021-07-23(Fri)
        • 2021-07-22(Thu)
        • 2021-07-21(Wed)
        • 2021-07-20(Tue)
        • 2021-07-19(Mon)
        • 2021-07-15(Thu)
        • 2021-07-14(Wed)
        • 2021-07-13(Tue)
        • 2021-07-12(Mon)
      • June
        • 2021-06-05(Sat)
        • 2021-06-04(Fri)
        • 2021-06-03(Thu)
        • 2021-06-02(Wed)
        • 2021-06-01(Tue)
      • May
        • 2021-05-31(Mon)
        • 2021-05-29(Sat)
        • 2021-05-28(Fri)
        • 2021-05-27(Thu)
        • 2021-05-26(Wed)
        • 2021-05-25(Tue)
        • 2021-05-24(Mon)
        • 2021-05-22(Sat)
        • 2021-05-21(Fri)
        • 2021-05-20(Thu)
        • 2021-05-19(Wed)
        • 2021-05-18(Tue)
        • 2021-05-17(Mon)
        • 2021-05-15(Sat)
        • 2021-05-13(Thu)
        • 2021-05-12(Wed)
        • 2021-05-11(Tue)
        • 2021-05-10(Mon)
        • 2021-05-03(Mon)
      • April
        • 2021-04-30(Fri)
        • 2021-04-29(Thu)
        • 2021-04-28(Wed)
        • 2021-04-27(Tue)
        • 2021-04-26(Mon)
        • 2021-04-24(Sat)
        • 2021-04-23(Fri)
        • 2021-04-21(Wed)
        • 2021-04-20(Tue)
        • 2021-04-19(Mon)
        • 2021-04-18(Sun)
        • 2021-04-16(Fri)
        • 2021-04-15(Thu)
        • 2021-04-14(Wed)
        • 2021-04-12(Mon)
        • 2021-04-11(Sun)
        • 2021-04-09(Fri)
        • 2021-04-08(Thu)
        • 2021-04-06(Tue)
        • 2021-04-05(Mon)
        • 2021-04-04(Sun)
        • 2021-04-03(Sat)
        • 2021-04-02(Fri)
        • 2021-04-01(Thu)
      • March
        • 2021-03-29(Mon)
        • 2021-03-28(Sun)
        • 2021-03-26(Fri)
        • 2021-03-25(Thu)
        • 2021-03-24(Wed)
        • 2021-03-23(Tue)
        • 2021-03-22(Mon)
        • 2021-03-21(Sun)
        • 2021-03-20(Sat)
        • 2021-03-17(Wed)
        • 2021-03-16(Tue)
        • 2021-03-15(Mon)
        • 2021-03-12(Fri)
        • 2021-03-11(Thu)
        • 2021-03-10(Wed)
        • 2021-03-09(Tue)
        • 2021-03-08(Mon)
        • 2021-03-07(Sun)
        • 2021-03-05(Fri)
        • 2021-03-03(Wed)
        • 2021-03-02(Tue)
        • 2021-03-01(Mon)
      • Feb
        • 2021-02-26(Fri)
        • 2021-02-25(Thu)
        • 2021-02-24(Wed)
        • 2021-02-23(Tue)
        • 2021-02-22(Mon)
        • 2021-02-19(Fri)
        • 2021-02-18(Thu)
        • 2021-02-17(Wed)
        • 2021-02-16(Tue)
        • 2021-02-15(Mon)
        • 2021-02-14(Sun)
        • 2021-02-13(Sat)
        • 2021-02-12(Fri)
        • 2021-02-10(Wed)
        • 2021-02-09(Tue)
        • 2021-02-08(Mon)
        • 2021-02-07(Sun)
        • 2021-02-05(Fri)
        • 2021-02-03(Wed)
        • 2021-02-02(Tue)
        • 2021-02-01(Mon)
      • Jan
        • 2021-01-29(Fri)
        • 2021-01-28(Thu)
        • 2021-01-27(Wed)
        • 2021-01-26(Tue)
        • 2021-01-25(Mon)
        • 2021-01-23(Sat)
        • 2021-01-22(Fri)
        • 2021-01-20(Wed)
        • 2021-01-19(Tue)
        • 2021-01-18(Mon)
        • 2021-01-12(Tue)
        • 2020-01-11(Mon)
        • 2021-01-08(Fri)
        • 2021-01-07(Thu)
        • 2021-01-06(Wed)
        • 2021-01-05(Tue)
        • 2021-01-04(Mon)
        • 2021-01-01(Fri)
    • 2020
      • Dec
        • 2020-12-30(Thu)
        • 2020-12-25(Fri)
        • 2020-12-24(Thu)
        • 2020-12-23(Wed)
        • 2020-12-22(Tue)
        • 2020-12-21(Mon)
        • 2020-12-18 (Fri)
      • Nov
        • 2020-11-30(Mon)
        • 2020-11-28(Sat)
        • 2020-11-26(Thu)
        • 2020-11-25(Wed)
        • 2020-11-24(Tue)
        • 2020-11-23(Mon)
        • 2020-11-22(Sun)
        • 2020-11-20(Fri)
        • 2020-11-19(Thu)
        • 2020-11-18(Wed)
        • 2020-11-17(Tue)
        • 2020-11-14(Sat)
        • 2020-11-13(Fri)
        • 2020-11-12(Thu)
        • 2020-11-11(Wed)
        • 2020-11-09(Mon)
        • 2020-11-07(Sat)
        • 2020-11-05(Thu)
        • 2020-11-04(Wed)
        • 2020-11-03(Tue)
        • 2020-11-02(Mon)
    • Good article 아카이빙
Powered by GitBook
On this page
  • 상세 ν•™μŠ΅ λ‚΄μš©
  • Rails ν΄λΌμ΄μ–ΈνŠΈ 개발
  • Sprockets vs Webpacker
  • Sprockets둜 μžλ°”μŠ€ν¬λ¦½νŠΈ, μŠ€νƒ€μΌμ‹œνŠΈ μž„ν¬νŠΈ
  • 에셋 νŒŒμ΄ν”„λΌμΈ(Asset Pipeline)
  • Ajax 개발
  • Javascript
  • μžλ°”μŠ€ν¬λ¦½νŠΈ νŠΉμ§•
  • νƒ€μž…
  • ν˜• λ³€ν™˜
  • λ³€μˆ˜
  • μ—°μ‚°μž
  • 반볡문
  • ν•™μŠ΅ λ‚΄μš©μ— λŒ€ν•œ 개인적인 총평

Was this helpful?

  1. DAILY REVIEW
  2. 2021
  3. Jan

2021-01-05(Tue)

Previous2021-01-06(Wed)Next2021-01-04(Mon)

Last updated 4 years ago

Was this helpful?

ν•­λͺ©

λ‚΄μš©

ν•™μŠ΅ λ‚ μ§œ

2021-01-05(ν™”)

ν•™μŠ΅ μ‹œκ°„

12:00~24:00

ν•™μŠ΅ λ²”μœ„ 및 주제

λ£¨λΉ„μ˜¨λ ˆμΌμ¦ˆ ν΄λΌμ΄μ–ΈνŠΈ 개발 - Sprockets, Asset pipeline

ν•™μŠ΅ λͺ©ν‘œ

νΌνŽ™νŠΈ λ£¨λΉ„μ˜¨λ ˆμΌμ¦ˆμ˜ ν΄λΌμ΄μ–ΈνŠΈ κ°œλ°œμ— λŒ€ν•œ λ‚΄μš©μ„ ν›‘κ³  νŠΈλ Œμ  λ”μŠ€ κ΅¬ν˜„μ‹œ ν•„μš”ν•œ κ°œλ…μ„ μˆ™μ§€ν•΄λ‘”λ‹€.

λ™λ£Œ ν•™μŠ΅ 방법

eunhkim, jujeong, sanam, yohlee λ‹˜κ³Ό λ””μŠ€μ½”λ“œλ‘œ ν•™μŠ΅μ‹œκ°„ 곡유 + ν•™μŠ΅λ―ΈνŒ…μ„ μ§„ν–‰ν–ˆλ‹€.

상세 ν•™μŠ΅ λ‚΄μš©

레일즈 ν΄λΌμ΄μ–ΈνŠΈ κ°œλ°œμ— λŒ€ν•΄μ„œ 책을 ν›‘μ—ˆλ‹€. 이 κ³Όμ •μ—μ„œ Sprockets만 책에 μ ν˜€μžˆλŠ”λ° Asset 파일 ꡬ쑰가 Rails 6와 λ‹¬λΌμ„œ 깊게 νŒŒλ³΄μ•˜λ”λ‹ˆ webpacker와 κΈ°λŠ₯이 λ‚˜λˆ„μ–΄μ§„ μƒν™©μž„μ„ μ•Œκ²Œ λ˜μ—ˆλ‹€. 이 λΆ€λΆ„κΉŒμ§€ 팠던 νŒ€μ›μ΄ μ—†μ—ˆκΈ°μ— μ •λ¦¬ν•΄μ„œ κ³΅μœ ν•˜μ˜€λ‹€. Ajax, ν„°λ³΄νŽ˜μ΄μ§€ 등은 μ‹€μŠ΅ν•΄λ³΄μ§€λŠ” μ•Šμ•˜μ§€λ§Œ κ°œλ…μ„ ν™•μΈν•΄λ’€μœΌλ‹ˆ μΆ”ν›„ Rails κ°œλ°œμ‹œ μ μš©μ‹œν‚€λ©΄ 될 것 κ°™λ‹€.

backbone jsλ₯Ό ν•™μŠ΅ν•˜κΈ° 전에 μš°μ„  javascript에 λŒ€ν•œ ν•™μŠ΅μ΄ μ„ ν–‰λ˜μ–΄μ•Όν•¨μ„ ν™•μΈν–ˆλ‹€. λΉ λ₯΄κ²Œ 을 ν›‘μ—ˆλ‹€.

μ•„λž˜λŠ” ν•™μŠ΅ν•œ λ‚΄μš©μ˜ λ©”λͺ¨μ΄λ‹€.

Rails ν΄λΌμ΄μ–ΈνŠΈ 개발

Sprockets vs Webpacker

μš°μ„  에셋 κ°œλ…μ„ 짚자. μ• μ…‹(Asset)μ΄λž€ μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œ, μŠ€νƒ€μΌμ‹œνŠΈ, 그림처럼 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λ‹€λ£¨λŠ” λͺ¨λ“  λ¦¬μ†ŒμŠ€μ˜ 총칭이닀.

Rails4 μ—μ„œλŠ” 에셋을 읽어듀이기 μœ„ν•΄ Sprockets λΌλŠ” 라이브러리λ₯Ό μ‚¬μš©ν•œλ‹€. Rails6 μ—μ„œλŠ” Sprockets 말고도 WebpackerλΌλŠ” 라이브러리λ₯Ό ν•¨κ»˜ μ‚¬μš©ν•œλ‹€. λ₯Ό μ°Ύμ•„λ³΄λ‹ˆ WebpackerλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ μ†ŒμŠ€νŒŒμΌμ„ λ‹€λ£¨λŠ”λ° μ“°κ³ , SprocketsλŠ” λ‚˜λ¨Έμ§€ μ „λΆ€λ₯Ό λ‹€λ£¨λŠ”λ° μ“°λŠ” 것 κ°™λ‹€.

"Rails way": Webpacker to compile JavaScript, Sprockets for CSS, images, and fonts

μ–΄μ°¨ν”Ό 두 λΌμ΄λΈŒλŸ¬λ¦¬λŠ” μ„œλ‘œ μ˜μ‘΄μ„±μ„ 1도 κ°€μ§€κ³  μžˆμ§€ μ•Šλ‹€. λ”°λΌμ„œ Sprockets만 μ“°κ±°λ‚˜ Webpacker만 μ“°λŠ” 것도 μœ νš¨ν•˜λ‹€. 즉, λ‘˜ λ‹€ μ„ νƒμ§€λ‘œ μ‘΄μž¬ν•œλ‹€λŠ” μ†Œλ¦¬κ³  상황에 따라 선택해야할 λ¬Έμ œλ‹€. μ•„λž˜ μ˜ˆμ‹œλ₯Ό μ°Έκ³ ν•˜μž.

Sprockets을 μ“Έ 이유(상황)

  • λ‚΄ Rails 앱이 μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό 많이 μ•ˆ μ“΄λ‹€.

  • μ „μ—­ μŠ€ν¬λ¦½νŠΈμ™€ jQueryλ₯Ό μ„ ν˜Έν•œλ‹€. 예λ₯Ό λ“€μ–΄ μžλ°”μŠ€ν¬λ¦½νŠΈ λͺ¨λ“ˆ μ‹œμŠ€ν…œμ„ μ“Έ ν•„μš”κ°€ μ—†λŠ” 상황이닀.

  • legacy Rails 앱을 Webpacker둜 μ—…κ·Έλ ˆμ΄λ“œ λΉ„μš©μ΄ λ„˜ λΉ„μ‹Έλ‹€.

  • 둜컬 κ°œλ°œμ„ μœ„ν•΄ κ³ κΈ‰ 툴링(tooling)을 ν•  ν•„μš”κ°€ μ—†λ‹€.

  • 걍 λŒμ•„κ°€λŠ” μ„œλΉ„μŠ€λ₯Ό λ§Œλ“€κΈ°λ₯Ό μ›ν•œλ‹€. 막 쒋은 λŒ€μ•ˆμ„ 찾을 μ‹œκ°„μ΄ μ—†λ‹€.

  • λ‚΄ Rails 앱이 νŠΉμ • gem을 μ‚¬μš©ν•˜λ©°, NPM을 λŒ€μ‹  ν•  수 μ—†λ‹€.

Sprocketsλ₯Ό μ“°μ§€ μ•Šμ„ 이유(상황)

  • SprocketsλŠ” λ‘œμ»¬κ°œλ°œν™˜κ²½μ—μ„œ λŠλ¦¬λ‹€.

  • asset을 μ’€ 더 μ„¬μ„Έν•˜κ²Œ μ œμ–΄ν•΄μ•Όν•œλ‹€.

  • λ‚΄ μ•±μ—λŠ” JavaScriptκ°€ 많고 λŒ€λŸ‰μ˜ νŽ˜μ΄λ‘œλ“œλ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ μ½”λ“œ λΆ„ν•  κΈ°λŠ₯이 ν•„μš”ν•˜λ‹€.

  • μž₯기적으둜 지원을 μœ μ§€ν•  μ„œλΉ„μŠ€λ‹€.

Webpackerλ₯Ό μ“Έ 이유(상황)

  • μ˜μ‘΄μ„± κ΄€λ¦¬ν•˜λŠ”λ° μžλ°”μŠ€ν¬λ¦½νŠΈ λͺ¨λ“ˆ μ‹œμŠ€ν…œμ„ μ“°λŠ” 것을 μ„ ν˜Έν•œλ‹€. 예λ₯Ό λ“€μ–΄ μ „μ—­ μŠ€μ½”ν”„κ°€ μ˜€μ—Όλ˜μ—ˆκ±°λ‚˜ λͺ…μ‹œμ μΈ 쒅속성 κ·Έλž˜ν”„κ°€ μš”κ΅¬λœλ‹€.

  • ES6+, Babel, PostCS의 μ΅œμ²¨λ‹¨ κΈ°λŠ₯을 ν™œμš©ν•˜κ³  μ‹Άλ‹€.

  • 동적 κ°€μ Έμ˜€κΈ° 및 μ›Ή 팩의 splitChunks μ΅œμ ν™”μ™€ 같은 μ§€λŠ₯ν˜• μ½”λ“œ λΆ„ν•  κΈ°λŠ₯을 μ›ν•œλ‹€.

  • λΉŒλ“œ μ‹œμŠ€ν…œμ—μ„œ μ†ŒμŠ€ 맡을 μƒμ„±ν•˜λŠ” λ°©μ‹μœΌλ‘œ 더 λ§Žμ€ μœ μ—°μ„±μ„ μ›ν•œλ‹€.

  • hot module replacement 같은 κ³ κΈ‰ 툴링(tooling)이 ν•„μš”ν•˜λ‹€.

  • μ‹±κΈ€ νŽ˜μ΄μ§€ 앱을 λ§Œλ“€κ³  μ‹Άλ‹€. μ•„, λ¬Όλ‘  Webpack을 μ“°λ €κ³  μ‹±κΈ€ νŽ˜μ΄μ§€ 앱을 λ§Œλ“€ ν•„μš”λŠ” μ—†λ‹€. Webpack은 λ©€ν‹° νŽ˜μ΄μ§€ μ•±μ—μ„œ 더 잘 μž‘λ™ν•œλ‹€.

Webpackerλ₯Ό μ“°μ§€ μ•Šμ„ 이유(상황)

  • λ‚΄ Rails 앱이 μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό 많이 μ•ˆμ“΄λ‹€.

  • μžλ°”μŠ€ν¬λ¦½νŠΈ μ—μ½”μ‹œμŠ€ν…œμ— λŒ€ν•΄μ„œ 지식이 λΆ€μ‘±ν•˜λ‹€.

  • webpackκ³Ό Webpacker ν•™μŠ΅μ— μ‹œκ°„μ„ μ“Έ μˆ˜κ°€ μ—†λ‹€.

  • λ„˜ λ³΅μž‘ν•΄λ³΄μΈλ‹€.

Sprockets둜 μžλ°”μŠ€ν¬λ¦½νŠΈ, μŠ€νƒ€μΌμ‹œνŠΈ μž„ν¬νŠΈ

SprocketsλŠ” 에셋을 λ§€λ‹ˆνŽ˜μŠ€νŠΈ, 즉 미리 μ€€λΉ„λœ λ¦¬μ†ŒμŠ€λ‘œ 읽어듀인닀. app/assets 폴더λ₯Ό ν™•μΈν•˜μž.

λ§€λ‹ˆνŽ˜μŠ€νŠΈ μ •μ˜λŠ” 각각 주석(//, /* ~ */)의 내뢀에 =<μ§€μ‹œμž> <맀개 λ³€μˆ˜>의 ν˜„μ‹μœΌλ‘œ ν‘œκΈ°ν•œλ‹€.

참고둜 RailsλŠ” ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œ 개발 μ–Έμ–΄λ‘œ μ»€ν”ΌμŠ€ν¬λ¦½νŠΈμ™€ SCSSλ₯Ό ν‘œμ€€μœΌλ‘œ μ§€μ›ν•˜κ³  μžˆλ‹€. ν•˜μ§€λ§Œ λ°˜λ“œμ‹œ μ‚¬μš©ν•  ν•„μš”λŠ” μ—†λ‹€.

에셋 νŒŒμ΄ν”„λΌμΈ(Asset Pipeline)

에셋 νŒŒμ΄ν”„λΌμΈμ€ Sprockets 라이브러리둜 μ œκ³΅λ˜λŠ” ꡬ쑰둜, μžλ°”μŠ€ν¬λ¦½νŠΈμ™€ μŠ€νƒ€μΌμ‹œνŠΈ, 이미지 λ“±μ˜ 접근을 ν•œκΊΌλ²ˆμ— κ΄€λ¦¬ν•˜κ³  μ‚¬μš©μžμ—κ²Œ 보닀 효율적으둜 μ‘λ‹΅ν•΄μ£ΌλŠ” κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.

μ±…μ—μ„œ λ¬˜μ‚¬λœ Rails4 κΈ°μ€€ 에셋 νŒŒμ΄ν”„λΌμΈμ€ μ•„λž˜ 과정을 κ±°μΉœλ‹€.

  1. μ›λž˜ μ†ŒμŠ€ μ½”λ“œ ex) articles.js.coffee, photos.css.scss

  2. 컴파일 ex) article.js, photos.css

  3. κ²°ν•© ex) 각각 application.js, application.css 에 결합됨.

  4. μ••μΆ•

    μ›λž˜ μ½”λ“œμ—μ„œ μ£Όμ„μ΄λ‚˜ κ°œν–‰, 곡백 등을 μ œκ±°ν•˜λŠ” 것을 λ§ν•œλ‹€. ex) 각각 application.js, application.css 에 압좕됨.

  5. λ‹€μ΄μ œμŠ€νŠΈ μΆ”κ°€

    μ½”λ“œμ˜ λ‚΄μš©μ„ 기반으둜 ν•΄μ‹œ(λ‹€μ΄μ œμŠ€νŠΈ)λ₯Ό μ—°μ‚°ν•΄μ„œ 파일의 λ§ˆμ§€λ§‰μ— 뢙인닀. μ΄λŠ” λΈŒλΌμš°μ €μ—μ„œ μ˜λ„ν•˜μ§€ μ•Šμ€ μΊμ‹œ μ‚¬μš©μ„ ν”Όν•˜κΈ° μœ„ν•΄μ„œμ΄λ‹€. μ½”λ“œκ°€ 변경될 λ•Œ 파일 이름을 κ°•μ œμ μœΌλ‘œ ν•¨κ»˜ λ³€κ²½ν•˜λ―€λ‘œ λΈŒλΌμš°μ €κ°€ μ΄μ „μ˜ 에셋 μ½”λ“œλ₯Ό μž¬ν™œμš©ν•˜λŠ” 일 없이 에셋 μˆ˜μ •μ΄ μ‹€μ‹œκ°„μœΌλ‘œ λ°˜μ˜λœλ‹€. ex) 각각 application-xxxx.js, application-xxxx.css둜 λ‹€μ΄μ œμŠ€νŠΈ 좔가됨.

이 λ•Œ 개발 ν™˜κ²½μ€ 2번(컴파일) 과정을 거친 후에 λ°”λ‘œ 좜λ ₯해버린닀.

반면 배포 ν™˜κ²½μ€ 2번 과정을 κ±΄λ„ˆλ›°κ³  λ°”λ‘œ 3(κ²°ν•©), 4(μ••μΆ•), 5(λ‹€μ΄μ œμŠ€νŠΈ μΆ”κ°€) 과정을 κ±°μΉœλ‹€.

Ajax 개발

Ajax(Asynchronous JAvascript + Xml)은 λΈŒλΌμš°μ € μœ„μ—μ„œ λ°μŠ€ν¬ν†± μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ²˜λŸΌ λ‹€μ–‘ν•œ ν‘œν˜„μ„ κ°€λŠ₯ν•˜κ²Œ ν•˜λŠ” κΈ°μˆ μ΄λ‹€. μ΄λŸ¬ν•œ 기술둜 κ΅¬ν˜„λœ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ RIA(Rich Internet Applications)라고 λΆ€λ₯΄κΈ°λ„ ν•œλ‹€. RIA 기술 κ΅¬ν˜„ 방법엔 ν”Œλž˜μ‹œλ‚˜ μ‹€λ²„λΌμ΄νŠΈ 같은 기술과 Ajax 기술이 μžˆλ‹€. ν”Œλž˜μ‹œμ™€ μ‹€λ²„λΌμ΄νŠΈλŠ” ν”ŒλŸ¬κ·ΈμΈμ„ μ‚¬μš©ν•΄μ•Όν•˜μ§€λ§Œ AjaxλŠ” μ›Ή ν‘œμ€€ 기술만으둜 μž‘λ™ν•œλ‹€λŠ” 점이 λ‹€λ₯΄λ‹€. 참고둜 ν”Œλž˜μ‹œλŠ” 사μž₯λ˜μ—ˆλ‹€.

Ajaxλ₯Ό μ‚¬μš©ν•˜λ©΄ 비동기 톡신이 λœλ‹€. λ”°λΌμ„œ νŽ˜μ΄μ§€ 전체가 μƒˆλ‘œκ³ μΉ¨λ  λ•ŒκΉŒμ§€ 기닀릴 ν•„μš”λ„ μ—†λ‹€.

Javascript

javascriptλ₯Ό ν•™μŠ΅ν•˜λ©° κ°„λ‹¨ν•˜κ²Œ λ©”λͺ¨ν•©λ‹ˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈ νŠΉμ§•

ν˜„μž¬ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μ΅œμ‹  ν‘œμ€€μ€ 2015년에 λ°œν‘œλœ ECMAScript 6이닀.

νƒ€μž…

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κΈ°λ³Έ νƒ€μž…μ€ μ›μ‹œ νƒ€μž…κ³Ό 객체 νƒ€μž…μœΌλ‘œ ꡬ뢄할 수 μžˆλ‹€.

μ›μ‹œ νƒ€μž…(primitive type)

  1. 숫자(number)

    μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λͺ¨λ“  수λ₯Ό μ •μˆ˜, μ‹€μˆ˜ ꡬ뢄 없이 μ‹€μˆ˜ ν•˜λ‚˜λ‘œλ§Œ ν‘œκΈ°ν•œλ‹€.

  2. λ¬Έμžμ—΄(string)

    μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” μˆ«μžμ™€ λ¬Έμžμ—΄μ„ 더할 μˆ˜λ„ μžˆλ‹€. 이럴 κ²½μš°μ— 숫자λ₯Ό λ¬Έμžμ—΄λ‘œ μžλ™ ν˜•λ³€ν™˜ν•΄μ„œ, 두 λ¬Έμžμ—΄μ„ μ—°κ²°ν•˜λŠ” 연산을 μˆ˜ν–‰ν•œλ‹€.

  3. λΆˆλ¦¬μ–Έ(boolean)

  4. 심볼(symbol): ECMAScript 6λΆ€ν„° 제곡됨. 심볼은 μœ μΌν•˜κ³  λ³€κ²½ν•  수 μ—†λŠ” νƒ€μž…μœΌλ‘œ, 객체의 ν”„λ‘œνΌν‹°λ₯Ό μœ„ν•œ μ‹λ³„μžλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€. μ΅μŠ€ν”Œλ‘œλŸ¬μ—μ„œλŠ” μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€.

  5. undefined nullκ³Ό κ΅¬λ³„ν•˜μž. null은 object νƒ€μž…μ΄λ©°, 아직 'κ°’'이 μ •ν•΄μ§€μ§€ μ•Šμ€ 것을 μ˜λ―Έν•œλ‹€. λ˜ν•œ, undefinedλž€ nullκ³ΌλŠ” 달리 'νƒ€μž…'이 μ •ν•΄μ§€μ§€ μ•Šμ€ 것을 μ˜λ―Έν•œλ‹€. λ”°λΌμ„œ μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ undefinedλŠ” μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šμ€ λ³€μˆ˜λ‚˜ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 값에 μ ‘κ·Όν•  λ•Œ λ°˜ν™˜λœλ‹€.

    nullκ³Ό undefiendλŠ” 동등 μ—°μ‚°μž(==)와 일치 μ—°μ‚°μž(===)둜 비ꡐ할 λ•Œ κ·Έ 결과값이 λ‹€λ₯΄λ―€λ‘œ μ£Όμ˜ν•˜μž.

    null == undefined; //true, νƒ€μž…μ„ μ œμ™Έν•˜κ³ λŠ” 같은 μ˜λ―Έμ΄λ‹€.
    null === undefined; //false, νƒ€μž…μ΄ λ‹€λ₯΄λ―€λ‘œ μΌμΉ˜ν•˜μ§€ μ•ŠλŠ”λ‹€.

참쑰데이터 νƒ€μž…

μ°Έμ‘° 데이터 νƒ€μž…μ—λŠ” 객체(object)κ°€ μžˆλ‹€.

ν˜• λ³€ν™˜

λ¬΅μ‹œμ  νƒ€μž… λ³€ν™˜

μ™ λ§Œν•˜λ©΄ νŠΉμ • νƒ€μž…μ˜ 값을 κΈ°λŒ€ν•˜λŠ” 곳에 λ‹€λ₯Έ νƒ€μž…μ˜ 값이 였면, μžλ™μœΌλ‘œ νƒ€μž…μ„ λ³€ν™˜ν•˜μ—¬ μ‚¬μš©ν•œλ‹€.

1 - "λ¬Έμžμ—΄"; 처럼 μ•„μ˜ˆ ν˜•λ³€ν™˜μ΄ λΆˆκ°€λŠ₯ν•  경우 NaN 값을 λ°˜ν™˜ν•œλ‹€.

NaN
Not a Number의 μΆ•μ•½ν˜•μœΌλ‘œ, μ •μ˜λ˜μ§€ μ•Šμ€ κ°’μ΄λ‚˜ ν‘œν˜„ν•  수 μ—†λŠ” κ°’μ΄λΌλŠ” 의미λ₯Ό κ°€μ§‘λ‹ˆλ‹€. μ΄λŸ¬ν•œ NaN은 Number νƒ€μž…μ˜ κ°’μœΌλ‘œ 0을 0으둜 λ‚˜λˆ„κ±°λ‚˜, 숫자둜 λ³€ν™˜ν•  수 μ—†λŠ” ν”Όμ—°μ‚°μžλ‘œ μ‚°μˆ  연산을 μ‹œλ„ν•˜λŠ” κ²½μš°μ— λ°˜ν™˜λ˜λŠ” 읽기 μ „μš© κ°’μž…λ‹ˆλ‹€.

λͺ…μ‹œμ  νƒ€μž… λ³€ν™˜

λͺ…μ‹œμ  νƒ€μž… λ³€ν™˜μ„ μœ„ν•΄ μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ μ œκ³΅ν•˜λŠ” μ „μ—­ ν•¨μˆ˜λŠ” μ•„λž˜μ™€ κ°™λ‹€.

  1. Number()

  2. String()

  3. Boolean()

  4. Object()

  5. parseInt()

  6. parseFloat()

λ³€μˆ˜

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” var ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ λ³€μˆ˜λ₯Ό μ„ μ–Έν•œλ‹€.

λ§Œμ•½ μ„ μ–Έλ˜μ§€ μ•Šμ€ λ³€μˆ˜μ„ μ‚¬μš©ν•˜λ €ν•˜κ±°λ‚˜ μ ‘κ·Όν•˜λ©΄ 였λ₯˜κ°€ λ°œμƒν•œλ‹€. 단, μ„ μ–Έλ˜μ§€ μ•Šμ€ λ³€μˆ˜λ₯Ό μ΄ˆκΈ°ν™”ν•  κ²½μš°μ—λŠ” μžλ™μœΌλ‘œ 선언을 λ¨Όμ € ν•œ ν›„ μ΄ˆκΈ°ν™”λ₯Ό μ§„ν–‰ν•œλ‹€.

date = 25; //dateλΌλŠ” μ΄λ¦„μ˜ λ³€μˆ˜λ₯Ό λ¬΅μ‹œμ μœΌλ‘œ μ„ μ–Έ

음..? 그리고 컴파일 단계가 μ—†λŠ” 인터프리터 μ–Έμ–΄μ΄λ‹€λ³΄λ‹ˆ λ³€μˆ˜ μž¬μ„ μ–Έμ‹œ 컴파일 μ—λŸ¬κ°€ λ‚  μˆ˜κ°€ μ—†μœΌλ―€λ‘œ 걍 λ³€μˆ˜ μž¬μ„ μ–Έ 문ꡬ가 λ¬΄μ‹œλœλ‹€.

var num = 10;        // λ³€μˆ˜μ˜ μ„ μ–Έκ³Ό ν•¨κ»˜ μ΄ˆκΈ°ν™”
num = [10, 20, 30];  // λ°°μ—΄ λŒ€μž…
var num;             // 이 μž¬μ„ μ–Έλ¬Έμ€ λ¬΄μ‹œλ¨.

μ—°μ‚°μž

λ™λ“±μ—°μ‚°μžμ™€ 일치 μ—°μ‚°μžλ₯Ό μ²΄ν¬ν•˜μž.

비ꡐ μ—°μ‚°μž

μ„€λͺ…

===

μ™Όμͺ½ ν”Όμ—°μ‚°μžμ™€ 였λ₯Έμͺ½ ν”Όμ—°μ‚°μžμ˜ 값이 κ°™κ³ , 같은 νƒ€μž…μ΄λ©΄ 참을 λ°˜ν™˜.

==

μ™Όμͺ½ ν”Όμ—°μ‚°μžμ™€ 였λ₯Έμͺ½ ν”Όμ—°μ‚°μžμ˜ 값이 κ°™μœΌλ©΄ 참을 λ°˜ν™˜.

!=

μ™Όμͺ½ ν”Όμ—°μ‚°μžμ™€ 였λ₯Έμͺ½ ν”Όμ—°μ‚°μžμ˜ 값이 κ°™μ§€ μ•ŠμœΌλ©΄ 참을 λ°˜ν™˜.

!==

μ™Όμͺ½ ν”Όμ—°μ‚°μžμ™€ 였λ₯Έμͺ½ ν”Όμ—°μ‚°μžμ˜ 값이 κ°™μ§€ μ•Šκ±°λ‚˜, νƒ€μž…μ΄ λ‹€λ₯΄λ©΄ 참을 λ°˜ν™˜.

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν”Όμ—°μ‚°μžκ°€ λ‘˜ λ‹€ λ¬Έμžμ—΄μ΄λ©΄, λ¬Έμžμ—΄μ˜ 첫 번째 λ¬ΈμžλΆ€ν„° μ•ŒνŒŒλ²³ μˆœμ„œλŒ€λ‘œ λΉ„κ΅ν•œλ‹€.

λΉ„νŠΈ μ—°μ‚°μž, μ‚Όν•­ μ—°μ‚°μž, delete, typeof μ—°μ‚°μžλ„ C, C++μ΄λž‘ λ™μΌν•˜λ‹€.

instanced μ—°μ‚°μžλŠ” ν”Όμ—°μ‚°μžμΈ 객체가 νŠΉμ • 객체의 μΈμŠ€ν„΄μŠ€μΈμ§€ μ•„λ‹Œμ§€λ₯Ό 확인해쀀닀.

var str = new String("이것은 λ¬Έμžμ—΄μž…λ‹ˆλ‹€.");
​
str instanceof Object;  // true
str instanceof String;  // true
str instanceof Array;   // false
str instanceof Number;  // false
str instanceof Boolean; // false

void μ—°μ‚°μžλŠ” ν”Όμ—°μ‚°μžλ‘œ μ–΄λ–€ νƒ€μž…μ΄ μ˜€λ˜μ§€ 상관없이 μ–Έμ œλ‚˜ undefined κ°’λ§Œμ„ λ°˜ν™˜ν•œλ‹€.

반볡문

for / in λ¬Έ

for / in 문은 ν•΄λ‹Ή 객체의 λͺ¨λ“  μ—΄κ±°ν•  수 μžˆλŠ” ν”„λ‘œνΌν‹°(enumerable properties)λ₯Ό μˆœνšŒν•  수 μžˆλ„λ‘ ν•΄μ€€λ‹€. λ‹€μ‹œ ν•œλ²ˆ λ§ν•˜μ§€λ§Œ, for / in 문은 ν•΄λ‹Ή 객체가 κ°€μ§„ λͺ¨λ“  ν”„λ‘œνΌν‹°λ₯Ό λ°˜ν™˜ν•˜λŠ” 것이 μ•„λ‹Œ, 였직 μ—΄κ±°ν•  수 μžˆλŠ” ν”„λ‘œνΌν‹°λ§Œμ„ λ°˜ν™˜ν•œλ‹€.

μ—΄κ±°ν•  수 μžˆλŠ” ν”„λ‘œνΌν‹°λž€ λ‚΄λΆ€μ μœΌλ‘œ enumerable ν”Œλž˜κ·Έκ°€ true둜 μ„€μ •λœ ν”„λ‘œνΌν‹°λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ ν”„λ‘œνΌν‹°λ“€μ€ for / in 문으둜 μ ‘κ·Όν•  수 있게 λ©λ‹ˆλ‹€.

for / of λ¬Έ

for / of 문은 λ°˜λ³΅ν•  수 μžˆλŠ” 객체(iterable objects)λ₯Ό μˆœνšŒν•  수 μžˆλ„λ‘ ν•΄μ£ΌλŠ” λ°˜λ³΅λ¬Έμ΄λ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ λ°˜λ³΅ν•  수 μžˆλŠ” κ°μ²΄μ—λŠ” Array, Map, Set, arguments 객체 등이 μžˆλ‹€.

for / of 문은 μ΅μŠ€ν”Œλ‘œλŸ¬μ—μ„œ μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€.

루프 μ œμ–΄ - label λ¬Έ

일반적으둜 ν‘œν˜„μ‹μ˜ 검사λ₯Ό 톡해 λ£¨ν”„λ‘œ μ§„μž…ν•˜λ©΄, λ‹€μŒ ν‘œν˜„μ‹μ„ κ²€μ‚¬ν•˜κΈ° μ „κΉŒμ§€ 루프 μ•ˆμ— μžˆλŠ” λͺ¨λ“  싀행문을 μ‹€ν–‰ν•œλ‹€. ν•˜μ§€λ§Œ continue λ¬Έκ³Ό break 문은 μ΄λŸ¬ν•œ 일반적인 λ£¨ν”„μ˜ 흐름을 μ‚¬μš©μžκ°€ 직접 μ œμ–΄ν•  수 있게 ν•΄μ€€λ‹€.

label 문을 μ‚¬μš©ν•˜λ©΄ continue λ¬Έκ³Ό break 문의 λ™μž‘μ΄ ν”„λ‘œκ·Έλž¨μ˜ 흐름을 νŠΉμ • μ˜μ—­μœΌλ‘œ μ΄λ™μ‹œν‚¬ 수 μžˆλ‹€. 문법은 μ•„λž˜μ™€ κ°™λ‹€.

label:
μ‹λ³„ν•˜κ³ μž ν•˜λŠ” νŠΉμ • μ˜μ—­

μ˜ˆμ‹œλŠ” μ•„λž˜μ™€ κ°™λ‹€.

μ˜ˆμ‹œ1) ν™€μˆ˜μ— λŒ€ν•΄μ„œλ§Œ ꡬꡬ단 적용.

gugudan:
for (var i = 2; i <= 9; i++) {
    dan:
    for (var j = 1; j <= 9; j++) {
        if ((i*j) % 2 == 0)
            continue dan;
        document.write(i + " * " + j + " = " + (i*j) + "<br>");
    }
}

μ˜ˆμ‹œ2) 3λ‹¨κΉŒμ§€λ§Œ ꡬꡬ단 적용

gugudan:
for (var i = 2; i <= 9; i++) {
    dan:
    for (var j = 1; j <= 9; j++) {
        if (i > 3)
            break gugudan;
        document.write(i + " * " + j + " = " + (i*j) + "<br>");
    }
}

λ°°μ—΄(array)

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ λ°°μ—΄(array): 이름과 인덱슀둜 μ°Έμ‘°λ˜λŠ” μ •λ ¬λœ κ°’μ˜ μ§‘ν•©

배열을 κ΅¬μ„±ν•˜λŠ” 각각의 값을 λ°°μ—΄ μš”μ†Œ(element)라고 ν•˜λ©°, λ°°μ—΄μ—μ„œμ˜ μœ„μΉ˜λ₯Ό κ°€λ¦¬ν‚€λŠ” 숫자λ₯Ό 인덱슀(index)라고 ν—Œλ”,

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ λ°°μ—΄μ˜ νŠΉμ§•μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  1. λ°°μ—΄ μš”μ†Œμ˜ νƒ€μž…μ΄ κ³ μ •λ˜μ–΄ μžˆμ§€ μ•ŠμœΌλ―€λ‘œ, 같은 배열에 μžˆλŠ” λ°°μ—΄ μš”μ†ŒλΌλ¦¬μ˜ νƒ€μž…μ΄ μ„œλ‘œ λ‹€λ₯Ό μˆ˜λ„ μžˆλ‹€.

  2. λ°°μ—΄ μš”μ†Œμ˜ μΈλ±μŠ€κ°€ 연속적이지 μ•Šμ•„λ„ 되며, λ”°λΌμ„œ νŠΉμ • λ°°μ—΄ μš”μ†Œκ°€ λΉ„μ–΄ μžˆμ„ μˆ˜λ„ μžˆλ‹€.

  3. μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 배열은 Array 객체둜 닀뀄진닀.

λ°°μ—΄ 생성

생성 방식은 3κ°€μ§€κ°€ 있으며 λͺ¨λ‘ 같은 결과의 배열을 λ§Œλ“€μ–΄ μ€€λ‹€.

  1. var arr = [λ°°μ—΄μš”μ†Œ1, λ°°μ—΄μš”μ†Œ2,...]; // λ°°μ—΄ λ¦¬ν„°λŸ΄μ„ μ΄μš©ν•˜λŠ” 방법

  2. var arr = Array(λ°°μ—΄μš”μ†Œ1, λ°°μ—΄μš”μ†Œ2,...); // Array 객체의 μƒμ„±μžλ₯Ό μ΄μš©ν•˜λŠ” 방법

  3. var arr = new Array(λ°°μ—΄μš”μ†Œ1, λ°°μ—΄μš”μ†Œ2,...); // new μ—°μ‚°μžλ₯Ό μ΄μš©ν•œ Array 객체 생성 방법

λ°°μ—΄ μš”μ†Œμ˜ μΆ”κ°€

배열에 μš”μ†Œλ₯Ό μΆ”κ°€ν•˜λŠ” 방법은 3κ°€μ§€κ°€ μžˆλ‹€.

1. arr.push(μΆ”κ°€ν•  μš”μ†Œ);         // push() λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•˜λŠ” 방법
2. arr[arr.length] = μΆ”κ°€ν•  μš”μ†Œ; // length ν”„λ‘œνΌν‹°λ₯Ό μ΄μš©ν•˜λŠ” 방법
3. arr[νŠΉμ •μΈλ±μŠ€] = μΆ”κ°€ν•  μš”μ†Œ; // νŠΉμ • 인덱슀λ₯Ό μ§€μ •ν•˜μ—¬ μΆ”κ°€ν•˜λŠ” 방법

push() λ©”μ†Œλ“œμ™€ length ν”„λ‘œνΌν‹°λ₯Ό μ΄μš©ν•œ 방법은 λͺ¨λ‘ λ°°μ—΄μ˜ 제일 끝에 μƒˆλ‘œμš΄ μš”μ†Œλ₯Ό μΆ”κ°€ν•œλ‹€.

μΈλ±μŠ€μ— λŒ€μ‘ν•˜λŠ” λ°°μ—΄ μš”μ†Œκ°€ μ—†λŠ” 뢀뢄은 λ°°μ—΄μ˜ 홀(hole)이라고 ν•œλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” μ΄λŸ¬ν•œ λ°°μ—΄μ˜ 홀을 undefined 값을 κ°€μ§€λŠ” μš”μ†Œμ²˜λŸΌ μ·¨κΈ‰ν•œλ‹€.

ν¬μ†Œ λ°°μ—΄

ν¬μ†Œ λ°°μ—΄μ΄λž€ 배열에 μ†ν•œ μš”μ†Œμ˜ μœ„μΉ˜κ°€ 연속적이지 μ•Šμ€ 배열을 μ˜λ―Έν•œλ‹€.

μ—°κ΄€ λ°°μ—΄

숫자둜 된 인덱슀 λŒ€μ‹ μ— λ¬Έμžμ—΄λ‘œ 된 ν‚€(key)λ₯Ό μ‚¬μš©ν•˜λŠ” 배열을 μ—°κ΄€ λ°°μ—΄(associative array)이라고 ν•œλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ—°κ΄€ 배열을 λ³„λ„λ‘œ μ œκ³΅ν•˜μ§€λŠ” μ•Šμ§€λ§Œ, 인덱슀둜 λ¬Έμžμ—΄μ„ μ‚¬μš©ν•˜μ—¬ μ—°κ΄€ λ°°μ—΄μ²˜λŸΌ μ‚¬μš©ν•  수 μžˆλŠ” 객체(object)λ₯Ό λ§Œλ“€ 수 μžˆλ‹€.

μ΄λ ‡κ²Œ μƒμ„±λœ 배열은 μžλ°”μŠ€ν¬λ¦½νŠΈ λ‚΄λΆ€μ μœΌλ‘œ Array 객체가 μ•„λ‹Œ κΈ°λ³Έ 객체둜 μž¬μ„ μ–Έλœλ‹€. 즉, μ—°κ΄€ 배열은 Array 객체가 μ•„λ‹ˆλ―€λ‘œ length ν”„λ‘œνΌν‹°μ˜ 값이 0 이고 숫자λ₯Ό 인덱슀둜 ν•˜μ—¬ μš”μ†Œμ— μ ‘κ·Όν•˜λ©΄ undefinedλ₯Ό ν™•μΈν•˜κ²Œ λœλ‹€.

ECMAScript6 λΆ€ν„°λŠ” μ΄λŸ¬ν•œ λΆˆνŽΈν•¨μ„ ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μƒˆλ‘œμš΄ 데이터 ꡬ쑰인 Map 객체λ₯Ό λ³„λ„λ‘œ μ œκ³΅ν•˜κ³  μžˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ λ°°μ—΄ μ—¬λΆ€ 확인

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” ν•΄λ‹Ή λ³€μˆ˜κ°€ 배열인지 μ—¬λΆ€λ₯Ό 확인할 수 μžˆλ„λ‘ λ‹€μŒκ³Ό 같은 방법듀을 μ œκ³΅ν•˜κ³  μžˆλ‹€.

  1. Array.isArray() λ©”μ†Œλ“œ

  2. instanceof μ—°μ‚°μž

  3. constructor ν”„λ‘œνΌν‹°

λ˜ν•œ Array 객체의 constructor ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•˜μ—¬ λ°°μ—΄ μ—¬λΆ€λ₯Ό 확인할 μˆ˜λ„ μžˆλ‹€. μ˜ˆμ‹œλ₯Ό 보면 λœλ‹€.

function isArray(a) {

    return a.constructor.toString().indexOf("Array") > -1;

}

var arr = [1, true, "JavaScript"];          // λ°°μ—΄ 생성
document.write(arr.constructor);            // constructor ν”„λ‘œνΌν‹°μ˜ κ°’ 좜λ ₯
document.write(arr.constructor.toString()); // function Array() {[native code]}
document.write(arr.constructor.toString().indexOf("Array")); // 10
document.write(isArray(arr))                // true

μžλ°”μŠ€ν¬λ¦½νŠΈ ν•¨μˆ˜

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” ν•¨μˆ˜λ„ ν•˜λ‚˜μ˜ νƒ€μž…(datatype)이닀.

λ”°λΌμ„œ ν•¨μˆ˜λ₯Ό λ³€μˆ˜μ— λŒ€μž…ν•˜κ±°λ‚˜, ν•¨μˆ˜μ— ν”„λ‘œνΌν‹°λ₯Ό μ§€μ •ν•˜λŠ” 것도 κ°€λŠ₯ν•˜λ‹€. λ˜ν•œ μžλ°”μŠ€ν¬λ¦½νŠΈ ν•¨μˆ˜λŠ” λ‹€λ₯Έ ν•¨μˆ˜ 내에 μ€‘μ²©λ˜μ–΄ μ •μ˜λ  μˆ˜λ„ μžˆλ‹€.

κ°’μœΌλ‘œμ„œμ˜ ν•¨μˆ˜

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν•¨μˆ˜λŠ” 문법적 ꡬ문일뿐만 μ•„λ‹ˆλΌ κ°’(value)이기도 ν•˜λ‹€. λ”°λΌμ„œ ν•¨μˆ˜κ°€ λ³€μˆ˜μ— λŒ€μž…λ  μˆ˜λ„ 있으며, λ‹€λ₯Έ ν•¨μˆ˜μ˜ 인수둜 전달될 μˆ˜λ„ μžˆλ‹€.

λ³€μˆ˜ μŠ€μ½”ν”„

μ§€μ—­ λ³€μˆ˜(local variable)

ν•¨μˆ˜ λ‚΄μ—μ„œ μ„ μ–Έλœ λ³€μˆ˜. λ³€μˆ˜κ°€ μ„ μ–Έλœ ν•¨μˆ˜ λ‚΄μ—μ„œλ§Œ μœ νš¨ν•˜λ©°, ν•¨μˆ˜κ°€ μ’…λ£Œλ˜λ©΄ λ©”λͺ¨λ¦¬μ—μ„œ 사라진닀.

μ „μ—­ λ³€μˆ˜(global variable)

μ „μ—­ λ³€μˆ˜(global variable)λž€ ν•¨μˆ˜μ˜ μ™ΈλΆ€μ—μ„œ μ„ μ–Έλœ λ³€μˆ˜λ₯Ό 가리킨닀. μ΄λŸ¬ν•œ μ „μ—­ λ³€μˆ˜λŠ” ν”„λ‘œκ·Έλž¨μ˜ μ–΄λŠ μ˜μ—­μ—μ„œλ‚˜ μ ‘κ·Όν•  수 있으며, μ›Ή νŽ˜μ΄μ§€κ°€ λ‹«ν˜€μ•Όλ§Œ λ©”λͺ¨λ¦¬μ—μ„œ 사라진닀.

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μ§€μ—­ λ³€μˆ˜λ₯Ό μ„ μ–Έν•  λ•Œμ—λŠ” λ°˜λ“œμ‹œ var ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„ μ–Έν•΄μ•Ό ν•œλ‹€. ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ var ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λ©΄, ν•΄λ‹Ή λ³€μˆ˜λŠ” μ§€μ—­ λ³€μˆ˜κ°€ μ•„λ‹Œ μ „μ—­ λ³€μˆ˜λ‘œ μ„ μ–Έλœλ‹€.

λ˜ν•œ, μ „μ—­ λ³€μˆ˜μ™€ 같은 μ΄λ¦„μ˜ μ§€μ—­ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λ©΄, ν•΄λ‹Ή λΈ”λ‘μ—μ„œλŠ” ν•΄λ‹Ή μ΄λ¦„μœΌλ‘œ μ§€μ—­ λ³€μˆ˜λ§Œμ„ ν˜ΈμΆœν•  수 μžˆλ‹€.

λ¬Όλ‘  이 κ²½μš°μ—” μ „μ—­ λ³€μˆ˜κ°€ window 객체의 ν”„λ‘œνΌν‹°μž„μ„ λͺ…μ‹œν•˜λ©΄ μ „μ—­ λ³€μˆ˜λ₯Ό ν˜ΈμΆœν•  μˆ˜λ„ μžˆλ‹€.

ν•¨μˆ˜ μŠ€μ½”ν”„

블둝(block)μ΄λž€ μ½”λ“œ λ‚΄μ—μ„œ μ€‘κ΄„ν˜Έ({})둜 λ‘˜λŸ¬μ‹ΈμΈ 뢀뢄을 가리킀며, λŒ€λΆ€λΆ„μ˜ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œλŠ” 블둝 λ‚΄μ—μ„œ μ •μ˜λœ λ³€μˆ˜λ₯Ό 블둝 μ™ΈλΆ€μ—μ„œλŠ” μ ‘κ·Όν•  수 μ—†λ‹€.

ν•˜μ§€λ§Œ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λ‹€λ₯Έ 언어와 달리 ν•¨μˆ˜λ₯Ό 블둝 λŒ€μ‹  μ‚¬μš©ν•œλ‹€.

'μ „μ—­ ν•¨μˆ˜'λŠ” λͺ¨λ“  μ „μ—­ λ³€μˆ˜μ™€ μ „μ—­ ν•¨μˆ˜μ— μ ‘κ·Όν•  수 μžˆλ‹€.

반면, λ‹€λ₯Έ ν•¨μˆ˜ 내에 μ •μ˜λœ 'λ‚΄λΆ€ ν•¨μˆ˜'λŠ” κ·Έ ν•¨μˆ˜μ˜ λΆ€λͺ¨ ν•¨μˆ˜(parent function)μ—μ„œ μ •μ˜λœ λͺ¨λ“  λ³€μˆ˜ 및 λΆ€λͺ¨ ν•¨μˆ˜κ°€ μ ‘κ·Όν•  수 μžˆλŠ” λͺ¨λ“  λ‹€λ₯Έ λ³€μˆ˜κΉŒμ§€λ„ μ ‘κ·Όν•  수 μžˆλ‹€.

μ•„λž˜ μ˜ˆμ‹œλ₯Ό μ°Έκ³ .

// x, y, name을 μ „μ—­ λ³€μˆ˜λ‘œ 선언함.
var x = 10, y = 20;
// sub()λ₯Ό μ „μ—­ ν•¨μˆ˜λ‘œ 선언함.
function sub() {
    return x - y;     // μ „μ—­ λ³€μˆ˜μΈ x, y에 접근함.
}
document.write(sub() + "<br>");
// parentFunc()을 μ „μ—­ ν•¨μˆ˜λ‘œ 선언함.
function parentFunc() {
    var x = 1, y = 2; // μ „μ—­ λ³€μˆ˜μ™€ 같은 μ΄λ¦„μœΌλ‘œ μ„ μ–Έν•˜μ—¬ μ „μ—­ λ³€μˆ˜μ˜ λ²”μœ„λ₯Ό μ œν•œν•¨.
    function add() {  // add() ν•¨μˆ˜λŠ” λ‚΄λΆ€ ν•¨μˆ˜λ‘œ 선언됨.
        return x + y; // μ „μ—­ λ³€μˆ˜κ°€ μ•„λ‹Œ μ§€μ—­ λ³€μˆ˜ x, y에 접근함.
    }
    return add();
}
document.write(parentFunc());

ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…(hoisting)

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν•¨μˆ˜μ˜ 유효 λ²”μœ„λΌλŠ” 것은 ν•¨μˆ˜ μ•ˆμ—μ„œ μ„ μ–Έλœ λͺ¨λ“  λ³€μˆ˜λŠ” ν•¨μˆ˜ 전체에 걸쳐 μœ νš¨ν•˜λ‹€λŠ” μ˜λ―Έμ΄λ‹€.

그런데 이 유효 λ²”μœ„μ˜ 적용이 λ³€μˆ˜κ°€ μ„ μ–Έλ˜κΈ° 전에도 λ˜‘κ°™μ΄ μ μš©λœλ‹€. μ΄λŸ¬ν•œ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ νŠΉμ§•μ„ ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…(hoisting)이라고 ν•œλ‹€. 즉, μžλ°”μŠ€ν¬λ¦½νŠΈ ν•¨μˆ˜ μ•ˆμ— μžˆλŠ” λͺ¨λ“  λ³€μˆ˜μ˜ 선언은 ν•¨μˆ˜μ˜ 맨 처음으둜 μ΄λ™λœ κ²ƒμ²˜λŸΌ λ™μž‘ν•œλ‹€.

μ•„λž˜ 예제λ₯Ό 보자.

var globalNum = 10;     // globalNum을 μ „μ—­ λ³€μˆ˜λ‘œ 선언함.

function printNum() {
    document.write("μ§€μ—­ λ³€μˆ˜ globalNum μ„ μ–Έ μ „μ˜ globalNum의 값은 " + globalNum + "μž…λ‹ˆλ‹€.<br>"); // β‘ 
    var globalNum = 20; // globalNum을 μ§€μ—­ λ³€μˆ˜λ‘œ 선언함. // β‘‘
    document.write("μ§€μ—­ λ³€μˆ˜ globalNum μ„ μ–Έ ν›„μ˜ globalNum의 값은 " + globalNum + "μž…λ‹ˆλ‹€.<br>");
}

printNum();

β‘ μ—μ„œ μ „μ—­λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  것 κ°™μ§€λ§Œ μ•„λ‹ˆλ‹€. ν˜Έμ΄μŠ€νŒ…μ΄ μ μš©λ˜μ–΄ μ•„λž˜μ²˜λŸΌ μ½”λ“œκ°€ λ°”λ€ŒκΈ° λ•Œλ¬Έ.

var globalNum = 10;     // globalNum을 μ „μ—­ λ³€μˆ˜λ‘œ 선언함.

function printNum() {
		var globalNum; // ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…μ— μ˜ν•΄ λ³€μˆ˜μ˜ μ„ μ–Έ 뢀뢄이 ν•¨μˆ˜μ˜ 맨 처음 λΆ€λΆ„μœΌλ‘œ 이동됨.
    document.write("μ§€μ—­ λ³€μˆ˜ globalNum μ„ μ–Έ μ „μ˜ globalNum의 값은 " + globalNum + "μž…λ‹ˆλ‹€.<br>"); // β‘ 
    globalNum = 20; // globalNum을 μ§€μ—­ λ³€μˆ˜λ‘œ 선언함. // β‘‘
    document.write("μ§€μ—­ λ³€μˆ˜ globalNum μ„ μ–Έ ν›„μ˜ globalNum의 값은 " + globalNum + "μž…λ‹ˆλ‹€.<br>");
}

printNum();

λ§€κ°œλ³€μˆ˜μ™€ 인수

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” ν•¨μˆ˜λ₯Ό μ •μ˜ν•  λ•ŒλŠ” λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μ„ λ”°λ‘œ λͺ…μ‹œν•˜μ§€ μ•ŠλŠ”λ‹€. ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œμ—λ„ 인수(argument)둜 μ „λ‹¬λœ 값에 λŒ€ν•΄ μ–΄λ– ν•œ νƒ€μž… 검사도 ν•˜μ§€ μ•ŠλŠ”λ‹€.

ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ ν•¨μˆ˜μ˜ μ •μ˜λ³΄λ‹€ 적은 수의 μΈμˆ˜κ°€ μ „λ‹¬λ˜λ”λΌλ„, λ‹€λ₯Έ μ–Έμ–΄μ™€λŠ” 달리 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚€μ§€ μ•ŠλŠ”λ‹€.

이 같은 경우 μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ „λ‹¬λ˜μ§€ μ•Šμ€ λ‚˜λ¨Έμ§€ λ§€κ°œλ³€μˆ˜μ— μžλ™μœΌλ‘œ undefined 값을 μ„€μ •ν•œλ‹€.

arguments 객체

λ§Œμ•½ ν•¨μˆ˜μ˜ μ •μ˜λ³΄λ‹€ 더 λ§Žμ€ 수의 μΈμˆ˜κ°€ μ „λ‹¬λ˜λ©΄, λ§€κ°œλ³€μˆ˜μ— λŒ€μž…λ˜μ§€ λͺ»ν•œ μΈμˆ˜λ“€μ€ μ°Έμ‘°ν•  방법이 μ—†κ²Œ λœλ‹€.

ν•˜μ§€λ§Œ arguments 객체λ₯Ό μ΄μš©ν•˜λ©΄, ν•¨μˆ˜λ‘œ μ „λ‹¬λœ 인수의 총 개수λ₯Ό ν™•μΈν•˜κ±°λ‚˜, 각각의 μΈμˆ˜μ—λ„ λ°”λ‘œ μ ‘κ·Όν•  수 μžˆλ‹€.

arguments κ°μ²΄λŠ” ν•¨μˆ˜κ°€ 호좜될 λ•Œ μ „λ‹¬λœ 인수λ₯Ό λ°°μ—΄μ˜ ν˜•νƒœλ‘œ μ €μž₯ν•˜κ³  μžˆλ‹€. 첫 번째 μΈμˆ˜λŠ” arguments[0]에 μ €μž₯되며, λ‹€μŒ μΈμˆ˜λŠ” arguments[1]에 μ €μž₯λœλ‹€. λ˜ν•œ, 인수의 총 κ°œμˆ˜λŠ” arguments 객체의 length ν”„λ‘œνΌν‹°μ— μ €μž₯λœλ‹€.

λ””ν΄νŠΈ λ§€κ°œλ³€μˆ˜μ™€ λ‚˜λ¨Έμ§€ λ§€κ°œλ³€μˆ˜

ECMAScript 6λΆ€ν„° μƒˆλ‘­κ²Œ μ •μ˜λœ λ§€κ°œλ³€μˆ˜λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

  1. λ””ν΄νŠΈ λ§€κ°œλ³€μˆ˜(default parameter) μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ λ§€κ°œλ³€μˆ˜μ˜ 기본값은 undefined κ°’μœΌλ‘œ μ„€μ •λ˜μ–΄ μžˆλ‹€.

  2. λ‚˜λ¨Έμ§€ λ§€κ°œλ³€μˆ˜(rest parameter) λ‚˜λ¨Έμ§€ λ§€κ°œλ³€μˆ˜λŠ” μƒλž΅ 접두사(...)λ₯Ό μ‚¬μš©ν•˜μ—¬ νŠΉμ • μœ„μΉ˜μ˜ μΈμˆ˜λΆ€ν„° λ§ˆμ§€λ§‰ μΈμˆ˜κΉŒμ§€λ₯Ό ν•œ λ²ˆμ— μ§€μ •ν•  수 μžˆλ‹€. 이건 예제λ₯Ό 보자.

    // 첫 번째 인수λ₯Ό λ³€μˆ˜ firstNum에 μ €μž₯ν•˜κ³  λ‚˜λ¨Έμ§€ μΈμˆ˜λ“€μ€ λ°°μ—΄ restArgs에 μ €μž₯함.
    
    function sub(firstNum, ...restArgs) {
        for(var i = 0; i < restArgs.length; i++) {
            firstNum -= restArgs[i];
        }
        return firstNum;
    }
    
    sub(10, 2, 3);    // 10 - 2 - 3 = 5
    sub(10, 1, 5, 8); // 10 - 1 - 5 - 8 = -4

미리 μ •μ˜λœ μ „μ—­ ν•¨μˆ˜(predefined functions)

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ‚¬μš©μžμ˜ 편의λ₯Ό μœ„ν•΄ λ‹€μ–‘ν•œ κΈ°λŠ₯의 μ—¬λŸ¬ μ „μ—­ ν•¨μˆ˜λ₯Ό 미리 μ •μ˜ν•˜μ—¬ μ œκ³΅ν•œλ‹€. μ΄λŸ¬ν•œ μ „μ—­ ν•¨μˆ˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μ–΄λ–€ νƒ€μž…μ˜ κ°μ²΄μ—μ„œλ„ λ°”λ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 미리 μ •μ˜λ˜μ–΄ μžˆλŠ” μ „μ—­ ν•¨μˆ˜λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

  1. eval() : λ¬Έμžμ—΄λ‘œ ν‘œν˜„λœ μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” ν•¨μˆ˜

  2. isFinite() : μ „λ‹¬λœ 값이 μœ ν•œν•œ μˆ˜μΈμ§€λ₯Ό κ²€μ‚¬ν•˜μ—¬ κ·Έ κ²°κ³Όλ₯Ό λ°˜ν™˜. 인수둜 μ „λ‹¬λœ 값이 μˆ«μžκ°€ μ•„λ‹ˆλΌλ©΄ 숫자둜 λ³€ν™˜ν•˜μ—¬ 검사.

  3. isNaN()

  4. parseFloat()

  5. parseInt()

  6. decodeURI() : encodeURI() ν•¨μˆ˜λ‚˜ λ‹€λ₯Έ λ°©λ²•μœΌλ‘œ λ§Œλ“€μ–΄μ§„ URIλ₯Ό ν•΄λ…ν•œλ‹€.

  7. decodeURIComponent()

  8. encodeURI()

  9. encodeURIComponent()

  10. escape()

  11. unescape()

  12. Number()

  13. String()

μžλ°”μŠ€ν¬λ¦½νŠΈ 객체

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 객체의 ν”„λ‘œνΌν‹°λ₯Ό μ°Έμ‘°ν•˜λŠ” 방법은 λ‹€μŒκ³Ό κ°™λ‹€.

객체이름.ν”„λ‘œνΌν‹°μ΄λ¦„
λ˜λŠ”
객체이름["ν”„λ‘œνΌν‹°μ΄λ¦„"]

λ©”μ†Œλ“œλ₯Ό μ°Έμ‘°ν•  λ•Œ λ©”μ†Œλ“œ 이름 뒀에 κ΄„ν˜Έ(())λ₯Ό 뢙이지 μ•ŠμœΌλ©΄, λ©”μ†Œλ“œκ°€ μ•„λ‹Œ ν”„λ‘œνΌν‹° κ·Έ 자체λ₯Ό μ°Έμ‘°ν•˜κ²Œ λœλ‹€. λ”°λΌμ„œ κ΄„ν˜Έλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  ν”„λ‘œνΌν‹° κ·Έ 자체λ₯Ό μ°Έμ‘°ν•˜κ²Œ 되면 ν•΄λ‹Ή λ©”μ†Œλ“œμ˜ μ •μ˜ κ·Έ μžμ²΄κ°€ λ°˜ν™˜λœλ‹€.

객체의 생성

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 객체λ₯Ό μƒμ„±ν•˜λŠ” 방법은 λ‹€μŒκ³Ό κ°™λ‹€.

  1. λ¦¬ν„°λŸ΄ ν‘œκΈ°(literal notation)λ₯Ό μ΄μš©ν•œ 방법

    var 객체이름 = {
    	ν”„λ‘œνΌν‹°1이름: ν”„λ‘œνΌν‹°1의 κ°’
    	...
    }
  2. μƒμ„±μž ν•¨μˆ˜(constructor function)λ₯Ό μ΄μš©ν•œ 방법

    var day = new Date(); // new μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ—¬ Date νƒ€μž…μ˜ 객체λ₯Ό 생성함.
    document.write("μ˜¬ν•΄λŠ” " + day.getFullYear() + "λ…„μž…λ‹ˆλ‹€.");
  3. Object.create() λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•œ 방법 Object.create() λ©”μ†Œλ“œλŠ” μ§€μ •λœ ν”„λ‘œν† νƒ€μž…(prototype) 객체와 ν”„λ‘œνΌν‹°λ₯Ό κ°€μ§€κ³  μƒˆλ‘œμš΄ 객체λ₯Ό λ§Œλ“€μ–΄μ€€λ‹€.

    λ”°λΌμ„œ 이 λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•˜λ©΄ μ‚¬μš©μžκ°€ ν”„λ‘œν† νƒ€μž… 객체λ₯Ό 직접 λͺ…μ‹œν•  수 μžˆμœΌλ―€λ‘œ, μƒλ‹Ήνžˆ μœ μš©ν•˜κ²Œ μ‚¬μš©λœλ‹€.

    Object.create(ν”„λ‘œν† νƒ€μž…κ°μ²΄[, μƒˆλ‘œμš΄κ°μ²΄μ˜ν”„λ‘œνΌν‹°1, μƒˆλ‘œμš΄κ°μ²΄μ˜ν”„λ‘œνΌν‹°2, ...]);

    Object.create() λ©”μ†Œλ“œμ˜ 첫 번째 μΈμˆ˜λ‘œλŠ” ν”„λ‘œν† νƒ€μž…μœΌλ‘œ μ‚¬μš©ν•  객체λ₯Ό μ „λ‹¬ν•œλ‹€. 두 번째 μΈμˆ˜λ‘œλŠ” μƒˆλ‘œμš΄ 객체의 μΆ”κ°€ν•  ν”„λ‘œνΌν‹° 정보λ₯Ό μ „λ‹¬ν•œλ‹€.

ν”„λ‘œν† νƒ€μž… - 상속

C#μ΄λ‚˜ C++κ³Ό 같은 클래슀 기반(class-based)의 객체 μ§€ν–₯ μ–Έμ–΄μ™€λŠ” 달리 μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ν”„λ‘œν† νƒ€μž… 기반(prototype-based)의 객체 μ§€ν–₯ 언어이닀.

λ”°λΌμ„œ 상속 λ“±μ˜ κ°œλ…μ΄ μ’€ λ‹€λ₯Έλ°, μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” ν˜„μž¬ μ‘΄μž¬ν•˜κ³  μžˆλŠ” 객체λ₯Ό ν”„λ‘œν† νƒ€μž…μœΌλ‘œ μ‚¬μš©ν•˜μ—¬, ν•΄λ‹Ή 객체λ₯Ό λ³΅μ œν•˜μ—¬ μž¬μ‚¬μš©ν•˜λŠ” 것을 상속이라고 ν•œλ‹€.

ν”„λ‘œν† νƒ€μž…

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λͺ¨λ“  κ°μ²΄λŠ” ν”„λ‘œν† νƒ€μž…(prototype)μ΄λΌλŠ” 객체λ₯Ό κ°€μ§€κ³  μžˆλ‹€. λͺ¨λ“  κ°μ²΄λŠ” κ·Έλ“€μ˜ ν”„λ‘œν† νƒ€μž…μœΌλ‘œλΆ€ν„° ν”„λ‘œνΌν‹°μ™€ λ©”μ†Œλ“œλ₯Ό 상속 λ°›λŠ”λ‹€.

이처럼 μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λͺ¨λ“  κ°μ²΄λŠ” μ΅œμ†Œν•œ ν•˜λ‚˜ μ΄μƒμ˜ λ‹€λ₯Έ κ°μ²΄λ‘œλΆ€ν„° 상속을 λ°›μœΌλ©°, μ΄λ•Œ μƒμ†λ˜λŠ” 정보λ₯Ό μ œκ³΅ν•˜λŠ” 객체λ₯Ό ν”„λ‘œν† νƒ€μž…(prototype)이라고 ν•œλ‹€.

μ•„ 단 ν•˜λ‚˜, Object.prototype κ°μ²΄λŠ” μ–΄λ– ν•œ ν”„λ‘œν† νƒ€μž…λ„ κ°€μ§€μ§€ μ•ŠμœΌλ©°, μ•„λ¬΄λŸ° ν”„λ‘œνΌν‹°λ„ 상속받지 μ•ŠλŠ”λ‹€.

ν”„λ‘œν† νƒ€μž… 체인(prototype chain)

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” 객체 μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό μ‚¬μš©ν•΄ μƒμ„±λœ 같은 νƒ€μž…μ˜ 객체듀은 λͺ¨λ‘ 같은 ν”„λ‘œν† νƒ€μž…μ„ κ°€μ§„λ‹€.

λ˜ν•œ, new μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•΄ μƒμ„±ν•œ κ°μ²΄λŠ” μƒμ„±μžμ˜ ν”„λ‘œν† νƒ€μž…μ„ μžμ‹ μ˜ ν”„λ‘œν† νƒ€μž…μœΌλ‘œ μƒμ†λ°›λŠ”λ‹€.

이런 ν”„λ‘œν† νƒ€μž… μƒμ†μ˜ 가상 연결고리λ₯Ό ν”„λ‘œν† νƒ€μž… 체인이라고 ν•œλ‹€. Object.prototype κ°μ²΄λŠ” μ–΄λ– ν•œ ν”„λ‘œν† νƒ€μž…λ„ κ°€μ§€μ§€ μ•ŠμœΌλ©°, μ•„λ¬΄λŸ° ν”„λ‘œνΌν‹°λ„ 상속받지 μ•ŠλŠ”λ‹€κ³  ν–ˆμ—ˆλŠ”λ°, Object.prototype κ°μ²΄λŠ” μ΄λŸ¬ν•œ ν”„λ‘œν† νƒ€μž… μ²΄μΈμ—μ„œλ„ κ°€μž₯ μƒμœ„μ— μ‘΄μž¬ν•˜λŠ” ν”„λ‘œν† νƒ€μž…μ΄κΈ° λ•Œλ¬Έμ΄λ‹€.

Math 객체

Math κ°μ²΄λŠ” μˆ˜ν•™μ—μ„œ 자주 μ‚¬μš©ν•˜λŠ” μƒμˆ˜μ™€ ν•¨μˆ˜λ“€μ„ 미리 κ΅¬ν˜„ν•΄ 놓은 μžλ°”μŠ€ν¬λ¦½νŠΈ ν‘œμ€€ λ‚΄μž₯ 객체이닀. Math κ°μ²΄λŠ” λ‹€λ₯Έ μ „μ—­ κ°μ²΄μ™€λŠ” 달리 μƒμ„±μž(constructor)κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€. λ”°λΌμ„œ λ”°λ‘œ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•Šμ•„λ„ Math 객체의 λͺ¨λ“  λ©”μ†Œλ“œλ‚˜ ν”„λ‘œνΌν‹°λ₯Ό λ°”λ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λŒ€λΆ€λΆ„μ˜ Math λ©”μ†Œλ“œλŠ” μ›Ή λΈŒλΌμš°μ €λ§ˆλ‹€ λ‹€λ₯Έ 결괏값을 얻을 κ°€λŠ₯성이 λ†’λ‹€. 심지어 같은 μžλ°”μŠ€ν¬λ¦½νŠΈ 인터프리터라도 μš΄μ˜μ²΄μ œκ°€ λ‹€λ₯΄λ©΄ λ‹€λ₯Έ 결괏값을 λ°˜ν™˜ν•  수 μžˆλ‹€. λ”°λΌμ„œ μ•„μ£Ό μ •ν™•ν•œ 결괏값이 ν•„μš”ν•œ μž‘μ—…μ—λŠ” Math λ©”μ†Œλ“œλŠ” μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 것이 μ’‹λ‹€.

ν•™μŠ΅ λ‚΄μš©μ— λŒ€ν•œ 개인적인 총평

μš°μ„  λ²Όλ₯΄κ³  λ²Όλ₯΄λ˜ javascript 에 λŒ€ν•œ ν•™μŠ΅μ„ ν•  수 μžˆμ–΄μ„œ μ’‹μ•˜μŠ΅λ‹ˆλ‹€. backbone.jsλ₯Ό ν•™μŠ΅ν•  수 μžˆλŠ” μ •λ„λ‘œλ§Œ λ”± ν›‘μ–΄μ•Όκ² μŠ΅λ‹ˆλ‹€.

νŒ€ λ―ΈνŒ…λ„ νŒ€μ›λ“€μ„ λ…λ €ν•΄μ„œ κ³΅μœ ν• λ§Œν•œ 이슈λ₯Ό 곡유 λ°›κ³ , λ‹€μŒ ν•™μŠ΅ν•  것을 ν™•μΈν•˜λŠ” 흐름이 잘 μ •μ°©λœ 것 κ°™λ„€μš”.

ν•™μŠ΅ μΌμ •μ˜ 경우 Rails의 μ‹€μ‹œκ°„ μ±„νŒ…μ— λŒ€ν•œ λ‚΄μš©κ³Ό backbone.js에 λŒ€ν•΄μ„œ μ–΄λ–»κ²Œ ν•™μŠ΅μ„ μ΄μ–΄λ‚˜κ°ˆμ§€ μ •ν–ˆκ³ , ν•™μŠ΅ λ°©μ‹μ˜ 경우 κ°œμ„ μ΄ ν•„μš”ν•˜λ‹€ νŒλ‹¨ν•˜μ—¬ 1) κ°•μ œλ‘œ λ””μŠ€μ½”λ“œ μ°Έμ—¬μ‹œκ°„λŒ€ μ •ν•˜κΈ° 2) ν•™μŠ΅μ†ŒμŠ€λ₯Ό ν†΅μΌν•˜κΈ° λ₯Ό μ‹€ν—˜ν•΄λ³΄κΈ°λ‘œ ν–ˆμŠ΅λ‹ˆλ‹€. 잘 되면 μ’‹κ² λ„€μš”.

λ‹€μŒ ν•™μŠ΅ κ³„νš

  • javascript κ°œλ… λ–ΌκΈ°. backbone js ν•™μŠ΅κ°€λŠ₯ν•œ μˆ˜μ€€μœΌλ‘œ.

TCP School
같이 μ‚¬μš©ν•˜λŠ” 이μœ