๐Ÿ‹ JavaScript

์šฐ๋ฆฐ ์–ด๋–ป๊ฒŒ โ€œabcโ€์— toUpperCase๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ?

์š”๋‹ˆ๊น€ 2023. 2. 28. 03:16

 

๐Ÿ‹ ์˜๋ฌธ์ 


์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋ฅผ ํ’€๋˜ ์ค‘ ๋ฌธ์ž์—ด โ€œabcโ€๋ฅผ ๋Œ€๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ toUpperCase๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ๋‹ค.

์‚ฌ์šฉ๋งŒ ํ•˜๋‹ค๊ฐ€ ๊ฐ‘์ž๊ธฐ ๋ฌธ๋“ ์˜๋ฌธ์ด ๋“ค์—ˆ๋‹ค.

โ€œabcโ€ ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ๋‹น์—ฐํ•˜๊ฒŒ๋„ ๊ฐ์ฒด๋„ ์•„๋‹ˆ๊ณ  ๋ฌธ์ž์—ด์ธ๋ฐ, ์–ด๋–ป๊ฒŒ toUpperCase๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฑฐ์ง€?

console.log(typeof "abc") // string

 

 

๐Ÿ‹ ์žโ€ฆ ์›์‹œ๊ฐ’์„ ๊ฐ์ฒด์ฒ˜๋Ÿผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค๊ณ ?


์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๊ฐ์ฒด๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ ๋ถ€๋ฅด๋Š” ํด๋ž˜์Šค์™€ ๊ฐ™์ด ๋‹ค์–‘ํ•œ ๊ฐ’๊ณผ ๋ฉ”์„œ๋“œ๋ฅผ ์‘์ง‘ํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ฒŒํ•˜๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด๋‹ค.

๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ๊ฐ’์„ ํ”„๋กœํผํ‹ฐ๋กœ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ , ๋‚ด๋ถ€์— ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด ๊ฐ์ฒด ์ž์ฒด๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค..

const ๋žœ๋ค๋ฌธ์ž = new Object();

๋žœ๋ค๋ฌธ์ž.value = "abc";
๋žœ๋ค๋ฌธ์ž.toUpperCase = function (){
    // value๋ฅผ ๋Œ€๋ฌธ์ž๋กœ ๋ฐ”๊พธ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ...
    return this.value
}

ํ•˜์ง€๋งŒ ์›์‹œํ˜• (์—ฌ๊ธฐ์„œ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฌธ์ž์—ด)์€ ๊ฐ์ฒด ํ˜•ํƒœ๊ฐ€ ์•„๋‹ˆ๊ธฐ์— ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†์–ด,

๊ตฌํ˜„ํ•˜๋ ค๋Š” ๋กœ์ง์„ ์™ธ๋ถ€์— ์œ„์ž„ํ•ด์•ผ ํ•œ๋‹ค๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์—ˆ๊ณ ,

๊ทธ๋ž˜์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฐฝ๋ฆฝ์ž๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์›์‹œ๊ฐ’์„ ๊ฐ์ฒด๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ์žฅ์น˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋œ๋‹ค.

1. ์›์‹œ๊ฐ’์„ ์„ ์–ธํ•œ๋‹ค.
2. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์›์‹œ๊ฐ’์— ๋ฉ”์„œ๋“œ(์ง€๊ธˆ ์˜ˆ์ œ์—์„  toUpperCase)์— ์ ‘๊ทผํ•˜๋ ค๋Š” ์‹œ๋„๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค.
3.1. toUpperCase()๊ฐ€ ํ˜ธ์ถœ๋œ ๋Ÿฐํƒ€์ž„์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ toUpperCase๋ฅผ ๊ฐ€์ง„ Object wrapper ๊ฐ์ฒด ์ƒ์„ฑ
3.2. toUpperCase ๋ฉ”์„œ๋“œ ์‹คํ–‰
3.3. ์‹คํ–‰ ํ›„ ๊ฒฐ๊ด๊ฐ’ ๋ฐ˜ํ™˜
3.4. ๊ณผ์ • a์—์„œ ์ƒ์„ฑํ•œ ๊ฐ์ฒด ํŒŒ๊ดด
3.5. ๋ฐ˜ํ™˜๋œ ๊ฒฐ๊ด๊ฐ’๋งŒ ์ƒ์กด.

 

์œ„ ์žฅ์น˜๋“ค๋กœ ์ธํ•ด ์›์‹œํƒ€์ž…์—๋„ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ๊ณ ๋ฏผ ํ•ด๊ฒฐ ๋•…๋•…๋•…

 

 

๐Ÿ‹ ์˜๋„์น˜ ์•Š์€ Object wrapper์˜ ์ƒ์„ฑ?


์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์›์‹œ๊ฐ’์— ๋ฉ”์†Œ๋“œ๋ฅผ ์ ‘๊ทผํ•˜๋ ค๋Š” ์‹œ๋„๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค.

'use strict';

let name = "์†ก๊ฐ•"

