티스토리 뷰

JAVA

자바 습관 (기본 프로그래밍)

김남김 2023. 11. 28. 22:20

 

 

자바를 다시 공부하면서 흔히 실수하고 잘못 사용되는 기초적이고 필수적인 부분들을 습관화해보고자한다. 

처음에는 프로그래밍 규칙에서부터 계속해서 포스트를 작성하여 살펴보고자한다. 

 

 

1. 반복문 for문에서 사용하는 i,j 와 같은 증감 변수에 네이밍을 하자. 

i와 j는 일단 가시적으로 비슷하게 생겼고 정확히 어떤 의미를 하는가 이해하기 어렵다. 또한 왜 for문에 이만큼 증감시켜서 동작시키는지도 어렵다. 협업 시에 어떻게 어느정도 반복되고 있는가 읽기에 어려움을 줄 수 있다. 
더욱 구분하기 쉬운 증감변수명   혹은 Enhaced For(foreach)를 사용하자

for (preNumber = 2; preNumber < 10; preNumber++) {
	for (postNumber = preNumber + 1; postNumber < 10; postNumber++) {
    }
}

for (Person student  : students) {
}

 

 

 

2. 연관된 조건문은 하나로 통합한다. 

간단한 if문은 상관없지만, if문이 중첩될 수록 혹은 요구사항이 추가될 수록 계속해서 길어져 가독성이 떨어지는 문제가 발생한다. 그렇기에 하나의 조건으로 통합하여 작성하도록한다.

if (a > b && a > 4) {
}

if (isEnughSize(a)) {
}

 

 

3. 아무것도 하지 않는 if문은 제거한다. 

임시로 테스트용 코드를 작성하거나, 항상 true인 경우에 대해 코드를 작성하다가 아무 동작하지 않는 if문이 생길 수 있다. 당장에는 큰 영향을 미치지 않더라도, 추후 전체적인 프로세스의 흐름을 추적하면서 확인하지 않는 이상 발견하기 어렵다. 

단순히 삭제해서 해결할 수 있는 코드라면 삭제해도 좋지만, 모의 상황을 위해 테스트를 용도로 삽입한 경우라면 JUnit을 활용한 테스트 환경에서 동작할 수 있도록 관리하자. 

 

@Test
void test() {
	boolean isAdmin = true;
    if (isAdmin) {
    	System.out.print("관리자 입니다.");
    }
}

 

 

4. 잘못된 null 조건 비교

String에서 null값을 확인하기 위해 조건문을 이용해 객체를 확인하기도 하지만, 이는 아이러니하게도 NullPointException을 일으키기도한다.  그렇기에 공백 문자열 확인 문제를 해결하기 위해서는 아래와 같이 null 확인 후 equals 동작하도록 사용한다.   

 

void test(String value) {
	if (value == null || value.equals("")) {
    // null을 만족하면 뒤에 equals 를 동작하지 않도록 하여 의도하지 않은 NullPointException을 방지한다. 
    }
}

 

 

5. for문과 While문 

for문과 while 문 중에 무엇을 쓸까 고민할 수 있다. 

웬만하면 for문은 일반적으로 범위가 정해졌을 때 사용한다. while문은 특정 조건에 따라 제어해야하는 반복에 대해 사용한다. 추가로 while문을 사용할 떄 while(true) 보다는 변수 네이밍을 하여 어떤 조건에 동작하는 while문인지 알려주도록 한다.

for (int i = 0; i < 10; i++) {
}

isGameOver = true;
while(isGameOver) {
	if () {
    	isGameOver = false;
        break;
    }
}

 

 

6. for 문에서는 float 문을 증감변수로 사용하지 않는다.

float과 double은 부동소수점 연산에 정확한 값을 도출한다고 믿지만, 실은 근사치를 계산하며 그로 인해 혼란을 야기할 수 있다. 

이러한 문제를 해결하기 위해서는 비록 속도가 느리더라도 정확한 BigDecimal을 사용한다 

 

 

7. 반복문 끝에는 분기문을 두지 않는다. 

분기문은 주로 반복문의 종료와 실행 흐름을 제어하는데 사용하는데 이따금 return 과 같은 예약어를 사용한다. 

