2 분 소요

지역 변수의 선언: 상수로 선언하는 게 좋다.

  • 변수를 사용하지 않고(지역 변수의 경우) 상수로 변수를 선언/초기화 하면 논리 오류를 구문 오류로 찾을 수 있다(즉 디버깅하는데 필요한 시간을 줄일 수 있다).
  • 그 데이터를 처리하는 메서드는 목적에 따라 한 가지 기능만 하는 메서드에 넣는다: 단, 한 메서드는 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; // 랜덤 주사위 숫자 만들기

댓글남기기