년이십육이지이십오비(年二十六而知二十五非) RSS 태그 관리 글쓰기 방명록
2023-02-22 22:36:03

Just Java meme

 

1. 긴 메서드 작성을 지양하자

클래스 로딩과 메소드 호출 시 스택 메모리에 메소드를 로드하기 때문에
처리량이 너무 많아 메서드가 크면 실행을 위해 메모리와 CPU 주기를 소비합니다
메서드는 너무 길면 안 되며 단일 기능을 수행하도록 해야 합니다.

 

2. 여러 If-else 문을 피하자

 

조건문을 남용해서는 안 됩니다. 
조건부 if-else 문을 너무 많이 사용하면 JVM이 조건을 비교해야 하므로 

성능에 영향을 미칩니다. 
for, while 등과 같은 반복문에서 동일한 조건을 사용하면 상황이 악화될 수 있습니다.
능하면 여러 if-else 대신 switch 문을 사용하는 것도 생각할 수 있습니다.
Switch 문은 if – else보다 성능상의 이점이 있습니다.

https://jerry92k.tistory.com/51
https://jerry92k.tistory.com/54

 

3. 반복문에서 크기를 가져오는 것을 지양하자

지양코드

List<String> objList = getData(); 
for (int i = 0; i < objList.size(); i++) { 코드 실행 ..}
// objList.size() <- 부분에서 지속적으로 호출한다.
// 만일 사이즈가 어마어마하게 크다면  호출횟수를 생각해보자 정말 아찔하다.

위 코드를 최대한 피하여 다음과 같이 작성하자

지향코드

List<String> objList = getData();
int size = objList.size(); // <- 반복문에서 호출하지 않으므로 여러번 호출하지 않는다!
for (int i = 0; i < size; i++) { execute code ..}

https://junghyungil.tistory.com/65
https://yeon-kr.tistory.com/158

 

4. '+' 연산자로 문자열을 연결하지말자

'+' 연산자를 사용하여 문자열 개체를 연결하면 자바의 String 객체들은 불변하기 때문에
'+' 연산자를 사용하면 연결된 값으로 새 String 개체가 생성되며,

이로 인해 여러 String 개체가 생성되고 
힙에 저장되어 메모리 사용량이 증가하게 만듭니다
이 경우 StringBuilder 또는 StringBuffer를 사용하면 성능의 이점이 있다.

 

지양코드

String query = String1+String2+String3;

위 코드를 최대한 피하여 다음과 같이 작성하자

지향코드

StringBuilder strBuilder = new StringBuilder(“”);
strBuilder.append(String1).append(String2).append(String3);
String query = strBuilder.toString();

https://jgrammer.tistory.com/entry/%EC%9D%B4%ED%8E%99%ED%8B%B0%EB%B8%8C-%EC%9E%90%EB%B0%94-%EB%AC%B8%EC%9E%90%EC%97%B4-%EC%97%B0%EA%B2%B0%EC%9D%80-%EB%8A%90%EB%A6%AC%EB%8B%88-%EC%A3%BC%EC%9D%98%ED%95%98%EB%9D%BC-%EB%AC%B8%EC%9E%90%EC%97%B4-%EC%97%B0%EA%B2%B0-%EB%B0%A9%EB%B2%95-%EB%B9%84%EA%B5%90

 

5. 가능하면 원시타입(Primitive Types)을 지향하자

원시타입은 stack영역에 있고 참조 유형은 heap영역에 있습니다.
스택 메모리가 힙보다 액세스 속도가 훨씬 빠릅니다.
또한 Boxing overhead가 상당합니다.
원시타입을 쓰는 것이 성능의 이점이 있습니다.

 

 

https://www.baeldung.com/java-primitives-vs-objects
https://alammori.com/benchmarks/primitive-vs-boxed-performance

 

 

 

+ 가끔 다른 블로그 글을 읽다 보면 
Java 1.5 이후 성능 이슈가 해결되어 '+'연산자를 사용해도 

문제없다는 말이 보입니다. 사실 이는 이율배반입니다.
Java 1.5 이후 관련 로직을 수정한 게 아닌
StringBuilder 클래스를 도입하여 heap에 여러 개체를 만들지 않고도 
String 개체를 연결할 수 있는 효율적인 방법을 제공한다는 의미에서

성능 문제가 해결되었다는 의미였기 때문입니다.