Coding Planet
[์ดํํฐ๋ธ ์๋ฐ]chapter2 : [์์ดํ 6] ๋ถํ์ํ ๊ฐ์ฒด ์์ฑ์ ํผํ๋ผ ๋ณธ๋ฌธ
๐ป Java Study
[์ดํํฐ๋ธ ์๋ฐ]chapter2 : [์์ดํ 6] ๋ถํ์ํ ๊ฐ์ฒด ์์ฑ์ ํผํ๋ผ
jhj.sharon 2023. 8. 16. 20:52๋ฐ์ํ
์์ดํ 6 : ๋ถํ์ํ ๊ฐ์ฒด ์์ฑ์ ํผํ๋ผ
๋๊ฐ์ ๊ธฐ๋ฅ์ ๊ฐ์ฒด๋ฅผ ๋งค๋ฒ ์์ฑํ๊ธฐ๋ณด๋ค๋ ๊ฐ์ฒด ํ๋๋ฅผ ์ฌ์ฌ์ฉํ๋ ํธ์ด ๋์ ๋๊ฐ ๋ง๋ค. ์ฌ์ฌ์ฉ์ ๋น ๋ฅด๊ณ ์ธ๋ จ๋๋ค.
1. String Instance์ ์์
(1) 'new' ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด ๊ฐ์ฒด๋ฅผ ๋ช ์์ ์ผ๋ก ์์ฑํ ๊ฒฝ์ฐ
- ๋ฌธ์์ด์ heap ์์ฌ๊ฒก ์ ์ฅ๋๋ฉฐ ์๋ ๋ฌธ์ฅ์ด ์คํ๋ ๋ ๋ง๋ค String ์ธ์คํด์ค๋ฅผ ์๋ก ๋ง๋ ๋ค.
String s = new String("Effective Java");
(2) String Constant Pool
- String Constant Pool์ Java์ ๋ฉ๋ชจ๋ฆฌ ์์ญ ์ค ํ๋๋ก, ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ์ ์ฅํ๋ ํน๋ณํ ์์ญ์ด๋ค.
- Java์์ ๋ฌธ์์ด์ ๋ถ๋ณ(immutable)ํ๊ธฐ ๋๋ฌธ์, ๋ ๊ฐ ์ด์์ ๋์ผํ ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ๋ฉ๋ชจ๋ฆฌ์ ํ๋ฒ๋ง ์ ์ฅ๋๋ค.
- ์ด ์ฝ๋๋ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ๋งค๋ฒ ๋ง๋๋ ๋์ ํ๋์ String ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๋ค. ์ด ๋ฐฉ์์ ์ฌ์ฉํ๋ค๋ฉด ๊ฐ์ ๊ฐ์ ๋จธ์ ์์์ ์ด์ ๋๊ฐ์ ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ์ฌ์ฉํ๋ ๋ชจ๋ ์ฝ๋๊ฐ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฌ์ฉํจ์ด ๋ณด์ฅ๋๋ค.
String s = "Effective Java";
(3) ๊ฒ์ฆ ์ฝ๋
- ์๋ ์ฝ๋์์ str1๊ณผ str2๋ ๋์ผํ ๋ฌธ์์ด ๋ฆฌํฐ๋ด "Effective Java"๋ฅผ ์ฐธ์กฐํ๋ฏ๋ก, ๋์ String Constant Pool์์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ฐ๋ฅดํจ๋ค. ๋ฐ๋ผ์ str1 == str2๋ true๋ฅผ ๋ฐํํ๋ค.
- ํ์ง๋ง, new ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด ๊ฐ์ฒด๋ฅผ ๋ช ์์ ์ผ๋ก ์์ฑํ๋ฉด, ๊ทธ ๋ฌธ์์ด์ ํ ์์ญ์ ์ ์ฅ๋์ด String Constant Pool๊ณผ๋ ๋ณ๊ฐ์ ๊ฐ์ฒด๊ฐ ๋๋ค. ์ด ๊ฒฝ์ฐ, str3 == str4๋ false๋ฅผ ๋ฐํํ๊ฒ ๋ฉ๋๋ค.
- str1 == str3๋ false
package jeon.chapter2.item6;
public class StringInstance {
String str1 = "Effective Java";
String str2 = "Effective Java";
String str3 = new String("Effective Java");
String str4 = new String("Effective Java");
public void checkStrings() {
if(str1 == str2) {
System.out.println("str1๊ณผ str2๋ ๋์ผ");
} else {
System.out.println("str1๊ณผ str2๋ ๋์ผํ์ง ์์");
}
if(str3 == str4) {
System.out.println("str3๊ณผ str4๋ ๋์ผ");
} else {
System.out.println("str3๊ณผ str4๋ ๋์ผํ์ง ์์");
}
}
public static void main(String[] args) {
StringInstance instance = new StringInstance();
instance.checkStrings();
}
}
2. ์ ์ ํฉํฐ๋ฆฌ๋ฅผ ์ ๊ณตํ๋ ๋ถ๋ณ ํด๋์ค
- ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ๋ถํ์ํ ๊ฐ์ฒด ์์ฑ์ ํผํ ์ ์๋ค.
- Boolean(String) ์์ฑ์ ๋์ Boolean.valueOf(String) ํฉํฐ๋ฆฌ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
- ์์ฑ์๋ ํธ์ถํ ๋๋ง๋ค ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ง๋ง, ํฉํฐ๋ฆฌ ๋ฉ์๋๋ ์ ํ ๊ทธ๋ ์ง ์๋ค.
- ๋ถ๋ณ ๊ฐ์ฒด๊ฐ ์๋ ๊ฐ๋ณ ๊ฐ์ฒด๋ผ ํด๋ ์ฌ์ฉ ์ค์ ๋ณ๊ฒฝ๋์ง ์์ ๊ฒ์์ ์๋ค๋ฉด ์ฌ์ฌ์ฉํ ์ ์๋ค.
public static Boolean valueOf(boolean b) {
return b ? Boolean.TRUE : Boolean.FALSE;
}
3. ๋น์ผ ๊ฐ์ฒด๋ ์บ์ฑํด์ ์ฐ๊ธฐ
- ๋น์ผ ๊ฐ์ฒด๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฐ์ ๋ง์ ์์(์๊ฐ, ๋ฉ๋ชจ๋ฆฌ, CPU ๋ฑ)์ด ์๋ชจ๋๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธํ๋ค๋ค. ์๋ฅผ ๋ค์ด, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ด๋ ๋คํธ์ํฌ ๋ฆฌ์์ค๋ฅผ ์ด๊ธฐํํ๋ ๊ฐ์ฒด, ๋ณต์กํ ๊ณ์ฐ์ ์ํํ๋ ๊ฐ์ฒด ๋ฑ์ด ์ด์ ํด๋น๋๋ค.
- ๋น์ผ ๊ฐ์ฒด๋ฅผ ๋งค๋ฒ ์๋กญ๊ฒ ์์ฑํ๋ ๊ฒ์ ๋นํจ์จ์ ์ด๋ค. ๋ฐ๋ผ์ ํ ๋ฒ ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ์บ์(๋ฉ๋ชจ๋ฆฌ์ ์์๋ก ์ ์ฅ)์ ์ ์ฅํด๋๊ณ , ํ์ํ ๋๋ง๋ค ์ฌ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
(1 )String.matches ์ ๋ฌธ์ ์
- ์ฃผ์ด์ง ๋ฌธ์์ด์ด ์ ๊ทํํ์๊ณผ ์ผ์นํ๋์ง ํ์ธํ๋ Java์ ๋ด์ฅ ๋ฉ์๋. ์ ๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ์ ์ด ์๋ค.
- โ ์ฑ๋ฅ ๋ฌธ์ : String.matches๋ ๋ด๋ถ์ ์ผ๋ก 'Pattern'๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ์ ๊ทํํ์์ ์ผ์น ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํ๋ค. ๋ฌธ์ ๋ ์ด ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋๋ง๋ค ์๋ก์ด 'Pattern' ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ String.matches๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ํธ์ถํ๋ ์ํฉ์์๋ ๋งค๋ฒ ์๋ก์ด 'Pattern'๊ฐ์ฒด๊ฐ ์์ฑ๋๋ฏ๋ก ์ฑ๋ฅ์ ๋ถ๋ด์ด ๋๋ค.
- โก ๊ฐ๋น์ง ์ปฌ๋ ์ ๋ฌธ์ : String.matches ๋ฉ์๋๊ฐ ์ข ๋ฃ๋๋ฉด ๋ด๋ถ์์ ์์ฑ๋ Pattern ๊ฐ์ฒด๋ ๋ ์ด์ ์ฐธ์กฐ๋์ง ์๊ฒ ๋๋ฏ๋ก ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋์์ด ๋๋ค.
- โข ์ ํ ์ํ ๋จธ์ (Finite State Machine) : ์ ๊ทํํ์์ ๋ด๋ถ์ ์ผ๋ก ์ ํ ์ํ ๋จธ์ ์ผ๋ก ๋ณํ๋์ด ๋์ํ๋ค. Pattern ๊ฐ์ฒด๋ ์ด ์ ํ ์ํ ๋จธ์ ์ ๊ตฌ์ฑํ๊ณ , ๋ฌธ์์ด๊ณผ ์ผ์นํ๋์ง ๊ฒ์ฌํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค. ์ ํ ์ํ ๋จธ์ ์ ์์ฑํ๋ ๊ณผ์ ์ ๋น์ฉ์ด ๋ค๊ธฐ ๋๋ฌธ์, ์ด ์์ ์ ๋ฐ๋ณต์ ์ผ๋ก ์ํํ๋ ๊ฒ์ ๋นํจ์จ์ ์ด๋ค.
** ์ ํ์ํ๋จธ์ : ์ฃผ์ด์ง๋ ๋ชจ๋ ์๊ฐ์์ ์ฒํด ์์ ์ ์๋ ์ ํ๊ฐ์ ์ํ๋ฅผ ๊ฐ์ง๊ณ ์ฃผ์ด์ง๋ ์ ๋ ฅ์ ๋ฐ๋ผ ์ด๋ค ์ํ์์ ๋ค๋ฅธ ์ํ๋ก ์ ํํ๊ฑฐ๋ ์ถ๋ ฅ์ด๋ ์ก์ ์ด ์ผ์ด๋๊ฒ ํ๋ ์ฅ์น ๋๋ ๊ทธ๋ฐ ์ฅ์น๋ฅผ ๋ํ๋ธ ๋ชจ๋ธ
public class RomanNumerals {
static boolean isRomanNumeral(String s) {
return s.matches("^(?=.)M*(C[MD]|D?C{0,3})" +
"(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})");
}
}
(2)String.matches์ ๋ฌธ์ ์ ํด๊ฒฐ : ๊ฐ๋น์ผ ๊ฐ์ฒด๋ฅผ ์ฌ์ฌ์ฉํด ์ฑ๋ฅ์ ๊ฐ์
- ์ฑ๋ฅ์ ๊ฐ์ ํ๋ ค๋ฉด ํ์ํ ์ ๊ทํํ์์ ํํํ๋ (๋ถ๋ณ์ธ) Pattern ์ธ์คํด์ค๋ฅผ ํด๋์ค ์ด๊ธฐํ(์ ์ ์ด๊ธฐํ) ๊ณผ์ ์์ ์ง์ ์์ฑํด ์บ์ฑํด๋๊ณ , ๋์ค์ ์ด ์ธ์คํด์ค๋ฅผ ์ฌ์ฌ์ฉํ๋ค.
- ์ถ๊ฐ๋ก, ๊ฐ์ ์ ์์๋ ์กด์ฌ์กฐ์ฐจ ๋ชฐ๋๋ Pattern ์ธ์คํด์ค๋ฅผ static final ํ๋๋ก ๋์ง์ด๋ด๊ณ ์ด๋ฆ์ ์ง์ด์ฃผ์ด ์ฝ๋์ ์๋ฏธ๊ฐ ํจ์ฌ ์ ๋๋ฌ๋๋ค.
- ์ง์ฐ ์ด๊ธฐํ(lazy initialization)๋ก ๋ถํ์ํ ์ด๊ธฐํ๋ฅผ ์์จ ์๋ ์์ง๋ง, ๊ถํ์ง๋ ์๋๋ค. ์ฝ๋๋ ๋ณต์กํ๊ฒ ๋ง๋ค์ง๋ง ์ฑ๋ฅ์ ํฌ๊ฒ ๊ฐ์ ๋์ง ์์ ๋๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ด๋ค.(์ง์ฐ์ด๊ธฐํ : https://sharonprogress.tistory.com/223)
package jeon.chapter2.item6;
import java.util.regex.Pattern;
public class RomanNumerals {
private static final Pattern ROMAN = Pattern.compile("^(?=.)M*(C[MD]|D?C{0,3})" +
"(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})");
//compile : ์ ๊ทํํ์์ ์ปดํ์ผํ์ฌ 'pattern'๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ ๊ทํํ์์ ์ ํจ์ฑ๋ ๊ฒ์ฌ
static boolean isRomanNumeral(String s) {
return ROMAN.matcher(s).matches();
}
public static void main(String[] args) {
String[] testStrings = {"III", "IV", "IX", "LVIII", "MCMXCIV", "ABC", "100"};
for (String test : testStrings) {
System.out.println(test + " is a Roman numeral? " + isRomanNumeral(test));
}
}
}
4. ๋ถํธ ๊ฐ์ฒด ์ฌ์ฉ์ง ์ฃผ์ํด์ผํ๋ ๊ฒฝ์ฐ
- ๋ถ๋ณ ๊ฐ์ฒด์ธ ๊ฒฝ์ฐ์ ์์ ํ๊ฒ ์ฌ์ฌ์ฉํ๋ ๊ฒ์ด ๋งค์ฐ ๋ช ํํ๋ค. ํ์ง๋ง ๋ช๋ช ๊ฒฝ์ฐ์ ๋ถ๋ช ํ์ง ์์ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์ด๋ํฐ๋ฅผ ์๋ก ๋ค๋ฉด, ์ด๋ํฐ๋ ์ธํฐํ์ด์ค๋ฅผ ํตํด์ ๋ค์ ์๋ ๊ฐ์ฒด๋ก ์ฐ๊ฒฐํด์ฃผ๋ ๊ฐ์ฒด๋ผ ์ฌ๋ฌ๊ฐ ๋ง๋ค ํ์๊ฐ ์๋ค.
- Map ์ธํฐํ์ด์ค๊ฐ ์ ๊ณตํ๋ keySet์ Map์ด ๋ค์ ์๋ Set ์ธํฐํ์ด์ค์ ๋ทฐ๋ฅผ ์ ๊ณตํ๋ค. keySet์ ํธ์ถํ ๋๋ง๋ค ์๋ก์ด ๊ฐ์ฒด๊ฐ ๋์ฌ๊ฑฐ ๊ฐ์ง๋ง ์ฌ์ค ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํ๊ธฐ ๋๋ฌธ์ ๋ฆฌํด ๋ฐ์ Set ํ์ ์ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๋ฉด, ๊ฒฐ๊ตญ์ ๊ทธ ๋ค์ ์๋ Map ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๊ฒ ๋๋ค.
package jeon.chapter2.item6;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class KeySetExample {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("One", 1);
map.put("Two", 2);
map.put("Three", 3);
Set<String> keys = map.keySet();
for (String key : keys) {
System.out.println(key);
}
// "Two" ํค๋ฅผ Set์์ ์ ๊ฑฐํ๋ฉด ์๋์ ๋งต์์๋ ํด๋น ํญ๋ชฉ์ด ์ ๊ฑฐ๋๋ค.
keys.remove("Two");
System.out.println(map); // {One=1, Three=3}
}
}
5. ์คํ ๋ฐ์ฑ : ๋ถํ์ํ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ํ
- ๋ถํ์ํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์คํ ๋ฐ์ฑ์ด ์๋ค. ์คํ ๋ฐ์ฑ์ ํ๋ก๊ทธ๋๋จธ๊ฐ ๊ธฐ๋ณธํ์ ๊ณผ ๋ฐ์ค ํ์ ์ ์์ด ์ธ ์ ์๊ฒ ํด์ฃผ๊ณ ๋ฐ์ฑ๊ณผ ์ธ๋ฐ์ฑ์ ์๋์ผ๋ก ํด์ค๋ค.
- ์คํ ๋ฐ์ฑ์ ๊ธฐ๋ณธ ํ์ ๊ณผ ๋ฐ์ค ํ์ ์ ๊ฒฝ๊ณ๊ฐ ์๋ณด์ด๊ฒ ํด์ฃผ์ง๋ง ๊ทธ๋ ๋ค๊ณ ๊ทธ ๊ฒฝ๊ณ๋ฅผ ์์ ์ฃผ์ง ์๋๋ค.
- ์๋ฏธ์์ผ๋ก๋ ๋ณ๋ค๋ฅผ ๊ฒ ์์ง๋ง ์ฑ๋ฅ์์ ์ฐจ์ด๊ฐ ๋ง์ด ๋๋ค.
- ๋ฐ๋ผ์ ๋ฐ์ฑ๋ ๊ธฐ๋ณธ ํ์ ๋ณด๋ค๋ ๊ธฐ๋ณธ ํ์ ์ ์ฌ์ฉํ๊ณ ์๋์น ์์ ์คํ ๋ฐ์ฑ์ด ์จ์ด๋ค์ง ์๋๋ก ํด์ผํ๋ค.
(1) sum ๋ณ์์ ํ์ ์ด Wrapperํด๋์ค Long์ผ ๋
- ๊ฐ์ ์ ์์ ์ผ๋ก ์ถ๋ ฅ๋์ง๋ง ๋๋ฆฌ๋ค.
package jeon.chapter2.item6;
public class AutoBoxingExample {
public static void main(String[] args) {
long start = System.currentTimeMillis();
Long sum = 0l;
for (long i = 0 ; i <= Integer.MAX_VALUE ; i++) {
sum += i;
}
System.out.println(sum);
System.out.println(System.currentTimeMillis() - start);
}
}
(2)sum ๋ณ์์ ํ์ ์ด ๊ธฐ๋ณธํ long์ผ ๋
package jeon.chapter2.item6;
public class AutoBoxingExample {
public static void main(String[] args) {
long start = System.currentTimeMillis();
long sum = 0l;
for (long i = 0 ; i <= Integer.MAX_VALUE ; i++) {
sum += i;
}
System.out.println(sum);
System.out.println(System.currentTimeMillis() - start);
}
}
๐ ํ๋ก๊ทธ๋๋จธ์ ํต์ฐฐ๋ ฅ์ด ํ์ํ ๋ถ๋ถ
- ์ด ์์ดํ ์ด ์๋ฏธํ๋ ๋ฐ๋ ๊ฐ์ฒด ์์ฑ์ด ๋น์ธ๋ ๋ฌด์กฐ๊ฑด ํผํด์ผํ๋ค๋ ๊ฒ์ด ์๋๋ค. ํ๋ก๊ทธ๋จ์ ๋ช ํ์ฑ, ๊ฐ๊ฒฐ์ฑ, ๊ธฐ๋ฅ์ ์ํด์๋ ์ถ๊ฐ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๋ค. ์ด ๊ท ํ์ ์ ์งํ๋ ๊ฒ์ ํ๋ก๊ทธ๋๋จธ์ ๋ชซ์ด๋ค.
- ๊ฐ์ฒด ์์ฑ์ ํจ์จ์ ์ผ๋ก ํด๋ณด๊ฒ ๋ค๊ณ ์ฌ์ํ ๊ฒ๋ค๋ ๋ค ์บ์ฑํ๊ฑฐ๋ ์์ฒด ํ(pool)์ ๋ง๋ค์ด์ ์ ์ง๋ณด์ํ๊ธฐ ์ด๋ ค์ด ๋ณต์กํ ํ๋ก๊ทธ๋จ์ ๋ง๋๋ ๊ฒ๋ ํผํด์ผ ํ๋ ๋ถ๋ถ์ด๋ค (JVM์๊ฒ ์์ํ ๋ถ๋ถ์ ์์ํด๋ผ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ฅผ ์ ๋ขฐํ์)
- [Item50]๋ฐฉ์ด์ ๋ณต์ฌ(defensive copy) ์ ๋๋น๋๋ ๋ด์ฉ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด ์์ฑ์ ํด์ผํ๋ ๊ฒฝ์ฐ์ ํ์ง ์๊ณ ๊ธฐ์กด ๊ฒ์ ์ฌ์ฌ์ฉํด์ผ ํ๋ ๋ถ๋ถ์ ๊ฐ๋ฐ์์ ์ญ๋์ ๋ฌ๋ ค์๋ค (ํน์ ์ฑ๋ฅ ํ ์คํธ๋ฅผ ์ง์ ํด์ ๋น๊ตํด๋ณด์๋ผ)
๋ฐ์ํ
'๐ป Java Study' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
No serializer found for class - @JsonProperty๋ก ํด๊ฒฐ (0) | 2023.10.18 |
---|---|
jQuery, Java Script๋ก ํ์ด์ง๋ค์ด์ (pagination) ๊ตฌํํ๊ธฐ - ์ฝ๋ ํฌํจ (0) | 2023.06.29 |
Comments