지역 변수의 선언: 상수로 선언하는 게 좋다.
- 변수를 사용하지 않고(지역 변수의 경우) 상수로 변수를 선언/초기화 하면 논리 오류를 구문 오류로 찾을 수 있다(즉 디버깅하는데 필요한 시간을 줄일 수 있다).
- 그 데이터를 처리하는 메서드는 목적에 따라 한 가지 기능만 하는 메서드에 넣는다: 단, 한 메서드는 15 줄 이내로 작성하여 넘어가면 분리해낸다.
한 메서드는 같은 작업만 몰아서: 컴퓨터의 입장에서
for(int i = 0; i < score.length; i++) {
score[i] = i * 3; // < 쓰는 작업
}
for(int i = 0; i < score.length; i++) {
System.out.println(score[i]); // < 읽는 작업
}
for 문 안에 읽고 쓰는 작업을 같이 넣으면 어떻게 될까?
빠를 것 같지만, 컴퓨터의 입장에서는 그렇지 않다. 같은 작업을 반복하는 것이 더 효율적.
- 쓰기: CPU > 캐시(128 byte) > 메모리
- 읽기: 메모리 > 캐시(128 byte) > CPU
리팩터링 예제
public class MultidimensionalArrayByValueListExample {
public static void main(String[] args) {
//2차원 배열 생성
int[][] scores = {
{ 80, 90, 96 },
{ 76, 88 }
};
//배열의 길이
System.out.println("1차원 배열 길이(반의 수): " + scores.length);
System.out.println("2차원 배열 길이(첫 번째 반의 학생 수): " + scores[0].length);
System.out.println("2차원 배열 길이(두 번째 반의 학생 수): " + scores[1].length);
//첫 번째 반의 세 번째 학생의 점수 읽기
System.out.println("scores[0][2]: " + scores[0][2]);
//두 번째 반의 두 번째 학생의 점수 읽기
System.out.println("scores[1][1]: " + scores[1][1]);
//두 반의 평균 점수 구하기
System.out.println("첫번째 반의 평균 점수: " + getAverage(scores[0])); // <<
System.out.println("두번째 반의 평균 점수: " + getAverage(scores[1])); // <<
//전체 학생의 평균 점수 구하기
int totalStudent = 0;
int totalSum = 0;
for(int i=0; i<scores.length; i++) { // 반의 수만큼 반복
totalStudent += scores[i].length; // 반의 학생 수 합산
for(int k=0; k<scores[i].length; k++) { // 해당 반의 학생 수만큼 반복
totalSum += scores[i][k]; // 학생 점수 합산
}
}
double totalAvg = (double) totalSum / totalStudent;
System.out.println("전체 학생의 평균 점수: " + totalAvg);
}
private static double getAverage(int[] scores) { // <<
int class1Sum = 0;
for(int i=0; i<scores.length; i++) {
class1Sum += scores[i];
}
return (double) class1Sum / scores.length;
}
}
- 처음부터 일반화하지 말고, 코드에서 반복이 나타날 때 까지 하드 코딩해도 된다. 반복이 시작하면 그 때 공통 부분을 추출해 메서드로 추출한다.
- 이 코드에서는 average를 구하는 메서드 만으로 추출한다.
- 이중 배열의 데이터를 잘 사용했다: 이중 배열 이해가 부족했네
한 줄 Tip 모아보기
- 복잡한 연산을 할 때에는 괄호 활용할 것.
if
문 → 범위 조건 /switch-case
문 → 정해진 값의 조건에 사용하기 쉽다.- 랜덤 숫자 만들기:
Math.random()
jdk 페이지 읽어보자. double 형이고 0.0~1.0 임을 알 수 있다.
int num = (int)(Math.random()*6) + 1; // 랜덤 주사위 숫자 만들기