name.sayHi = function(){console.log('hi')}

console.log(name.sayHi) // undefined

๋”ฐ๋ผ์„œ ์œ„ ์˜ˆ์‹œ์™€ ๊ฐ™์ด ์ž„์˜์˜ ๋ฌธ์ž์—ด name์— sayHi๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ”„๋กœํผํ‹ฐ๋กœ ์ถ”๊ฐ€ํ•˜๋ ค ํ•œ๋‹ค๋ฉด, ๋‹ค์Œ์˜ ๊ณผ์ •์„ ๊ฑฐ์น˜๊ฒŒ ๋œ๋‹ค.

  1. ์›์‹œ๊ฐ’ name์— sayHi๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ Wrapper Object๊ฐ€ ์ƒ์„ฑ
  2. sayHi๋ฅผ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง„ Wrapper Object๊ฐ€ ๋ฐ”๋กœ ์‚ญ์ œ๋จ
  3. sayHi ๋ฉ”์†Œ๋“œ๋ฅผ ๋‹ค์‹œ ์ฐพ์„ ์ˆ˜ ์—†์–ด undefined ์ถœ๋ ฅ

์œ„์™€ ๊ฐ™์€ ์ด์Šˆ๋ฅผ ์‚ฌ์ „์— ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด strict mode๋ฅผ ํ™œ์„ฑํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด Wrapper Object๊ฐ€ ์ƒ์„ฑ๋˜์ง€๋งŒ, readonly์ธ ๊ฐ์ฒด์— sayHi๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋Š” ์‹œ๋„๊ฐ€ ์‚ฌ์ „์— ์ฐจ๋‹จ๋˜์–ด ์—๋Ÿฌ๋ฅผ ๋ณด์—ฌ์ฃผ๊ฒŒ ๋œ๋‹ค.

 

 

๐Ÿ‹ ํ™•์žฅ ๊ณต๋ถ€: ์ƒ๊ธธ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ณ ๋ฏผ


์œ„ ๊ฐœ๋…๊ณผ ์—ฐ๊ฒฐ ์ง€์–ด ๋ฌธ์ž์—ด ๊ฐ์ฒด์™€ ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด ์„ ์–ธ ๊ณผ์ •์„ ๋ด๋ณด์ž.

๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์€ ๊ทธ ์ž์ฒด๋กœ string ํƒ€์ž…์„ ๊ฐ–๊ณ , ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ƒ์„ฑํ•œ ๋ฌธ์ž์—ด ๊ฐ์ฒด๋Š” object ํƒ€์ž…์„ ๊ฐ–๋Š”๋‹ค.

console.log(typeof "abc") // string
console.log(typeof new String("abc")) // object

์˜๋„์ ์œผ๋กœ ๋งŒ๋“  welcome ํ•จ์ˆ˜๋ฅผ ๋ฉ”์„œ๋“œ๋กœ ๊ฐ€์ง„ ๋ฌธ์ž์—ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ–ˆ๊ณ , ์ด ๋ฌธ์ž์—ด ๊ฐ์ฒด์˜ prototype์„ welcome ํ•จ์ˆ˜๋กœ ์„ค์ •ํ•˜๋Š” ์˜ˆ์‹œ์ด๋‹ค. ์ด๋•Œ toUpperCase()๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ƒ์ƒํ•ด ๋ณด์ž.

let name = new String("song kang")
String.prototype.welcome = function(){
    console.log(this + " ์ž…๋‹ˆ๋‹ค") // song kang ์ž…๋‹ˆ๋‹ค
}
name.welcome()

์ƒ์„ฑํ•œ name ๊ฐ์ฒด์— toUpperCase()๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, toUpperCase ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ๊ฒฐ๊ณผ๊ฐ’๋งŒ์ด ์ƒ์กด๋˜๊ณ  ๋‚˜๋จธ์ง€ ๊ฐ์ฒด๋Š” ํŒŒ๊ดด๋œ๋‹ค. ์ด ๊ฐ’์„ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ์‹œํ‚จ๋‹ค๋ฉด ๋ฌธ์ž์—ด๋กœ ํ˜•๋ณ€ํ™˜์ด ์ผ์–ด๋‚˜๋ฉฐ ์ด์ „์— ๋งŒ๋“  welcome ํ•จ์ˆ˜๋Š” ์‚ฌ๋ผ์ง€๊ฒŒ ๋œ๋‹ค!

console.log(typeof name) // object
console.log(typeof name.toUpperCase()) // string

๋ฌผ๋ก  ์ด๋Ÿฐ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋นˆ๋ฒˆํžˆ ๋งˆ์ฃผํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋ผ ์˜ˆ์ƒํ•˜์ง„ ์•Š์ง€๋งŒ... ์ด ํ˜•๋ณ€ํ™˜์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•ด๋ณด๊ณ  ์‹ถ์—ˆ๋‹ค.

 

 

๐Ÿ‹ ํ™•์žฅ ๊ณต๋ถ€: ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„๊นŒ?


  1. Object freeze๋กœ ๊ฐ์ฒด ๋™๊ฒฐ โŒ