만약 반복문의 끝에 종료와 실행 흐름을 제어하는 조건문이 있다면 개발자가 원치 않는 과정에서 반복문을 무력화할 수 있다. 

 

 

8. Boolean 객체의 사용법 

Boolean 객체를 사용할 떄, 인스턴스화하는 것은 불필요한 작업이다. 이 객체는 다른 것들과는 달리 true, false 밖에 없기에 이미 객체 내에 정의되어 있는 값을 사용한다. 

 

Boolean bool = Boolean.TRUE;
Boolean falseBool = Boolean.FALSE;

 

 

9. BigInteger 객체의 사용법 

자바에서는 큰 정수를 담기위한 박스화된 기본 자료형으로 BigInterger을 사용한다. BigInterger은 위에 Boolean객체와 같이 이미 상수가 있기 때문에 이미 정의되어 있는 값이 있다면 상수 값을 되도록 활용하자. 

BigInteger bigZero = BigInteger.ZERO;
BigINteger bigOne = BigInteger.ONE;

 

 

10. BigDecimal의 함정

 위에서 float과 double의 함정에 빠지지 않기 위해 해당 객체를 언급했다.  그러나 BigDecimal은 연산자를 사용하지 않고 메서드를 사용한다.

BigDecmial a = BigDecimal.ONE;
BigDeCmial b = BigDecimal.valueOf(1.123);
a.add(b); // substract, muliply, divide

 

 

11. 잘못 하드코딩된 IP는 위험하다.

서버의 IP는 관리적인 측면과 보안상의 이유로 유동적으로 변경될 수 있다.  또한 자바소스는 디컴파일이 가능한데, IP와 같은 중요 파일이 유출된다면 디컴파일을 통해 관련 정보도 함께 유출될 수 있다. 소스코드에는 어떠한 중요 설정값도 하드코딩해서는 안되고 이를 위해서자바는 property라는 설정값 관리 수단을 제공하여 properties, yml파일을 통해 관리하도록한다. 

 

 

12. 올바른 toArray 메서드 사용

List와 같은 컬렉션에서 배열 형태로 전환하는 코드는 빈번히 사용되지만 효율적으로 사용해야한다.

아래와 같이 대상 배열의 자료형과 정확한 길이를 전달하여 사용하도록 한다. 

String[] array = (String[])list.toArray(new String[list.size()]);

 

 

13. equals와 hashCode메서드는 언제나 함께 오버라이드한다.

equlas 메서드는 두 인스턴스가 동일한지 비교할 때 사용하고 해시 기반의 HashMap이나 HashSet같은 컬렉션에서는 hashCode메서드를 사용하므로 두 메서드는 어느 한쪽만 오버라이드해서는 안된다. 

 

14. finally 절에서는 return을 사용하지 않는다.

예외 처리를 위한 try/ catch/ finally블록을 사용할 때 일반적으로 실제 사용하는 코드를 try, 예외가 발생했을 때 이를 처리하기위한 catch, 자원을 반환하거나 반드시 실행해야하는 코드를 위한 finally를 사용한다.

그러나 만약, return 문을 finally에 넣게되면 예외가 발생하여 멈춰야함에도 불구하고 return 문을 통해 해당 소스코드가 실행된척 정상 동작으로 가장하게된다. 

 

try (
	a / 0;
 ) catch (Exception e) {
 	System.out.println("문제 발생" + e.getMessage());
 } finally {
 	return 0; // return 문을 통해 예외가 묵살된다.
 }

 

 

15. 초기화 블록은 생성자와 혼동될 수 있다.

일반적으로 클래스를 초기화하는데 생성자를 사용하지만 초기화 블록을 사용해 초기화할 수 있다.

이러한 초기화 블록은 클래스의 모든 인스턴스를 생성할 때 생성자보다 먼저 실행된다.

하지만 이 경우 생성자와 초기화 블록이 모두 인스턴스의 초기화를 담당하는데, 혼란을 야기할 여지가 있다. 

 

'JAVA' 카테고리의 다른 글

모든 객체의 공통 메서드  (1) 2023.12.02
객체의 생성과 파괴  (2) 2023.12.02
자바 습관(올바른 문자열 처리)  (0) 2023.11.29
어떻게 협력하는가? (with MVC)  (0) 2023.10.14
Java 코딩 컨벤션  (1) 2023.10.13
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함