How does Google design APIs?
โป ์๋ฌธ : How to Design a Good API and Why it Matters(Google Tech Talks, 2007.1.24) โป ์ ์ : Joshua Bloch, Principal Software Engineer, Google
01. API ์ค๊ณ๊ฐ ์ ์ค์ํ๊ฐ?
์ฒซ์งธ, API๋ ํ์ฌ์ ์ค์ํ ์์ฐ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ ์ธ ๊ฐ์ง ์ด์ ๋๋ฌธ์ด๋ค.
๊ณ ๊ฐ(API ์ฌ์ฉ์)๋ค์ ๋ฌด์ญ๊ฒ ํฌ์ํ๋ค : ๊ตฌ๋งคํ๊ณ , ์ฌ์ฉํ๊ณ , ๋ฐฐ์ด๋ค.
์ด์์ค์ธ API๋ฅผ ์ค๋จ์ํค๋ ๋น์ฉ์ ์๋๋ ๋ผ ์ ์๋ค.
์ฑ๊ณต์ ์ธ Public API๋ ๊ณ ๊ฐ์ ๋ถ๋ฌ๋ค์ธ๋ค.
Public API๋ ํ๋ฒ ์คํํ๋ฉด ํจ๋ถ๋ก Shutdown ํ ์ ์๋ค.
๊ทธ๋์ ์ ๋๋ก ๋ง๋ค ๊ธฐํ๋ ์ค์ง ๋ฑ ํ ๋ฒ ๋ฟ์ด๋ค.
์ฒ์์ ๋ง๋ค ๋ ์ ๋๋ก ๋ง๋ค์ด์ผ ํ๋ค.
02. ๋์๊ฒ ์ API๊ฐ ์ค์ํ๊ฐ?
์ฒซ์งธ, ๋น์ ์ด ๊ฐ๋ฐ์๋ผ๋ฉด, ๋น์ ์ ์ด๋ฏธ API ์ค๊ณ์์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ข์ ์ฝ๋๋ ๋ชจ๋ํ๋์ด ์๊ณ , ์ข์ ๋ชจ๋์ API๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
๊ทธ๋์ ๋น์ ์ด ๊ฐ๋ฐ์๋ผ๋ฉด, ์ข์ API๋ฅผ ์ด๋ป๊ฒ ์ค๊ณํ๋์ง ์์์ผํ๋ค.
๋์งธ, ์ ์ฉํ ๋ชจ๋๋ค์ ๋ฐ๋์ ์ฌ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ด๋ค.
๋ชจ๋์ด ์ผ๋จ ์ฌ์ฉ์๋ฅผ ๊ฐ์ง๊ธฐ ์์ํ๋ฉด, ์์๋ก API๋ฅผ ๋ฐ๊ฟ ์ ์๋ค.
์ข์ ๋ฐฉํฅ์ผ๋ก ์ฌ์ฌ์ฉ๋๋ ๋ชจ๋๋ค์ ํ์ฌ์ ์์ฐ์ด๋ค.
03. ์ข์ API์ ํน์ง
๋ค์๊ณผ ๊ฐ์ 7๊ฐ์ง ํน์ง์ด ์๋ค.
๋ฐฐ์ฐ๊ธฐ ์ฝ๋ค.
๋ฌธ์๊ฐ ์์ด๋ ์ฌ์ฉํ๊ธฐ ์ฝ๋ค.
์๋ชป ์ฌ์ฉํ๊ธฐ ์ด๋ ต๋ค.
์ฝ๊ธฐ ์ฝ๊ณ , API๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ์ ์ง๋ณด์ํ๊ธฐ ์ฝ๋ค.
์๊ตฌ์ฌํญ์ ๋ง์กฑ์ํค๊ธฐ์ ์ถฉ๋ถํ ๊ฐํ๋ค.
ํ์ฅํ๊ธฐ ์ฝ๋ค.
์ฌ์ฉํ๋ ์ฌ๋๋ค์ ์์ค์ ๋ง์ ๊ฒ.
04. ์ข์ API์ ์ค๊ณ๋ฐฉ๋ฒ
4.1. API ์ค๊ณ ๊ณผ์
์ ๋นํ ์์ค, ํ์์ ์ธ ํ๋๋ก ์๊ตฌ์ฌํญ ์์งํ๊ธฐ.
์ข
์ข
์๋ฃจ์
๋ค์ ์ ์ ๋ฐ์ ์๋ ์๋ค. ํ์ง๋ง ์ง์ง ์ค์ํ ๊ฑด ์๋ฃจ์
์ด ์๋๋ผ ์๊ตฌ์ฌํญ์ ์์งํ๋ ๊ฒ์ด๋ค.
๊ฐ๋ฅํ๋ฉด ๊ธฐ๋ฅ ๋์ด์ด ์๋๋ผ, ์ ์ฆ ์ผ์ด์ค ํํ๋ก ์์งํด์ผํ๋ค. ์ ์ฆ ์ผ์ด์ค๊ฐ ์ผ๋ฐ์ ์ผ ์๋ก ์ค๊ณ๊ฐ ๋ ์ฌ์์ง๊ฑฐ๋, ๋ณด์์ด ์ปค์ง ์ ์๋ค.
์งง์ ์คํ์ผ๋ก ์์ํ๊ธฐ
ํ ํ์ด์ง๊ฐ ์ด์์ ์ด๋ค. Agility๊ฐ ์๋ฒฝํจ์ ์ด๊ธด๋ค. ๊ฐ๋ฅํ๋ฉด ํ ํ์ด์ง ๋ด์ ๋ชจ๋ ๊ฑธ ๋ด์๋ด๋ผ.
๊ฐ๋ฅํ ๋ง์ ์ฌ๋๋ค๋ก๋ถํฐ ๋ฐ์์ ์ดํด๋ผ. ๊ทธ๋ค์ ์ด์ผ๊ธฐ๋ฅผ ๊ท ๊ธฐ์ธ์ฌ ๋ฃ๊ณ , ์ฌ๊ฐํ๊ฒ ๋ฐ์๋ค์ฌ๋ผ.
์คํ์ด ์์์๋ก, ๊ณ ์น๊ธฐ ์ฝ๋ค. ์์ ๊ฐ์ ์ป์ ๋๊น์ง ์ด์ ๋ถ์ฌ๋ผ. ์ด ๊ณผ์ ์ ํ์ฐ์ ์ผ๋ก ์ฝ๋ฉ์ ๋๋ฐํ๋ค.
๋ฏธ๋ฆฌ API์ ๊ธ์ ์ ๊ธฐ. ์์ฃผ ์์ฃผ ์ ์ด๋๊ธฐ.
๋น function ๋ด์ ํ์ํ ๊ธฐ๋ฅ๋ค์ ์ฃผ์์ผ๋ก ๋ฏธ๋ฆฌ ์ ์ด๋ผ.
๊ฐ๋ฅํ ์์ฃผ ์๊ฐ๋ ๋๋ง๋ค ์ ์ด ๋ฃ์ด๋ผ.
API ๊ฐ๋ฐ ์๊ฐ์ ๋ง์ด ์ ์ฝํด์ค๋ค.
๊ฐ๋ฅํ ์คํ์ ์ก๊ธฐ ์ด์ ๋ถํฐ ์์ํด๋ผ. ์คํ์ ์ก๋ ์๊ฐ๋ ์ ์ฝํด์ค๋ค.
์ด์ด ๋ถ์ ๋๊น์ง API์ ๊ธ์ ์ ์ด๋ผ. ๋์ฐํ ์คํจ๋ฅผ ์๋ฐฉํด์ค๋ค.
์ฝ๋๋ ์์ ์ Unit Test๋ฅผ ๋จน๊ณ ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์๋น์ค ์ธํฐํ์ด์ค์ ์ ๋ ๊ฑด ๋ ์ค์
์๋น์ค ์ธํฐํ์ด์ค๋, ๋จ์ด ์ฐ๋ผ๊ณ ์ด์ด์ฃผ๋ ์ธํฐํ์ด์ค๋ฅผ ๋ปํ๋ค.
ํ๋ฌ๊ทธ์ธ ๋ฐฉ์์ผ๋ก ์ค๊ณํ๋ฉด, ์ฌ๋ฌ ๊ฐ์ Implementation์ ํฌํจํ ์ ์๋ค.
Java Cryptographt Extension ๊ฐ์ ๊ฒ์ด๋ค.
๋ฐฐํฌํ๊ธฐ ์ ์ Multiple plugin๋ค์ ๋ง๋ค์ด๋ผ.
๋ง์ผ ํ๋ฌ๊ทธ์ธ ํ๋๋ฅผ ๋ง๋ค๋ฉด, ์๋ง๋ API๊ฐ ๋ค๋ฅธ ๊ฒ์ ์ง์ํ์ง ๋ชปํ๊ฒ ๋ ๊ฒ์ด๋ค.
๋ ๊ฐ๋ฅผ ๋ง๋ ๋ค๋ฉด, ์ด๋ ต๊ฒ๋ผ๋ ์ฌ๋ฌ๊ฐ๋ฅผ ์ง์ํ๊ธฐ๋ ํ ๊ฒ์ด๋ค.
์ธ ๊ฐ๋ฅผ ๋ง๋ ๋ค๋ฉด, ๊ทธ๊ฒ์ ์์ฃผ ์ ์๋ํ ๊ฒ์ด๋ค.
ํ์ค์ ๊ธฐ๋์์ค์ ๋ฐ์๋ค์ด๊ธฐ
API ์ค๊ณ๋ฅผ ๋ณด๋ฉด ๋ชจ๋ ์ฌ๋์ ๋ง์กฑ์ํค๊ธฐ ์ํด ์ง๋์น๊ฒ ์ ์ฝ๋์ด ์๋ค.
ํ์ง๋ง, ๋ชจ๋ ์ฌ๋์ ๋ง์กฑ์ํฌ ์ ์๋ค. ๊ทธ๋ฅ ๋ชจ๋ ์ฌ๋๋ค์ ๋๊ฐ์ด ๋ง์กฑ์ค๋ฝ์ง ๋ชปํ๊ฒ ํ๋ผ.
์ค์๋ฅผ ๋๋ฌด ์ ๊ฒฝ์ฐ์ง๋ง๊ณ , ๊ทธ๊ฑธ ๊ธฐํ๋ก API๋ฅผ ์งํ์์ผ๋ผ.
4.2. ์ผ๋ฐ ์์น
API๋ ํ๋์ ์ผ๋ง ์ฒ๋ฆฌํด์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ , ๊ทธ๊ฑธ ์์ฃผ ์ ์ฒ๋ฆฌํ ์ ์์ด์ผ ํ๋ค. ๊ทธ๋์ ๊ธฐ๋ฅ์ ์ค๋ช ํ๊ธฐ ์ฌ์์ผ ํ๋ค.
๋ง์ผ ์ด๋ฆ์ง๊ธฐ ํ๋ค๋ค๋ฉด, ๊ธฐ๋ฅ์ ๋ณต์กํ๊ฒ ์ ์ํ ๊ฒ์ด๋ค. ์ข์ ์ด๋ฆ์ ์ง์ด๋ณด๋ผ.
๊ฐ๋ฐ์ด ์์ฐ์ค๋ฝ๊ฒ ๋ ๊ฒ์ด๋ค. ๊ทธ๋ ๊ฒ ๋ ์ ์๋๋ก, ์ฌ๋ฌ ๋ชจ๋๋ค์ ์ชผ๊ฐ๊ฑฐ๋ ํฉ์ณ๋ณด๋ผ.
API๋ ๊ฐ๋ฅํ ์๊ฒ ๋ง๋ค์ด์ผ ํ๋ค.
ํ์ง๋ง, ๋๋ฌด ์์์๋ ์๋๋ค. API๋ ์๊ตฌ์ฌํญ์ ๋ง์กฑ์์ผ์ผ ํ๋ค.
์ด๋ป๊ฒ ๋ง๋ค์ด์ผ ํ ์ง ๋ชจ๋ฅด๊ฒ ๋ค๋ฉด ๊ทธ๋ฅ ๊ทธ๋๋ก ๋์ด๋ผ.
๊ธฐ๋ฅ, class, method, param๊น์ง ๋ญ๊ฐ๋ฅผ ๋ํ๊ธฐ๋ ์ฝ์ง๋ง, ์ ๊ฑฐํ๊ธฐ๋ ์ด๋ ต๋ค.
์ผ๋จ API๊ฐ ๋ฐฐํฌ๋์ด ์ฌ์ฉ์๊ฐ ์๊ธฐ๊ธฐ ์์ํ๋ฉด ํ์ํ๋ ๊ฒ์ ๊ฑฐ์ ๋ถ๊ฐ๋ฅํ๋ค.
๊ฐ๋ ์ ์ธ ๋ฌด๊ฒ๊ฐ์ด ๊ธฐ๋ฅ์ ๊ท๋ชจ๋ณด๋ค ๋ ์ค์ํ๋ค. API ์ ํ๊ณผ ๋ฌด๊ฒ ๊ฐ์ ๊ท ํ๋น๋ฅผ ์ฐพ์๋ผ.
Implementation ์ด API์ ์ํฅ์ ์ฃผ์ด์๋ ์๋๋ค.
๊ตฌํ์ด ๋๋ฌด ์ธ์ธํด์ง๋ฉด, API ์ฌ์ฉ์๋ค์ ํผ๋์ค๋ฝ๊ฒ ํ๋ค.
Implementation ์ ํ๊ธฐ ์ํ ๊ทธ๋ค์ ์์ ๋ฅผ ๋ฐฉํดํ๋ค.
์ธ์ธํ ๊ตฌํ์ด ๋ฌด์์ธ์ง๋ฅผ ์ ํํ ์์๋ผ.
Method behavior ์คํ์ ๋๋ฌด ๊ณผํ๊ฒ ์ก์ง ๋ง๋ผ.
์๋ฅผ ๋ค๋ฉด Hash function ๋ค์ ์คํํํ์ง ์๋๋ค.
๋ชจ๋ ํ๋ ํ๋ผ๋ฏธํฐ๋ค์ด ๊ผญ ํ์ํ์ง ์์ฌํด ๋ณธ๋ค.
์ฆ, ๋ชจ๋ ์ผ์ด์ค๋ฅผ ์ง์ํ๋ค๊ณ ์ข์ API ๊ฐ ์๋๋ค.
API ์ค๊ณ์ ์ฌ์ฉ์๋ค์ ์ธ์ธํ Implementation ์ ๋ชจ๋ ๋ด์ง ๋ง๋ผ. ๋์คํฌ ์์ด๋, ๋คํธ์ํฌ ์์ด๋, ์์ธ ์ผ์ด์ค๋ก๋ผ๋ !!!
๋ชจ๋ ๊ฒ์ ์ ๊ทผ์ ์ต์ํํ๋ผ.
๊ฐ๋ฅํ Private ํ๊ฒ Class ์ Member๋ฅผ ๋ง๋ค์ด๋ผ.
Public class ๊ฐ ๊ฐ๋ฅํ Public field๋ฅผ ๊ฐ์ ธ์๋ ์๋๋ค.
์ ๋ณด์ํ๋ฅผ ์ต๋ํํ๋ผ.
๋ชจ๋์ด ๋ ๋ฆฝ์ ์ผ๋ก Debug ๋๊ณ , ์ดํด๋์ด์ง๊ณ , ๊ตฌ์ถ๋์ด์ง๊ณ , ํ ์คํธ ๋์ด์ง๋๋ก ํ๋ผ.
์ด๋ฆ์ด ์ค์ํ๋ค.
API ๋ ์์ ์ธ์ด๋ค. ์ด๋ฆ์ ๊ตณ์ด ์ค๋ช ํ์ง ์์๋ ์ดํด๋ ์ ์์ด์ผ ํ๋ค.
๊ธฐํธ๋ ์ถ์ฝ์ ์ฌ์ฉํ์ง ๋ง๋ผ. ์ผ๊ด์ฑ์ ์ ์งํ๋ผ.
API ์ ๋ฐ์ ๊ฑธ์ณ, ๋๊ฐ์ ๋จ์ด๋ผ๋ฉด ๊ธฐ๋ฅ๋ ๊ฐ์ ๊ฒ์ด์ด์ผ ํ๋ค.
๊ท์น์ ์ด์ด์ผ ํ๋ค. ๋์นญ๊ณผ ๊ท ํ์ ๊ฐ๊ตฌํ๋ผ. ์ฝ๋๋ ์ฐ๋ฌธ์ฒ๋ผ ์ฝํ ์ ์์ด์ผ ํ๋ค.
์ข ๊ต์ฒ๋ผ ๋ฌธ์ํํ๋ผ.
๋ชจ๋ class, interface, method, constructor, parameter, and exception ์ ๋ฌธ์ํํ๋ผ.
Class : instance ํ ๋๋ ๊ฒ๋ค
Method : method ์ ๊ทธ client ๋ค๊ฐ์ ๊ณ์ฝ๋ค์ด๋ค.
Parameter : units, form, ownership ๋ฑ์ ์ง์นญํ๋ค.
State-space ๋ฅผ ์ฃผ์๊น๊ฒ ๋ฌธ์ํํ๋ผ.
API์ ์ฑ๋ฅ ๊ฒฐ๊ณผ์ ๋ํด์๋ ๊ณ ๋ คํ๋ผ.
๋์ ์์ฌ๊ฒฐ์ ์ ์ฑ๋ฅ ํ๊ณ๋ฅผ ๋ง๋ ๋ค.
Type ์ ์ํธ ๊ตํ๊ฐ๋ฅํ๊ฒ ๋ง๋ค์ด๋ผ.
Static factory ๋์ Constructor ๋ฅผ ์ ๊ณตํ๋ผ.
Interface ๋์ ์ Implementation type ์ ์ฌ์ฉํ๋ผ.
์ฑ๋ฅ์ ์ป๊ธฐ ์ํด API๋ฅผ ๋คํ์ง ๋ง๋ผ.
๊ทธ๋ ๊ฒ ํ๋ค๋ฉด ์ฑ๋ฅ ์ด์๊ฐ ๊ณ ์ณ์ง ์ ์๋ค.
ํ์ง๋ง ์์ํ ๊ณจ์น๊ฑฐ๋ฆฌ๋ฅผ ๋ง๋๋ ์ผ์ด๋ค.
์ข์ ์ค๊ณ๋ ์ข์ ์ฑ๋ฅ๊ณผ ์ผ๋ฐ์ ์ผ๋ก ์ผ์นํ๋ค.
์ฑ๋ฅ์ ๊ณ ๋ คํ API ์ค๊ณ๋ ์ค์ง์ ์ธ ํจ๊ณผ๋ก ๋ํ๋ ๋ฟ ์๋๋ผ ์์ํ๋ค.
Component.getSize()๋ Dimension์ return ํ๋ค. Dimenstion ์ mutual ํ๋ค.
๋ชจ๋ getSize call ์ Dimension์ ํ ๋นํด์ผ๋ง ํ๋ค.
์๋ง์ ๋ถํ์ํ object allocation ์ด ๋ฐ์ํ๋ค.
๋์ฒด์์ด 1.2 ๋ฒ์ ์ ์ถ๊ฐ๋๋ค : old client code ๋ ์ฌ์ ํ ๋๋ฆฌ๋ค.
API๋ ํ๋ซํผ๊ณผ ํํ์ ์ผ๋ก ๊ณต์กดํด์ผ๋ง ํ๋ค.
๊ด์ต์ ์ธ ๊ฒ์ ๋ฐ๋ผ๋ผ.
ํ์ค naming rule ์ ๋ฐ๋ผ๋ผ.
๋ ์์ ์ธ ํ๋ผ๋ฏธํฐ๋ Return Type์ ์ฐ์ง๋ง๋ผ.
์ฝ์ด API๋ ์ธ์ด์ ์๋ ํจํด์ ํ๋ด๋ด์ด ์จ๋ผ.
API ์นํ์ ์ธ ํน์ง์ ์ด์ฉํ๋ผ.
Generics, varargs, enums, default arguments
API ์ ์ํ๊ณผ ๋จ์ ๋ค์ ์ ์๊ณ ํํผํ๋ผ.
finalizers, Public static final arrays
4.3. Class ์ค๊ณ
๋ณ๊ฒฝ์ ์ต์ํํ๋ผ.
๋ง์ผ ๋ค๋ฅธ ์ผ์ ํด์ผ ํ ์ถฉ๋ถํ ์ด์ ๊ฐ ์๋ค๋ฉด, class ๋ ๋ถ๋ณ์ ๊ฒ์ด์ด์ผ ํ๋ค.
์ฅ์ : simple, thread-safe, reusable
๋จ์ : ๊ฐ value ๋ณ๋ก ๋ถ๋ฆฌ๋ object
๋ง์ผ ๋ณ๊ฒฝํด์ผ ํ๋ค๋ฉด, State-space๋ฅผ ์๊ฒ ์ ์งํ๊ณ , ์ ์๋ฅผ ์ ์ ์งํ๋ผ. ์ธ์ , ์ด๋ค method๋ฅผ ๋ถ๋ฅด๋๊ฒ ํฉ๋ฆฌ์ ์ธ์ง๋ฅผ ๋ช ํํ ํ๋ผ.
Bad: Date, Calendar
Good: TimerTask
Subclass๋ Substitutability ๋ฅผ ์๋ฏธํ๋ค.
โโฆ์ โฆ์ด๋คโ ๋ผ๋ ๊ด๊ณ๊ฐ ์กด์ฌํ ๋๋ง subclass ๋ฅผ ์จ๋ผ.
๊ทธ๋ ์ง ์์ผ๋ฉด, Composition ์ ์ฌ์ฉํ๋ผ.
Bad: Properties extends Hashtable, Stack extends Vector
Good: Set extends Collection
์์์ ์ํด ์ค๊ณํ๊ณ ๋ฌธ์๋ฅผ ๋จ๊ฒจ๋ผ.
์ค๊ณ๊ฐ ๊ทธ๋ ๊ฒ ๋์ด ์์ง ์๊ณ ๋ฌธ์๊ฐ ์๋ค๋ฉด, ์์์ ๋ชปํ๊ฒ ๋ง๋ค์ด๋ผ.
์์์ด๋ ์บก์ํ์ ์์ถฉํ๋ค.
subclass ๋ superclass ์ ์ธ์ธํ ๊ตฌํ์ ๋ฏผ๊ฐํ๋ค. ๋ง์ผ subclass ๋ฅผ ํ๋ฝํ๋ค๋ฉด, self-use๋ฅผ ๋ฌธ์ํํ๋ผ.
method๊ฐ ์ด๋ป๊ฒ ๋ค๋ฅธ method ๋ฅผ ์ฌ์ฉํ๋์ง ์ดํด๋ณด๋ผ. ๋ณด์์ ์ธ ์ ์ฑ ์ผ๋ก๋ ๋ชจ๋ ๊ตฌ์ฒด์ ์ธ class ๋ final ์ด์ด์ผ ํ๋ค.
Bad: Many concrete classes in J2SE libraries
Good: AbstractSet, AbstractMap
4.4. Method ์ค๊ณ
๋ชจ๋์ ๋ฃ์ ์ ์๋ ๊ธฐ๋ฅ์ Client๊ฐ ํ๊ฒ ํ์ง ๋ง๋ผ.
Boilerplate code ์ ๋ํ ํ์๋ฅผ ์ค์ฌ๋ผ.
Boilerplate code ๋ ์ผ๋ฐ์ ์ผ๋ก cut-and-paste ๋ก ํํด์ง๋ ์ฝ๋๋ฅผ ๋งํ๋ค.
๋ชจ๋์ cut&pasteํด์ Client ๋ด์ ๋ฃ์ด๋ฒ๋ฆฌ๋ฉด, ์์ฃผ ๋ฒ๊ฑฐ๋กญ๊ณ ์ค๋ฅ ๋ฐ์์ด ์ฆ๊ฒ ๋๋ค.
โ์ฌ์ฉ์๋ฅผ ๋๋ผ๊ฒ ํ์ง ์๊ธฐโ ์์น์ ์ค์ํ๋ผ
API ์ฌ์ฉ์๊ฐ Behavior ์ ์ํด ๋๋ผ์๋ ์๋๋ค.
๊ทธ๋ ๊ฒ ํ๊ธฐ ์ํด ๊ตฌํ์ ์ถ๊ฐ์ ์ธ ๋ ธ๋ ฅ์ ๊ธฐ์ธ์ผ๋งํ ๊ฐ์น๊ฐ ์๋ค.
๊ทธ๋ฆฌ๊ณ , ์กฐ๊ธ ์ฑ๋ฅ์ ๊น์ฌ๋ ๋ ๋งํ ๊ฐ์น๊ฐ ์๋ค.
๋นจ๋ฆฌ ์คํจํ๋ผ.
์ฅ์ ๊ฐ ๋ฐ์๋๋ฉด ๊ฐ๋ฅํํ ๋นจ๋ฆฌ ์๋ฌ๋ฅผ ์๋ ค๋ผ. ์ปดํ์ผ ์๊ฐ์ด ์ ์ผ ์ข๋ค.
static typing, generics
๋ฐํ์์, ์ฒซ ์๋ชป๋ method invocation ์ด ์ ์ผ ์ข๋ค.
method ๋ ๋ฐ๋์ failure-atomic ํด์ผ ํ๋ค.
String ํฌ๋งท์ผ๋ก ์๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋ก๊ทธ๋จ ๊ตฌ์กฐ๋ก ๋ฐ๊พธ์ด๋ผ.
๊ทธ๋ ๊ฒ ํ์ง ์์ผ๋ฉด client๋ string์ parseํด์ผํ๋ค.
Client๋ ๊ดด๋กญ๋ค.
๋ ๋์ ๊ฑด, string์ด ์ฌ์ค ์์ API๋ก ๋ณ์ง๋์ด ๋ฒ๋ฆฐ๋ค.
์ฃผ์๋ฅผ ๊ฐ์ง๊ณ Overloadingํ๋ผ.
๋ชจํธํ ์ค๋ฒ๋ก๋๋ ํผํ๋ผ.
์ฌ๋ฌ ๊ฐ์ ์ค๋ฒ๋ก๋ฉ์ด ๋์์ ์ ์ฉ๋ ์ ์๋ค.
๋ณด์์ ์ด ๋์ด๋ผ : ๋์ผํ argument ์ซ์๊ฐ ์๋๋ก ํ๋ผ.
๋ชจํธํ ์ค๋ฒ๋ก๋ฉ์ ์ ๊ณตํด์ผ ํ๋ค๋ฉด, ๋์ผํ arguments์ ๋ํด์๋ ๋์ผํ behavior ๊ฐ ์ผ์ด๋๊ฒ ํ๋ผ.
์ ์ ํ Parameter์ Return type ์ ์ฌ์ฉํ๋ผ.
Input ์ ์ํด class ์ ๋ฐ์ interface type ์ ์ฅ๋ คํ๋ผ. ์ ์ฐ์ฑ๊ณผ ์ฑ๋ฅ์ ์ ๊ณตํ๋ผ.
๊ฐ์ฅ ๊ตฌ์ฒด์ ์ด๋ฉด์ ๊ฐ๋ฅํ input parameter type ๋ค์ ์ฌ์ฉํ๋ผ.
๋ฐํ์ ์๊ฐ์ผ๋ก๋ถํฐ ์ปดํ์ผ ์๊ฐ๊น์ง ์๋ฌ๋ฅผ ์ฎ๊ฒจ๋ผ.
๋ ์ข์ type ์ด ์์ผ๋ฉด, string ์ ์ฌ์ฉํ์ง ๋ง๋ผ.
String ์ ๋ฌด๊ฒ๊ณ , ์๋ฌ๊ฐ ๋๊ธฐ ์ฝ๊ณ , ๋๋ฆฌ๊ธฐ๊น์ง ํ๋ค.
ํตํ๋ฅผ ํํํ๋๋ฐ floating point ๋ฅผ ์ฌ์ฉํ์ง ๋ง๋ผ.
binary floating point ๋ ๋ถ์ ํํ ๊ฒฐ๊ณผ๋ฅผ ์ผ๊ธฐ์ํจ๋ค.
float(32 bits) ๋ณด๋ค double(64 bits)๋ฅผ ์ฌ์ฉํ๋ผ.
์ ํ์ฑ ์์ค์ ํ์ค์ด๊ณ , ์ฑ๋ฅ ์์ค์ ๋ฌด์ํ ๋ง ํ๋ค.
Method ์ ๋ฐ์ ๊ฑธ์ณ ์ผ๊ด์ ์ธ Parameter ordering์ ์ฌ์ฉํ๋ผ.
ํนํ parameter type ๋ค์ด ๋์ผํ ๋ ๋์ฑ ์ค์ํ๋ค.
๊ธด ํ๋ผ๋ฏธํฐ๋ฅผ ๋ง๋ค์ง ๋ง๋ผ.
ํ๋ผ๋ฏธํฐ ์๋ 3 ๊ฐ, ๋๋ ๋ ์ ์ ์๊ฐ ์ด์์ ์ด๋ค. ๋ ๋ง๋ค๋ฉด, ์ฌ์ฉ์๋ค์ ๋ฌธ์๋ฅผ ๋ค์ฌ๋ค๋ณด๋ ค ํ๋ค.
ํนํ ๋๊ฐ์ด ํ์ดํ๋ ๊ธด ํ๋ผ๋ฏธํฐ ๋ฆฌ์คํธ๋ ์ํํ๋ค. ํ๋ก๊ทธ๋๋จธ๋ค์ Parameter ์์๋ฅผ ์ค์๋ก ๋ฐ๊พธ์ด๋ฒ๋ฆด ์ ์๋ค.
๋ฌผ๋ก ์ฝ๋๋ ์ฌ์ ํ ์ปดํ์ผ๋๊ณ ์ ์คํ๋๋ค. ๊ทธ๋์ ๊ทธ๊ฒ ๋ ํฐ ๋ฌธ์ ๋ค.
ํ๋ผ๋ฏธํฐ ๋ฆฌ์คํธ๋ฅผ ์งง๊ฒํ ์ ์๋ ๋๊ฐ์ง ๊ธฐ๋ฒ์ด ์๋ค.
method ๋ฅผ ๋๊ฐ๋ก ๋๋์ด๋ผ.
ํ๋ผ๋ฏธํฐ๋ฅผ ์ ์งํ ์ ์๋๋ก Helper class ๋ฅผ ๋ง๋ค์ด๋ผ.
์์ธ์ฒ๋ฆฌ๋ฅผ ์๊ตฌํ๋ Return Value๋ฅผ ๋ง๋ค์ง ๋ง๋ผ.
zero-length array๋ฅผ ๋ฆฌํดํ๊ฑฐ๋ ๋น collection ์ ๋ฆฌํดํ๋ผ. null ์ ๋ฆฌํดํ์ง ๋ง๋ผ.
4.5. Exception ์ค๊ณ
์์ธ ์ํฉ์ ํ์ํ๊ธฐ ์ํด Exception์ ๋์ ธ๋ผ.
Client ๊ฐ Control flow ๋ฅผ ์ํด exception์ ์ฌ์ฉํ๋๋ก ํด์๋ ์๋๋ค.
์ ๋ฐ๋๋ก, ์กฐ์ฉํ๊ฒ fail์ด ๋์๋ ์๋๋ค.
Unchecked Exceptions์ ์ฌ์ฉํ๋ผ.
Checked : client ๊ฐ recovery action ์ ํด์ผ ํ๋ค
Unchecked : programming error
๋ฌผ๋ก Checked exceptions ์ ๊ณผํ ์ฌ์ฉ์ boilerplate ๋ฅผ ์ผ๊ธฐ์ํจ๋ค.
์์ธ ์์ ์๋ฌ์ ๋ณด(failure-capture information)๋ฅผ ํฌํจ์์ผ๋ผ.
์ง๋จ์ ํ์ฉํ๊ณ repair ํ๊ฑฐ๋ recovery ํ๋ผ.
unchecked exception์ ๋ํด์๋ ๋ฉ์์ง๋ก ์ถฉ๋ถํ๋ค.
checked exception์ ๋ํด์๋ accessor ๋ฅผ ์ ๊ณตํ๋ผ.
4.6. ๊ฒฐ๋ก
1. API ๋์์ธ์ ์ฐ์ํ๋ฉด์๋ ๋์ ๋ฒ ์ ์๋ ํ์์ด๋ค.
๋ง์ ํ๋ก๊ทธ๋๋จธ์ ์ฌ์ฉ์๋ค๊ณผ ํ์ฌ๋ค์ ์ด๋กญ๊ฒ ํ๋ค.
2. ์ด ์ด์ผ๊ธฐ๋ ์ด๋ค ์๋ฏธ์์ ํด๋ฆฌ์คํฑํ ๊ธฐ๋ฒ๋ค์ ๋ฎ์ด๋ฒ๋ฆฐ๋ค.
๋ ธ์๊ฐ์ด ํด๋ฆฌ์คํฑํ ๊ธฐ์ ๋ค์ ๋ฌ๋ผ๋ถ์ง ๋ง๋ผ. ์ถฉ๋ถํ ์ด์ ์์ด ๊ทธ๋ค์ ์นจ๋ฒํ์ง๋ ๋ง๋ผ.
3. API ๋์์ธ์ ํ๋ค๋ค.
ํผ์ํ๋ ์์ ์ด ์๋๋ค. ์๋ฒฝํ ์ ์๋ค. ๊ทธ๋ฌ๋ ์๋ฒฝํด์ง๋ ค๊ณ ์๋ํ๋ผ.
4. ๋ป๋ปํ๊ฒ ์ค์ค๋ก Promotionํ๋ผ.
Last updated