Development/Code

자바 개발자를 위한 10가지 팁

Danny Seo 2023. 6. 20. 09:38

 

 

1. 가독성과 유지보수성을 높이기 위해 서술적이고 의미 있는 변수 이름을 사용하세요.

// 나쁜 예
int a;
int d;

// 좋은 예
int age;
int elapsedTimeInDays;
int daysSinceCreation;
int daysSinceModification;
int fileAgeInDays;

 

2. 마법의 숫자(magic numbers)를 코드에서 사용하지 말고, 대신에 상수로 선언하여 코드의 가독성과 유지보수성을 개선하세요.

// 나쁜 예
if (status == 1) {
    // 뭔가를 수행
}

// 좋은 예
private static final int ACTIVE_STATUS = 1;

if (status == ACTIVE_STATUS) {
    // 뭔가를 수행
}

 

3. try-with-resources를 사용하여 파일, 데이터베이스 연결 등과 같은 리소스를 사용한 후 자동으로 닫을 수 있도록 하세요.

// try-with-resources를 사용하지 않은 경우
BufferedReader br = null;
try {
    br = new BufferedReader(new FileReader(file));
    String line;
    while ((line = br.readLine()) != null) {
        // 라인 처리
    }
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (br != null) {
        try {
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

// try-with-resources를 사용한 경우
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
    String line;
    while ((line = br.readLine()) != null) {
        // 라인 처리
    }
} catch (IOException e) {
    e.printStackTrace();
}

 

4. 의도하지 않은 상태 변경을 방지하기 위해 변경할 수 없는(immutable) 객체와 클래스를 사용하세요.

// 변경 가능한 객체
public class Person {
    private String name;

    public void setName(String name) {
        this.name = name;
    }
}

// 변경할 수 없는 객체
public class Person {
    private final String name;

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

 

5. 느슨한 결합(loose coupling)을 실현하고 유지보수성을 향상하기 위해 인터페이스와 추상 클래스를 사용하세요.

// 인터페이스를 사용하지 않은 경우
public class Person {
    public void sayHello() {
        System.out.println("Hello!");
    }
}

// 인터페이스를 사용한 경우
public interface Greeting {
    void sayHello();
}

public class Person implements Greeting {
    @Override
    public void sayHello() {
        System.out.println("Hello!");
    }
}

 

6. 코드 재사용과 유지보수성 향상을 위해 상속과 다형성을 사용하세요.

public abstract class Shape {
    public abstract double getArea();
}

public class Rectangle extends Shape {
    private final double length;
    private final double width;

    public Rectangle(double length, double width) {
        this.length = length;
        this.width = width;
    }

    @Override
    public double getArea() {
        return length * width;
    }
}

public class Circle extends Shape {
    private final double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    @Override
    public double getArea() {
        return Math.PI * Math.pow(radius, 2);
    }
}

위의 다형성을 활용한 사례 (SOLID 원칙 중 : OCP 예제 참조)
https://devloo.tistory.com/entry/SOLID-%EB%94%94%EC%9E%90%EC%9D%B8-%EC%9B%90%EC%B9%99-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EB%8B%A8%EC%88%9C%ED%99%94

7. 제네릭을 사용하여 다른 데이터 유형에서 작동하는 일반 코드를 작성하세요.

public class Box<T> {
    private T value;
    
    public Box(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }
}

Box<String> stringBox = new Box<>("Hello");
Box<Integer> intBox = new Box<>(42);

 

8. 열거형(enum) 타입을 사용하여 고정된 상수 집합을 나타내세요.

public enum DayOfWeek {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
}

 

9. 리소스를 자동으로 관리하기 위해 try-with-resources를 사용하세요.

try-with-resources 문은 Java 7에서 도입된 기능으로, 스트림이나 데이터베이스 연결과 같이 사용 후에 닫아야 하는 리소스의 자동 관리를 가능하게 합니다. try-with-resources 문은 각 리소스가 문장의 끝에서 닫히도록 보장하므로 수동으로 닫을 필요가 없습니다.

try (BufferedReader br = new BufferedReader(new FileReader(file))) {
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) {
    e.printStackTrace();
}

 

10. Java 컬렉션을 효과적으로 사용하세요.

Java 컬렉션은 관련 객체 그룹을 관리하기 위한 강력한 도구입니다. 컬렉션을 효과적으로 사용함으로써 보다 더 효율적이고 유지보수 가능한 코드를 작성할 수 있습니다. 다음은 Java 컬렉션을 효과적으로 사용하기 위한 몇 가지 팁입니다:

  1. 작업에 적합한 컬렉션 유형을 선택하세요. 예를 들어, 인덱스로 요소에 접근해야 하는 경우 ArrayList를 사용하고, 요소의 존재 여부를 빠르게 확인해야 하는 경우 HashSet을 사용하세요.
  2. 제네릭을 사용하여 타입 안전성을 보장하고 캐스팅을 피하세요.
  3. 향상된 for 루프를 사용하여 컬렉션을 반복하세요.
  4. Collections 클래스를 사용하여 컬렉션을 정렬하거나 섞고,
List<String> list = new ArrayList<>();
list.add("사과");
list.add("바나나");
list.add("체리");

Collections.sort(list);
for (String s : list) {
    System.out.println(s);
}