์ฝํ ๋ฌธ์ ํ ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ ์๋ฃ๊ตฌ์กฐ๋ ๊ณต๋ถํด์ผ ํ์ง๋ง, ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ๋ ์ค์ํ๋ค.
ํด๋ฆฐ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ํด์๋ ์๋ ์ธ ๊ฐ์ง ์ต๊ด์ ๋ค์ฌ์ผ ํ๋ค.
ํ๋ฃจ ์์นจ์ ์ฝ๋ ์ฐ๋ ์ต๊ด์ด ๋ฐ๋์ง๋ ์๊ฒ ์ง๋ง ๋งค๋ฒ ์ฝ๋๋ฅผ ์์ฑํ ๋๋ง๋ค ์ด๋ฌํ ์ต๊ด์ ์ผ๋์ ๋๊ณ ์์ฑํ๋ค ๋ณด๋ฉด ์ ์ฐจ ํด๋ฆฐ ์ฝ๋ ์์ฑ ๋ฅ๋ ฅ์ด ํฅ์๋ ๊ฒ์ด๋ผ๊ณ ๊ธฐ๋ํ๋ค.
1. ์กฐ๊ธฐ๋ฐํ (early return)
์กฐ๊ธฐ ๋ฆฌํด(early return)์ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋๋ฉด ํจ์๋ ๋ฉ์๋์์ ๋ฐ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ์ด๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ถํ์ํ ๊ณ์ฐ์ ํผํ๊ณ ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋์ผ ์ ์๋ค.
์๋ฅผ ๋ค์ด, totalPrice ํจ์์์ ๊ฐ๊ฒฉ์ด 100์ ์ด๊ณผํ๋ ๊ฒฝ์ฐ ๋ฐ๋ก ํ ์ธ์ ์ ์ฉํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ์ฝ๋๋ฅผ ์งค ๋, ์กฐ๊ธฐ ๋ฆฌํด์ ํ์ง ์์ผ๋ฉด ํ ์ธ ๋ก์ง์ ์ฒ๋ฆฌํ ํ์๋ง ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ์ ์ธ ์ฝ๋๊ฐ ํ์ํ๋ค.
์๋๋ totalPrice ๋ฉ์๋์์ ์กฐ๊ธฐ ๋ฆฌํด์ ํ์ฉํ๋ ์์ ์ฝ๋์ด๋ค.
public static void main(String[] args) {
System.out.println(totalPrice(4, 50));
}
static int totalPrice(int quantity, int price) {
int total = quantity * price;
if (total > 100) {
return (int)(total * 0.9); // ๊ฐ๊ฒฉ์ด 100์ ์ด๊ณผํ๋ฉด ํ ์ธ ์ ์ฉ ํ ๋ฐ๋ก ๋ฐํ
}
return total; // ๊ทธ ์ธ์ ๊ฒฝ์ฐ, ์ด์ก์ ๊ทธ๋๋ก ๋ฐํ
}
- total์ quantity * price ๋ฅผ ๋์ ํ๋ค.
- total์ ๊ฐ์ด 100๋ณด๋ค ํฐ ๊ฒฝ์ฐ, total์ 0.9๋ฅผ ๊ณฑํ๊ณ ๋ฐํํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฉ์๋๋ฅผ ์กฐ๊ธฐ์ ์ข ๋ฃํ ์ ์์ผ๋ฏ๋ก ์ดํ ์์ธ์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์๋ ๋๋ค.
2. ๋ณดํธ ๊ตฌ๋ฌธ (guard clauses)
๋ณดํธ ๊ตฌ๋ฌธ์ ๋ณธ๊ฒฉ์ ์ธ ๋ก์ง์ ์คํํ๊ธฐ ์ ์ ์ ๋ ฅ๊ฐ์ ์ ํจ์ฑ์ ๊ฒ์ฌํ๋ ์์ธ ์ฒ๋ฆฌ ๊ธฐ๋ฒ์ด๋ค. ์ํ๋ ์ฝ๋๋ฅผ ์ฐ๊ธฐ ์ ์ ์กฐ๊ฑด๋ฌธ์ ์ฌ์ฉํด์ ๋จผ์ ์ด๊ธฐ ์ ๋ ฅ๊ฐ์ด ์ ํจํ์ง ํ์ธํ๊ณ , ์ ํจํ์ง ์์ผ๋ฉด ์ฆ์ ๋ฉ์๋๋ฅผ ์ข ๋ฃํ๊ฑฐ๋ ๊ธฐ๋ณธ๊ฐ์ ๋ฐํํ๋๋ก ๋ฏธ๋ฆฌ ์์ธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค.
๋ณดํธ๊ตฌ๋ฌธ์ ํ์ฉํ๋ฉด ์์ธก ๊ฐ๋ฅํ ์ค๋ฅ๋ฅผ ์ฌ์ ์ ์ฒ๋ฆฌํ๊ณ , ์๋ชป๋ ์ ๋ ฅ์ ๋ํด ์์ ํ ๊ธฐ๋ณธ๊ฐ์ ๋ฐํํจ์ผ๋ก์จ ํ๋ก๊ทธ๋จ์ ์์ ์ฑ์ ๋์ผ ์ ์๋ค.
import java.util.List;
static double calculateAverage(List<Integer> numbers) {
if (numbers == null || numbers.isEmpty()) { // null ์ด๊ฑฐ๋ ๋น ๋ฆฌ์คํธ์ด๋ฉด 0 ๋ฐํ
return 0;
}
int total = numbers.stream().mapToInt(i -> i).sum(); // stream ์ฌ์ฉํ์ฌ ํฉ์ฐ
return (double) total / numbers.size(); // ํ๊ท ๊ณ์ฐ ํ ๋ฐํ
}
์ฝ๋๋ฅผ ๋ณด๋ฉด null ์ด๊ฑฐ๋ ๋ฐ์ดํฐ๊ฐ ์์ ๋ ๋ฐ๋ก ์์ธ์ฒ๋ฆฌ๋ฅผ ํด์ ๋ฉ์๋๊ฐ ์ข ๋ฃ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก ์์ฑํ๋ ๋ก์ง์ ์์ธ์ฒ๋ฆฌ ๋ค์ ์จ๋ค.
3. ์ ๋ค๋ฆญ(generic)
์ ๋ค๋ฆญ์ ๋น๋ ๋ ๋ฒจ์์ ํ์ ์ ์ฒดํฌํด์ ํ์ ์์ ์ฑ์ ์ ๊ณตํ๊ณ , ํ์ ์ฒดํฌ๊ณผ ํ๋ณํ์ ์๋ต ํ ์ ์๊ฒ ํด ์ฃผ๊ธฐ ๋๋ฌธ์ ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด ์ง๋ค.
// 1. ์ผ๋ฐ List ์ฌ์ฉ (ํ์
์์ ํ์ง ์์)
List<Object> list = new ArrayList<>(); // List์ ํ์
์ Object๋ก ์ค์
list.add(10);
list.add("abc");
// ๋ฐํ์ ์ค๋ฅ ๋ฐ์ (๊ฐ์ ๋ก ํ์
์บ์คํ
)
// String์ int๋ก ์บ์คํ
ํ๋ฉด ClassCastException ๋ฐ์
int sum1 = (int) list.get(0) + (int) list.get(1);
// 2. ์ ๋ค๋ฆญ์ ์ฌ์ฉํ List (ํ์
์์ ํจ)
// ์ ๋ค๋ฆญ์ ์ฌ์ฉํ์ฌ Integer๋ง ์ ์ฅ ๊ฐ๋ฅ
List<Integer> genericList = new ArrayList<>();
genericList.add(10);
// genericList.add("abc"); // ์ปดํ์ผ ์ค๋ฅ(๋ฌธ๋ฒ - ๋น๋ ์ค๋ฅ), Integer๋ง ํ์ฉ๋จ
// sum2 ๊ณ์ฐ์์ ํ์
์ด ๋ง์ง ์์
int sum2 = genericList.get(0) + genericList.get(0); // ์ค๋ฅ ์์ด ์ ์์ ์ผ๋ก ๊ณ์ฐ
์ฝ๋๋ฅผ ๋ณด๋ฉด 1์์๋ ๋ฐํ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ณ 2์์๋ ๋น๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. List๋ฅผ ์ ์ํ ๋ <Integer> ๊ณผ ๊ฐ์ด ํ์ ์ ๊ฐ์ ํ๋ ๊ฒ์ ์ ๋ค๋ฆญ์ด๋ผ๊ณ ํ๋ค. ํ ๋ค๋ฆญ์ ํ์ ์ ๋ง์ง ์์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๋ ค๊ณ ํ ๋ ๋ฌธ๋ฒ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์์ ์ค์๋ฅผ ๋ฏธ๋ฆฌ ๋ฐฉ์ง ํด ์ค๋ค.
๊ทธ๋์ 1์ฒ๋ผ ์์ฑํ๋ฉด ์ฝ๋๋ฅผ ์ค์ ๋ก ์คํ ํด ๋ด์ผ์ง๋ง ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค๋ ๊ฒ์ ์ ์ ์์ง๋ง, 2๋ ๋น๋ ์์ฒด๊ฐ ์ ๋๊ธฐ ๋๋ฌธ์ ๋ฐํ์ ๋ฒ๊ทธ๋ฅผ ๋ฐฉ์งํ ์ ์๋ค. ๋ ๋ฐ์ดํฐ์ ์ ๊ทผํด์ ์ฌ์ฉํ๋ ค๊ณ ํ ๋ ํ๋ณํ์ ํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด์ง๋ค. ์ฝํ ์์๋ ์ฌ๋ฌ ํ์ ์ ๋ฐ์ดํฐ๋ฅผ ํ๋์ ์ปฌ๋ ์ ์ ๋ฃ์ด์ผ ํ๋ ๊ฒฝ์ฐ๋ ๊ฑฐ์ ์๊ธฐ ๋๋ฌธ์ ์ ๋ค๋ฆญ์ผ๋ก ํ์ ์ ๊ฐ์ ํด์ ์ค์๋ฅผ ๋ฐฉ์งํ๋ ๊ฒ์ด ์ข๋ค.
4. ํด์๋งต
์๋ฐ์ ํด์๋งต(hashmap)์ ํค(key)์ ๊ฐ(value) ์์ ์ ์ฅํ๋ ํด์ํ ์ด๋ธ๋ก ๊ตฌํ๋์ด ์๋ค. ํค๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ ๊ฒ์ํ๋ ์๋ฃ๊ตฌ์กฐ๋ผ๊ณ ์๊ฐํ๋ฉด ํธํ๋ค.
ํด์๋งต ์ด๊ธฐํ
ํค๋ ๋ฌธ์์ด, ๊ฐ์ 32๋นํธ ์ ์ํ์ ์ ์ฅํ๋ ํด์๋งต ์ ์ธ
HashMap<String, Integer> map = new HashMap<>();
ํด์๋งต ๋ฐ์ดํฐ ์ฝ์ & ์ ์ฒด ์ถ๋ ฅ
// ํด์๋งต ๊ฐ ์ฝ์
map.put("apple", 1);
map.put("banana", 2);
map.put("orange", 3);
// ํด์๋งต ๊ฐ ์ถ๋ ฅ
System.out.println(map); // {banana=2, orange=3, apple=1}

