Java code convention

ํ™ฉ์—ฐ์ค€ยท2025๋…„ 11์›” 16์ผ

1. Objects.equals(a, b) ์‚ฌ์šฉ

Yoda Condition์˜ ํ˜„๋Œ€์  ๋ฒ„์ „.

Objects.equals(a, b)
  • null-safe
  • ๊ฐ€๋…์„ฑ ์ข‹์Œ
  • IDE ์ž๋™์™„์„ฑ ์ž˜ ๋จ
if (Objects.equals(user.getStatus(), "ACTIVE")) { ... }

2. ์ƒ์ˆ˜(static final) ์ด๋ฆ„์€ ๋Œ€๋ฌธ์ž + ์–ธ๋”๋ฐ”

๋ฆฌํ„ฐ๋Ÿด ๋ฌธ์ž์—ด์„ ์ฝ”๋“œ์— ์ง์ ‘ ์ ์ง€ ์•Š๊ธฐ.

private static final String STATUS_ACTIVE = "ACTIVE";

ํ•˜๋“œ์ฝ”๋”ฉ ๋Œ€์‹ :

if (STATUS_ACTIVE.equals(user.getStatus())) { ... }

์œ ์ง€๋ณด์ˆ˜์„ฑ ์ƒ์Šน.


3. Optional ์ ๊ทน ํ™œ์šฉ (NPE ๋ฐฉ์ง€ + ์˜๋„ ๋“œ๋Ÿฌ๋‚ด๊ธฐ)

์˜ˆ:

Optional.ofNullable(user)
    .map(User::getName)
    .orElse("unknown");

์˜๋ฏธ: "user ์—†์œผ๋ฉด unknown"

๋ช…ํ™•ํ•˜๊ณ  NPE๋„ ๋ฐฉ์ง€.


4. early-return์œผ๋กœ ์ค‘์ฒฉ ์ค„์ด๊ธฐ

Bad Case

if (user != null) {
    if (user.isActive()) {
        if (user.hasPermission()) {
            // logic
        }
    }
}

Good Case

if (user == null) return;
if (!user.isActive()) return;
if (!user.hasPermission()) return;
// logic

โžก ๊นŠ์ด๊ฐ€ ์–•์•„์ง€๊ณ  ์ฝ๊ธฐ ์‰ฌ์›€.


5. ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์šฉํ•ด if-else ํ”ผํ•˜๊ธฐ

์˜ˆ: if-else๋กœ ํƒ€์ž…๋ณ„๋กœ ์ฒ˜๋ฆฌํ•˜๋˜ ๊ฑฐ

Bad Case:

if (type == A) { ... }
else if (type == B) { ... }
else if (type == C) { ... }

Good Case:

Map<Type, Runnable> handler = Map.of(
    A, () -> handleA(),
    B, () -> handleB(),
    C, () -> handleC()
);

handler.get(type).run();

6. Stream์œผ๋กœ ๋ฐ˜๋ณต๋ฌธ, ์กฐ๊ฑด ์ฒ˜๋ฆฌ ์ตœ์†Œํ™”

Before:

List<String> filtered = new ArrayList<>();
for (String s : list) {
    if (s.startsWith("A")) {
        filtered.add(s);
    }
}

After:

List<String> filtered = list.stream()
    .filter(s -> s.startsWith("A"))
    .toList();

โžก ๋ชฉ์ ์ด ๋ช…ํ™•ํ•จ.


7. @NonNull / @Nullable ์• ๋…ธํ…Œ์ด์…˜ ์‚ฌ์šฉ

IDE/๋นŒ๋“œ ํƒ€์ž„์— null ๊ด€๋ จ ๋ฒ„๊ทธ๋ฅผ ์žก์„ ์ˆ˜ ์žˆ์Œ.

์˜ˆ:

public void doSomething(@NonNull String value) { ... }

8. Lombok์œผ๋กœ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ค„์ด๊ธฐ

ํŠนํžˆ DTO/VO.

@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class User { ... }

โžก ์ฝ”๋“œ ์–‘ ์ค„๊ณ  ๊ฐ€๋…์„ฑ ์ฆ๊ฐ€.


9. ๊ธฐ๋ณธํ˜• ๋Œ€์‹  wrapper ์‚ฌ์šฉ์— ์ฃผ์˜

Integer vs int ๊ฐ„์˜ auto-unboxing NPE ์ฃผ์˜.

์˜ˆ:

Integer count = null;
int result = count;  // NPE

โžก ๊ฐ€๋Šฅํ•˜๋ฉด primitive(int) ์‚ฌ์šฉ.


10. switch๋ฌธ์€ modern switch ์‚ฌ์šฉ (Java 14+)

Before:

switch (role) {
    case "USER":
        return 1;
    case "ADMIN":
        return 2;
    default:
        return 0;
}

After:

return switch (role) {
    case "USER" -> 1;
    case "ADMIN" -> 2;
    default -> 0;
};

0๊ฐœ์˜ ๋Œ“๊ธ€