๊ฐ์ฒด๋ฅผ ๋™๊ฒฐ์‹œํ‚ค๋Š” Object.freeze() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์†์„ฑ์ด ์ถ”๊ฐ€๋˜๊ณ  ์ œ๊ฑฐ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ์— ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•œ๋‹ค๊ณ  ์•Œ๊ณ  ์žˆ๋‹ค.
ํ•˜์ง€๋งŒ ์ด ๊ฒฝ์šฐ์—์„  ๊ฐ์ฒด์˜ ํ˜•ํƒœ๋ฅผ ๋ณ€ํ˜•ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ํƒ€์ž…์ด ์บ์ŠคํŒ…๋˜๋Š” ๊ฒƒ์ด๊ธฐ์— ์ ์šฉ์ด ๋ถˆ๊ฐ€ํ•˜๋‹ค.

 

  1. ๋ฉ”์†Œ๋“œ Overriding โœ…

์šฐ๋ฆฌ๋Š” ์ƒ์„ฑ์ž 'ํ•จ์ˆ˜' (๋˜๋Š” new ์—ฐ์‚ฐ์ž)๋ฅผ ํ†ตํ•ด ๋งŒ๋“  ๊ฐ์ฒด๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ ํ”„๋กœํ† ํƒ€์ž… ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•ด Prototype์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ํŠน์„ฑ์„ ํ™œ์šฉํ•ด, ํ˜•๋ณ€ํ™˜์ด ์ผ์–ด๋‚˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์• ์ดˆ์— ๋ฐฉ์ง€ํ•˜๋Š” ์ฐจ์›์—์„œ String ์ธ์Šคํ„ด์Šค์— ์ถ”๊ฐ€ํ•˜๋ ค๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ prototype ์œ ์ „์ž ์‹ฌ์–ด์ค„ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ toUpperCase๋Š” String ๊ฐ์ฒด์— property๊ฐ’์— ํฌํ•จ๋œ ๋ฉ”์„œ๋“œ์ด๋‹ค.

String.prototype.toUpperCase()

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Class ๋ฌธ๋ฒ•์ด ๋“ฑ์žฅํ•œ ์ด๋ž˜๋กœ Prototype์€ ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•˜์ง€๋งŒ, ํด๋ž˜์Šค ๊ฐœ๋…์— ๋Œ€์ž…ํ•˜์˜€์„ ๋•Œ,

String์ด๋ผ๋Š” ํด๋ž˜์Šค๊ฐ€ ๊ฐ€์ง„ toUpperCase ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก Overriding ํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ?๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

toUpperCase ํ•จ์ˆ˜๋ฅผ ์žฌ์ •์˜ ํ•˜์ง€ ์•Š๊ณ ์„œ์•ผ ๊ฒฐ๊ด๊ฐ’์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๊ธฐ์—, ์ฐจ์„ ์ฑ…์œผ๋กœ toUpperCase ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฐ๊ณผ๊ฐ’์„ ์ƒˆ๋กœ์šด String ์ƒ์„ฑ์ž์— ๋‹ด์•„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋ฉด, ๋ชจ๋“  String์˜ prototype ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์†๋ฐ›์€ ๋ฌธ์ž์—ด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. 

const x = new String("hello")

String.prototype.welcome = function(){
    console.log(this + " ์ž…๋‹ˆ๋‹ค")
}

String.prototype._toUpperCase = function(){ // ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ปค์Šคํ…€ toUpperCase ํ•จ์ˆ˜
    const newStr = String.prototype.toUpperCase()
    return new String(newStr)
}

console.log(x._toUpperCase())

console.log(typeof x)
console.log(typeof x._toUpperCase())

 

 

๐Ÿ‹ ๋А๋‚€ ์ 


๋ง๋กœ ์ธํ•œ ๊ฒฐ๊ณผ๋ฅผ ํ™”์ž๊ฐ€ ์ฑ…์ž„์ง€๋“ฏ, ๊ฐœ๋ฐœ์ž๋กœ์„œ ๋ฐœ์ƒํ•  ๊ฒฐ๊ณผ๋ฅผ ์˜ˆ์ธกํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์งœ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๋‹จ์ˆœํžˆ ๋ชจ๋“  ๊ฒฐ๊ณผ๋ฅผ โ€œ๋งˆ๋ฒ•โ€์ด ์•„๋‹Œ โ€œ๊ณผํ•™โ€์œผ๋กœ ๋ฐ”๋ผ๋ณด๋Š” ์‹œ๊ฐ์„ ๊ฐ–๋Š” ๊ฒŒ ์ค‘์š”ํ•˜๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. 

 

 

 

 

 

์ฐธ๊ณ ์ž๋ฃŒ:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toUpperCase
https://developer.mozilla.org/ko/docs/Web/JavaScript/Memory_Management
https://ko.javascript.info/function-prototype
https://ko.javascript.info/primitives-methods

๋Œ“๊ธ€์ˆ˜0