ํด์๋งต ๋ฐ์ดํฐ ๊ฒ์
ํด์๋งต์ "apple" ๋ฌธ์์ด๊ณผ ์ผ์นํ๋ ํค๊ฐ ์๋์ง ํ์ธํ๊ณ , ์ผ์นํ๋ ํค๋ฅผ ์ฐพ์ผ๋ฉด ํค-๊ฐ์ ์ถ๋ ฅํ๋ค.
String key = "apple";
if (map.containsKey(key)) { // containsKey๋ก ์์
int value = map.get(key); // ์คํ ์์ : 'key'๋ก ๋ณ๊ฒฝ
System.out.println(key + ": " + value); // apple: 1
} else {
System.out.println(key + "๋ ํด์๋งต์ ์กด์ฌํ์ง ์์ต๋๋ค.");
}

ํด์๋งต ๋ฐ์ดํฐ ์์
ํด์๋งต์์ ํค "banana"๋ฅผ ๊ฒ์ํด์ ํด๋น ํค์ ๊ฐ์ 4๋ก ๋ฐ๊พธ๋ ์ฝ๋
ํด์๋งต ๋ด๋ถ๋ ํด์ ํ ์ด๋ธ๋ก ๊ตฌ์ฑ๋์ด ์๊ธฐ ๋๋ฌธ์ ํด์ ํ ์ด๋ธ์์ ํค๋ฅผ ์ฐพ๊ฑฐ๋ ํ์ง ์์๋ ๋๋ค.
map.put("banana", 4 );
System.out.println(map); // {banana=4, orange=3, apple=1}

