[Java] First-class Object, ์ผ๊ธ ๊ฐ์ฒด
๐ ์ผ๊ธ ๊ฐ์ฒด๋?
First-class Object
, ์ผ๊ธ ๊ฐ์ฒด๋ ์ฌ์ค ์๋ฐ์์๋ง ์ฌ์ฉ๋๋ ํํ์ ์๋๋ค. ์ผ๊ธ ๊ฐ์ฒด๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ค์ ๋ํด ์ผ๋ฐ์ ์ผ๋ก ์ ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ์ฐ์ฐ์ ์ง์ํ๋ ๊ฐ์ฒด๋ฅผ ๋งํ๋ฉฐ, ๋ณดํต ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ ๊ฐ๋
์ผ๋ก ์ฌ๊ฒจ์ง๋ค. ๋ํ์ ์ผ๋ก JavaScript, Python์ด ์ผ๊ธ ๊ฐ์ฒด ์ธ์ด์ด๋ฉฐ, C, C++ ๋ฑ์ ๊ทธ๋ ์ง ์๋ค.
์๋ฐ๋ Java 7 ์ด์ ์๋ Object
๋ ์ผ๊ธ ๊ฐ์ฒด์์ผ๋, ๋ฉ์๋๋ ๊ทธ๋ ์ง ์์๋ค. ์ผ๋จ ์ด๋ค ๊ธฐ์ค์ผ๋ก ์ผ๊ธ ๊ฐ์ฒด์ธ์ง ํ๋จํ๋์ง ์ดํด๋ณด์.
๐ ์ผ๊ธ ๊ฐ์ฒด๊ฐ ๋๊ธฐ ์ํ ์กฐ๊ฑด
๋ชจ๋ ํด๋์ค๋ Object
๋ฅผ ์์๋ฐ๋๋ค. User
๋ผ๋ ํด๋์ค๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์.
๋ณ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ์ ์ฅํ ์ ์์ด์ผ ํ๋ค
๋ณ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋ด์ ์ ์๋ค๋ ๊ฒ์, ๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์์ฑํ๊ณ ํด๋น ๋ฉ๋ชจ๋ฆฌ ์์น๋ฅผ ๊ฐ๋ฆฌํค๋ ์ฐธ์กฐ ๊ฐ์ ์ ์ฅํ๋ค๋ ๊ฒ์ด๋ค.
1
2
3
4
User user1 = new User("chosh");
User[] users = new User[2];
users[0] = user1;
์์ฑ์๋ฅผ ํตํด User
๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด ํด๋น ๊ฐ์ฒด๋ ๋ฉ๋ชจ๋ฆฌ์ Heap ์์ญ์ ์์ฑ๋๋ค. user1
์ด๋ผ๋ ๋ณ์๋ ์์ฑ๋ ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ฐธ์กฐํ๊ฒ ๋๋ค. ์ฆ, ๊ฐ์ฒด๋ ๋ณ์์ ์์ ๋กญ๊ฒ ํ ๋นํ ์ ์๋ค.
๋ฉ์๋์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํ ์ ์์ด์ผ ํ๋ค
1
2
3
public static void printUser(User user) {
System.out.println("์ฌ์ฉ์: " + user);
}
printUser(user1)
์ ํธ์ถํ ๋, user1
์ด ๊ฐ๋ฆฌํค๋ User
๊ฐ์ฒด์ ์ฐธ์กฐ ๊ฐ์ด ๋ฉ์๋๋ก ๋ณต์ฌ๋์ด ์ ๋ฌ๋๋ค. ์ด๋ฅผ ํตํด ๋ฉ์๋๋ ์ ๋ฌ๋ฐ์ ๊ฐ์ฒด์ ์ ๊ทผํ ์ ์๋ค.
๋ฉ์๋์ ๋ฆฌํด ๊ฐ์ผ๋ก ์ฌ์ฉํ ์ ์์ด์ผ ํ๋ค
1
2
3
public static User createUser(String name) {
return new User(name);
}
createUser
๋ฉ์๋๋ ๋ด๋ถ์ ์ผ๋ก ์๋ก์ด User
๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ค ๊ฐ์ฒด์ ์ฐธ์กฐ ๊ฐ์ ๋ฆฌํดํ๋ค.
๐ ์๋ฐ์์ ์ผ๊ธ ๊ฐ์ฒด
Java 7 ์ด์ ์๋ ๋ฉ์๋๋ ์ผ๊ธ ๊ฐ์ฒด๊ฐ ์๋์๋ค. ์ฆ, ๋ฉ์๋๋ฅผ ๋ณ์์ ํ ๋นํ ์ ์์๊ณ , ๋ค๋ฅธ ๋ฉ์๋์ ์ธ์๋ก ๋๊ธธ ์ ์์์ผ๋ฉฐ ๋ฉ์๋์์ ๋ฉ์๋๋ฅผ ๋ฆฌํดํ ์ ์์๋ค. ๋ฐ๋ผ์ ๋ฉ์๋๋ฅผ ๋ฆฌํดํ๊ณ ์ถ์ ๋ ๋ฉ์๋๋ฅผ ํฌํจํ๋ ๊ฐ์ฒด๋ก ๊ฐ์ธ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋๋ฐ, ์ด๊ฒ์ด โ์ต๋ช ๋ด๋ถ ํด๋์คโ์ด๋ค.
๊ทธ๋ฌ๋ Java 8๋ถํฐ ๋๋ค ํํ์๊ณผ ํจ์ํ ์ธํฐํ์ด์ค๊ฐ ๋์ ๋๋ฉด์ ๋ฉ์๋๋ฅผ ์ผ๊ธ ๊ฐ์ฒด์ฒ๋ผ ๋ค๋ฃฐ ์ ์๊ฒ ๋์๋ค. ์ ํํ ํํํ๋ฉด ๋ฉ์๋ ์์ฒด๊ฐ ์ผ๊ธ ๊ฐ์ฒด๊ฐ ๋ ๊ฒ์ด ์๋๋ผ, ๋ด๋ถ์ ์ผ๋ก ์ต๋ช ๊ฐ์ฒด๋ก ๋ณํ๋์ง๋ง ๋ง์น ๋๋ค ํํ์์ ์ผ๊ธ ๊ฐ์ฒด์ธ ์ ์ฌ์ฉํ ์ ์๊ฒ ๋ ๊ฒ์ด๋ค.