public static void main(String[] args)
{ int n;
…
{ int k;
….
} // k local to block and defined only until the end of the block
}
하지만, 동일한 메소드의 다른 블록 내에서 같은 이름의 변수를 선언할 수 없다.
public static void main(String[] args)
{ int n;
…
{ int k;
int n; // ERROR – can’t redefine n in inner block
….
}
}
———————————————————————-
C++ 노트 : C++에서 중첩된 블록내에 변수를 다시 정의할 수 있다. 그러나 내부 정의는 외부 정
의의 그림자이다. 따라서 프로그램내의 에러가 될 수 있다. 이러한 이유 때문에 자바는 이것을
불허한다.
———————————————————————-
int n;
read_data:
while(…)
{
…
for (…)
{ n = Console.readInt(…);
if (n < 0) // should never happen-can’t continue
break read_data;
// break out of read_data loop
…
}
}
// check for success or failure here
if (n < 0)
{ // deal with bad situation
}
else
{ // got here normally
}
잘못된 입력이 들어오면 레벨된 브레이크는 레벨된 블록의 뒤로 이동한다. break 구문을 사용한
다음, 루프가 정상적으로 종료됐는지 브레이크의 결과 값을 검사할 필요가 있다.
클래스 변수는 다음과 같이 main 메소드 위에 선언된다.
class Employee
{ private static double socialSecurityRate = 7.62;
public static void main(String[] args)
{ … }
}
———————————————————————-
주의 : 클래스 변수는 메소드 내부의 블록에 선언된 같은 이름의 변수에 의해 가려질 수 있
다.(이렇게 하는 것이 이상한 프로그래밍 방식이지만)
———————————————————————-
Solve recursively(Problem p)
{ if(the problem is trivial) return the obvious answer;
//simplify the problem
p1 = simpler problem(p)
s1 = solve recursively(p1)
// Turn solution of simpler problem into solution of original problem
s = solution of original problem(s1)
return s;
}
재귀적 서브프로그램은 좀더 단순화되는 상황까지 자신을 호출하여, 아주 단순화된 경우에 이
르면 멈춘다. 경험이 많은 프로그래머에게는 재귀적으로 사고하는 방식이 좀더 쉬운 문제 해결
에 이르게 하는 경우가 많다.(예를 들면, 퀵 정렬(QuickSort) 같은 매우 빠른 정렬의 대부분은 재
귀적 방식을 이용한다.)
public static long lotteryOdds(int high, int number)
{ if (number <= 0) return 0; // just in case
else if (number == 1) return high;
else return high * lotteryOdds
(high – 1, number – 1) / number;
}
노트 : 이런 경우, 실제로는 재귀적 방법이 루프를 사용하는 방법보다 다소 비효율적으로 보여
진다. 그러나 이 경우는 재귀 호출의 구문을 극명하게 보여준다. 다음은 재귀 호출시 일반적인
원칙이다.: 재귀 솔루션은 반복 솔루션보다 일반적으로 더 느리고 오버헤드도 많다.
배열은 프로그래머가 의도적으로 생성해야 하는 객체에 대한 첫번째 예제이다. 이것은 new 연
산자를 통해 이루어진다. 예를 들면,
int[] arrayOfInt = new int[100];
int smallPrimes = { 2,3,5,7,11,13}
이 구문을 사용할 때 new 메소드를 호출해서는 안된다.
심지어 여러분은 임의 배열(Anonymous array)을 초기화할 수 있다:
new int[]{ 2,3,5,7,11,13}
이 표현은 새로운 배열을 할당하고 괄호 내에 있는 값들로 채운다. 이것은 초기 값들의 숫자를
셈한 후 적당하게 배열의 크기를 설정한다. 만일 여러분이 메소드에 배열을 전달하길 원하고
이를 위해 지역 변수를 만들고 싶지 않을 때 이 구문을 사용한다. 예를 들면,
printLabels(new String[] { “Region” , “Sales” } );
은 다음을 줄인 표현이다.
String[] titles = { “Region” , “Sales” }
printLabels(titles);
배열의 원소 개수를 알기 위해 , arrayName.length 를 사용한다. 예를 들면,
for( int i=0 ; i < smakkPrimes.length; i++)
System.out.println(smallPrimes[i]);
배열 복사
여러분은 하나의 배열 변수를 다른 변수에 복사할 수 있다. 그러나 양쪽 변수들은 같은 배열
을 참조한다:
int luckyNumbers = smallPrimes;
luckyNumbers[5] = 12 ; // now smallPromes[5] is also 12
그림 3-8 은 그 결과를 보여준다. 만일 여러분이 실제적으로 한 배열의 모든 값들을 다른 것에
복사하길 원한다면 System 클래스내의 arraycopy 메소드를 사용해야 한다. 구문은 다음과 같다.
System.arraycopy(from , fromIndex, to, toIndex, count) .
예를 들면, 다음 프로그램은 그림 3-9 처럼 배열을 설정하고 난 다음 첫번째 배열의 마지막 네
번째 항목들을 두번째 배열에 복사한다. 복사는 소스 배열의 2 번째 위치에서 시작하여 목표의
3 번째에서 시작한다. 4 개의 항목들을 복사한다.
public class ArrayExample
{ public static void main(String args[])
{ int[] smallPrices = { 2,3,5,7,11,13};
int[] luckyNumbers = { 1001, 1002, 1003, 1004, 1005, 1006, 1007};
System.arraycopy(smallPrimes, 2, luckyNumbers, 3, 4);
for( int i; i < luckyNumbers.length; i++)
{ System.out.println( i +
“ entry after copy is “ + luckyNumbers [ i]);
}
}
}
예제 3-8 : ShellSort.java
public class ShellSort
{ public static void sort(int[] a)
{ int n = a.length;
int incr = n / 2;
while (incr >= 1)
{ for (int i = incr; i < n; i++)
{ int temp = a[i];
int j = i;
while (j >= incr && temp < a[j – incr])
{ a[j] = a[j – incr];
j -= incr;
}
a[j] = temp;
}
incr /= 2;
}
}
public static void print(int[] a)
{ for (int i = 0; i < a.length; i++)
System.out.print(a[i] + ” “);
System.out.println();
}
public static void main(String[] args)
{ // make an array of ten integers
int[] a = new int[10];
int i;
// fill the array with random values
for (i = 0; i < a.length; i++)
a[i] = (int)(Math.random() * 100);
print(a);
sort(a);
print(a);
}
}
실제 쉘 정렬은 큰 배열에 대해 최고의 정렬 알고리즘은 아니다(작은 배열에 대해서는 잘 작동
한다). 우리는 프로그램을 쉽게 하기위해 이 알고리즘을 사용했다. 만일 여러분이 숫자 배열을
정렬하고자 한다면 Array 클래스의 sort 메소드중의 하나를 사용할 수 있다.