ํด์๋งต ์ญ์
ํค "orange"๋ฅผ ์ฐพ์ ํด์๋งต์์ ์ญ์ ํ๊ธฐ
map.remove("orange");
System.out.println(map); // {banana=4, apple=1}

์ฐธ๊ณ ๋ก ์๋ฐ์๋ ํด์๋งต๊ณผ ์ ์ฌํ์ง๋ง 'ํค-๊ฐ' ์์ด ์๋๋ผ 'ํค'๋ง ์ ์ฅํ๋ ํด์ ์ ๋ ์๋ค.
์ธ์ HashSet์ ์ฌ์ฉํ๊ณ , ์ธ์ HashMap์ ์ฌ์ฉํ ๊น?
HashSet
์ค๋ณต์ ์ ๊ฑฐํ๊ฑฐ๋, ์กด์ฌ ์ฌ๋ถ๋ง ์ฒดํฌํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๊ณ ์์๊ฐ ์ค์ํ์ง ์๋ค.
์: ํน์ ์ซ์๊ฐ ๋ฐฐ์ด์ ํฌํจ๋์ด ์๋์ง ํ์ธํ ๋
HashMap
ํค์ ๊ฐ์ ๊ด๊ณ๋ฅผ ์ ์ฅํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค.
์: ํ์ ์ด๋ฆ๊ณผ ์ฑ์ , ์ํ ID์ ๊ฐ๊ฒฉ์ ์ ์ฅํ ๋
5. ๋ฌธ์์ด (String)
์ค์ํ ์ ์ ๋ฌธ์์ด์ ์ถ๊ฐํ๊ณ ์ญ์ ํ๋ ๋์์ ํ ๋, ๋ฌธ์์ด์ immutable ๊ฐ์ฒด์ด๋ฏ๋ก ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ์์ ํ๋ ๊ฒ์ด ์๋๋ผ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค๋ ์ฌ์ค์ด๋ค.
String string = "he"
string += "llo"
System.out.println(string) // "hello"

