{"componentChunkName":"component---node-modules-narative-gatsby-theme-novela-src-templates-articles-template-tsx","path":"/","result":{"pageContext":{"authors":[{"authorsPage":true,"bio":"Hi, I'm Reno.\nI am an Android developer and love to play games and cook and kickboard.\nMy favorite word is that it's not over until the end.\n","id":"3e9ccc1b-53d9-552d-a736-92a82c29fb2a","name":"Reno Kim","featured":true,"social":[{"url":"https://www.linkedin.com/in/renovatio0424"},{"url":"https://github.com/renovatio0424"}],"slug":"/authors/reno-kim","avatar":{"small":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAIDAQQF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAwEE/9oADAMBAAIQAxAAAAGnauhF47BBtkFsmLl//8QAGxABAQACAwEAAAAAAAAAAAAAAgEDEQATIjP/2gAIAQEAAQUCxmimLeb6ZGQe3Yd27zHfcEt//8QAGhEAAgIDAAAAAAAAAAAAAAAAAREAAgMQM//aAAgBAwEBPwEYyQ4lK89f/8QAFxEBAAMAAAAAAAAAAAAAAAAAEAERMf/aAAgBAgEBPwGydP/EABwQAAICAgMAAAAAAAAAAAAAAAABESECEDFBcf/aAAgBAQAGPwKcbIaUaUK+iU7XKGxay9P/xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhUTFBYfD/2gAIAQEAAT8hZlpqJo1LxDSDqOtju2phdh8p70xtZcRQekbk+E//2gAMAwEAAgADAAAAEEPYP//EABgRAQADAQAAAAAAAAAAAAAAAAEAEBFR/9oACAEDAQE/EOfMUsaldn//xAAYEQACAwAAAAAAAAAAAAAAAAAAARARIf/aAAgBAgEBPxDDFUn/xAAeEAEBAAICAgMAAAAAAAAAAAABEQAhMUFRcYGRwf/aAAgBAQABPxA6LCB2F558Y7umvO8P3jPtAP3CQECNBq4qvew9vjGdI0h1jiVCwuJg8g3smR0SQNARn//Z","aspectRatio":1,"src":"/static/fd36d5b8be98b6b35c5ea46e0a863cf4/fa1ea/reno-profile.jpg","srcSet":"/static/fd36d5b8be98b6b35c5ea46e0a863cf4/afb2b/reno-profile.jpg 13w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/7c20e/reno-profile.jpg 25w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/fa1ea/reno-profile.jpg 50w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/03612/reno-profile.jpg 75w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/61cdf/reno-profile.jpg 100w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/1920d/reno-profile.jpg 1080w","srcWebp":"/static/fd36d5b8be98b6b35c5ea46e0a863cf4/e7b2c/reno-profile.webp","srcSetWebp":"/static/fd36d5b8be98b6b35c5ea46e0a863cf4/58718/reno-profile.webp 13w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/74aad/reno-profile.webp 25w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/e7b2c/reno-profile.webp 50w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/ed320/reno-profile.webp 75w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/66016/reno-profile.webp 100w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/4c77b/reno-profile.webp 1080w","sizes":"(max-width: 50px) 100vw, 50px"},"medium":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAIDAQQF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAwEE/9oADAMBAAIQAxAAAAGnauhF47BBtkFsmLl//8QAGxABAQACAwEAAAAAAAAAAAAAAgEDEQATIjP/2gAIAQEAAQUCxmimLeb6ZGQe3Yd27zHfcEt//8QAGhEAAgIDAAAAAAAAAAAAAAAAAREAAgMQM//aAAgBAwEBPwEYyQ4lK89f/8QAFxEBAAMAAAAAAAAAAAAAAAAAEAERMf/aAAgBAgEBPwGydP/EABwQAAICAgMAAAAAAAAAAAAAAAABESECEDFBcf/aAAgBAQAGPwKcbIaUaUK+iU7XKGxay9P/xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhUTFBYfD/2gAIAQEAAT8hZlpqJo1LxDSDqOtju2phdh8p70xtZcRQekbk+E//2gAMAwEAAgADAAAAEEPYP//EABgRAQADAQAAAAAAAAAAAAAAAAEAEBFR/9oACAEDAQE/EOfMUsaldn//xAAYEQACAwAAAAAAAAAAAAAAAAAAARARIf/aAAgBAgEBPxDDFUn/xAAeEAEBAAICAgMAAAAAAAAAAAABEQAhMUFRcYGRwf/aAAgBAQABPxA6LCB2F558Y7umvO8P3jPtAP3CQECNBq4qvew9vjGdI0h1jiVCwuJg8g3smR0SQNARn//Z","aspectRatio":1,"src":"/static/fd36d5b8be98b6b35c5ea46e0a863cf4/61cdf/reno-profile.jpg","srcSet":"/static/fd36d5b8be98b6b35c5ea46e0a863cf4/7c20e/reno-profile.jpg 25w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/fa1ea/reno-profile.jpg 50w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/61cdf/reno-profile.jpg 100w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/59538/reno-profile.jpg 150w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/fd013/reno-profile.jpg 200w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/1920d/reno-profile.jpg 1080w","srcWebp":"/static/fd36d5b8be98b6b35c5ea46e0a863cf4/66016/reno-profile.webp","srcSetWebp":"/static/fd36d5b8be98b6b35c5ea46e0a863cf4/74aad/reno-profile.webp 25w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/e7b2c/reno-profile.webp 50w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/66016/reno-profile.webp 100w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/d9b14/reno-profile.webp 150w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/6b183/reno-profile.webp 200w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/4c77b/reno-profile.webp 1080w","sizes":"(max-width: 100px) 100vw, 100px"},"large":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAIDAQQF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAwEE/9oADAMBAAIQAxAAAAGnauhF47BBtkFsmLl//8QAGxABAQACAwEAAAAAAAAAAAAAAgEDEQATIjP/2gAIAQEAAQUCxmimLeb6ZGQe3Yd27zHfcEt//8QAGhEAAgIDAAAAAAAAAAAAAAAAAREAAgMQM//aAAgBAwEBPwEYyQ4lK89f/8QAFxEBAAMAAAAAAAAAAAAAAAAAEAERMf/aAAgBAgEBPwGydP/EABwQAAICAgMAAAAAAAAAAAAAAAABESECEDFBcf/aAAgBAQAGPwKcbIaUaUK+iU7XKGxay9P/xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhUTFBYfD/2gAIAQEAAT8hZlpqJo1LxDSDqOtju2phdh8p70xtZcRQekbk+E//2gAMAwEAAgADAAAAEEPYP//EABgRAQADAQAAAAAAAAAAAAAAAAEAEBFR/9oACAEDAQE/EOfMUsaldn//xAAYEQACAwAAAAAAAAAAAAAAAAAAARARIf/aAAgBAgEBPxDDFUn/xAAeEAEBAAICAgMAAAAAAAAAAAABEQAhMUFRcYGRwf/aAAgBAQABPxA6LCB2F558Y7umvO8P3jPtAP3CQECNBq4qvew9vjGdI0h1jiVCwuJg8g3smR0SQNARn//Z","aspectRatio":1,"src":"/static/fd36d5b8be98b6b35c5ea46e0a863cf4/ec46e/reno-profile.jpg","srcSet":"/static/fd36d5b8be98b6b35c5ea46e0a863cf4/a2637/reno-profile.jpg 82w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/15203/reno-profile.jpg 164w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/ec46e/reno-profile.jpg 328w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/b69a5/reno-profile.jpg 492w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/23a36/reno-profile.jpg 656w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/1920d/reno-profile.jpg 1080w","srcWebp":"/static/fd36d5b8be98b6b35c5ea46e0a863cf4/5a48e/reno-profile.webp","srcSetWebp":"/static/fd36d5b8be98b6b35c5ea46e0a863cf4/2d087/reno-profile.webp 82w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/29d87/reno-profile.webp 164w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/5a48e/reno-profile.webp 328w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/42f2e/reno-profile.webp 492w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/dec03/reno-profile.webp 656w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/4c77b/reno-profile.webp 1080w","sizes":"(max-width: 328px) 100vw, 328px"}}}],"basePath":"/","skip":6,"limit":6,"group":[{"id":"4834da44-c416-5d14-93ea-2c3731407357","slug":"/suspend-(feat.-)","secret":false,"title":"suspend 를 붙이면 생기는 일 (feat. 코루틴 동작 원리)","author":"Reno Kim","date":"February 9th, 2021","dateForSEO":"2021-02-09T00:00:00.000Z","timeToRead":1,"excerpt":"코루틴의 작동 원리에 대해 공부하면서 정리한 글입니다.","canonical_url":null,"subscription":true,"body":"function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"title\": \"suspend 를 붙이면 생기는 일 (feat. 코루틴 동작 원리)\",\n  \"author\": \"Reno Kim\",\n  \"date\": \"2021-02-09T00:00:00.000Z\",\n  \"hero\": \"./images/hero.jpg\",\n  \"excerpt\": \"코루틴의 작동 원리에 대해 공부하면서 정리한 글입니다.\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, [\"components\"]);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h1\", {\n    \"id\": \"suspend-를-붙이면-생기는-일-feat-코루틴-동작-원리\"\n  }, \"suspend \\uB97C \\uBD99\\uC774\\uBA74 \\uC0DD\\uAE30\\uB294 \\uC77C (feat. \\uCF54\\uB8E8\\uD2F4 \\uB3D9\\uC791 \\uC6D0\\uB9AC)\"), mdx(\"h2\", {\n    \"id\": \"시작하기-앞서\"\n  }, \"\\uC2DC\\uC791\\uD558\\uAE30 \\uC55E\\uC11C\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"\\uC774 \\uAE00\\uC740 \", mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"\\u201Ccoroutine \\uC774 \\uC2E4\\uC81C\\uB85C \\uB3D9\\uC791\\uD558\\uB294 \\uC6D0\\uB9AC\\u201D\"), \"\\uC5D0 \\uB300\\uD574 \\uACF5\\uBD80\\uD558\\uBA74\\uC11C \\uD559\\uC2B5\\uD55C \\uB0B4\\uC6A9\\uC744 \\uC27D\\uAC8C \\uC774\\uD574\\uD560 \\uC218 \\uC788\\uB3C4\\uB85D \\uC4F4 \\uAE00\\uC785\\uB2C8\\uB2E4.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"\\uC774\\uD574\\uB97C \\uB3D5\\uAE30 \\uC704\\uD574 \\uC608\\uC81C \\uCF54\\uB4DC\\uAC00 \\uC2E4\\uC81C \\uCF54\\uB4DC\\uC640 \\uB2E4\\uB97C \\uC218 \\uC788\\uC2B5\\uB2C8\\uB2E4.\")), mdx(\"h2\", {\n    \"id\": \"suspend-를-붙이면-어떻게-될까\"\n  }, \"\\u2018suspend\\u2019 \\uB97C \\uBD99\\uC774\\uBA74 \\uC5B4\\uB5BB\\uAC8C \\uB420\\uAE4C?\"), mdx(\"p\", null, \"Coroutine \\uC18C\\uAC1C \\uAE00\\uC774\\uB098 \\uC601\\uC0C1\\uC744 \\uBCF4\\uB2E4 \\uBCF4\\uBA74 \\uD56D\\uC0C1 \\uC5B8\\uAE09\\uD558\\uB294 \\uCF54\\uB8E8\\uD2F4\\uC758 \\uC7A5\\uC810\\uC774 \\uD558\\uB098 \\uC788\\uB2E4.\"), mdx(\"p\", null, \"\\u201D\", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Callback\"), \" \\uC744 \\uC5C6\\uC560 \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Imperative code\"), \" \\uB97C \\uB9CC\\uB4E4\\uC5B4 \\uC900\\uB2E4\\u201D \\uB294 \\uAC83\\uC774\\uB2E4.\"), mdx(\"p\", null, \"\\uCF5C\\uBC31 \\uC9C0\\uC625\\uC774\\uC5C8\\uB358 \\uCF54\\uB4DC\\uAC00\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-kotlin\"\n  }), \"// Simplified code that only considers the happy path\\nfun loginUser(userId: String, password: String, userResult: Callback<User>) {\\n  // Async callbacks\\n  userRemoteDataSource.logUserIn { user ->\\n    // Successful network request\\n    userLocalDataSource.logUserIn(user) { userDb ->\\n      // Result saved in DB\\n      userResult.success(userDb)\\n    }\\n  }\\n}\\n\")), mdx(\"p\", null, \"\\uAE54\\uB054\\uD55C \\uCF54\\uB4DC\\uB85C \\uBC14\\uB00C\\uB294 \\uB9C8\\uBC95\\uC744 \\uBCFC \\uC218 \\uC788\\uB2E4.\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-kotlin\"\n  }), \"suspend fun loginUser(userId: String, password: String): User {\\n  val user = userRemoteDataSource.logUserIn(userId, password)\\n  val userDb = userLocalDataSource.logUserIn(user)\\n  return userDb\\n}\\n\")), mdx(\"p\", null, \"\\uADF8\\uB807\\uB2E4\\uBA74 Coroutine\\uC740 \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Callback\"), \" \\uC744 \\uC0AC\\uC6A9\\uD558\\uC9C0 \\uC54A\\uB294 \\uAC83\\uC77C\\uAE4C? \"), mdx(\"p\", null, \"\\uACB0\\uB860\\uBD80\\uD130 \\uB9D0\\uD558\\uC790\\uBA74 \\uC2E4\\uC81C\\uB85C \\uB0B4\\uBD80\\uC801\\uC73C\\uB85C\\uB294 \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Callback\"), \" \\uC744 \\uC0AC\\uC6A9\\uD558\\uACE0 \\uC788\\uB2E4. \"), mdx(\"p\", null, \"\\uB2E8\\uC9C0 \\uAC1C\\uBC1C\\uC790\\uAC00 \\uC9C1\\uC811 \\uCF5C\\uBC31\\uC744 \\uAD6C\\uD604\\uD558\\uB294 \\uAC83\\uC774 \\uC544\\uB2CC \\uCEF4\\uD30C\\uC77C\\uB7EC\\uAC00 \\uAD6C\\uD604\\uD558\\uB294 \\uAC83\\uC774\\uB2E4.\"), mdx(\"h3\", {\n    \"id\": \"continuation\"\n  }, \"Continuation\"), mdx(\"p\", null, \" Coroutine\\uC740 \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Continuation\"), \" \\uC744 \\uD1B5\\uD574 \\uCF5C\\uBC31\\uACFC \\uCF5C\\uBC31\\uC5D0 \\uC0AC\\uC6A9\\uB418\\uB294 \\uC815\\uBCF4\\uB4E4\\uC744 \\uACF5\\uC720\\uD558\\uB294\\uB370 \\uC544\\uB798\\uC640 \\uAC19\\uC774 \\uC815\\uC758\\uB418\\uC5B4 \\uC788\\uB2E4.\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-kotlin\"\n  }), \"interface Continuation<in T> {\\n  public val context: CoroutineContext\\n  public fun resumeWith(value: Result<T>)\\n}\\n\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"context\")), \" : \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"Continuation\"), \" \\uC5D0\\uC11C \\uC0AC\\uC6A9\\uB420 \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"CoroutineContext\"), \" \\uB97C \\uC758\\uBBF8\\uD558\\uACE0\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"resumeWith\")), \" : \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"Result\"), \" \\uC640 \\uD568\\uAED8 Coroutine \\uC744 \\uC7AC\\uC2E4\\uD589\\uD558\\uB294\\uB370, \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"Result\"), \" \\uAC12\\uC5D0\\uB294 Exception \\uB610\\uB294 \\uCC98\\uB9AC\\uB41C \\uAC12\\uC774\\uB2E4.\")), mdx(\"p\", null, \"\\uC774 \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Continuation\"), \" \\uC744 \\uC0AC\\uC6A9\\uD574 \\uCEF4\\uD30C\\uC77C\\uB7EC\\uB294 \\uB2E4\\uC74C\\uACFC \\uAC19\\uC740 \\uCF54\\uB4DC\\uB97C \\uB9CC\\uB4E4\\uC5B4 \\uB0B8\\uB2E4\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-kotlin\"\n  }), \"fun loginUser(userId: String, password: String, completion: Continuation<Any?>) {\\n  val user = userRemoteDataSource.logUserIn(userId, password)\\n  val userDb = userLocalDataSource.logUserIn(user)\\n  completion.resume(userDb)\\n}\\n\")), mdx(\"p\", null, \"\\uCEF4\\uD30C\\uC77C\\uB7EC\\uAC00 \\uB9CC\\uB4E4\\uC5B4\\uB0B8 \\uCF54\\uB4DC\\uB294\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"suspend\")), \" \\uC9C0\\uC2DC\\uC5B4\\uAC00 \\uC0AC\\uB77C\\uC84C\\uB2E4.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"\\uD568\\uC218 \\uD30C\\uB77C\\uBBF8\\uD130\\uC5D0 \", mdx(\"strong\", {\n    parentName: \"li\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"completion: Continuation<Any?>\")), \" \\uAC00 \\uCD94\\uAC00 \\uB418\\uC5C8\\uB2E4.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"return \\uAC12\\uC774 \\uC0AC\\uB77C\\uC84C\\uB2E4\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"code block \\uB9C8\\uC9C0\\uB9C9\\uC5D0 \", mdx(\"strong\", {\n    parentName: \"li\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"completion.resume(userDb)\")), \" \\uAC00 \\uC0DD\\uACBC\\uB2E4. \")), mdx(\"p\", null, \"\\uC544\\uAE4C \\uC598\\uAE30 \\uD588\\uB358 \\uB300\\uB85C \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"completion\")), \" \\uC744 \\uD1B5\\uD574 \\uACB0\\uACFC \\uAC12\\uC744 \\uC804\\uB2EC\\uD558\\uAC8C \\uB41C\\uB2E4 \"), mdx(\"p\", null, \"\\uD558\\uC9C0\\uB9CC \\uB208\\uCE58 \\uBE60\\uB978 \\uB204\\uAD70\\uAC00\\uB294 \\uC65C \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"completion\")), \" \\uC758 \\uD0C0\\uC785\\uC774 \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"Continuation<Any?>\")), \" \\uC778\\uC9C0 \\uAD81\\uAE08\\uD560 \\uAC83\\uC774\\uB2E4.\"), mdx(\"p\", null, \"\\uC774 \\uB0B4\\uC6A9\\uC740 \\uB098\\uC911\\uC5D0 \\uC124\\uBA85\\uD558\\uB3C4\\uB85D \\uD558\\uACA0\\uB2E4.\"), mdx(\"h3\", {\n    \"id\": \"state-machine\"\n  }, \"State Machine\"), mdx(\"p\", null, mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"loginUser\"), \" \\uAC00 \\uD558\\uB098\\uC758 \\uC2A4\\uB808\\uB4DC\\uC5D0\\uC11C \\uB3D9\\uC791\\uD55C\\uB2E4\\uBA74 \\uC5EC\\uAE30\\uC11C \\uB05D\\uB0A0 \\uAC83\\uC774\\uB2E4. \"), mdx(\"p\", null, \"\\uD558\\uC9C0\\uB9CC \\uC2E4\\uC81C\\uB85C\\uB294 \\uD55C\\uAC1C \\uC774\\uC0C1\\uC758 \\uC2A4\\uB808\\uB4DC\\uC5D0\\uC11C \\uBE44\\uB3D9\\uAE30 \\uCC98\\uB9AC \\uC791\\uC5C5\\uC774 \\uC77C\\uC5B4\\uB098\\uB294\\uB370 Coroutine\\uC740 \\uC774\\uB97C \\uC5B4\\uB5BB\\uAC8C \\uCC98\\uB9AC\\uD560\\uAE4C?\"), mdx(\"p\", null, \"\\uC5B4\\uB5BB\\uAC8C \\uAC01 \\uC791\\uC5C5\\uC774 \\uB05D\\uB098\\uACE0 \\uB2E4\\uC74C \\uC791\\uC5C5\\uC774 \\uC2DC\\uC791\\uD574\\uC57C\\uD558\\uB294 \\uC0C1\\uD0DC\\uB97C \\uAD00\\uB9AC\\uD560\\uAE4C?\"), mdx(\"p\", null, \"\\uADF8\\uAC83\\uC744 \\uAD00\\uB9AC\\uD558\\uB294 \\uAC83\\uC774 \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"State Machine\"), \"\\uC774\\uB2E4.\"), mdx(\"p\", null, \"\\uC6B0\\uC120 \\uCEF4\\uD30C\\uC77C\\uB7EC\\uB294 \"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, \"\\uAC01\\uAC01\\uC758 \\uC791\\uC5C5\\uC5D0 Label \\uC744 \\uBD99\\uC5EC \\uCC98\\uB9AC\\uD574\\uC57C\\uD560 \\uC791\\uC5C5\\uC744 \\uB098\\uB204\\uACE0 \")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, \"Label \\uD1B5\\uD574 \\uB2E4\\uC74C \\uD574\\uC57C\\uD560 \\uC791\\uC5C5\\uC744 \\uC9C0\\uC2DC\\uD55C\\uB2E4. \"))), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-kotlin\"\n  }), \"fun loginUser(userId: String, password: String, completion: Continuation<Any?>) {\\n  when(label) {\\n    0 -> { // Label 0 -> first execution\\n        userRemoteDataSource.logUserIn(userId, password)\\n    }\\n    1 -> { // Label 1 -> resumes from userRemoteDataSource\\n        userLocalDataSource.logUserIn(user)\\n    }\\n    2 -> { // Label 2 -> resumes from userLocalDataSource\\n        completion.resume(userDb)\\n    }\\n    else -> throw IllegalStateException(/* ... */)\\n  }\\n}\\n\")), mdx(\"p\", null, \"\\uADF8\\uB9AC\\uACE0 State Machine \\uC744 \\uC0DD\\uC131\\uD558\\uB294\\uB370 \\uB2E4\\uC74C\\uACFC \\uAC19\\uB2E4.\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-kotlin\"\n  }), \"fun loginUser(userId: String?, password: String?, completion: Continuation<Any?>) {\\n  \\n  class LoginUserStateMachine(\\n    // completion \\uD30C\\uB77C\\uBBF8\\uD130\\uB294 loginUser \\uD568\\uC218\\uC758 \\uCF5C\\uBC31\\uC774\\uB2E4.\\n    completion: Continuation<Any?>\\n  ): CoroutineImpl(completion) {\\n  \\n    // suspend \\uD568\\uC218\\uC758 \\uB85C\\uCEEC \\uBCC0\\uC218\\n    var user: User? = null\\n    var userDb: UserDb? = null\\n  \\n    // \\uBAA8\\uB4E0 \\uCF54\\uB8E8\\uD2F4 \\uAD6C\\uD604\\uCCB4\\uC758 \\uACF5\\uD1B5 \\uAC1D\\uCCB4\\uB4E4 \\n    var result: Any? = null\\n    var label: Int = 0\\n  \\n    // \\uC774 \\uD568\\uC218\\uB294 loginUser \\uB97C \\uB2E4\\uC2DC state machine\\uC744 \\uD2B8\\uB9AC\\uAC70\\uD569\\uB2C8\\uB2E4. (label\\uC740 \\uC774\\uBBF8 \\uB2E4\\uC74C \\uC0C1\\uD0DC\\uC785\\uB2C8\\uB2E4) \\n    // \\uADF8\\uB9AC\\uACE0 result\\uB294 \\uC774\\uC804 \\uC0C1\\uD0DC\\uC758 \\uACC4\\uC0B0 \\uACB0\\uACFC\\uC785\\uB2C8\\uB2E4.\\n    override fun invokeSuspend(result: Any?) {\\n      this.result = result\\n      loginUser(null, null, this)\\n    }\\n  }\\n  /* ... */\\n}\\n\")), mdx(\"p\", null, mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"invokeSuspend\"), \" \\uAC00 \\uC624\\uC9C1 \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Continuation\"), \" \\uAC1D\\uCCB4\\uC758 \\uC815\\uBCF4\\uB9CC \\uAC00\\uC9C0\\uACE0 \\uD638\\uCD9C\\uC774 \\uB418\\uAE30 \\uB54C\\uBB38\\uC5D0, \\uB098\\uBA38\\uC9C0 parameters (\", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"user:User?\"), \",  \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"userDb:UserDb?\"), \")\\uB4E4\\uC740 nullable\\uC774 \\uB429\\uB2C8\\uB2E4. \"), mdx(\"p\", null, \"\\uADF8\\uB807\\uAE30 \\uB54C\\uBB38\\uC5D0 \\uCEF4\\uD30C\\uC77C\\uB7EC\\uB294 state\\uAC00 \\uC5B4\\uB5BB\\uAC8C \\uBCC0\\uACBD\\uC774 \\uB418\\uB294\\uC9C0\\uC5D0 \\uB300\\uD55C \\uC815\\uBCF4\\uB4E4\\uB9CC \\uCD94\\uAC00\\uD574\\uC8FC\\uBA74 \\uB429\\uB2C8\\uB2E4. \"), mdx(\"p\", null, \"\\uADF8\\uB807\\uAE30 \\uC704\\uD574\\uC11C\\uB294 \\uC774 \\uD568\\uC218\\uAC00 \\uCD5C\\uCD08 \\uC2E4\\uD589\\uC778\\uC9C0 \\uC544\\uB2C8\\uBA74 \\uC774\\uC804 \\uC0C1\\uD0DC\\uB85C\\uBD80\\uD130 resume \\uB41C \\uD568\\uC218\\uC778\\uC9C0 \\uC54C\\uC544\\uC57C \\uD569\\uB2C8\\uB2E4.  \"), mdx(\"p\", null, \"\\uCD5C\\uCD08\\uC5D0\\uB294 \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"LoginUserStateMachine\"), \" \\uC774 \\uC778\\uC2A4\\uD134\\uC2A4 \\uB418\\uC5B4 \\uC788\\uC9C0 \\uC54A\\uAE30 \\uB54C\\uBB38\\uC5D0 \\uB2E4\\uC74C\\uCC98\\uB7FC \\uC778\\uC2A4\\uD134\\uC2A4\\uD654 \\uD560 \\uC218 \\uC788\\uC2B5\\uB2C8\\uB2E4. \"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-kotlin\"\n  }), \"fun loginUser(userId: String?, password: String?, completion: Continuation<Any?>) {\\n  /* ... */\\n  val continuation = completion as? LoginUserStateMachine ?: LoginUserStateMachine(completion)\\n  /* ... */\\n}\\n\")), mdx(\"p\", null, \"\\uCEF4\\uD30C\\uC77C\\uB7EC\\uAC00 \\uC0DD\\uC131\\uD55C \\uC0C1\\uD0DC \\uC774\\uB3D9 \\uCF54\\uB4DC\\uC640 \\uADF8\\uB4E4\\uAC04\\uC758 \\uC815\\uBCF4 \\uACF5\\uC720\\uD558\\uB294 \\uCF54\\uB4DC\\uB97C \\uBCF4\\uBA74 \\uB2E4\\uC74C\\uACFC \\uAC19\\uC2B5\\uB2C8\\uB2E4. \"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-kotlin\"\n  }), \"fun loginUser(userId: String?, password: String?, completion: Continuation<Any?>) {\\n    /* ... */\\n\\n    val continuation = completion as? LoginUserStateMachine ?: LoginUserStateMachine(completion)\\n\\n    when(continuation.label) {\\n        0 -> {\\n            // \\uC2E4\\uD328 \\uC5EC\\uBD80\\uB97C \\uCCB4\\uD06C\\uD569\\uB2C8\\uB2E4.\\n            throwOnFailure(continuation.result)\\n            // \\uB2E4\\uC74C\\uC5D0 continuation \\uC774 \\uD638\\uCD9C\\uC774 \\uB418\\uBA74 state = 1 \\uC73C\\uB85C \\uC774\\uB3D9\\uD574\\uC57C \\uD569\\uB2C8\\uB2E4.\\n            continuation.label = 1\\n              // continuation \\uAC1D\\uCCB4\\uAC00 logUserIn\\uC5D0 \\uC804\\uB2EC\\uB418\\uACE0 \\uC644\\uB8CC\\uB418\\uBA74 \\n            // state machine\\uC758 \\uC2E4\\uD589\\uC744 \\uC7AC\\uAC1C\\uD569\\uB2C8\\uB2E4\\n            userRemoteDataSource.logUserIn(userId!!, password!!, continuation)\\n        }\\n        1 -> {\\n            // \\uC2E4\\uD328 \\uC5EC\\uBD80\\uB97C \\uCCB4\\uD06C\\uD569\\uB2C8\\uB2E4. \\n            throwOnFailure(continuation.result)\\n            // \\uC774\\uC804 \\uC0C1\\uD0DC\\uC758 \\uACB0\\uACFC\\uB97C \\uAC00\\uC838\\uC635\\uB2C8\\uB2E4. \\n            continuation.user = continuation.result as User\\n            // \\uB2E4\\uC74C\\uC5D0 continuation\\uC774 \\uD638\\uCD9C\\uB418\\uBA74, state = 2 \\uB85C \\uC774\\uB3D9\\uD574\\uC57C \\uD569\\uB2C8\\uB2E4. \\n            continuation.label = 2\\n            // contination \\uAC1D\\uCCB4\\uAC00 logUserIn\\uC5D0 \\uC804\\uB2EC\\uB418\\uACE0 \\uC644\\uB8CC\\uB418\\uBA74 \\n            // state machine\\uC758 \\uC2E4\\uD589\\uC744 \\uC7AC\\uAC1C\\uD569\\uB2C8\\uB2E4. \\n            userLocalDataSource.logUserIn(continuation.user, continuation)\\n        }\\n        2 -> {\\n            // \\uC2E4\\uD328 \\uC5EC\\uBD80\\uB97C \\uCCB4\\uD06C\\uD569\\uB2C8\\uB2E4. \\n            throwOnFailure(continuation.result)\\n            // \\uC774\\uC804 \\uC0C1\\uD0DC\\uC758 \\uACB0\\uACFC\\uB97C \\uAC00\\uC838\\uC635\\uB2C8\\uB2E4. \\n            continuation.userDb = continuation.result as UserDb\\n            // \\uC774 \\uD568\\uC218\\uB97C \\uD638\\uCD9C\\uD55C \\uD568\\uC218\\uB97C \\uC7AC\\uC2E4\\uD589\\uD569\\uB2C8\\uB2E4. \\n            continuation.cont.resume(continuation.userDb)\\n        }\\n        else -> throw IllegalStateException(/* ... */)\\n    }\\n}\\n\")), mdx(\"p\", null, \"\\uC774\\uB7EC\\uD55C \\uD504\\uB85C\\uC138\\uC2A4\\uAC00 Recursive\\uD558\\uAC8C \\uC77C\\uC5B4\\uB09C\\uB2E4\\uACE0 \\uBCF4\\uC2DC\\uBA74 \\uB429\\uB2C8\\uB2E4. \"), mdx(\"h2\", {\n    \"id\": \"결론\"\n  }, \"\\uACB0\\uB860\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"suspend\"), \" \\uC9C0\\uC2DC\\uC5B4\\uB97C \\uBD99\\uC774\\uAC8C \\uB418\\uBA74 \\uCEF4\\uD30C\\uC77C\\uB7EC\\uAC00 Callback \\uC744 \\uC0DD\\uC131\\uD55C\\uB2E4\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Callback\\uC2DC \\uD544\\uC694\\uD55C \\uC815\\uBCF4\\uC640 \\uC0C1\\uD0DC \\uAD00\\uB9AC\\uB294 \", mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"State Machine\"), \" \\uC5D0 \\uC758\\uD574 \\uAD00\\uB9AC\\uB41C\\uB2E4.\")), mdx(\"h2\", {\n    \"id\": \"reference\"\n  }, \"Reference\"), mdx(\"p\", null, mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://manuelvivo.dev/suspend-modifier\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"The suspend modifier - under the hood\")));\n}\n;\nMDXContent.isMDXComponent = true;","hero":{"full":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAEDBf/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAdWlgQw//8QAGhAAAQUBAAAAAAAAAAAAAAAAAQAQEhMhI//aAAgBAQABBQKzrMoaH//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABkQAAEFAAAAAAAAAAAAAAAAACEAAQIgMf/aAAgBAQAGPwJ4gLK//8QAGhABAAIDAQAAAAAAAAAAAAAAAQARIDFRkf/aAAgBAQABPyEduhp1nB+MdDh//9oADAMBAAIAAwAAABDUz//EABYRAAMAAAAAAAAAAAAAAAAAABARYf/aAAgBAwEBPxBwf//EABURAQEAAAAAAAAAAAAAAAAAAAEQ/9oACAECAQE/EGf/xAAcEAEBAAICAwAAAAAAAAAAAAABEQAhEGFBkdH/2gAIAQEAAT8QrUCiLosO8UHY8X4d4q5FKkde8hbC8//Z","aspectRatio":1.7744360902255638,"src":"/static/ca62a29181684ca858a0fb4b20094291/58fe7/hero.jpg","srcSet":"/static/ca62a29181684ca858a0fb4b20094291/e0f30/hero.jpg 236w,\n/static/ca62a29181684ca858a0fb4b20094291/86afd/hero.jpg 472w,\n/static/ca62a29181684ca858a0fb4b20094291/58fe7/hero.jpg 944w,\n/static/ca62a29181684ca858a0fb4b20094291/02748/hero.jpg 1416w,\n/static/ca62a29181684ca858a0fb4b20094291/5c241/hero.jpg 1888w,\n/static/ca62a29181684ca858a0fb4b20094291/097fa/hero.jpg 1920w","srcWebp":"/static/ca62a29181684ca858a0fb4b20094291/99fbb/hero.webp","srcSetWebp":"/static/ca62a29181684ca858a0fb4b20094291/77392/hero.webp 236w,\n/static/ca62a29181684ca858a0fb4b20094291/1f177/hero.webp 472w,\n/static/ca62a29181684ca858a0fb4b20094291/99fbb/hero.webp 944w,\n/static/ca62a29181684ca858a0fb4b20094291/4a492/hero.webp 1416w,\n/static/ca62a29181684ca858a0fb4b20094291/b0b8f/hero.webp 1888w,\n/static/ca62a29181684ca858a0fb4b20094291/30cf3/hero.webp 1920w","sizes":"(max-width: 944px) 100vw, 944px"},"regular":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAEDBf/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAdWlgQw//8QAGhAAAQUBAAAAAAAAAAAAAAAAAQAQEhMhI//aAAgBAQABBQKzrMoaH//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABkQAAEFAAAAAAAAAAAAAAAAACEAAQIgMf/aAAgBAQAGPwJ4gLK//8QAGhABAAIDAQAAAAAAAAAAAAAAAQARIDFRkf/aAAgBAQABPyEduhp1nB+MdDh//9oADAMBAAIAAwAAABDUz//EABYRAAMAAAAAAAAAAAAAAAAAABARYf/aAAgBAwEBPxBwf//EABURAQEAAAAAAAAAAAAAAAAAAAEQ/9oACAECAQE/EGf/xAAcEAEBAAICAwAAAAAAAAAAAAABEQAhEGFBkdH/2gAIAQEAAT8QrUCiLosO8UHY8X4d4q5FKkde8hbC8//Z","aspectRatio":1.7717391304347827,"src":"/static/ca62a29181684ca858a0fb4b20094291/1dc0b/hero.jpg","srcSet":"/static/ca62a29181684ca858a0fb4b20094291/3a5ce/hero.jpg 163w,\n/static/ca62a29181684ca858a0fb4b20094291/05730/hero.jpg 327w,\n/static/ca62a29181684ca858a0fb4b20094291/1dc0b/hero.jpg 653w,\n/static/ca62a29181684ca858a0fb4b20094291/f72c7/hero.jpg 980w,\n/static/ca62a29181684ca858a0fb4b20094291/6e4a3/hero.jpg 1306w,\n/static/ca62a29181684ca858a0fb4b20094291/097fa/hero.jpg 1920w","srcWebp":"/static/ca62a29181684ca858a0fb4b20094291/0acdf/hero.webp","srcSetWebp":"/static/ca62a29181684ca858a0fb4b20094291/ac59e/hero.webp 163w,\n/static/ca62a29181684ca858a0fb4b20094291/7660b/hero.webp 327w,\n/static/ca62a29181684ca858a0fb4b20094291/0acdf/hero.webp 653w,\n/static/ca62a29181684ca858a0fb4b20094291/75470/hero.webp 980w,\n/static/ca62a29181684ca858a0fb4b20094291/68d47/hero.webp 1306w,\n/static/ca62a29181684ca858a0fb4b20094291/30cf3/hero.webp 1920w","sizes":"(max-width: 653px) 100vw, 653px"},"narrow":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAEDBf/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAdWlgQw//8QAGhAAAQUBAAAAAAAAAAAAAAAAAQAQEhMhI//aAAgBAQABBQKzrMoaH//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABkQAAEFAAAAAAAAAAAAAAAAACEAAQIgMf/aAAgBAQAGPwJ4gLK//8QAGhABAAIDAQAAAAAAAAAAAAAAAQARIDFRkf/aAAgBAQABPyEduhp1nB+MdDh//9oADAMBAAIAAwAAABDUz//EABYRAAMAAAAAAAAAAAAAAAAAABARYf/aAAgBAwEBPxBwf//EABURAQEAAAAAAAAAAAAAAAAAAAEQ/9oACAECAQE/EGf/xAAcEAEBAAICAwAAAAAAAAAAAAABEQAhEGFBkdH/2gAIAQEAAT8QrUCiLosO8UHY8X4d4q5FKkde8hbC8//Z","aspectRatio":1.78125,"src":"/static/ca62a29181684ca858a0fb4b20094291/eaa58/hero.jpg","srcSet":"/static/ca62a29181684ca858a0fb4b20094291/5a3ee/hero.jpg 114w,\n/static/ca62a29181684ca858a0fb4b20094291/41f8f/hero.jpg 229w,\n/static/ca62a29181684ca858a0fb4b20094291/eaa58/hero.jpg 457w,\n/static/ca62a29181684ca858a0fb4b20094291/c309b/hero.jpg 686w,\n/static/ca62a29181684ca858a0fb4b20094291/e3008/hero.jpg 914w,\n/static/ca62a29181684ca858a0fb4b20094291/097fa/hero.jpg 1920w","srcWebp":"/static/ca62a29181684ca858a0fb4b20094291/15384/hero.webp","srcSetWebp":"/static/ca62a29181684ca858a0fb4b20094291/31fce/hero.webp 114w,\n/static/ca62a29181684ca858a0fb4b20094291/e3e25/hero.webp 229w,\n/static/ca62a29181684ca858a0fb4b20094291/15384/hero.webp 457w,\n/static/ca62a29181684ca858a0fb4b20094291/0258d/hero.webp 686w,\n/static/ca62a29181684ca858a0fb4b20094291/64ea2/hero.webp 914w,\n/static/ca62a29181684ca858a0fb4b20094291/30cf3/hero.webp 1920w","sizes":"(max-width: 457px) 100vw, 457px"},"seo":{"src":"/static/ca62a29181684ca858a0fb4b20094291/0ff54/hero.jpg"}}},{"id":"e9aa9c50-3431-5e71-b5f2-994b7f0a4074","slug":"/garbage-collection-(-)","secret":false,"title":"Garbage Collection (가비지 컬렉션)","author":"Reno Kim","date":"December 23rd, 2020","dateForSEO":"2020-12-23T00:00:00.000Z","timeToRead":2,"excerpt":"가비지 컬렉션에 대해 공부한 내용을 정리하였습니다.","canonical_url":null,"subscription":true,"body":"function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"title\": \"Garbage Collection (가비지 컬렉션)\",\n  \"author\": \"Reno Kim\",\n  \"date\": \"2020-12-23T00:00:00.000Z\",\n  \"hero\": \"./images/hero.jpg\",\n  \"excerpt\": \"가비지 컬렉션에 대해 공부한 내용을 정리하였습니다.\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, [\"components\"]);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h1\", {\n    \"id\": \"garbage-collection-memory\"\n  }, \"Garbage Collection (Memory)\"), mdx(\"h2\", {\n    \"id\": \"jvm-이란\"\n  }, \"JVM \\uC774\\uB780?\"), mdx(\"p\", null, \"\\uC790\\uBC14 \\uD504\\uB85C\\uADF8\\uB7A8\\uC758 \\uBC94\\uC8FC\\uC5D0 \\uB4E4\\uC5B4\\uAC00\\uB294 \\uBAA8\\uB4E0 \\uAC83\\uB4E4\\uC744 \\uC2E4\\uD589\\uC2DC\\uD0A4\\uB294 \\uAE30\\uBCF8 \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"\\uB370\\uBAAC\")), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {}), \"\\uB370\\uBAAC \\n\\uBA40\\uD2F0\\uD0DC\\uC2A4\\uD0B9 \\uC6B4\\uC601 \\uCCB4\\uC81C\\uC5D0\\uC11C \\uC0AC\\uC6A9\\uC790\\uAC00 \\uC9C1\\uC811\\uC801\\uC73C\\uB85C \\uC81C\\uC5B4\\uD558\\uC9C0 \\uC54A\\uACE0, \\uBC31\\uADF8\\uB77C\\uC6B4\\uB4DC\\uC5D0\\uC11C \\uB3CC\\uBA74\\uC11C \\uC5EC\\uB7EC \\uC791\\uC5C5\\uC744 \\uD558\\uB294 \\uD504\\uB85C\\uADF8\\uB7A8\\n\")), mdx(\"h2\", {\n    \"id\": \"java-프로그램을-실행한다-의-의미\"\n  }, \"\\u201CJava \\uD504\\uB85C\\uADF8\\uB7A8\\uC744 \\uC2E4\\uD589\\uD55C\\uB2E4\\u201D \\uC758 \\uC758\\uBBF8\"), mdx(\"p\", null, \"\\uCEF4\\uD30C\\uC77C \\uACFC\\uC815\\uC744 \\uD1B5\\uD558\\uC5EC \\uC0DD\\uC131\\uB41C Class \\uD30C\\uC77C\\uC744 JVM \\uC73C\\uB85C \\uB85C\\uB529\\uD558\\uACE0 ByteCode\\uB97C \\uD574\\uC11D(interpret)\\uD558\\uB294 \\uACFC\\uC815\\uC744 \\uAC70\\uCCD0 \\uBA54\\uBAA8\\uB9AC \\uB4F1\\uC758 \\uB9AC\\uC18C\\uC2A4\\uB97C \\uD560\\uB2F9\\uD558\\uACE0 \\uAD00\\uB9AC\\uD558\\uBA70 \\uC815\\uBCF4\\uB97C \\uCC98\\uB9AC\\uD558\\uB294 \\uC77C\\uB828\\uC758 \\uC791\\uC5C5\"), mdx(\"p\", null, mdx(\"img\", _extends({\n    parentName: \"p\"\n  }, {\n    \"src\": \"https://t1.daumcdn.net/cfile/tistory/99DD604A5BC7562711\",\n    \"alt\": \"image\"\n  }))), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Java Source\"), \": \\uC0AC\\uC6A9\\uC790\\uAC00 \\uC791\\uC131\\uD55C Java \\uCF54\\uB4DC\\uC774\\uB2E4\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Java Compiler\"), \": Java Source \\uD30C\\uC77C\\uC744 JVM\\uC774 \\uD574\\uC11D\\uD560 \\uC218 \\uC788\\uB294 Java Byte Code\\uB85C \\uBCC0\\uACBD\\uD55C\\uB2E4.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Java Byte Code\"), \": Java Compiler\\uC5D0 \\uC758\\uD574 \\uC218\\uD589\\uB420 \\uACB0\\uACFC\\uBB3C\\uC774\\uB2E4(\\uD655\\uC7A5\\uC790 .class \\uD30C\\uC77C)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Class Loader\"), \": JVM \\uB0B4\\uB85C .class \\uD30C\\uC77C\\uB4E4\\uC744 Load\\uD558\\uC5EC Loading\\uB41C \\uD074\\uB798\\uC2A4\\uB4E4\\uC744 Runtime Data Area\\uC5D0 \\uBC30\\uCE58\\uB41C\\uB2E4.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Execution Engine\"), \": Loading\\uB41C \\uD074\\uB798\\uC2A4\\uC758 Bytecode\\uB97C \\uD574\\uC11D(interpret)\\uD55C\\uB2E4.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Runtime Data Area\"), \": JVM\\uC774\\uB77C\\uB294 \\uD504\\uB85C\\uC138\\uC2A4\\uAC00 \\uD504\\uB85C\\uADF8\\uB7A8\\uC744 \\uC218\\uD589\\uD558\\uAE30 \\uC704\\uD574 OS\\uC5D0\\uC11C \\uD560\\uB2F9\\uBC1B\\uC740 \", mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"\\uBA54\\uBAA8\\uB9AC \\uACF5\\uAC04\"), \"\\uC774\\uB2E4.\")), mdx(\"h2\", {\n    \"id\": \"runtime-data-area\"\n  }, \"Runtime Data Area\"), mdx(\"p\", null, mdx(\"img\", _extends({\n    parentName: \"p\"\n  }, {\n    \"src\": \"https://t1.daumcdn.net/cfile/tistory/99423C425BC7564C1D\",\n    \"alt\": \"https://t1.daumcdn.net/cfile/tistory/99423C425BC7564C1D\"\n  }))), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Method Area:\"), \"\\xA0\\uD074\\uB798\\uC2A4, \\uBCC0\\uC218, Method, static\\uBCC0\\uC218, \\uC0C1\\uC218 \\uC815\\uBCF4 \\uB4F1\\uC774 \\uC800\\uC7A5\\uB418\\uB294 \\uC601\\uC5ED (\\uBAA8\\uB4E0 Thread\\uAC00 \\uACF5\\uC720)\", mdx(\"ul\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"\\uC800\\uC7A5\\uD558\\uB294 \\uC815\\uBCF4\\uB4E4\", mdx(\"ol\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Type(Class, Interface) Information\"), \" \", mdx(\"ul\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Type\\uC758 \\uC804\\uCCB4 \\uC774\\uB984 (\\uD328\\uD0A4\\uC9C0\\uBA85 + \\uD074\\uB798\\uC2A4\\uBA85)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Type\\uC758 \\uC9C1\\uACC4 \\uD558\\uC704 \\uD074\\uB798\\uC2A4 \\uC804\\uCCB4 \\uC774\\uB984\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Type\\uC758 \\uD074\\uB798\\uC2A4 / \\uC778\\uD130\\uD398\\uC774\\uC2A4 \\uC5EC\\uBD80\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Type\\uC758 modifier (public / abstract / final)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"\\uC5F0\\uAD00\\uB41C \\uC778\\uD130\\uD398\\uC774\\uC2A4 \\uC774\\uB984 \\uB9AC\\uC2A4\\uD2B8\"))), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Runtime Constant pool (Type \\uC758 \\uBAA8\\uB4E0 \\uC0C1\\uC218 \\uC815\\uBCF4)\"), mdx(\"ul\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Type, Field, Method\\uB85C\\uC758 \\uBAA8\\uB4E0 Symbolic Reference \\uC815\\uBCF4\\uB97C \\uD3EC\\uD568\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Constant Pool\\uC758 Entry\\uB294 \\uBC30\\uC5F4\\uACFC \\uAC19\\uC774 \\uC778\\uB371\\uC2A4 \\uBC88\\uD638\\uB97C \\uD1B5\\uD574 \\uC811\\uADFC\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Object\\uC758 \\uC811\\uADFC \\uB4F1 \\uBAA8\\uB4E0 \\uCC38\\uC870\\uB97C \\uC704\\uD55C \\uD575\\uC2EC \\uC694\\uC18C\"))), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Field Information (\\uC778\\uC2A4\\uD134\\uC2A4 \\uBCC0\\uC218)\"), mdx(\"ul\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Field Type\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Field modifier (public / private / protected / static / final / volatile / transient)\"))), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Method Information (Constructor\\uB97C \\uD3EC\\uD568\\uD55C \\uBAA8\\uB4E0 \\uBA54\\uC18C\\uB4DC)\"), mdx(\"ul\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Method Name\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Method Return Type\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Method Parameter \\uC218\\uC640 Type\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Method modifier (public / private / protected / static / final / syncronized / native / abstract)Method \\uAD6C\\uD604 \\uBD80\\uBD84\\uC774 \\uC788\\uC744 \\uACBD\\uC6B0 ( abstract \\uB610\\uB294 native \\uAC00 \\uC544\\uB2D0 \\uACBD\\uC6B0 )\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Method\\uC758 byteCode\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Method\\uC758 Stack Frame\\uC758 Operand Stack \\uBC0F Local variable section\\uC758 \\uD06C\\uAE30\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Exception Table\"))), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Class Variable (static \\uD0A4\\uC6CC\\uB4DC\\uB85C \\uC120\\uC5B8\\uB41C \\uBCC0\\uC218)\"), mdx(\"ul\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"\\uBAA8\\uB4E0 \\uC778\\uC2A4\\uD134\\uC2A4\\uC5D0 \\uACF5\\uC720 \\uB418\\uBA70 \\uC778\\uC2A4\\uD134\\uC2A4\\uAC00 \\uC5C6\\uC5B4\\uB3C4 \\uC9C1\\uC811 \\uC811\\uADFC\\uC774 \\uAC00\\uB2A5\\uD558\\uB2E4.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"\\uC774 \\uBCC0\\uC218\\uB294 \\uC778\\uC2A4\\uD134\\uC2A4\\uC758 \\uAC83\\uC774 \\uC544\\uB2C8\\uB77C \\uD074\\uB798\\uC2A4\\uC5D0 \\uC18D\\uD558\\uAC8C \\uB41C\\uB2E4.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"\\uD074\\uB798\\uC2A4\\uB97C \\uC0AC\\uC6A9 \\uD558\\uAE30 \\uC774\\uC804\\uC5D0 \\uC774 \\uBCC0\\uC218\\uB4E4\\uC740 \\uBBF8\\uB9AC \\uBA54\\uBAA8\\uB9AC\\uB97C \\uD560\\uB2F9 \\uBC1B\\uC544 \\uC788\\uB294 \\uC0C1\\uD0DC\\uAC00 \\uB41C\\uB2E4.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"final class \\uBCC0\\uC218\\uB294 \\uC0C1\\uC218\\uB85C \\uCE58\\uD658 \\uB418\\uC5B4 Runtime Constant Pool\\uC5D0 \\uAC12\\uC744 \\uBCF5\\uC0AC\\uD55C\\uB2E4.\"))))))), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Heap Area:\"), \"\\xA0new \\uBA85\\uB839\\uC5B4\\uB85C \\uC0DD\\uC131\\uB41C \\uC778\\uC2A4\\uD134\\uC2A4\\uC640 \\uAC1D\\uCCB4\\uAC00 \\uC800\\uC7A5\\uB418\\uB294 \\uAD6C\\uC5ED(Garbage Collection \\uC774\\uC288\\uB294 \\uC774 \\uC601\\uC5ED\\uC5D0\\uC11C \\uC77C\\uC5B4\\uB098\\uBA70, \\uBAA8\\uB4E0 Thread\\uAC00 \\uACF5\\uC720)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Stack Area:\"), \"\\xA0Method \\uB0B4\\uC5D0\\uC11C \\uC0AC\\uC6A9\\uB418\\uB294 \\uAC12\\uB4E4(\\uB9E4\\uAC1C\\uBCC0\\uC218, \\uC9C0\\uC5ED\\uBCC0\\uC218, \\uB9AC\\uD134\\uAC12 \\uB4F1)\\uC774 \\uC800\\uC7A5\\uB418\\uB294 \\uAD6C\\uC5ED\\uC73C\\uB85C \\uBA54\\uC18C\\uB4DC\\uAC00 \\uD638\\uCD9C\\uB420\\uB54C LIFO\\uB85C \\uD558\\uB098\\uC529 \\uC0DD\\uC131\\uB418\\uACE0, \\uBA54\\uC18C\\uB4DC \\uC2E4\\uD589\\uC774 \\uC644\\uB8CC\\uB418\\uBA74 LIFO\\uB85C \\uD558\\uB098\\uC529 \\uC9C0\\uC6CC\\uC9C4\\uB2E4. (\\uAC01 Thread\\uBCC4\\uB85C \\uD558\\uB098\\uC529 \\uC0DD\\uC131)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"PC Register:\"), \"\\xA0CPU\\uC758 Register\\uC640 \\uC5ED\\uD560\\uC774 \\uBE44\\uC2B7\\uD558\\uB2E4. \\uD604\\uC7AC \\uC218\\uD589 \\uC911\\uC778 JVM \\uBA85\\uB839\\uC758 \\uC8FC\\uC18C \\uAC12\\uC774 \\uC800\\uC7A5\\uB41C\\uB2E4. (\\uAC01 Thread\\uBCC4\\uB85C \\uD558\\uB098\\uC529 \\uC0DD\\uC131)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Native Method Stack:\"), \"\\xA0\\uB2E4\\uB978 \\uC5B8\\uC5B4(C/C++\\xA0\\uB4F1)\\uC758 \\uBA54\\uC18C\\uB4DC \\uD638\\uCD9C\\uC744 \\uC704\\uD574 \\uD560\\uB2F9\\uB418\\uB294 \\uAD6C\\uC5ED\\uC73C\\uB85C \\uC5B8\\uC5B4\\uC5D0 \\uB9DE\\uAC8C Stack\\uC774 \\uD615\\uC131\\uB418\\uB294 \\uAD6C\\uC5ED\\uC774\\uB2E4\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"\\uD504\\uB85C\\uADF8\\uB7A8 \\uCE74\\uC6B4\\uD130(Program counter, PC)\"), \" \\uB294 \\uB9C8\\uC774\\uD06C\\uB85C\\uD504\\uB85C\\uC138\\uC11C(\\uC911\\uC559 \\uCC98\\uB9AC \\uC7A5\\uCE58) \\uB0B4\\uBD80\\uC5D0 \\uC788\\uB294 \\uB808\\uC9C0\\uC2A4\\uD130 \\uC911\\uC758 \\uD558\\uB098\\uB85C\\uC11C, \\uB2E4\\uC74C\\uC5D0 \\uC2E4\\uD589\\uB420 \\uBA85\\uB839\\uC5B4\\uC758 \\uC8FC\\uC18C\\uB97C \\uAC00\\uC9C0\\uACE0 \\uC788\\uC5B4 \\uC2E4\\uD589\\uD560 \\uAE30\\uACC4\\uC5B4 \\uCF54\\uB4DC\\uC758 \\uC704\\uCE58\\uB97C \\uC9C0\\uC815\\uD55C\\uB2E4. \\uB54C\\uBB38\\uC5D0 \\u201C\\uBA85\\uB839\\uC5B4 \\uD3EC\\uC778\\uD130\\u201D \\uB77C\\uACE0\\uB3C4 \\uD55C\\uB2E4.\"), mdx(\"h2\", {\n    \"id\": \"jvm-heap-structure\"\n  }, \"JVM Heap Structure\"), mdx(\"p\", null, mdx(\"img\", _extends({\n    parentName: \"p\"\n  }, {\n    \"src\": \"https://t1.daumcdn.net/cfile/tistory/99423C425BC7564C1D\",\n    \"alt\": \"image2\"\n  }))), mdx(\"hr\", null), mdx(\"h1\", {\n    \"id\": \"garbage-collection-hotspot-jvm\"\n  }, \"Garbage Collection (Hotspot JVM)\"), mdx(\"h2\", {\n    \"id\": \"정의\"\n  }, \"\\uC815\\uC758\"), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, \"The garbage collector (GC) automatically manages the application\\u2019s dynamic memory allocation requests.\")), mdx(\"h2\", {\n    \"id\": \"역할\"\n  }, mdx(\"strong\", {\n    parentName: \"h2\"\n  }, \"\\uC5ED\\uD560\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"\\uD799(heap) \\uB0B4\\uC758 \\uAC1D\\uCCB4 \\uC911\\uC5D0\\uC11C \\uAC00\\uBE44\\uC9C0(garbage)\\uB97C \\uCC3E\\uC544\\uB0B8\\uB2E4\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"\\uCC3E\\uC544\\uB0B8 \\uAC00\\uBE44\\uC9C0\\uB97C \\uCC98\\uB9AC\\uD574\\uC11C \\uD799\\uC758 \\uBA54\\uBAA8\\uB9AC\\uB97C \\uD68C\\uC218\\uD55C\\uB2E4\")), mdx(\"h2\", {\n    \"id\": \"gc-알고리즘\"\n  }, \"GC \\uC54C\\uACE0\\uB9AC\\uC998\"), mdx(\"h3\", {\n    \"id\": \"gc-root\"\n  }, \"GC Root\"), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, \"GC\\uB97C \\uC704\\uD55C \\uD2B9\\uBCC4\\uD55C \\uAC1D\\uCCB4\\n\\uAC1D\\uCCB4\\uAC00 \\uC0B4\\uC544\\uC788\\uC74C\\uC744 \\uBCF4\\uC7A5\\uD55C\\uB2E4\")), mdx(\"p\", null, \"ex) Class, Thread, Stack Local, JNI Local, JNI Global, Monitor Used, Held by JVM\"), mdx(\"p\", null, mdx(\"img\", _extends({\n    parentName: \"p\"\n  }, {\n    \"src\": \"https://image.slidesharecdn.com/gcalgorithms-130706151142-phpapp02/95/gc-algorithms-37-638.jpg?cb=1373123601\",\n    \"alt\": \"https://image.slidesharecdn.com/gcalgorithms-130706151142-phpapp02/95/gc-algorithms-37-638.jpg?cb=1373123601\"\n  }))), mdx(\"h2\", {\n    \"id\": \"reachability\"\n  }, mdx(\"strong\", {\n    parentName: \"h2\"\n  }, \"Reachability\")), mdx(\"p\", null, mdx(\"img\", _extends({\n    parentName: \"p\"\n  }, {\n    \"src\": \"https://d2.naver.com/content/images/2015/06/helloworld-329631-2.png\",\n    \"alt\": \"https://d2.naver.com/content/images/2015/06/helloworld-329631-2.png\"\n  }))), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"\\uC5B4\\uB5A4 \\uAC1D\\uCCB4\\uAC00 \\uC720\\uD6A8\\uD55C \\uCC38\\uC870\\uAC00 \\uC788\\uC744 \\uACBD\\uC6B0 - \\u2018reachable\\u2019\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"\\uC5B4\\uB5A4 \\uAC1D\\uCCB4\\uAC00 \\uC720\\uD6A8\\uD55C \\uCC38\\uC870\\uAC00 \\uC5C6\\uB294 \\uACBD\\uC6B0 - \\u2018unreachable\\u2019\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"\\uC720\\uD6A8\\uD55C \\uCD5C\\uCD08 \\uCC38\\uC870 - \\u2018root set\\u2019\")), mdx(\"h2\", {\n    \"id\": \"reference--reachability\"\n  }, mdx(\"strong\", {\n    parentName: \"h2\"\n  }, \"Reference & Reachability\")), mdx(\"p\", null, mdx(\"img\", _extends({\n    parentName: \"p\"\n  }, {\n    \"src\": \"https://d2.naver.com/content/images/2015/06/helloworld-329631-5.png\",\n    \"alt\": \"https://d2.naver.com/content/images/2015/06/helloworld-329631-5.png\"\n  }))), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Strong Reachable Object\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Weakly Reachable Object (GC \\uB300\\uC0C1)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Unreachable Objects (GC \\uB300\\uC0C1)\")), mdx(\"h2\", {\n    \"id\": \"strengths-of-reachability\"\n  }, mdx(\"strong\", {\n    parentName: \"h2\"\n  }, \"Strengths of Reachability\")), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Name\"), mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"\\uCC38\\uC870 \\uBC29\\uC2DD\"), mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"\\uBA54\\uBAA8\\uB9AC \\uD574\\uC81C \\uC2DC\\uC810\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Strongly Reachable\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"root set \\u2192 reference object\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"\\uC9C1\\uC811 \\uD574\\uC81C (set null)\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Soflty Reachable\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"soft reference \\u2192 reference object\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Out of Memory \\uC5D0\\uB9CC \\uBC18\\uD658\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Weakly Reachable\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"weak reference \\u2192 reference object\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"GC \\uC2E4\\uD589\\uC2DC\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Phantom Reachable\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"phantom reference \\u2192 reference object\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"\\uC774\\uBBF8 \\uD574\\uC81C\\uB41C(finalize \\uD638\\uCD9C \\uC774\\uD6C4) object\\uB97C \\uCC38\\uC870\\uD55C \\uAC1D\\uCCB4\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"UnReachable\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"reference object\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"GC \\uC2E4\\uD589\\uC2DC\")))), mdx(\"h2\", {\n    \"id\": \"gc의-종류\"\n  }, \"GC\\uC758 \\uC885\\uB958\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Name\"), mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Characteristic\"), mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"\\uC801\\uD569\\uD55C \\uD658\\uACBD\"), mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Young Generation\"), mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Old Generation\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Serial Collector\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"\\uC2F1\\uAE00 \\uC2A4\\uB808\\uB4DC\\uB85C \\uC218\\uD589\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"- \\uC2F1\\uAE00 \\uD504\\uB85C\\uC138\\uC11C \\uC2DC\\uC2A4\\uD15C - \\uC18C\\uD615 \\uB370\\uC774\\uD130\\uC14B (100MB) \\uBA40\\uD2F0 \\uD504\\uB85C\\uC138\\uC11C \\uD658\\uACBD\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Serial\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Mark-Sweep-Compact\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Parallel Collector\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"1. Minor Collection \\uC744 \\uBCD1\\uB82C\\uB85C \\uCC98\\uB9AC \\u2192 GC \\uC624\\uBC84\\uD5E4\\uB4DC \\uC904\\uC784\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"- \\uC911\\uB300\\uD615 \\uADDC\\uBAA8 \\uB370\\uC774\\uD130\\uC14B\\uC744 \\uB2E4\\uB8E8\\uB294 \\uBA40\\uD2F0 \\uD504\\uB85C\\uC138\\uC11C \\uD658\\uACBD\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Parallel Scavenge\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Mark-Sweep-Compact\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Concurrent Mark Sweep Collector\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"2. Parallel Compaction \\u2192 Major Collection \\uC774 \\uBCD1\\uB82C \\uCC98\\uB9AC\\uD574\\uC8FC\\uB294 \\uAE30\\uB2A5\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"1. \\uC77C\\uC2DC \\uC815\\uC9C0\\uAC00 \\uC9E7\\uC544\\uC57C \\uD558\\uB294 \\uD504\\uB85C\\uADF8\\uB7A8 2. heap \\uBA54\\uBAA8\\uB9AC\\uAC00 \\uD074 \\uB54C\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Parallel\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Mark-Sweep\")))), mdx(\"h1\", {\n    \"id\": \"reference\"\n  }, \"Reference\"), mdx(\"p\", null, mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://jungwoon.github.io/java,%20gc/2019/07/27/Garbage-Collection/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uAC00\\uBE44\\uC9C0 \\uCEEC\\uB809\\uC158(Garbage Collection)\")), mdx(\"p\", null, mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://d2.naver.com/helloworld/329631\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"NAVER D2\")), mdx(\"p\", null, mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://www.oracle.com/technetwork/java/javase/tech/memorymanagement-whitepaper-1-150020.pdf\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"memorymanagement-whitepaper-1-150020.pdf\")), mdx(\"p\", null, mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://www.oracle.com/java/technologies/javase/javase-core-technologies-apis.html\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }))), mdx(\"p\", null, mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://12bme.tistory.com/382\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"[JVM Internal] JVM \\uBA54\\uBAA8\\uB9AC \\uAD6C\\uC870\")), mdx(\"p\", null, mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://www.holaxprogramming.com/2013/07/16/java-jvm-runtime-data-area/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"JVM\\uC758 Runtime Data Area\")), mdx(\"p\", null, mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://lazymankook.tistory.com/83\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"Garbage Collection (Hotspot JVM GC)\")), mdx(\"p\", null, mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://5dol.tistory.com/183\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"JVM GC\\uC640 \\uBA54\\uBAA8\\uB9AC \\uD29C\\uB2DD (\\uC870\\uB300\\uD611)\")), mdx(\"p\", null, mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://frontjang.info/entry/javalangref-1-SoftRerefence-WeakReference-PhantomReference\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"java.lang.ref #1. Object Reachability\\uB780?\")), mdx(\"p\", null, mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://tourspace.tistory.com/42\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"Java\\uC758 \\uBA54\\uBAA8\\uB9AC \\uAD00\\uB9AC - Weak, Soft, Phantom reference \\uC608\\uC81C\")), mdx(\"p\", null, mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://www.yourkit.com/docs/java/help/gc_roots.jsp\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"GC roots\")), mdx(\"p\", null, mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://ionutbalosin.com/2019/12/jvm-garbage-collectors-benchmarks-report-19-12/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"JVM Garbage Collectors Benchmarks Report 19.12\")));\n}\n;\nMDXContent.isMDXComponent = true;","hero":{"full":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAQF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAAB01IjXD//xAAZEAADAQEBAAAAAAAAAAAAAAAAAQIREgP/2gAIAQEAAQUCVUzbK9Kl8ycSYj//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAbEAACAwADAAAAAAAAAAAAAAAAARExMiKRsf/aAAgBAQAGPwJcrRfhCcmUZXRR/8QAHRAAAgEEAwAAAAAAAAAAAAAAAAEhEDFhkRFR0f/aAAgBAQABPyGYOpHaMGbsR0u2jm8KKSLJo//aAAwDAQACAAMAAAAQAA//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/ED//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/ED//xAAdEAEAAgEFAQAAAAAAAAAAAAABABFhITFRcfDx/9oACAEBAAE/ELeBZBVYMzfjiKgVDQvrSLlVXdTPhIJQTAn/2Q==","aspectRatio":1.7744360902255638,"src":"/static/7bcc55522b6aa6e76745fc58620e4691/58fe7/hero.jpg","srcSet":"/static/7bcc55522b6aa6e76745fc58620e4691/e0f30/hero.jpg 236w,\n/static/7bcc55522b6aa6e76745fc58620e4691/86afd/hero.jpg 472w,\n/static/7bcc55522b6aa6e76745fc58620e4691/58fe7/hero.jpg 944w,\n/static/7bcc55522b6aa6e76745fc58620e4691/02748/hero.jpg 1416w,\n/static/7bcc55522b6aa6e76745fc58620e4691/5c241/hero.jpg 1888w,\n/static/7bcc55522b6aa6e76745fc58620e4691/097fa/hero.jpg 1920w","srcWebp":"/static/7bcc55522b6aa6e76745fc58620e4691/99fbb/hero.webp","srcSetWebp":"/static/7bcc55522b6aa6e76745fc58620e4691/77392/hero.webp 236w,\n/static/7bcc55522b6aa6e76745fc58620e4691/1f177/hero.webp 472w,\n/static/7bcc55522b6aa6e76745fc58620e4691/99fbb/hero.webp 944w,\n/static/7bcc55522b6aa6e76745fc58620e4691/4a492/hero.webp 1416w,\n/static/7bcc55522b6aa6e76745fc58620e4691/b0b8f/hero.webp 1888w,\n/static/7bcc55522b6aa6e76745fc58620e4691/30cf3/hero.webp 1920w","sizes":"(max-width: 944px) 100vw, 944px"},"regular":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAQF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAAB01IjXD//xAAZEAADAQEBAAAAAAAAAAAAAAAAAQIREgP/2gAIAQEAAQUCVUzbK9Kl8ycSYj//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAbEAACAwADAAAAAAAAAAAAAAAAARExMiKRsf/aAAgBAQAGPwJcrRfhCcmUZXRR/8QAHRAAAgEEAwAAAAAAAAAAAAAAAAEhEDFhkRFR0f/aAAgBAQABPyGYOpHaMGbsR0u2jm8KKSLJo//aAAwDAQACAAMAAAAQAA//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/ED//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/ED//xAAdEAEAAgEFAQAAAAAAAAAAAAABABFhITFRcfDx/9oACAEBAAE/ELeBZBVYMzfjiKgVDQvrSLlVXdTPhIJQTAn/2Q==","aspectRatio":1.7717391304347827,"src":"/static/7bcc55522b6aa6e76745fc58620e4691/1dc0b/hero.jpg","srcSet":"/static/7bcc55522b6aa6e76745fc58620e4691/3a5ce/hero.jpg 163w,\n/static/7bcc55522b6aa6e76745fc58620e4691/05730/hero.jpg 327w,\n/static/7bcc55522b6aa6e76745fc58620e4691/1dc0b/hero.jpg 653w,\n/static/7bcc55522b6aa6e76745fc58620e4691/f72c7/hero.jpg 980w,\n/static/7bcc55522b6aa6e76745fc58620e4691/6e4a3/hero.jpg 1306w,\n/static/7bcc55522b6aa6e76745fc58620e4691/097fa/hero.jpg 1920w","srcWebp":"/static/7bcc55522b6aa6e76745fc58620e4691/0acdf/hero.webp","srcSetWebp":"/static/7bcc55522b6aa6e76745fc58620e4691/ac59e/hero.webp 163w,\n/static/7bcc55522b6aa6e76745fc58620e4691/7660b/hero.webp 327w,\n/static/7bcc55522b6aa6e76745fc58620e4691/0acdf/hero.webp 653w,\n/static/7bcc55522b6aa6e76745fc58620e4691/75470/hero.webp 980w,\n/static/7bcc55522b6aa6e76745fc58620e4691/68d47/hero.webp 1306w,\n/static/7bcc55522b6aa6e76745fc58620e4691/30cf3/hero.webp 1920w","sizes":"(max-width: 653px) 100vw, 653px"},"narrow":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAQF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAAB01IjXD//xAAZEAADAQEBAAAAAAAAAAAAAAAAAQIREgP/2gAIAQEAAQUCVUzbK9Kl8ycSYj//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAbEAACAwADAAAAAAAAAAAAAAAAARExMiKRsf/aAAgBAQAGPwJcrRfhCcmUZXRR/8QAHRAAAgEEAwAAAAAAAAAAAAAAAAEhEDFhkRFR0f/aAAgBAQABPyGYOpHaMGbsR0u2jm8KKSLJo//aAAwDAQACAAMAAAAQAA//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/ED//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/ED//xAAdEAEAAgEFAQAAAAAAAAAAAAABABFhITFRcfDx/9oACAEBAAE/ELeBZBVYMzfjiKgVDQvrSLlVXdTPhIJQTAn/2Q==","aspectRatio":1.78125,"src":"/static/7bcc55522b6aa6e76745fc58620e4691/eaa58/hero.jpg","srcSet":"/static/7bcc55522b6aa6e76745fc58620e4691/5a3ee/hero.jpg 114w,\n/static/7bcc55522b6aa6e76745fc58620e4691/41f8f/hero.jpg 229w,\n/static/7bcc55522b6aa6e76745fc58620e4691/eaa58/hero.jpg 457w,\n/static/7bcc55522b6aa6e76745fc58620e4691/c309b/hero.jpg 686w,\n/static/7bcc55522b6aa6e76745fc58620e4691/e3008/hero.jpg 914w,\n/static/7bcc55522b6aa6e76745fc58620e4691/097fa/hero.jpg 1920w","srcWebp":"/static/7bcc55522b6aa6e76745fc58620e4691/15384/hero.webp","srcSetWebp":"/static/7bcc55522b6aa6e76745fc58620e4691/31fce/hero.webp 114w,\n/static/7bcc55522b6aa6e76745fc58620e4691/e3e25/hero.webp 229w,\n/static/7bcc55522b6aa6e76745fc58620e4691/15384/hero.webp 457w,\n/static/7bcc55522b6aa6e76745fc58620e4691/0258d/hero.webp 686w,\n/static/7bcc55522b6aa6e76745fc58620e4691/64ea2/hero.webp 914w,\n/static/7bcc55522b6aa6e76745fc58620e4691/30cf3/hero.webp 1920w","sizes":"(max-width: 457px) 100vw, 457px"},"seo":{"src":"/static/7bcc55522b6aa6e76745fc58620e4691/0ff54/hero.jpg"}}},{"id":"a404ae21-73ea-5be6-9ef5-3625b94b35d7","slug":"/virtual-memory-(linux-)","secret":false,"title":"Virtual Memory (Linux 가상 메모리)","author":"Reno Kim","date":"December 20th, 2020","dateForSEO":"2020-12-20T00:00:00.000Z","timeToRead":1,"excerpt":"가상 메모리에 대해서 공부한 내용을 정리하였습니다.","canonical_url":null,"subscription":true,"body":"function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"title\": \"Virtual Memory (Linux 가상 메모리)\",\n  \"author\": \"Reno Kim\",\n  \"date\": \"2020-12-20T00:00:00.000Z\",\n  \"hero\": \"./images/hero.jpg\",\n  \"excerpt\": \"가상 메모리에 대해서 공부한 내용을 정리하였습니다.\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, [\"components\"]);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h1\", {\n    \"id\": \"virtual-memory-os\"\n  }, \"Virtual Memory (OS)\"), mdx(\"p\", null, \"Question Type: Common\"), mdx(\"h1\", {\n    \"id\": \"가상-메모리란\"\n  }, \"\\uAC00\\uC0C1 \\uBA54\\uBAA8\\uB9AC\\uB780?\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"\\uAC00\\uC0C1 \\uBA54\\uBAA8\\uB9AC\\uB294 \\uBA54\\uBAA8\\uB9AC\\uB97C \\uAD00\\uB9AC\\uD558\\uB294 \\uBC29\\uBC95\\uC758 \\uD558\\uB098\\uB85C, \\uAC01 \\uD504\\uB85C\\uADF8\\uB7A8\\uC5D0 \\uC2E4\\uC81C \\uBA54\\uBAA8\\uB9AC \\uC8FC\\uC18C\\uAC00 \\uC544\\uB2CC \\uAC00\\uC0C1\\uC758 \\uBA54\\uBAA8\\uB9AC \\uC8FC\\uC18C\\uB97C \\uC8FC\\uB294 \\uBC29\\uC2DD\\uC744 \\uB9D0\\uD55C\\uB2E4\")), mdx(\"h3\", {\n    \"id\": \"배경\"\n  }, \"\\uBC30\\uACBD\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"\\uBA54\\uBAA8\\uB9AC \\uBD80\\uC871 \\uD604\\uC0C1\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"\\uB2E4\\uC911 \\uD504\\uB85C\\uADF8\\uB7A8 \\uC2E4\\uD589 \\uD658\\uACBD\")), mdx(\"h3\", {\n    \"id\": \"특징\"\n  }, \"\\uD2B9\\uC9D5\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"\\uBCF4\\uC870 \\uBA54\\uBAA8\\uB9AC\\uB85C \\uD558\\uB4DC \\uB514\\uC2A4\\uD06C\\uB098 SSD \\uAC19\\uC740 \\uBCF4\\uC870 \\uAE30\\uC5B5 \\uC7A5\\uCE58\\uB97C \\uC0AC\\uC6A9\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"\\uC2E4\\uC81C \\uB514\\uC2A4\\uD06C\\uB97C \\uB9C8\\uCE58 \\uBA54\\uBAA8\\uB9AC\\uCC98\\uB7FC \\uC0AC\\uC6A9\\uD558\\uB294 \\uAC83\\uC744 \\uAC00\\uC0C1 \\uBA54\\uBAA8\\uB9AC\\uB77C\\uACE0 \\uD558\\uBA70 \\uD504\\uB85C\\uC138\\uC2A4 \\uC785\\uC7A5\\uC5D0\\uC11C\\uB294 \\uB514\\uC2A4\\uD06C \\uACF5\\uAC04\\uC774 \\uC544\\uB2CC \\uC2E4\\uC81C \\uBA54\\uBAA8\\uB9AC\\uB85C \\uC778\\uC2DD\")), mdx(\"h1\", {\n    \"id\": \"paging\"\n  }, \"Paging\"), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, \"\\uBA54\\uBAA8\\uB9AC \\uC8FC\\uC18C\\uB4E4\\uC744 \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"\\uACE0\\uC815\\uB41C\"), \" \\uD06C\\uAE30\\uC758 \\uD398\\uC774\\uC9C0\\uB4E4\\uB85C \\uBD84\\uD560 \\uAD00\\uB9AC\\uD558\\uB294 \\uAE30\\uBC95\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Page : A fixed-length contiguous block of virtual memory residing on disk.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Frame : A fixed-length contiguous block located in RAM; whose sizing is identical to pages.\")), mdx(\"p\", null, mdx(\"img\", _extends({\n    parentName: \"p\"\n  }, {\n    \"src\": \"https://www.enterprisestorageforum.com/imagesvr_ce/1092/Paging.png\",\n    \"alt\": \"https://www.enterprisestorageforum.com/imagesvr_ce/1092/Paging.png\"\n  }))), mdx(\"h1\", {\n    \"id\": \"segmentation\"\n  }, \"Segmentation\"), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, \"\\uBA54\\uBAA8\\uB9AC \\uC8FC\\uC18C\\uB4E4\\uC744 \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"\\uB2E4\\uC591\\uD55C\"), \" \\uD06C\\uAE30\\uC758 \\uD30C\\uD3B8\\uB4E4\\uB85C \\uBD84\\uD560 \\uAD00\\uB9AC\\uD558\\uB294 \\uAE30\\uBC95\")), mdx(\"p\", null, mdx(\"img\", _extends({\n    parentName: \"p\"\n  }, {\n    \"src\": \"https://www.enterprisestorageforum.com/imagesvr_ce/3117/Segmentation.png\",\n    \"alt\": \"https://www.enterprisestorageforum.com/imagesvr_ce/3117/Segmentation.png\"\n  }))), mdx(\"h1\", {\n    \"id\": \"swapping\"\n  }, \"Swapping\"), mdx(\"p\", null, mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://t1.daumcdn.net/cfile/tistory/1260995050E18C8C24\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"https://t1.daumcdn.net/cfile/tistory/1260995050E18C8C24\")), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Created \"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Ready\\n\\u2192 secondary storage \\uC5D0 \\uC800\\uC7A5\\uB418\\uC5B4 \\uC788\\uB294 \\uC2E4\\uD589 \\uD30C\\uC77C\\uC774 \\uBA54\\uBAA8\\uB9AC\\uC5D0 load\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Running\\n\\u2192 \\uBA54\\uBAA8\\uB9AC\\uC5D0 \\uC788\\uB294 \\uD504\\uB85C\\uC138\\uC2A4 \\uC911\\uC5D0 \\uC5B4\\uB5A4 \\uD504\\uB85C\\uC138\\uC2A4\\uB97C \\uC2E4\\uD589 \\uC2DC\\uD0AC \\uAC83\\uC778\\uAC00? (CPU \\uC2A4\\uCF00\\uC904\\uB9C1)\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Asleep\\n\\u2192 I/O Request \\uBC1C\\uC0DD\\uD558\\uBA74 asleep \\uC0C1\\uD0DC\\uAC00 \\uB428 (\\uBA54\\uBAA8\\uB9AC\\uC5D0\\uB294 \\uC788\\uC9C0\\uB9CC \\uC0AC\\uC6A9\\uD558\\uC9C0 \\uC54A\\uB294 \\uC0C1\\uD0DC)\\n\\u2192 I/O \\uC791\\uC5C5\\uC774 \\uC644\\uB8CC\\uB418\\uBA74 ready \\uC0C1\\uD0DC\\uB85C \\uB3CC\\uC544\\uAC10\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Swapping \\uD544\\uC694\\uD55C \\uD504\\uB85C\\uC138\\uC2A4\")), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"ready \\uC0C1\\uD0DC\\uC5D0\\uC11C \\uACC4\\uC18D CPU \\uC810\\uC720\\uAD8C\\uC744 \\uBABB \\uAC00\\uC838\\uAC00\\uB294  \\uD504\\uB85C\\uC138\\uC2A4\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"asleep \\uC0C1\\uD0DC\\uC5D0\\uC11C ready \\uC0C1\\uD0DC\\uB85C \\uBABB \\uB118\\uC5B4\\uAC00\\uB294 \\uD504\\uB85C\\uC138\\uC2A4\")), mdx(\"h1\", {\n    \"id\": \"grossary\"\n  }, \"Grossary\"), mdx(\"h2\", {\n    \"id\": \"페이지\"\n  }, \"\\uD398\\uC774\\uC9C0\"), mdx(\"p\", null, \"\\uAC00\\uC0C1 \\uBA54\\uBAA8\\uB9AC \\uC2DC\\uC2A4\\uD15C\\uC5D0\\uC11C \\uBA54\\uBAA8\\uB9AC\\uB97C \\uB2E4\\uB8F0 \\uB54C \\uC0AC\\uC6A9\\uD558\\uB294 \\uCD5C\\uC18C \\uD06C\\uAE30 \\uB2E8\\uC704\"), mdx(\"h2\", {\n    \"id\": \"스왑-아웃\"\n  }, \"\\uC2A4\\uC651 \\uC544\\uC6C3\"), mdx(\"p\", null, \"\\uBA54\\uC778 \\uBA54\\uBAA8\\uB9AC\\uC758 \\uD504\\uB85C\\uC138\\uC2A4\\uC5D0\\uC11C \\uC77C\\uC815 \\uD398\\uC774\\uC9C0\\uB97C \\uC798\\uB77C\\uC11C \\uAC00\\uC0C1 \\uBA54\\uBAA8\\uB9AC\\uB85C \\uAC00\\uC838\\uAC00\\uB294 \\uAC83\"), mdx(\"h2\", {\n    \"id\": \"스왑-인\"\n  }, \"\\uC2A4\\uC651 \\uC778\"), mdx(\"p\", null, \"\\uAC00\\uC0C1 \\uBA54\\uBAA8\\uB9AC\\uC5D0 \\uC62E\\uACA8 \\uB450\\uC5C8\\uB358 \\uD504\\uB85C\\uC138\\uC2A4\\uC758 \\uD398\\uC774\\uC9C0\\uB97C \\uB2E4\\uC2DC \\uBA54\\uC778 \\uBA54\\uBAA8\\uB9AC\\uB85C \\uAC00\\uC838\\uC624\\uB294 \\uAC83\"), mdx(\"h1\", {\n    \"id\": \"references\"\n  }, \"References\"), mdx(\"p\", null, mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://searchstorage.techtarget.com/definition/virtual-memory\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"What is virtual memory? - Definition from WhatIs.com\")), mdx(\"p\", null, mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://www.youtube.com/watch?v=OPdjLaW0flU\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"https://www.youtube.com/watch?v=OPdjLaW0flU\")), mdx(\"p\", null, mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://wiki.kldp.org/Translations/html/The_Linux_Kernel-KLDP/tlk3.html\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uB9AC\\uB205\\uC2A4 \\uCEE4\\uB110 : \\uBA54\\uBAA8\\uB9AC \\uAD00\\uB9AC\")), mdx(\"p\", null, mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://www.enterprisestorageforum.com/storage-hardware/paging-and-segmentation.html\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"Paging and Segmentation\")));\n}\n;\nMDXContent.isMDXComponent = true;","hero":{"full":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAQCBf/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAehukRrh/8QAGRAAAgMBAAAAAAAAAAAAAAAAAAIBERID/9oACAEBAAEFAtuWw3RlnKmFKg//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAbEAACAwADAAAAAAAAAAAAAAAAAREhMjGRsf/aAAgBAQAGPwJW7NeETJlGV0cH/8QAHRABAAIBBQEAAAAAAAAAAAAAAQARIRAxUWGR0f/aAAgBAQABPyEZ4i0rEb3Jivj3qXfDRQGw8n//2gAMAwEAAgADAAAAEEAP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHRABAAICAgMAAAAAAAAAAAAAAQARITFBUWGB8f/aAAgBAQABPxDIUBArbfHEEAYUEaJ3FAihsH1iLlVXamfCQSgngT//2Q==","aspectRatio":1.7744360902255638,"src":"/static/aa09fe20f533ba099bac7379503b640c/58fe7/hero.jpg","srcSet":"/static/aa09fe20f533ba099bac7379503b640c/e0f30/hero.jpg 236w,\n/static/aa09fe20f533ba099bac7379503b640c/86afd/hero.jpg 472w,\n/static/aa09fe20f533ba099bac7379503b640c/58fe7/hero.jpg 944w,\n/static/aa09fe20f533ba099bac7379503b640c/02748/hero.jpg 1416w,\n/static/aa09fe20f533ba099bac7379503b640c/5c241/hero.jpg 1888w,\n/static/aa09fe20f533ba099bac7379503b640c/097fa/hero.jpg 1920w","srcWebp":"/static/aa09fe20f533ba099bac7379503b640c/99fbb/hero.webp","srcSetWebp":"/static/aa09fe20f533ba099bac7379503b640c/77392/hero.webp 236w,\n/static/aa09fe20f533ba099bac7379503b640c/1f177/hero.webp 472w,\n/static/aa09fe20f533ba099bac7379503b640c/99fbb/hero.webp 944w,\n/static/aa09fe20f533ba099bac7379503b640c/4a492/hero.webp 1416w,\n/static/aa09fe20f533ba099bac7379503b640c/b0b8f/hero.webp 1888w,\n/static/aa09fe20f533ba099bac7379503b640c/30cf3/hero.webp 1920w","sizes":"(max-width: 944px) 100vw, 944px"},"regular":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAQCBf/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAehukRrh/8QAGRAAAgMBAAAAAAAAAAAAAAAAAAIBERID/9oACAEBAAEFAtuWw3RlnKmFKg//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAbEAACAwADAAAAAAAAAAAAAAAAAREhMjGRsf/aAAgBAQAGPwJW7NeETJlGV0cH/8QAHRABAAIBBQEAAAAAAAAAAAAAAQARIRAxUWGR0f/aAAgBAQABPyEZ4i0rEb3Jivj3qXfDRQGw8n//2gAMAwEAAgADAAAAEEAP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHRABAAICAgMAAAAAAAAAAAAAAQARITFBUWGB8f/aAAgBAQABPxDIUBArbfHEEAYUEaJ3FAihsH1iLlVXamfCQSgngT//2Q==","aspectRatio":1.7717391304347827,"src":"/static/aa09fe20f533ba099bac7379503b640c/1dc0b/hero.jpg","srcSet":"/static/aa09fe20f533ba099bac7379503b640c/3a5ce/hero.jpg 163w,\n/static/aa09fe20f533ba099bac7379503b640c/05730/hero.jpg 327w,\n/static/aa09fe20f533ba099bac7379503b640c/1dc0b/hero.jpg 653w,\n/static/aa09fe20f533ba099bac7379503b640c/f72c7/hero.jpg 980w,\n/static/aa09fe20f533ba099bac7379503b640c/6e4a3/hero.jpg 1306w,\n/static/aa09fe20f533ba099bac7379503b640c/097fa/hero.jpg 1920w","srcWebp":"/static/aa09fe20f533ba099bac7379503b640c/0acdf/hero.webp","srcSetWebp":"/static/aa09fe20f533ba099bac7379503b640c/ac59e/hero.webp 163w,\n/static/aa09fe20f533ba099bac7379503b640c/7660b/hero.webp 327w,\n/static/aa09fe20f533ba099bac7379503b640c/0acdf/hero.webp 653w,\n/static/aa09fe20f533ba099bac7379503b640c/75470/hero.webp 980w,\n/static/aa09fe20f533ba099bac7379503b640c/68d47/hero.webp 1306w,\n/static/aa09fe20f533ba099bac7379503b640c/30cf3/hero.webp 1920w","sizes":"(max-width: 653px) 100vw, 653px"},"narrow":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAQCBf/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAehukRrh/8QAGRAAAgMBAAAAAAAAAAAAAAAAAAIBERID/9oACAEBAAEFAtuWw3RlnKmFKg//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAbEAACAwADAAAAAAAAAAAAAAAAAREhMjGRsf/aAAgBAQAGPwJW7NeETJlGV0cH/8QAHRABAAIBBQEAAAAAAAAAAAAAAQARIRAxUWGR0f/aAAgBAQABPyEZ4i0rEb3Jivj3qXfDRQGw8n//2gAMAwEAAgADAAAAEEAP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHRABAAICAgMAAAAAAAAAAAAAAQARITFBUWGB8f/aAAgBAQABPxDIUBArbfHEEAYUEaJ3FAihsH1iLlVXamfCQSgngT//2Q==","aspectRatio":1.78125,"src":"/static/aa09fe20f533ba099bac7379503b640c/eaa58/hero.jpg","srcSet":"/static/aa09fe20f533ba099bac7379503b640c/5a3ee/hero.jpg 114w,\n/static/aa09fe20f533ba099bac7379503b640c/41f8f/hero.jpg 229w,\n/static/aa09fe20f533ba099bac7379503b640c/eaa58/hero.jpg 457w,\n/static/aa09fe20f533ba099bac7379503b640c/c309b/hero.jpg 686w,\n/static/aa09fe20f533ba099bac7379503b640c/e3008/hero.jpg 914w,\n/static/aa09fe20f533ba099bac7379503b640c/097fa/hero.jpg 1920w","srcWebp":"/static/aa09fe20f533ba099bac7379503b640c/15384/hero.webp","srcSetWebp":"/static/aa09fe20f533ba099bac7379503b640c/31fce/hero.webp 114w,\n/static/aa09fe20f533ba099bac7379503b640c/e3e25/hero.webp 229w,\n/static/aa09fe20f533ba099bac7379503b640c/15384/hero.webp 457w,\n/static/aa09fe20f533ba099bac7379503b640c/0258d/hero.webp 686w,\n/static/aa09fe20f533ba099bac7379503b640c/64ea2/hero.webp 914w,\n/static/aa09fe20f533ba099bac7379503b640c/30cf3/hero.webp 1920w","sizes":"(max-width: 457px) 100vw, 457px"},"seo":{"src":"/static/aa09fe20f533ba099bac7379503b640c/0ff54/hero.jpg"}}},{"id":"c5461e7c-61d6-55ce-93eb-bd91e4a5fc5c","slug":"/the-first-class-collection-(-)","secret":false,"title":"The First Class Collection (일급 콜렉션)","author":"Reno Kim","date":"June 17th, 2020","dateForSEO":"2020-06-17T00:00:00.000Z","timeToRead":1,"excerpt":"일급 컬렉션에 대해 공부한 내용을 정리하였습니다","canonical_url":null,"subscription":true,"body":"function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"title\": \"The First Class Collection (일급 콜렉션)\",\n  \"author\": \"Reno Kim\",\n  \"date\": \"2020-06-17T00:00:00.000Z\",\n  \"hero\": \"./images/hero.jpeg\",\n  \"excerpt\": \"일급 컬렉션에 대해 공부한 내용을 정리하였습니다\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, [\"components\"]);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"\\uCD5C\\uADFC\\uC5D0 \\uAE30\\uB2A5 \\uAC1C\\uBC1C\\uD558\\uBA74\\uC11C \\uC2E4\\uC218\\uD588\\uB358 \\uC774\\uC57C\\uAE30\\uC5D0 \\uB300\\uD574\\uC11C \\uACF5\\uC720\\uD574\\uBCF4\\uB824\\uACE0 \\uD55C\\uB2E4 \\u3160\\u3160\"), mdx(\"h2\", {\n    \"id\": \"공부하게-된-배경\"\n  }, \"\\uACF5\\uBD80\\uD558\\uAC8C \\uB41C \\uBC30\\uACBD\"), mdx(\"p\", null, \"\\uAE30\\uB2A5 \\uAC1C\\uBC1C\\uC744 \\uD558\\uBA74\\uC11C \\uB370\\uC774\\uD130 \\uD074\\uB798\\uC2A4\\uC5D0 \\uCF5C\\uB809\\uC158\\uC744 \\uC790\\uCCB4\\uB97C \\uB370\\uC774\\uD130 \\uD615\\uD0DC\\uB85C \\uAC16\\uB3C4\\uB85D \\uAD6C\\uD604\\uD55C \\uC801\\uC774 \\uC788\\uB2E4.\"), mdx(\"p\", null, \"\\uC774\\uB807\\uAC8C \"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-kotlin\"\n  }), \"class Person(val name:String) {\\n    private val cars:List<Car> = listOf();\\n\\n    //bla bla\\n}\\n\\npublic class Car {\\n    private val name:String;\\n    private val price:Int;\\n}\\n\")), mdx(\"p\", null, \"\\uCC98\\uC74C\\uC5D0\\uB294 \\uBCC4 \\uBB38\\uC81C\\uAC00 \\uC5C6\\uC5B4 \\uBCF4\\uC600\\uB2E4\\n\\uD558\\uC9C0\\uB9CC \\uC5EC\\uAE30\\uC5D0 \\uBE44\\uC988\\uB2C8\\uC2A4 \\uB85C\\uC9C1\\uC744 \\uD558\\uB098\\uC529 \\uCD94\\uAC00\\uD558\\uB2E4 \\uBCF4\\uB2C8 \\uBB38\\uC81C\\uAC00 \\uC0DD\\uACBC\\uB2E4 \\u2026\"), mdx(\"h2\", {\n    \"id\": \"문제점\"\n  }, \"\\uBB38\\uC81C\\uC810\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-kotlin\"\n  }), \"class Person(val name:String) {\\n    private val cars:List<Car> = listOf();\\n\\n    fun getCarsSum() {\\n        //bla bla\\n    }\\n\\n    fun getCarsCount():Int {\\n        //bla bla\\n    }\\n\\n    // etc\\n}\\n\")), mdx(\"p\", null, \"\\uC704\\uCC98\\uB7FC \\uACC4\\uC18D \\uCEEC\\uB809\\uC158\\uC5D0 \\uB300\\uD55C \\uD568\\uC218\\uB4E4\\uC774 \\uC0AC\\uC6A9\\uD558\\uB294 \\uD074\\uB798\\uC2A4\\uB4E4\\uC5D0 \\uC0DD\\uACA8\\uB098\\uAE30 \\uC2DC\\uC791\\uD588\\uB2E4\\u2026\"), mdx(\"p\", null, \"\\uC774\\uB807\\uAC8C \\uD558\\uB2C8 \\uBB38\\uC81C\\uC810\\uC774\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"\\uD574\\uB2F9 \\uCEEC\\uB809\\uC158\\uC744 \\uAC00\\uC9C0\\uACE0 \\uC788\\uB294 \\uACF3\\uC5D0 \\uC911\\uBCF5\\uB418\\uB294 \\uAD00\\uB9AC \\uD568\\uC218\\uB4E4\\uC774 \\uC0DD\\uAE34\\uB2E4\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"\\uAD00\\uB9AC\\uD558\\uB294 \\uACF3\\uC774 \\uC5EC\\uAE30\\uC800\\uAE30 \\uD769\\uC5B4\\uC838 \\uC788\\uC5B4 \\uAD00\\uB9AC\\uD558\\uAE30 \\uC5B4\\uB835\\uB2E4 \")), mdx(\"p\", null, \"\\uC774\\uC5C8\\uB2E4.\"), mdx(\"p\", null, \"\\uADF8\\uB798\\uC11C \\uD68C\\uC0AC \\uC120\\uBC30\\uC758 \\uC870\\uC5B8\\uC73C\\uB85C \\uD574\\uB2F9 \\uCEEC\\uB809\\uC158\\uC744 \\uAC00\\uC9C0\\uACE0 \\uC788\\uB294 \\uD558\\uB098\\uC758 \\uD074\\uB798\\uC2A4\\uB85C \\uB9CC\\uB4E4\\uC5B4 \\uAD6C\\uD604\\uD558\\uC600\\uB294\\uB370\\n\\uC774\\uAC8C \\uC54C\\uACE0 \\uBCF4\\uB2C8 \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"First Class Collection\"), \" \\uC600\\uB2E4.\"), mdx(\"h2\", {\n    \"id\": \"fist-class-collection-이란\"\n  }, \"Fist Class Collection \\uC774\\uB780?\"), mdx(\"p\", null, \"Collection \\uC744 Wrapping \\uD558\\uBA74\\uC11C, Wrapping \\uD55C Collection \\uC678 \\uB2E4\\uB978 \\uBA64\\uBC84 \\uBCC0\\uC218\\uAC00 \\uC5C6\\uB294 \\uD074\\uB798\\uC2A4 \"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-kotlin\"\n  }), \"// example\\nclass Cars {\\n    private val cars:List<Car>\\n\\n    fun getCarsSum() {\\n        //bla bla\\n    }\\n    \\n    fun getCarsCount():Int {\\n        //bla bla\\n    }\\n}\\n\")), mdx(\"h2\", {\n    \"id\": \"장점\"\n  }, \"\\uC7A5\\uC810\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"\\uBE44\\uC988\\uB2C8\\uC2A4 \\uB85C\\uC9C1\\uC5D0 \\uB9DE\\uB294 \\uC790\\uB8CC\\uAD6C\\uC870\\uB97C \\uB9CC\\uB4E4 \\uC218 \\uC788\\uC73C\\uBA70 \"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"\\uD558\\uB098\\uC758 \\uD074\\uB798\\uC2A4\\uC5D0\\uC11C \\uCEEC\\uB809\\uC158\\uC744 \\uAD00\\uB9AC\\uD558\\uAE30 \\uB54C\\uBB38\\uC5D0 \\uAD00\\uB9AC\\uAC00 \\uD3B8\\uD558\\uB2E4 \")), mdx(\"h2\", {\n    \"id\": \"예제-코드\"\n  }, \"\\uC608\\uC81C \\uCF54\\uB4DC\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-kotlin\"\n  }), \"//Before\\n\\nclass ClipBefore {\\n    private val adjustmentList: List<Adjustment> = Adjustment.newAdjustment()\\n\\n    // adjustment \\uC5D0 \\uB300\\uD55C \\uBE44\\uC988\\uB2C8\\uC2A4 \\uB85C\\uC9C1\\uC774 Clip \\uC5D0 \\uCD94\\uAC00 \\uB418\\uC5B4\\uC57C \\uD588\\uB2E4...\\n    // clipBefore \\uB9D0\\uACE0\\uB3C4 \\uB2E4\\uB978 \\uACF3\\uC5D0\\uC11C adjustmentList \\uB97C \\uC0AC\\uC6A9\\uD574\\uC57C \\uD55C\\uB2E4\\uBA74 ?? ==> Hell\\n    fun applyAdjustmentToEngine() {\\n        val brightness = getEngineValue(AdjustmentType.BRIGHTNESS)\\n        val contrast = getEngineValue(AdjustmentType.CONTRAST)\\n        val saturation = getEngineValue(AdjustmentType.SATURATION)\\n\\n        println(\\\"apply adjustment brightness: $brightness\\\")\\n        println(\\\"apply adjustment contrast: $contrast\\\")\\n        println(\\\"apply adjustment saturation: $saturation\\\")\\n    }\\n\\n    private fun getFactor(type: AdjustmentType): Float\\n            = adjustmentList.find { it.type == type }?.factor ?: 0f\\n\\n    private fun getEngineValue(type: AdjustmentType): Float\\n            = getFactor(type) * 255f\\n}\\n\\n//Before Refactoring\\nclass Adjustment(\\n    //factor range : 0f ~ 1.0f\\n    var factor: Float,\\n    val type: AdjustmentType\\n) {\\n\\n    companion object {\\n        fun newAdjustment(): List<Adjustment> = AdjustmentType.values().map { Adjustment(0.5f, it) }\\n    }\\n}\\n\\nenum class AdjustmentType {\\n    BRIGHTNESS,\\n    CONTRAST,\\n    SATURATION\\n}\\n\")), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-kotlin\"\n  }), \"// After\\n\\nclass ClipAfter {\\n    private val adjustments: Adjustments = Adjustments()\\n\\n    //\\uBE44\\uC988\\uB2C8\\uC2A4\\uC5D0 \\uC885\\uC18D\\uC801\\uC778 \\uB85C\\uC9C1\\n    fun applyAdjustmentToEngine() {\\n        val brightness = adjustments.getEngineValue(AdjustmentType.BRIGHTNESS)\\n        val contrast = adjustments.getEngineValue(AdjustmentType.CONTRAST)\\n        val saturation = adjustments.getEngineValue(AdjustmentType.SATURATION)\\n\\n        //apply Adjustments to Engine\\n        println(\\\"apply adjustment brightness: $brightness\\\")\\n        println(\\\"apply adjustment contrast: $contrast\\\")\\n        println(\\\"apply adjustment saturation: $saturation\\\")\\n    }\\n}\\n\\n//After Refactoring (First Class Collection)\\nclass Adjustments {\\n    private val adjustmentList: List<Adjustment> = Adjustment.newAdjustment()\\n\\n    private fun getFactor(type: AdjustmentType): Float\\n            = adjustmentList.find { it.type == type }?.factor ?: 0f\\n\\n    fun getEngineValue(type: AdjustmentType): Float\\n            = getFactor(type) * 255f\\n}\\n\\n\")), mdx(\"h2\", {\n    \"id\": \"결론\"\n  }, \"\\uACB0\\uB860\"), mdx(\"p\", null, \"\\uC774 \\uAE00\\uC744 \\uC77D\\uC73C\\uC2DC\\uB294 \\uB3C5\\uC790\\uBD84\\uB4E4\\uB3C4 \\uB370\\uC774\\uD130 \\uBAA8\\uB378\\uC774 \\uCEEC\\uB809\\uC158\\uC778 \\uACBD\\uC6B0\\uC5D0 \\uD55C \\uBC88\\uCBE4 \\uACE0\\uB824\\uD574\\uBCF4\\uBA74 \\uC88B\\uC744 \\uAC83 \\uAC19\\uB2E4 \\u314E\\u314E (\\uBD84\\uBA85 \\uD074\\uB9B0\\uD55C \\uCF54\\uB4DC\\uC5D0 \\uB3C4\\uC6C0\\uC774 \\uB420 \\uAC83\\uC774\\uB2E4)\"), mdx(\"h2\", {\n    \"id\": \"참고\"\n  }, \"\\uCC38\\uACE0\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"\\uCF54\\uB4DC\\uB9AC\\uBDF0 \\uBAA8\\uC74C \\uC11C\\uBE44\\uC2A4\\uB97C \\uC18C\\uAC1C\\uD569\\uB2C8\\uB2E4 (\", mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"https://woowabros.github.io/techcourse/2020/06/05/techcourse-javable.html\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uC6B0\\uD558\\uD55C \\uD615\\uC81C\\uB4E4 \\uAE30\\uC220 \\uBE14\\uB85C\\uADF8\"), \")\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"\\uC77C\\uAE09 \\uCEEC\\uB809\\uC158\\uC758 \\uC18C\\uAC1C\\uC640 \\uC368\\uC57C\\uD560 \\uC774\\uC720 (\", mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"https://jojoldu.tistory.com/412\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uAE30\\uC5B5\\uBCF4\\uB2E8 \\uAE30\\uB85D\\uC744\"), \")\")));\n}\n;\nMDXContent.isMDXComponent = true;","hero":{"full":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAEDBf/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAeKxFQf/xAAXEAEBAQEAAAAAAAAAAAAAAAABAhIg/9oACAEBAAEFApgTBz//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAYEAACAwAAAAAAAAAAAAAAAAABMgARIP/aAAgBAQAGPwJqMYZ//8QAGBABAQADAAAAAAAAAAAAAAAAAREQIFH/2gAIAQEAAT8hp54OKSKaf//aAAwDAQACAAMAAAAQwA//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/ED//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/ED//xAAbEAEAAQUBAAAAAAAAAAAAAAABEQAgITFBgf/aAAgBAQABPxAXJJ0hhO+0IDurNgwxJ2z/2Q==","aspectRatio":1.7744360902255638,"src":"/static/ce4bb107795a2354e6a6ba2a0d11c71b/c993b/hero.jpg","srcSet":"/static/ce4bb107795a2354e6a6ba2a0d11c71b/e0f30/hero.jpg 236w,\n/static/ce4bb107795a2354e6a6ba2a0d11c71b/86afd/hero.jpg 472w,\n/static/ce4bb107795a2354e6a6ba2a0d11c71b/c993b/hero.jpg 520w","srcWebp":"/static/ce4bb107795a2354e6a6ba2a0d11c71b/67535/hero.webp","srcSetWebp":"/static/ce4bb107795a2354e6a6ba2a0d11c71b/77392/hero.webp 236w,\n/static/ce4bb107795a2354e6a6ba2a0d11c71b/1f177/hero.webp 472w,\n/static/ce4bb107795a2354e6a6ba2a0d11c71b/67535/hero.webp 520w","sizes":"(max-width: 520px) 100vw, 520px"},"regular":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAEDBf/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAeKxFQf/xAAXEAEBAQEAAAAAAAAAAAAAAAABAhIg/9oACAEBAAEFApgTBz//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAYEAACAwAAAAAAAAAAAAAAAAABMgARIP/aAAgBAQAGPwJqMYZ//8QAGBABAQADAAAAAAAAAAAAAAAAAREQIFH/2gAIAQEAAT8hp54OKSKaf//aAAwDAQACAAMAAAAQwA//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/ED//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/ED//xAAbEAEAAQUBAAAAAAAAAAAAAAABEQAgITFBgf/aAAgBAQABPxAXJJ0hhO+0IDurNgwxJ2z/2Q==","aspectRatio":1.7717391304347827,"src":"/static/ce4bb107795a2354e6a6ba2a0d11c71b/c993b/hero.jpg","srcSet":"/static/ce4bb107795a2354e6a6ba2a0d11c71b/3a5ce/hero.jpg 163w,\n/static/ce4bb107795a2354e6a6ba2a0d11c71b/05730/hero.jpg 327w,\n/static/ce4bb107795a2354e6a6ba2a0d11c71b/c993b/hero.jpg 520w","srcWebp":"/static/ce4bb107795a2354e6a6ba2a0d11c71b/67535/hero.webp","srcSetWebp":"/static/ce4bb107795a2354e6a6ba2a0d11c71b/ac59e/hero.webp 163w,\n/static/ce4bb107795a2354e6a6ba2a0d11c71b/7660b/hero.webp 327w,\n/static/ce4bb107795a2354e6a6ba2a0d11c71b/67535/hero.webp 520w","sizes":"(max-width: 520px) 100vw, 520px"},"narrow":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAEDBf/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAeKxFQf/xAAXEAEBAQEAAAAAAAAAAAAAAAABAhIg/9oACAEBAAEFApgTBz//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAYEAACAwAAAAAAAAAAAAAAAAABMgARIP/aAAgBAQAGPwJqMYZ//8QAGBABAQADAAAAAAAAAAAAAAAAAREQIFH/2gAIAQEAAT8hp54OKSKaf//aAAwDAQACAAMAAAAQwA//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/ED//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/ED//xAAbEAEAAQUBAAAAAAAAAAAAAAABEQAgITFBgf/aAAgBAQABPxAXJJ0hhO+0IDurNgwxJ2z/2Q==","aspectRatio":1.78125,"src":"/static/ce4bb107795a2354e6a6ba2a0d11c71b/eaa58/hero.jpg","srcSet":"/static/ce4bb107795a2354e6a6ba2a0d11c71b/5a3ee/hero.jpg 114w,\n/static/ce4bb107795a2354e6a6ba2a0d11c71b/41f8f/hero.jpg 229w,\n/static/ce4bb107795a2354e6a6ba2a0d11c71b/eaa58/hero.jpg 457w,\n/static/ce4bb107795a2354e6a6ba2a0d11c71b/c993b/hero.jpg 520w","srcWebp":"/static/ce4bb107795a2354e6a6ba2a0d11c71b/15384/hero.webp","srcSetWebp":"/static/ce4bb107795a2354e6a6ba2a0d11c71b/31fce/hero.webp 114w,\n/static/ce4bb107795a2354e6a6ba2a0d11c71b/e3e25/hero.webp 229w,\n/static/ce4bb107795a2354e6a6ba2a0d11c71b/15384/hero.webp 457w,\n/static/ce4bb107795a2354e6a6ba2a0d11c71b/67535/hero.webp 520w","sizes":"(max-width: 457px) 100vw, 457px"},"seo":{"src":"/static/ce4bb107795a2354e6a6ba2a0d11c71b/c993b/hero.jpg"}}},{"id":"d7583790-9972-587b-8154-ad1db44a2ec1","slug":"/kotlin-constructor-init","secret":false,"title":"Kotlin 의 constructor 와 init 중에 누가 먼저 호출될까?","author":"Reno Kim","date":"June 10th, 2020","dateForSEO":"2020-06-10T00:00:00.000Z","timeToRead":1,"excerpt":"코틀린의 생성자들은 어떤 순서로 호출이 되는지 찾아","canonical_url":null,"subscription":true,"body":"function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"title\": \"Kotlin 의 constructor 와 init 중에 누가 먼저 호출될까?\",\n  \"author\": \"Reno Kim\",\n  \"date\": \"2020-06-10T00:00:00.000Z\",\n  \"hero\": \"./images/hero.png\",\n  \"excerpt\": \"코틀린의 생성자들은 어떤 순서로 호출이 되는지 찾아\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, [\"components\"]);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"\\uC624\\uB298 \\uBB38\\uB4DD \\uC5C5\\uBB34\\uB97C \\uD558\\uB2E4\\uAC00 \\uAC11\\uC790\\uAE30 \\uAD81\\uAE08\\uD574\\uC9C4 \\uAC83\\u2026\"), mdx(\"p\", null, \"Kotlin \\uC740 constructor \\uC640 init \\uB450 \\uAC00\\uC9C0\\uB97C \\uD1B5\\uD574 \\uAC1D\\uCCB4\\uB97C \\uC0DD\\uC131\\uD560 \\uC218 \\uC788\\uB294\\uB370\"), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, \"\\u201C\\uB9CC\\uC57D \\uB3D9\\uC2DC\\uC5D0 \\uB450\\uAC00\\uC9C0 \\uBAA8\\uB450 \\uC0AC\\uC6A9\\uD560 \\uACBD\\uC6B0\\uC5D0 \"), mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, \"\\uC5B4\\uB5A4 \\uD568\\uC218\\uAC00 \\uBA3C\\uC800 \\uD638\\uCD9C\\uC774 \\uB420\\uAE4C??\\u201D\")), mdx(\"p\", null, \"\\uAC11\\uC790\\uAE30 \\uAD81\\uAE08\\uD574\\uC838\\uC11C \\uD14C\\uC2A4\\uD2B8\\uB97C \\uD574\\uBCF4\\uC558\\uB2E4\"), mdx(\"p\", null, \"\\uC544\\uB798\\uB294 \\uD14C\\uC2A4\\uD2B8\\uB97C \\uD558\\uBA74\\uC11C \\uC791\\uC131\\uD55C \\uCF54\\uB4DC\\uC774\\uB2E4  \"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-kotlin\"\n  }), \"class Person(private val name: String) { //primary constructor\\n    private var age: Int = 0\\n    set(value) {\\n        println(\\\"property called\\\")\\n        field = value\\n    }\\n    private lateinit var address: String\\n    private lateinit var company: String\\n\\n    constructor (name: String, age: Int, address: String) : this(name) { //secondary constructor\\n        println(\\\"constructor 1 called\\\")\\n        this.age = age\\n        this.address = address\\n    }\\n\\n    constructor (name: String, age: Int, address: String, company: String) : this(name) { //secondary constructor\\n        println(\\\"constructor 2 called\\\")\\n        this.age = age\\n        this.address = address\\n        this.company = company\\n    }\\n\\n    init {\\n        println(\\\"init called\\\")\\n        if (!::address.isInitialized)\\n            this.address = \\\"unknown address\\\"\\n        if (!::company.isInitialized)\\n            this.company = \\\"unknown company\\\"\\n\\n    }\\n}\\n\")), mdx(\"p\", null, \"\\uC5EC\\uAE30\\uC11C \\uAC1D\\uCCB4\\uB97C \\uC0DD\\uC131\\uD558\\uAC8C \\uB418\\uBA74 \\uACB0\\uACFC\\uB294 \\uB2E4\\uC74C\\uACFC \\uAC19\\uB2E4\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {}), \"val reno = Person(\\\"Reno\\\", 31, \\\"Seoul\\\", \\\"KM\\\")\\n\\n/**\\n * result\\n * \\n * init called\\n * constructor 2 called\\n * age called\\n * */\\n\")), mdx(\"p\", null, \"\\uC989, \\uB2E4\\uC74C\\uC758 \\uC21C\\uC11C\\uB85C \\uD638\\uCD9C\\uC774 \\uB41C\\uB2E4 !\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"init method \"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"constructor\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"property\")));\n}\n;\nMDXContent.isMDXComponent = true;","hero":{"full":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsTAAALEwEAmpwYAAACFklEQVQoz1WR70sTcRzH7y8KCnpe9KiCygllVOZ8UC4oEvckXYEZlUFlQk+KCITIaqCR0sBfbM4puc1pTqe5pZ7Nn/PHtju3u9tefe+amh/ufff+vvm+35/P8ZEiUZWxSWUfkcmsQIlHFUITWSamVdTdAmYVi0XzJZ7CP76nlUqKWEZVmMR3apfwtMGYdc5ZYVO/NBTVNBuWsVAwwygFgWEYQjtoJpnmsZ9ZhoJ5RkPbRIMzYsI0/h9rxOI68tK6eZX/Kza7wfeeGNtpbV/bayTNzqh8HFawPwuz0XyEVfddRidUnM6HfO3spuXFcxKJBKFgkEGfj8ePmmhqbMRuv0Nff4DxSIjlZLIUKyZclDU6A1v01FWz0lJJOJplfFrj2pXrHD92FP9ggAeu+zx90sypEyepqqzCVd9AdZWdsvPlXK64Sl2tE0NMl87oSHMrBeZ9Mq2333OufoF2d5rUZg7HTQetr15TcfESNTdqaGv7wNnTZ6i/1yDgwnbBRnmZjc9furnlqGV5zUBO5pDiC3kmxUKa+zd52b2Of3iHjOjk9Q5Zy+jr89HR8Y23b94hy6t8anfT1eURuhePp5fYTFz8+gjJVV0gj+QdyTAgEBlX+LOUF500tnZ0zL0pqnFoHXn9gBdL0IRmiMtrKY2lZRHY608zEMggi0N8McdvAU0rkMlqVmBW0S1u4jA/0EyktnTm5nP8BU6tbElZP7uhAAAAAElFTkSuQmCC","aspectRatio":2.2264150943396226,"src":"/static/7a4baf65cba625fcf8511fdebbabf48b/7beb7/hero.png","srcSet":"/static/7a4baf65cba625fcf8511fdebbabf48b/5b37e/hero.png 236w,\n/static/7a4baf65cba625fcf8511fdebbabf48b/49058/hero.png 472w,\n/static/7a4baf65cba625fcf8511fdebbabf48b/7beb7/hero.png 510w","srcWebp":"/static/7a4baf65cba625fcf8511fdebbabf48b/97f60/hero.webp","srcSetWebp":"/static/7a4baf65cba625fcf8511fdebbabf48b/77392/hero.webp 236w,\n/static/7a4baf65cba625fcf8511fdebbabf48b/1f177/hero.webp 472w,\n/static/7a4baf65cba625fcf8511fdebbabf48b/97f60/hero.webp 510w","sizes":"(max-width: 510px) 100vw, 510px"},"regular":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsTAAALEwEAmpwYAAACFklEQVQoz1WR70sTcRzH7y8KCnpe9KiCygllVOZ8UC4oEvckXYEZlUFlQk+KCITIaqCR0sBfbM4puc1pTqe5pZ7Nn/PHtju3u9tefe+amh/ufff+vvm+35/P8ZEiUZWxSWUfkcmsQIlHFUITWSamVdTdAmYVi0XzJZ7CP76nlUqKWEZVmMR3apfwtMGYdc5ZYVO/NBTVNBuWsVAwwygFgWEYQjtoJpnmsZ9ZhoJ5RkPbRIMzYsI0/h9rxOI68tK6eZX/Kza7wfeeGNtpbV/bayTNzqh8HFawPwuz0XyEVfddRidUnM6HfO3spuXFcxKJBKFgkEGfj8ePmmhqbMRuv0Nff4DxSIjlZLIUKyZclDU6A1v01FWz0lJJOJplfFrj2pXrHD92FP9ggAeu+zx90sypEyepqqzCVd9AdZWdsvPlXK64Sl2tE0NMl87oSHMrBeZ9Mq2333OufoF2d5rUZg7HTQetr15TcfESNTdqaGv7wNnTZ6i/1yDgwnbBRnmZjc9furnlqGV5zUBO5pDiC3kmxUKa+zd52b2Of3iHjOjk9Q5Zy+jr89HR8Y23b94hy6t8anfT1eURuhePp5fYTFz8+gjJVV0gj+QdyTAgEBlX+LOUF500tnZ0zL0pqnFoHXn9gBdL0IRmiMtrKY2lZRHY608zEMggi0N8McdvAU0rkMlqVmBW0S1u4jA/0EyktnTm5nP8BU6tbElZP7uhAAAAAElFTkSuQmCC","aspectRatio":2.232876712328767,"src":"/static/7a4baf65cba625fcf8511fdebbabf48b/7beb7/hero.png","srcSet":"/static/7a4baf65cba625fcf8511fdebbabf48b/078a8/hero.png 163w,\n/static/7a4baf65cba625fcf8511fdebbabf48b/e56da/hero.png 327w,\n/static/7a4baf65cba625fcf8511fdebbabf48b/7beb7/hero.png 510w","srcWebp":"/static/7a4baf65cba625fcf8511fdebbabf48b/97f60/hero.webp","srcSetWebp":"/static/7a4baf65cba625fcf8511fdebbabf48b/ac59e/hero.webp 163w,\n/static/7a4baf65cba625fcf8511fdebbabf48b/7660b/hero.webp 327w,\n/static/7a4baf65cba625fcf8511fdebbabf48b/97f60/hero.webp 510w","sizes":"(max-width: 510px) 100vw, 510px"},"narrow":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsTAAALEwEAmpwYAAACFklEQVQoz1WR70sTcRzH7y8KCnpe9KiCygllVOZ8UC4oEvckXYEZlUFlQk+KCITIaqCR0sBfbM4puc1pTqe5pZ7Nn/PHtju3u9tefe+amh/ufff+vvm+35/P8ZEiUZWxSWUfkcmsQIlHFUITWSamVdTdAmYVi0XzJZ7CP76nlUqKWEZVmMR3apfwtMGYdc5ZYVO/NBTVNBuWsVAwwygFgWEYQjtoJpnmsZ9ZhoJ5RkPbRIMzYsI0/h9rxOI68tK6eZX/Kza7wfeeGNtpbV/bayTNzqh8HFawPwuz0XyEVfddRidUnM6HfO3spuXFcxKJBKFgkEGfj8ePmmhqbMRuv0Nff4DxSIjlZLIUKyZclDU6A1v01FWz0lJJOJplfFrj2pXrHD92FP9ggAeu+zx90sypEyepqqzCVd9AdZWdsvPlXK64Sl2tE0NMl87oSHMrBeZ9Mq2333OufoF2d5rUZg7HTQetr15TcfESNTdqaGv7wNnTZ6i/1yDgwnbBRnmZjc9furnlqGV5zUBO5pDiC3kmxUKa+zd52b2Of3iHjOjk9Q5Zy+jr89HR8Y23b94hy6t8anfT1eURuhePp5fYTFz8+gjJVV0gj+QdyTAgEBlX+LOUF500tnZ0zL0pqnFoHXn9gBdL0IRmiMtrKY2lZRHY608zEMggi0N8McdvAU0rkMlqVmBW0S1u4jA/0EyktnTm5nP8BU6tbElZP7uhAAAAAElFTkSuQmCC","aspectRatio":2.235294117647059,"src":"/static/7a4baf65cba625fcf8511fdebbabf48b/502b1/hero.png","srcSet":"/static/7a4baf65cba625fcf8511fdebbabf48b/f2e6d/hero.png 114w,\n/static/7a4baf65cba625fcf8511fdebbabf48b/4ddba/hero.png 229w,\n/static/7a4baf65cba625fcf8511fdebbabf48b/502b1/hero.png 457w,\n/static/7a4baf65cba625fcf8511fdebbabf48b/7beb7/hero.png 510w","srcWebp":"/static/7a4baf65cba625fcf8511fdebbabf48b/15384/hero.webp","srcSetWebp":"/static/7a4baf65cba625fcf8511fdebbabf48b/31fce/hero.webp 114w,\n/static/7a4baf65cba625fcf8511fdebbabf48b/e3e25/hero.webp 229w,\n/static/7a4baf65cba625fcf8511fdebbabf48b/15384/hero.webp 457w,\n/static/7a4baf65cba625fcf8511fdebbabf48b/97f60/hero.webp 510w","sizes":"(max-width: 457px) 100vw, 457px"},"seo":{"src":"/static/7a4baf65cba625fcf8511fdebbabf48b/7beb7/hero.png"}}},{"id":"c6c4753e-33c5-5426-af20-555bff4a97ad","slug":"/android-accessibility","secret":false,"title":"Android Accessibility","author":"Reno Kim","date":"June 5th, 2020","dateForSEO":"2020-06-05T00:00:00.000Z","timeToRead":1,"excerpt":"우아한 형제들의 Android Accessibility 적용 방식에 대한 글을 간단히 요약","canonical_url":null,"subscription":true,"body":"function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"title\": \"Android Accessibility\",\n  \"author\": \"Reno Kim\",\n  \"date\": \"2020-06-05T00:00:00.000Z\",\n  \"hero\": \"./images/hero.png\",\n  \"excerpt\": \"우아한 형제들의 Android Accessibility 적용 방식에 대한 글을 간단히 요약\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, [\"components\"]);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h1\", {\n    \"id\": \"android-accessibility\"\n  }, \"Android Accessibility\"), mdx(\"p\", null, \"[\", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"http://woowabros.github.io/experience/2020/01/30/app-for-everyone.html\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uC6B0\\uC544\\uD55C\\uD615\\uC81C\\uB4E4 \\uAE30\\uC220 \\uBE14\\uB85C\\uADF8\"), \"]\"), mdx(\"h2\", {\n    \"id\": \"1-대체-텍스트\"\n  }, \"1. \\uB300\\uCCB4 \\uD14D\\uC2A4\\uD2B8\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"contentDescription \\uC740 \\uB208\\uC73C\\uB85C \\uC77D\\uD788\\uB294 \\uBAA8\\uB4E0 \\uC815\\uBCF4\\uB97C \\uC74C\\uC131\\uC73C\\uB85C \\uC77D\\uC5B4\\uC904 \\uC218 \\uC788\\uB294 \\uB300\\uCCB4 \\uD14D\\uC2A4\\uD2B8\\uB97C \\uD45C\\uD604 \\uD55C\\uB2E4\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Button \\uACFC ClickListner \\uAC00 \\uBD99\\uC740 ImageView \\uC5D0\\uB294 \\u201C\\u3147\\u3147 \\uBC84\\uD2BC\\u201D \\uC774\\uB77C\\uACE0 \\uC77D\\uC5B4\\uC900\\uB2E4\")), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-xml\"\n  }), \"<!-- for example -->\\n<ImageView\\n    android:id=\\\"@+id/userPhotoImageView\\\"\\n    android:layout_width=\\\"match_parent\\\"\\n    android:layout_height=\\\"match_parent\\\"\\n    android:contentDescription=\\\"@string/cd_profile_image_change\\\"\\n    android:src=\\\"@drawable/bg_user_thumbnail_pressed_selector\\\" />\\n\")), mdx(\"h2\", {\n    \"id\": \"2-상세히-설명하기\"\n  }, \"2. \\uC0C1\\uC138\\uD788 \\uC124\\uBA85\\uD558\\uAE30\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"AccessibilityNodeInfoCompat (api level 22 \\uBD80\\uD130 \\uC9C0\\uC6D0) \\uC0AC\\uC6A9\\uD558\\uAE30\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"hintScript\"), \" \\uB97C \\uD1B5\\uD574 \\uC6D0\\uD558\\uB294 \\uB0B4\\uC6A9\\uC744 \\uBCC0\\uACBD\")), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-kotlin\"\n  }), \"fun setAccessibilityClickActionHintScript(\\n    view: View, \\n    hintScript: String?\\n) {\\n    if (isTalkbackOn) {\\n        view.setAccessibilityDelegate(object : View.AccessibilityDelegate() {\\n            override fun onInitializeAccessibilityNodeInfo(\\n                host: View, \\n                info: AccessibilityNodeInfo\\n            ) {\\n                super.onInitializeAccessibilityNodeInfo(host, info)\\n                val infoCompat = AccessibilityNodeInfoCompat.wrap(info)\\n                val clickAction = AccessibilityActionCompat(\\n                    AccessibilityNodeInfoCompat.ACTION_CLICK, \\n                    hintScript\\n                )\\n                infoCompat.addAction(clickAction)\\n            }\\n        })\\n    }\\n}\\n\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"\\uD2B9\\uC815\\uAC12\\uC774 \\uBCC0\\uACBD\\uB418\\uC5C8\\uC744\\uB54C, \\uBCC0\\uACBD \\uC5EC\\uBD80\\uB97C \\uC720\\uC800\\uC5D0\\uAC8C \\uC54C\\uB824\\uC8FC\\uB824\\uBA74 AccessibilityEvent \\uB97C announce \\uB85C \\uC124\\uC815\\uD55C \\uD6C4 \\uC804\\uC1A1\")), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-kotlin\"\n  }), \"fun sendAccessibilityEvent(text: String?) {\\n    if (isTalkbackOn) {\\n        val e = AccessibilityEvent.obtain()\\n        e.eventType = AccessibilityEvent.TYPE_ANNOUNCEMENT\\n        e.className = context.javaClass.getName()\\n        e.packageName = context.packageName\\n        e.text.add(text)\\n        manager.sendAccessibilityEvent(e)\\n    }\\n}\\n\")));\n}\n;\nMDXContent.isMDXComponent = true;","hero":{"full":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABD0lEQVQoz2P4jwP8+ff/3/////79//sPl5L/DFhFIRqefv73+ts/OJcozRClBx/9UZ/52WrR15tv/+LSj6IZrmDS6Z9cPZ9sF3/Rm/1ZYtLnzbd//wd7Aa9msHTNwR9iEz8lbP4269yPCYc/ha79Ijbh08LLvyABgVMzRK5073eZKZ9tpr+48OTH3tvfLSY/k+h63XvyJ0jBX0Kad937DdTM2/1hy43vs05+5m18ptz3+srL35g+x+Lsjz/+mc3/LDXlS9uhr2Xb3ot3vvJe+gFi579/eEMbYnbB7m8cXR/Upr5X7n/F0fKq9/hXTDdj0Qwx+tXXvyee/gahx79OPf316ec/5LggkEhwJyoUAAD0/mFgCmWLhwAAAABJRU5ErkJggg==","aspectRatio":1.7744360902255638,"src":"/static/0f445eb807a8005754f385f726cc21cd/6ba37/hero.png","srcSet":"/static/0f445eb807a8005754f385f726cc21cd/5b37e/hero.png 236w,\n/static/0f445eb807a8005754f385f726cc21cd/49058/hero.png 472w,\n/static/0f445eb807a8005754f385f726cc21cd/6ba37/hero.png 512w","srcWebp":"/static/0f445eb807a8005754f385f726cc21cd/e4e36/hero.webp","srcSetWebp":"/static/0f445eb807a8005754f385f726cc21cd/77392/hero.webp 236w,\n/static/0f445eb807a8005754f385f726cc21cd/1f177/hero.webp 472w,\n/static/0f445eb807a8005754f385f726cc21cd/e4e36/hero.webp 512w","sizes":"(max-width: 512px) 100vw, 512px"},"regular":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABD0lEQVQoz2P4jwP8+ff/3/////79//sPl5L/DFhFIRqefv73+ts/OJcozRClBx/9UZ/52WrR15tv/+LSj6IZrmDS6Z9cPZ9sF3/Rm/1ZYtLnzbd//wd7Aa9msHTNwR9iEz8lbP4269yPCYc/ha79Ijbh08LLvyABgVMzRK5073eZKZ9tpr+48OTH3tvfLSY/k+h63XvyJ0jBX0Kad937DdTM2/1hy43vs05+5m18ptz3+srL35g+x+Lsjz/+mc3/LDXlS9uhr2Xb3ot3vvJe+gFi579/eEMbYnbB7m8cXR/Upr5X7n/F0fKq9/hXTDdj0Qwx+tXXvyee/gahx79OPf316ec/5LggkEhwJyoUAAD0/mFgCmWLhwAAAABJRU5ErkJggg==","aspectRatio":1.7717391304347827,"src":"/static/0f445eb807a8005754f385f726cc21cd/6ba37/hero.png","srcSet":"/static/0f445eb807a8005754f385f726cc21cd/078a8/hero.png 163w,\n/static/0f445eb807a8005754f385f726cc21cd/e56da/hero.png 327w,\n/static/0f445eb807a8005754f385f726cc21cd/6ba37/hero.png 512w","srcWebp":"/static/0f445eb807a8005754f385f726cc21cd/e4e36/hero.webp","srcSetWebp":"/static/0f445eb807a8005754f385f726cc21cd/ac59e/hero.webp 163w,\n/static/0f445eb807a8005754f385f726cc21cd/7660b/hero.webp 327w,\n/static/0f445eb807a8005754f385f726cc21cd/e4e36/hero.webp 512w","sizes":"(max-width: 512px) 100vw, 512px"},"narrow":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABD0lEQVQoz2P4jwP8+ff/3/////79//sPl5L/DFhFIRqefv73+ts/OJcozRClBx/9UZ/52WrR15tv/+LSj6IZrmDS6Z9cPZ9sF3/Rm/1ZYtLnzbd//wd7Aa9msHTNwR9iEz8lbP4269yPCYc/ha79Ijbh08LLvyABgVMzRK5073eZKZ9tpr+48OTH3tvfLSY/k+h63XvyJ0jBX0Kad937DdTM2/1hy43vs05+5m18ptz3+srL35g+x+Lsjz/+mc3/LDXlS9uhr2Xb3ot3vvJe+gFi579/eEMbYnbB7m8cXR/Upr5X7n/F0fKq9/hXTDdj0Qwx+tXXvyee/gahx79OPf316ec/5LggkEhwJyoUAAD0/mFgCmWLhwAAAABJRU5ErkJggg==","aspectRatio":1.78125,"src":"/static/0f445eb807a8005754f385f726cc21cd/502b1/hero.png","srcSet":"/static/0f445eb807a8005754f385f726cc21cd/f2e6d/hero.png 114w,\n/static/0f445eb807a8005754f385f726cc21cd/4ddba/hero.png 229w,\n/static/0f445eb807a8005754f385f726cc21cd/502b1/hero.png 457w,\n/static/0f445eb807a8005754f385f726cc21cd/6ba37/hero.png 512w","srcWebp":"/static/0f445eb807a8005754f385f726cc21cd/15384/hero.webp","srcSetWebp":"/static/0f445eb807a8005754f385f726cc21cd/31fce/hero.webp 114w,\n/static/0f445eb807a8005754f385f726cc21cd/e3e25/hero.webp 229w,\n/static/0f445eb807a8005754f385f726cc21cd/15384/hero.webp 457w,\n/static/0f445eb807a8005754f385f726cc21cd/e4e36/hero.webp 512w","sizes":"(max-width: 457px) 100vw, 457px"},"seo":{"src":"/static/0f445eb807a8005754f385f726cc21cd/6ba37/hero.png"}}}],"pathPrefix":"/","first":true,"last":false,"index":1,"pageCount":2,"additionalContext":{"authors":[{"authorsPage":true,"bio":"Hi, I'm Reno.\nI am an Android developer and love to play games and cook and kickboard.\nMy favorite word is that it's not over until the end.\n","id":"3e9ccc1b-53d9-552d-a736-92a82c29fb2a","name":"Reno Kim","featured":true,"social":[{"url":"https://www.linkedin.com/in/renovatio0424"},{"url":"https://github.com/renovatio0424"}],"slug":"/authors/reno-kim","avatar":{"small":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAIDAQQF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAwEE/9oADAMBAAIQAxAAAAGnauhF47BBtkFsmLl//8QAGxABAQACAwEAAAAAAAAAAAAAAgEDEQATIjP/2gAIAQEAAQUCxmimLeb6ZGQe3Yd27zHfcEt//8QAGhEAAgIDAAAAAAAAAAAAAAAAAREAAgMQM//aAAgBAwEBPwEYyQ4lK89f/8QAFxEBAAMAAAAAAAAAAAAAAAAAEAERMf/aAAgBAgEBPwGydP/EABwQAAICAgMAAAAAAAAAAAAAAAABESECEDFBcf/aAAgBAQAGPwKcbIaUaUK+iU7XKGxay9P/xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhUTFBYfD/2gAIAQEAAT8hZlpqJo1LxDSDqOtju2phdh8p70xtZcRQekbk+E//2gAMAwEAAgADAAAAEEPYP//EABgRAQADAQAAAAAAAAAAAAAAAAEAEBFR/9oACAEDAQE/EOfMUsaldn//xAAYEQACAwAAAAAAAAAAAAAAAAAAARARIf/aAAgBAgEBPxDDFUn/xAAeEAEBAAICAgMAAAAAAAAAAAABEQAhMUFRcYGRwf/aAAgBAQABPxA6LCB2F558Y7umvO8P3jPtAP3CQECNBq4qvew9vjGdI0h1jiVCwuJg8g3smR0SQNARn//Z","aspectRatio":1,"src":"/static/fd36d5b8be98b6b35c5ea46e0a863cf4/fa1ea/reno-profile.jpg","srcSet":"/static/fd36d5b8be98b6b35c5ea46e0a863cf4/afb2b/reno-profile.jpg 13w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/7c20e/reno-profile.jpg 25w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/fa1ea/reno-profile.jpg 50w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/03612/reno-profile.jpg 75w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/61cdf/reno-profile.jpg 100w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/1920d/reno-profile.jpg 1080w","srcWebp":"/static/fd36d5b8be98b6b35c5ea46e0a863cf4/e7b2c/reno-profile.webp","srcSetWebp":"/static/fd36d5b8be98b6b35c5ea46e0a863cf4/58718/reno-profile.webp 13w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/74aad/reno-profile.webp 25w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/e7b2c/reno-profile.webp 50w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/ed320/reno-profile.webp 75w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/66016/reno-profile.webp 100w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/4c77b/reno-profile.webp 1080w","sizes":"(max-width: 50px) 100vw, 50px"},"medium":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAIDAQQF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAwEE/9oADAMBAAIQAxAAAAGnauhF47BBtkFsmLl//8QAGxABAQACAwEAAAAAAAAAAAAAAgEDEQATIjP/2gAIAQEAAQUCxmimLeb6ZGQe3Yd27zHfcEt//8QAGhEAAgIDAAAAAAAAAAAAAAAAAREAAgMQM//aAAgBAwEBPwEYyQ4lK89f/8QAFxEBAAMAAAAAAAAAAAAAAAAAEAERMf/aAAgBAgEBPwGydP/EABwQAAICAgMAAAAAAAAAAAAAAAABESECEDFBcf/aAAgBAQAGPwKcbIaUaUK+iU7XKGxay9P/xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhUTFBYfD/2gAIAQEAAT8hZlpqJo1LxDSDqOtju2phdh8p70xtZcRQekbk+E//2gAMAwEAAgADAAAAEEPYP//EABgRAQADAQAAAAAAAAAAAAAAAAEAEBFR/9oACAEDAQE/EOfMUsaldn//xAAYEQACAwAAAAAAAAAAAAAAAAAAARARIf/aAAgBAgEBPxDDFUn/xAAeEAEBAAICAgMAAAAAAAAAAAABEQAhMUFRcYGRwf/aAAgBAQABPxA6LCB2F558Y7umvO8P3jPtAP3CQECNBq4qvew9vjGdI0h1jiVCwuJg8g3smR0SQNARn//Z","aspectRatio":1,"src":"/static/fd36d5b8be98b6b35c5ea46e0a863cf4/61cdf/reno-profile.jpg","srcSet":"/static/fd36d5b8be98b6b35c5ea46e0a863cf4/7c20e/reno-profile.jpg 25w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/fa1ea/reno-profile.jpg 50w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/61cdf/reno-profile.jpg 100w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/59538/reno-profile.jpg 150w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/fd013/reno-profile.jpg 200w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/1920d/reno-profile.jpg 1080w","srcWebp":"/static/fd36d5b8be98b6b35c5ea46e0a863cf4/66016/reno-profile.webp","srcSetWebp":"/static/fd36d5b8be98b6b35c5ea46e0a863cf4/74aad/reno-profile.webp 25w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/e7b2c/reno-profile.webp 50w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/66016/reno-profile.webp 100w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/d9b14/reno-profile.webp 150w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/6b183/reno-profile.webp 200w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/4c77b/reno-profile.webp 1080w","sizes":"(max-width: 100px) 100vw, 100px"},"large":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAIDAQQF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAwEE/9oADAMBAAIQAxAAAAGnauhF47BBtkFsmLl//8QAGxABAQACAwEAAAAAAAAAAAAAAgEDEQATIjP/2gAIAQEAAQUCxmimLeb6ZGQe3Yd27zHfcEt//8QAGhEAAgIDAAAAAAAAAAAAAAAAAREAAgMQM//aAAgBAwEBPwEYyQ4lK89f/8QAFxEBAAMAAAAAAAAAAAAAAAAAEAERMf/aAAgBAgEBPwGydP/EABwQAAICAgMAAAAAAAAAAAAAAAABESECEDFBcf/aAAgBAQAGPwKcbIaUaUK+iU7XKGxay9P/xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhUTFBYfD/2gAIAQEAAT8hZlpqJo1LxDSDqOtju2phdh8p70xtZcRQekbk+E//2gAMAwEAAgADAAAAEEPYP//EABgRAQADAQAAAAAAAAAAAAAAAAEAEBFR/9oACAEDAQE/EOfMUsaldn//xAAYEQACAwAAAAAAAAAAAAAAAAAAARARIf/aAAgBAgEBPxDDFUn/xAAeEAEBAAICAgMAAAAAAAAAAAABEQAhMUFRcYGRwf/aAAgBAQABPxA6LCB2F558Y7umvO8P3jPtAP3CQECNBq4qvew9vjGdI0h1jiVCwuJg8g3smR0SQNARn//Z","aspectRatio":1,"src":"/static/fd36d5b8be98b6b35c5ea46e0a863cf4/ec46e/reno-profile.jpg","srcSet":"/static/fd36d5b8be98b6b35c5ea46e0a863cf4/a2637/reno-profile.jpg 82w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/15203/reno-profile.jpg 164w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/ec46e/reno-profile.jpg 328w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/b69a5/reno-profile.jpg 492w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/23a36/reno-profile.jpg 656w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/1920d/reno-profile.jpg 1080w","srcWebp":"/static/fd36d5b8be98b6b35c5ea46e0a863cf4/5a48e/reno-profile.webp","srcSetWebp":"/static/fd36d5b8be98b6b35c5ea46e0a863cf4/2d087/reno-profile.webp 82w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/29d87/reno-profile.webp 164w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/5a48e/reno-profile.webp 328w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/42f2e/reno-profile.webp 492w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/dec03/reno-profile.webp 656w,\n/static/fd36d5b8be98b6b35c5ea46e0a863cf4/4c77b/reno-profile.webp 1080w","sizes":"(max-width: 328px) 100vw, 328px"}}}],"basePath":"/","skip":6,"limit":6}}},"staticQueryHashes":["1143375668","1491088328","2444214635","3372861117"]}