๋ฌธ์์ด ์์
๊ทธ๋ ๋ค๋ฉด ๋ฌธ์์ด์ ์์ ํ๊ณ ์ถ์ ๋๋ ์ด๋ป๊ฒ ํด์ผ ํ๋๊ฐ? ๊ทธ๋ด ๋๋ replace() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค. replace() ๋ฉ์๋๋ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์ฐพ์ ๋ฌธ์์ด์, ๋ ๋ฒ์งธ ์ธ์๋ก ๋ณ๊ฒฝํ ๋ฌธ์์ด์ ๋ฃ์ด์ ์ฌ์ฉํ๋ค.
์๋ฅผ ๋ค์ด์ replace(A, B)๋ ๋ฉ์๋์ ๊ฒ์ ๋์ ๋ฌธ์ A๋ฅผ ๋ชจ๋ ์ฐพ์์ ์ผ๊ด B๋ก ๋ณํํ๋ค.
String string = "Hello";
string = string.replace("l", ""); // "l" ๋ชจ๋ ์ญ์
System.out.println(string); // "Heo"
6. StringBuffer์ StringBuilder
์์์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ ์๋ฐ์์ String ๊ฐ์ฒด๋ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ Immutable ๊ฐ์ฒด์ด๋ค. '๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค'๋ ๊ฒ์ด ์ด๋ค ์๋ฏธ์ธ์ง ์ฑ๋ฅ ์ธก๋ฉด์์ ์์๋ณด๊ธฐ ์ํด ์๋ ์์ ์ฝ๋๋ฅผ ๋ณด์.
String s = "abc"
System.out.println(System.identityHashCode(s)); // 1808253012
s += "def";
System.out.println(System.identityHashCode(s)); // 589431969
System.out.println(s) // abcdef
`System.identityHashCode()` ๋ฉ์๋๋ ๊ฐ์ฒด๋ฅผ ํน์ ํ๋ ์๋ณ๊ฐ์ ๋ฐํํ๋ค. String s์ abc์ def๋ฅผ ์ด์ด ๋ถ์์ ๋ฟ์ธ๋ฐ identityHashCode() ๋ฉ์๋์ ์ถ๋ ฅ๊ฐ์ด ๋ฌ๋ผ์ง๋ค. ์ด๊ฑด "abc"๊ฐ๋ง ๊ฐ์ง๊ณ ์๋ s์ "abcdef" ๊ฐ์ ๊ฐ์ง๊ณ ์๋ s๊ฐ ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด์์ ์๋ฏธํ๋ค. ์ฆ, String ๊ฐ์ฒด์ ๊ฐ์ ๋ณ๊ฒฝํ๋ ์๋ก์ด String ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ๊ฐ์ ๋ณต์ฌํ๋ ์์ ์ด ์ํ๋จ์ ์๋ฏธํ๋ค. ๋ฐ๋ผ์ s+="def"๋ฅผ ์ํ ํ ๋ ๋ด๋ถ์์๋ ์๋์ ๊ฐ์ ์ฐ์ฐ์ด ์ํ๋๋ค.
- ์๋ก์ด String s ๊ฐ์ฒด๋ฅผ ์์ฑ
- s๊ฐ ๊ฐ์ง "abc" ๊ฐ์ ํ๋์ฉ ๋ณต์ฌ
- "abc" ๋ค์ "def" ์ ์ฅ
๊ทธ ๊ฒฐ๊ณผ s += "def" ์ฝ๋ ํ ์ค ์์ ์ด 6๋ฒ์ ๋ด๋ถ ์ฐ์ฐ("abc"๊ฐ 3๊ฐ ๋ณต์ฌ, "def"๊ฐ 3๊ฐ ์ ์ฅ)์ด ์ํ๋๋ค. ์๊ฐ ๋ณต์ก๋๋ก ๋ฐ์ง๋ฉด ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ N์ด๋ผ๊ณ ํ์ ๋ O(N)์ด๋ค.
๊ทธ๋์ ์๋์ฒ๋ผ N = 100,000์ธ ์ฝ๋๋ฅผ ์ํํ๋ฉด ์ปดํจํฐ์์ 6์ด๊ฐ ๊ฑธ๋ฆฐ๋ค.
public class Main {
public static void main(String[] args) {
long start = System.currentTimeMillis();
String s = "";
for (int i = 1; i <= 100000; i++) {
s += i; // String์ ๊ณ์ ์์ (๋นํจ์จ์ ์ด์ง๋ง ์๋์ ์ผ๋ก ์ ์ง)
}
long end = System.currentTimeMillis();
System.out.println((end - start) / 1000.0 + "์ด"); // ๊ดํธ ์์ ์๋ฃ
}
}
์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฑ์ฅํ ๊ฒ์ด StringBuilder ํด๋์ค์ StringBuffer ํด๋์ค์ด๋ค. ๋ ํด๋์ค๋ mutable ํ๋ฏ๋ก ๊ฐ์ ๋ณ๊ฒฝํ ๋ ์๊ฐ๋ณต์ก๋ ๊ด์ ์์ ํจ์ฌ ๋ ํจ์จ์ ์ด๋ค. ๋ค์ ์ฝ๋๋ ์ ์ฝ๋์ ๋น๊ตํ์ ๋ s ๊ฐ์ฒด์ ์ ์ฅํ ๋ฌธ์์ด์ ๋์ผํ๋ค. ํ์ง๋ง ์คํ ์๊ฐ์ ์ ํ ๋ค๋ฅด๋ค. ๊ณ ์ 0.005์ด๊ฐ ์์๋๋ค.
public class Main {
public static void main(String[] args) {
long start = System.currentTimeMillis();
StringBuilder sb = new StringBuilder(); // String ๋์ StringBuilder ์ฌ์ฉ
for (int i = 1; i <= 100000; i++) {
sb.append(i); // ๋ฌธ์์ด ์ถ๊ฐ
}
long end = System.currentTimeMillis();
System.out.println((end - start) / 1000.0 + "์ด"); // ๊ดํธ ์์ ์๋ฃ
}
}
๋ฐ๋ผ์ String ๊ฐ์ ๋ณ๊ฒฝํ๋ ์ฐ์ฐ์ด ๋ง์ ๋์๋ ํจ์จ์ด ๋์ StringBuilder ํด๋์ค๋ StringBuffer ํด๋์ค๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. ๋ ํด๋์ค์ ์ฐจ์ด๋ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ Thread-Safe ์ฌ๋ถ๋ก ๋๋์ด์ง๋ค. ํ์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ๋๋ถ๋ถ์ ์ฝ๋ฉ ํ ์คํธ์์๋ ๋ค์์ ์ค๋ ๋๋ฅผ ํ์ฑํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์, Thread-Safe๊ฐ ์๋ StringBuilder ํด๋์ค๊ฐ ์๋ ์ธก๋ฉด์์ ์ฝ๊ฐ ๋ฏธ์ธํ์ง๋ง ๋ ๋น ๋ฅด๋ฏ๋ก ๊ถ์ฅ๋๋ค.
int ์ Integer์ ์ฐจ์ด โผ
int ํ์
- Primitive type
- ๋ฉ๋ชจ๋ฆฌ์์ ์ง์ ๊ฐ์ ์ ์ฅํ๋ฉฐ, ์ฑ๋ฅ์ด ๋น ๋ฅด๋ค.
- null ๊ฐ์ ๊ฐ์ง ์ ์๋ค.
- ๊ธฐ๋ณธ ๊ฐ์ 0์ด๋ค.
Integer ํ์
- Reference type (์ฐธ์กฐ ํ์ )
- Integer๋ int๋ฅผ ๊ฐ์ธ๋ ํด๋์ค์ด๋ค.
- ๊ฐ์ฒด๋ก ์ฒ๋ฆฌ๋๋ฉฐ, int์ ๋ฌ๋ฆฌ ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์๋ค.
- null ๊ฐ์ ๊ฐ์ง ์ ์๋ค.
- Integer๋ int์ ์ํธ ๋ณํํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค. (auto-boxing๊ณผ unboxing)
int primitiveInt = 10; // Primitive type
Integer wrapperInt = 10; // Reference type (auto-boxing)
Integer nullInteger = null; // Reference type can be null
// Unboxing (Integer -> int)
int unboxedInt = wrapperInt; // ์๋์ผ๋ก unboxing ๋ฐ์
์ฑ๋ฅ์ ์ธ ๋ฉด์์ int๋ primitive type์ด๋ฏ๋ก ์ฐ์ฐ์ด ๋น ๋ฅด๊ณ , ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ ๋ค. ํ์ง๋ง ์ ์ฐ์ฑ์ Integer๋ ๊ฐ์ฒด๋ก์ null์ ํ์ฉํ๊ณ , ๋ค์ํ ๋ฉ์๋ ๋ฐ ํด๋์ค๋ฅผ ํ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ Integer์ด ๋ ์ ์ฐํ๋ค. ์๋ฅผ ๋ค์ด, ์ปฌ๋ ์ (List, Set ๋ฑ)์์ Integer๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฆฌ๋ง์ธ๋
- ์๋ฐ์ ๋ฐ์ดํฐ ํ์ ์๋ primitive types์ reference types๊ฐ ์๋ค. primitive types์ ์ฐ์ฐ ์๋๊ฐ reference types๋ณด๋ค ๋ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ๋ค๋ฉด primitive types์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
- ์๋ฐ์ ์ปฌ๋ ์ ํ๋ ์์ํฌ์ ๋ฆฌ์คํธ, ํด์๋งต์ ์ฝํ ์์ ์์ฃผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๊ผญ ์์๋์ด์ผ ํ๋ค.
- ์๋ฐ์์ String ํด๋์ค์ ๊ฐ์ฒด๋ Immutable ๊ฐ์ฒด์ด๋ค. ํ๋ฒ ์ ์ธํ๋ฉด ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๊ธฐ ๋๋ฌธ์ + ์ฐ์ฐ ๋ฑ์์ค ๊ฐ์ ๋ณ๊ฒฝํ ๊ฒฝ์ฐ ํจ์จ์ด ์ข์ง ์๋ค. String์ + ์ฐ์ฐ์ด ์์ฃผ ๋ฐ์ํ๋ ๊ฒฝ์ฐ StringBuilder์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
- ์กฐ๊ธฐ๋ฐํ, ๋ณดํธ๊ตฌ๋ฌธ, ์ ๋ค๋ฆญ ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ฉด ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ํจ์จ์ฑ์ ๋์ผ ์ ์๋ค.
์ฐธ๊ณ ์๋ฃ & ํฌ์คํ ์์ฑ์ ๋์์ ์ฃผ์ ๋ถ
1. chatGPT ์ ๊ถ๊ธํ ์ ์ ๋ฌผ์ด ๋ณด๋ฉฐ ์์ฑ
2. ๊นํฌ์ฑ, ํ๋ก๊ทธ๋๋จธ์ค ์ฝ๋ฉํ ์คํธ, ํ๋ก๊ทธ๋๋จธ์ค, 2023
'Algorithm > ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ฝํ ๋ฌธ์ ํ ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ ์๋ฃ๊ตฌ์กฐ๋ ๊ณต๋ถํด์ผ ํ์ง๋ง, ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ๋ ์ค์ํ๋ค.
ํด๋ฆฐ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ํด์๋ ์๋ ์ธ ๊ฐ์ง ์ต๊ด์ ๋ค์ฌ์ผ ํ๋ค.
ํ๋ฃจ ์์นจ์ ์ฝ๋ ์ฐ๋ ์ต๊ด์ด ๋ฐ๋์ง๋ ์๊ฒ ์ง๋ง ๋งค๋ฒ ์ฝ๋๋ฅผ ์์ฑํ ๋๋ง๋ค ์ด๋ฌํ ์ต๊ด์ ์ผ๋์ ๋๊ณ ์์ฑํ๋ค ๋ณด๋ฉด ์ ์ฐจ ํด๋ฆฐ ์ฝ๋ ์์ฑ ๋ฅ๋ ฅ์ด ํฅ์๋ ๊ฒ์ด๋ผ๊ณ ๊ธฐ๋ํ๋ค.
1. ์กฐ๊ธฐ๋ฐํ (early return)
์กฐ๊ธฐ ๋ฆฌํด(early return)์ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋๋ฉด ํจ์๋ ๋ฉ์๋์์ ๋ฐ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ์ด๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ถํ์ํ ๊ณ์ฐ์ ํผํ๊ณ ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋์ผ ์ ์๋ค.
์๋ฅผ ๋ค์ด, totalPrice ํจ์์์ ๊ฐ๊ฒฉ์ด 100์ ์ด๊ณผํ๋ ๊ฒฝ์ฐ ๋ฐ๋ก ํ ์ธ์ ์ ์ฉํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ์ฝ๋๋ฅผ ์งค ๋, ์กฐ๊ธฐ ๋ฆฌํด์ ํ์ง ์์ผ๋ฉด ํ ์ธ ๋ก์ง์ ์ฒ๋ฆฌํ ํ์๋ง ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ์ ์ธ ์ฝ๋๊ฐ ํ์ํ๋ค.
์๋๋ totalPrice ๋ฉ์๋์์ ์กฐ๊ธฐ ๋ฆฌํด์ ํ์ฉํ๋ ์์ ์ฝ๋์ด๋ค.
public static void main(String[] args) { System.out.println(totalPrice(4, 50)); } static int totalPrice(int quantity, int price) { int total = quantity * price; if (total > 100) { return (int)(total * 0.9); // ๊ฐ๊ฒฉ์ด 100์ ์ด๊ณผํ๋ฉด ํ ์ธ ์ ์ฉ ํ ๋ฐ๋ก ๋ฐํ } return total; // ๊ทธ ์ธ์ ๊ฒฝ์ฐ, ์ด์ก์ ๊ทธ๋๋ก ๋ฐํ }
- total์ quantity * price ๋ฅผ ๋์ ํ๋ค.
- total์ ๊ฐ์ด 100๋ณด๋ค ํฐ ๊ฒฝ์ฐ, total์ 0.9๋ฅผ ๊ณฑํ๊ณ ๋ฐํํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฉ์๋๋ฅผ ์กฐ๊ธฐ์ ์ข ๋ฃํ ์ ์์ผ๋ฏ๋ก ์ดํ ์์ธ์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์๋ ๋๋ค.
2. ๋ณดํธ ๊ตฌ๋ฌธ (guard clauses)
๋ณดํธ ๊ตฌ๋ฌธ์ ๋ณธ๊ฒฉ์ ์ธ ๋ก์ง์ ์คํํ๊ธฐ ์ ์ ์ ๋ ฅ๊ฐ์ ์ ํจ์ฑ์ ๊ฒ์ฌํ๋ ์์ธ ์ฒ๋ฆฌ ๊ธฐ๋ฒ์ด๋ค. ์ํ๋ ์ฝ๋๋ฅผ ์ฐ๊ธฐ ์ ์ ์กฐ๊ฑด๋ฌธ์ ์ฌ์ฉํด์ ๋จผ์ ์ด๊ธฐ ์ ๋ ฅ๊ฐ์ด ์ ํจํ์ง ํ์ธํ๊ณ , ์ ํจํ์ง ์์ผ๋ฉด ์ฆ์ ๋ฉ์๋๋ฅผ ์ข ๋ฃํ๊ฑฐ๋ ๊ธฐ๋ณธ๊ฐ์ ๋ฐํํ๋๋ก ๋ฏธ๋ฆฌ ์์ธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค.
๋ณดํธ๊ตฌ๋ฌธ์ ํ์ฉํ๋ฉด ์์ธก ๊ฐ๋ฅํ ์ค๋ฅ๋ฅผ ์ฌ์ ์ ์ฒ๋ฆฌํ๊ณ , ์๋ชป๋ ์ ๋ ฅ์ ๋ํด ์์ ํ ๊ธฐ๋ณธ๊ฐ์ ๋ฐํํจ์ผ๋ก์จ ํ๋ก๊ทธ๋จ์ ์์ ์ฑ์ ๋์ผ ์ ์๋ค.
import java.util.List; static double calculateAverage(List<Integer> numbers) { if (numbers == null || numbers.isEmpty()) { // null ์ด๊ฑฐ๋ ๋น ๋ฆฌ์คํธ์ด๋ฉด 0 ๋ฐํ return 0; } int total = numbers.stream().mapToInt(i -> i).sum(); // stream ์ฌ์ฉํ์ฌ ํฉ์ฐ return (double) total / numbers.size(); // ํ๊ท ๊ณ์ฐ ํ ๋ฐํ }
์ฝ๋๋ฅผ ๋ณด๋ฉด null ์ด๊ฑฐ๋ ๋ฐ์ดํฐ๊ฐ ์์ ๋ ๋ฐ๋ก ์์ธ์ฒ๋ฆฌ๋ฅผ ํด์ ๋ฉ์๋๊ฐ ์ข ๋ฃ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก ์์ฑํ๋ ๋ก์ง์ ์์ธ์ฒ๋ฆฌ ๋ค์ ์จ๋ค.
3. ์ ๋ค๋ฆญ(generic)
์ ๋ค๋ฆญ์ ๋น๋ ๋ ๋ฒจ์์ ํ์ ์ ์ฒดํฌํด์ ํ์ ์์ ์ฑ์ ์ ๊ณตํ๊ณ , ํ์ ์ฒดํฌ๊ณผ ํ๋ณํ์ ์๋ต ํ ์ ์๊ฒ ํด ์ฃผ๊ธฐ ๋๋ฌธ์ ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด ์ง๋ค.
// 1. ์ผ๋ฐ List ์ฌ์ฉ (ํ์
์์ ํ์ง ์์) List<Object> list = new ArrayList<>(); // List์ ํ์
์ Object๋ก ์ค์ list.add(10); list.add("abc"); // ๋ฐํ์ ์ค๋ฅ ๋ฐ์ (๊ฐ์ ๋ก ํ์
์บ์คํ
) // String์ int๋ก ์บ์คํ
ํ๋ฉด ClassCastException ๋ฐ์ int sum1 = (int) list.get(0) + (int) list.get(1); // 2. ์ ๋ค๋ฆญ์ ์ฌ์ฉํ List (ํ์
์์ ํจ) // ์ ๋ค๋ฆญ์ ์ฌ์ฉํ์ฌ Integer๋ง ์ ์ฅ ๊ฐ๋ฅ List<Integer> genericList = new ArrayList<>(); genericList.add(10); // genericList.add("abc"); // ์ปดํ์ผ ์ค๋ฅ(๋ฌธ๋ฒ - ๋น๋ ์ค๋ฅ), Integer๋ง ํ์ฉ๋จ // sum2 ๊ณ์ฐ์์ ํ์
์ด ๋ง์ง ์์ int sum2 = genericList.get(0) + genericList.get(0); // ์ค๋ฅ ์์ด ์ ์์ ์ผ๋ก ๊ณ์ฐ
์ฝ๋๋ฅผ ๋ณด๋ฉด 1์์๋ ๋ฐํ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ณ 2์์๋ ๋น๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. List๋ฅผ ์ ์ํ ๋ <Integer> ๊ณผ ๊ฐ์ด ํ์ ์ ๊ฐ์ ํ๋ ๊ฒ์ ์ ๋ค๋ฆญ์ด๋ผ๊ณ ํ๋ค. ํ ๋ค๋ฆญ์ ํ์ ์ ๋ง์ง ์์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๋ ค๊ณ ํ ๋ ๋ฌธ๋ฒ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์์ ์ค์๋ฅผ ๋ฏธ๋ฆฌ ๋ฐฉ์ง ํด ์ค๋ค.
๊ทธ๋์ 1์ฒ๋ผ ์์ฑํ๋ฉด ์ฝ๋๋ฅผ ์ค์ ๋ก ์คํ ํด ๋ด์ผ์ง๋ง ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค๋ ๊ฒ์ ์ ์ ์์ง๋ง, 2๋ ๋น๋ ์์ฒด๊ฐ ์ ๋๊ธฐ ๋๋ฌธ์ ๋ฐํ์ ๋ฒ๊ทธ๋ฅผ ๋ฐฉ์งํ ์ ์๋ค. ๋ ๋ฐ์ดํฐ์ ์ ๊ทผํด์ ์ฌ์ฉํ๋ ค๊ณ ํ ๋ ํ๋ณํ์ ํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด์ง๋ค. ์ฝํ ์์๋ ์ฌ๋ฌ ํ์ ์ ๋ฐ์ดํฐ๋ฅผ ํ๋์ ์ปฌ๋ ์ ์ ๋ฃ์ด์ผ ํ๋ ๊ฒฝ์ฐ๋ ๊ฑฐ์ ์๊ธฐ ๋๋ฌธ์ ์ ๋ค๋ฆญ์ผ๋ก ํ์ ์ ๊ฐ์ ํด์ ์ค์๋ฅผ ๋ฐฉ์งํ๋ ๊ฒ์ด ์ข๋ค.
4. ํด์๋งต
์๋ฐ์ ํด์๋งต(hashmap)์ ํค(key)์ ๊ฐ(value) ์์ ์ ์ฅํ๋ ํด์ํ ์ด๋ธ๋ก ๊ตฌํ๋์ด ์๋ค. ํค๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ ๊ฒ์ํ๋ ์๋ฃ๊ตฌ์กฐ๋ผ๊ณ ์๊ฐํ๋ฉด ํธํ๋ค.
ํด์๋งต ์ด๊ธฐํ
ํค๋ ๋ฌธ์์ด, ๊ฐ์ 32๋นํธ ์ ์ํ์ ์ ์ฅํ๋ ํด์๋งต ์ ์ธ
HashMap<String, Integer> map = new HashMap<>();
ํด์๋งต ๋ฐ์ดํฐ ์ฝ์ & ์ ์ฒด ์ถ๋ ฅ
// ํด์๋งต ๊ฐ ์ฝ์
map.put("apple", 1); map.put("banana", 2); map.put("orange", 3); // ํด์๋งต ๊ฐ ์ถ๋ ฅ System.out.println(map); // {banana=2, orange=3, apple=1}

ํด์๋งต ๋ฐ์ดํฐ ๊ฒ์
ํด์๋งต์ "apple" ๋ฌธ์์ด๊ณผ ์ผ์นํ๋ ํค๊ฐ ์๋์ง ํ์ธํ๊ณ , ์ผ์นํ๋ ํค๋ฅผ ์ฐพ์ผ๋ฉด ํค-๊ฐ์ ์ถ๋ ฅํ๋ค.
String key = "apple"; if (map.containsKey(key)) { // containsKey๋ก ์์ int value = map.get(key); // ์คํ ์์ : 'key'๋ก ๋ณ๊ฒฝ System.out.println(key + ": " + value); // apple: 1 } else { System.out.println(key + "๋ ํด์๋งต์ ์กด์ฌํ์ง ์์ต๋๋ค."); }

ํด์๋งต ๋ฐ์ดํฐ ์์
ํด์๋งต์์ ํค "banana"๋ฅผ ๊ฒ์ํด์ ํด๋น ํค์ ๊ฐ์ 4๋ก ๋ฐ๊พธ๋ ์ฝ๋
ํด์๋งต ๋ด๋ถ๋ ํด์ ํ ์ด๋ธ๋ก ๊ตฌ์ฑ๋์ด ์๊ธฐ ๋๋ฌธ์ ํด์ ํ ์ด๋ธ์์ ํค๋ฅผ ์ฐพ๊ฑฐ๋ ํ์ง ์์๋ ๋๋ค.
map.put("banana", 4 ); System.out.println(map); // {banana=4, orange=3, apple=1}

ํด์๋งต ์ญ์
ํค "orange"๋ฅผ ์ฐพ์ ํด์๋งต์์ ์ญ์ ํ๊ธฐ
map.remove("orange"); System.out.println(map); // {banana=4, apple=1}

์ฐธ๊ณ ๋ก ์๋ฐ์๋ ํด์๋งต๊ณผ ์ ์ฌํ์ง๋ง 'ํค-๊ฐ' ์์ด ์๋๋ผ 'ํค'๋ง ์ ์ฅํ๋ ํด์ ์ ๋ ์๋ค.
์ธ์ HashSet์ ์ฌ์ฉํ๊ณ , ์ธ์ HashMap์ ์ฌ์ฉํ ๊น?
HashSet
์ค๋ณต์ ์ ๊ฑฐํ๊ฑฐ๋, ์กด์ฌ ์ฌ๋ถ๋ง ์ฒดํฌํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๊ณ ์์๊ฐ ์ค์ํ์ง ์๋ค.
์: ํน์ ์ซ์๊ฐ ๋ฐฐ์ด์ ํฌํจ๋์ด ์๋์ง ํ์ธํ ๋
HashMap
ํค์ ๊ฐ์ ๊ด๊ณ๋ฅผ ์ ์ฅํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค.
์: ํ์ ์ด๋ฆ๊ณผ ์ฑ์ , ์ํ ID์ ๊ฐ๊ฒฉ์ ์ ์ฅํ ๋
5. ๋ฌธ์์ด (String)
์ค์ํ ์ ์ ๋ฌธ์์ด์ ์ถ๊ฐํ๊ณ ์ญ์ ํ๋ ๋์์ ํ ๋, ๋ฌธ์์ด์ immutable ๊ฐ์ฒด์ด๋ฏ๋ก ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ์์ ํ๋ ๊ฒ์ด ์๋๋ผ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค๋ ์ฌ์ค์ด๋ค.
String string = "he" string += "llo" System.out.println(string) // "hello"

๋ฌธ์์ด ์์
๊ทธ๋ ๋ค๋ฉด ๋ฌธ์์ด์ ์์ ํ๊ณ ์ถ์ ๋๋ ์ด๋ป๊ฒ ํด์ผ ํ๋๊ฐ? ๊ทธ๋ด ๋๋ replace() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค. replace() ๋ฉ์๋๋ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์ฐพ์ ๋ฌธ์์ด์, ๋ ๋ฒ์งธ ์ธ์๋ก ๋ณ๊ฒฝํ ๋ฌธ์์ด์ ๋ฃ์ด์ ์ฌ์ฉํ๋ค.
์๋ฅผ ๋ค์ด์ replace(A, B)๋ ๋ฉ์๋์ ๊ฒ์ ๋์ ๋ฌธ์ A๋ฅผ ๋ชจ๋ ์ฐพ์์ ์ผ๊ด B๋ก ๋ณํํ๋ค.
String string = "Hello"; string = string.replace("l", ""); // "l" ๋ชจ๋ ์ญ์ System.out.println(string); // "Heo"
6. StringBuffer์ StringBuilder
์์์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ ์๋ฐ์์ String ๊ฐ์ฒด๋ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ Immutable ๊ฐ์ฒด์ด๋ค. '๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค'๋ ๊ฒ์ด ์ด๋ค ์๋ฏธ์ธ์ง ์ฑ๋ฅ ์ธก๋ฉด์์ ์์๋ณด๊ธฐ ์ํด ์๋ ์์ ์ฝ๋๋ฅผ ๋ณด์.
String s = "abc" System.out.println(System.identityHashCode(s)); // 1808253012 s += "def"; System.out.println(System.identityHashCode(s)); // 589431969 System.out.println(s) // abcdef
System.identityHashCode()
๋ฉ์๋๋ ๊ฐ์ฒด๋ฅผ ํน์ ํ๋ ์๋ณ๊ฐ์ ๋ฐํํ๋ค. String s์ abc์ def๋ฅผ ์ด์ด ๋ถ์์ ๋ฟ์ธ๋ฐ identityHashCode() ๋ฉ์๋์ ์ถ๋ ฅ๊ฐ์ด ๋ฌ๋ผ์ง๋ค. ์ด๊ฑด "abc"๊ฐ๋ง ๊ฐ์ง๊ณ ์๋ s์ "abcdef" ๊ฐ์ ๊ฐ์ง๊ณ ์๋ s๊ฐ ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด์์ ์๋ฏธํ๋ค. ์ฆ, String ๊ฐ์ฒด์ ๊ฐ์ ๋ณ๊ฒฝํ๋ ์๋ก์ด String ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ๊ฐ์ ๋ณต์ฌํ๋ ์์
์ด ์ํ๋จ์ ์๋ฏธํ๋ค. ๋ฐ๋ผ์ s+="def"๋ฅผ ์ํ ํ ๋ ๋ด๋ถ์์๋ ์๋์ ๊ฐ์ ์ฐ์ฐ์ด ์ํ๋๋ค.
- ์๋ก์ด String s ๊ฐ์ฒด๋ฅผ ์์ฑ
- s๊ฐ ๊ฐ์ง "abc" ๊ฐ์ ํ๋์ฉ ๋ณต์ฌ
- "abc" ๋ค์ "def" ์ ์ฅ
๊ทธ ๊ฒฐ๊ณผ s += "def" ์ฝ๋ ํ ์ค ์์ ์ด 6๋ฒ์ ๋ด๋ถ ์ฐ์ฐ("abc"๊ฐ 3๊ฐ ๋ณต์ฌ, "def"๊ฐ 3๊ฐ ์ ์ฅ)์ด ์ํ๋๋ค. ์๊ฐ ๋ณต์ก๋๋ก ๋ฐ์ง๋ฉด ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ N์ด๋ผ๊ณ ํ์ ๋ O(N)์ด๋ค.
๊ทธ๋์ ์๋์ฒ๋ผ N = 100,000์ธ ์ฝ๋๋ฅผ ์ํํ๋ฉด ์ปดํจํฐ์์ 6์ด๊ฐ ๊ฑธ๋ฆฐ๋ค.
public class Main { public static void main(String[] args) { long start = System.currentTimeMillis(); String s = ""; for (int i = 1; i <= 100000; i++) { s += i; // String์ ๊ณ์ ์์ (๋นํจ์จ์ ์ด์ง๋ง ์๋์ ์ผ๋ก ์ ์ง) } long end = System.currentTimeMillis(); System.out.println((end - start) / 1000.0 + "์ด"); // ๊ดํธ ์์ ์๋ฃ } }
์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฑ์ฅํ ๊ฒ์ด StringBuilder ํด๋์ค์ StringBuffer ํด๋์ค์ด๋ค. ๋ ํด๋์ค๋ mutable ํ๋ฏ๋ก ๊ฐ์ ๋ณ๊ฒฝํ ๋ ์๊ฐ๋ณต์ก๋ ๊ด์ ์์ ํจ์ฌ ๋ ํจ์จ์ ์ด๋ค. ๋ค์ ์ฝ๋๋ ์ ์ฝ๋์ ๋น๊ตํ์ ๋ s ๊ฐ์ฒด์ ์ ์ฅํ ๋ฌธ์์ด์ ๋์ผํ๋ค. ํ์ง๋ง ์คํ ์๊ฐ์ ์ ํ ๋ค๋ฅด๋ค. ๊ณ ์ 0.005์ด๊ฐ ์์๋๋ค.
public class Main { public static void main(String[] args) { long start = System.currentTimeMillis(); StringBuilder sb = new StringBuilder(); // String ๋์ StringBuilder ์ฌ์ฉ for (int i = 1; i <= 100000; i++) { sb.append(i); // ๋ฌธ์์ด ์ถ๊ฐ } long end = System.currentTimeMillis(); System.out.println((end - start) / 1000.0 + "์ด"); // ๊ดํธ ์์ ์๋ฃ } }
๋ฐ๋ผ์ String ๊ฐ์ ๋ณ๊ฒฝํ๋ ์ฐ์ฐ์ด ๋ง์ ๋์๋ ํจ์จ์ด ๋์ StringBuilder ํด๋์ค๋ StringBuffer ํด๋์ค๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. ๋ ํด๋์ค์ ์ฐจ์ด๋ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ Thread-Safe ์ฌ๋ถ๋ก ๋๋์ด์ง๋ค. ํ์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ๋๋ถ๋ถ์ ์ฝ๋ฉ ํ ์คํธ์์๋ ๋ค์์ ์ค๋ ๋๋ฅผ ํ์ฑํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์, Thread-Safe๊ฐ ์๋ StringBuilder ํด๋์ค๊ฐ ์๋ ์ธก๋ฉด์์ ์ฝ๊ฐ ๋ฏธ์ธํ์ง๋ง ๋ ๋น ๋ฅด๋ฏ๋ก ๊ถ์ฅ๋๋ค.
int ์ Integer์ ์ฐจ์ด โผ
int ํ์
- Primitive type
- ๋ฉ๋ชจ๋ฆฌ์์ ์ง์ ๊ฐ์ ์ ์ฅํ๋ฉฐ, ์ฑ๋ฅ์ด ๋น ๋ฅด๋ค.
- null ๊ฐ์ ๊ฐ์ง ์ ์๋ค.
- ๊ธฐ๋ณธ ๊ฐ์ 0์ด๋ค.
Integer ํ์
- Reference type (์ฐธ์กฐ ํ์ )
- Integer๋ int๋ฅผ ๊ฐ์ธ๋ ํด๋์ค์ด๋ค.
- ๊ฐ์ฒด๋ก ์ฒ๋ฆฌ๋๋ฉฐ, int์ ๋ฌ๋ฆฌ ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์๋ค.
- null ๊ฐ์ ๊ฐ์ง ์ ์๋ค.
- Integer๋ int์ ์ํธ ๋ณํํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค. (auto-boxing๊ณผ unboxing)
int primitiveInt = 10; // Primitive type Integer wrapperInt = 10; // Reference type (auto-boxing) Integer nullInteger = null; // Reference type can be null // Unboxing (Integer -> int) int unboxedInt = wrapperInt; // ์๋์ผ๋ก unboxing ๋ฐ์
์ฑ๋ฅ์ ์ธ ๋ฉด์์ int๋ primitive type์ด๋ฏ๋ก ์ฐ์ฐ์ด ๋น ๋ฅด๊ณ , ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ ๋ค. ํ์ง๋ง ์ ์ฐ์ฑ์ Integer๋ ๊ฐ์ฒด๋ก์ null์ ํ์ฉํ๊ณ , ๋ค์ํ ๋ฉ์๋ ๋ฐ ํด๋์ค๋ฅผ ํ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ Integer์ด ๋ ์ ์ฐํ๋ค. ์๋ฅผ ๋ค์ด, ์ปฌ๋ ์ (List, Set ๋ฑ)์์ Integer๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฆฌ๋ง์ธ๋
- ์๋ฐ์ ๋ฐ์ดํฐ ํ์ ์๋ primitive types์ reference types๊ฐ ์๋ค. primitive types์ ์ฐ์ฐ ์๋๊ฐ reference types๋ณด๋ค ๋ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ๋ค๋ฉด primitive types์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
- ์๋ฐ์ ์ปฌ๋ ์ ํ๋ ์์ํฌ์ ๋ฆฌ์คํธ, ํด์๋งต์ ์ฝํ ์์ ์์ฃผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๊ผญ ์์๋์ด์ผ ํ๋ค.
- ์๋ฐ์์ String ํด๋์ค์ ๊ฐ์ฒด๋ Immutable ๊ฐ์ฒด์ด๋ค. ํ๋ฒ ์ ์ธํ๋ฉด ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๊ธฐ ๋๋ฌธ์ + ์ฐ์ฐ ๋ฑ์์ค ๊ฐ์ ๋ณ๊ฒฝํ ๊ฒฝ์ฐ ํจ์จ์ด ์ข์ง ์๋ค. String์ + ์ฐ์ฐ์ด ์์ฃผ ๋ฐ์ํ๋ ๊ฒฝ์ฐ StringBuilder์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
- ์กฐ๊ธฐ๋ฐํ, ๋ณดํธ๊ตฌ๋ฌธ, ์ ๋ค๋ฆญ ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ฉด ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ํจ์จ์ฑ์ ๋์ผ ์ ์๋ค.
์ฐธ๊ณ ์๋ฃ & ํฌ์คํ ์์ฑ์ ๋์์ ์ฃผ์ ๋ถ
1. chatGPT ์ ๊ถ๊ธํ ์ ์ ๋ฌผ์ด ๋ณด๋ฉฐ ์์ฑ
2. ๊นํฌ์ฑ, ํ๋ก๊ทธ๋๋จธ์ค ์ฝ๋ฉํ ์คํธ, ํ๋ก๊ทธ๋๋จธ์ค, 2023