JAVA
2011. 6. 2. 22:08
자바에서는 프로그램 실행 중에 발생하는 에러를 익셉션(exception, 예외) 라고 한다.
익셉션 처리, 예외처리 같은 말이다. 다음 예제를 보자.
이렇게 세가지의 블록으로 나뉘며 하나씩 살펴보면 try 블록안에는 위 예제의 result = a / b; 처럼
예외상황이 발생할 가능성이 있는 명령문을 써넣어야 하고 catch문 에는 그 예외상황을 처리할 수 있는
명령문을 넣어야 한다. 그리고 finally 에는 위 블록의 익셉션 여부와 상관없이 마지막에 수행되는
명령문을 넣는다. 모두 넣은 예제를 보자.
그리고 하나더 문제가 있다. 배열의 갯수는 여섯개인데 포문은 열번을 돌아버리니 배열이 모자라
익셉션이 난다. 그래서 두번째 catch(java.lang.ArrayIndexOutOfBoundsException e){ 이것을
넣어준 것이다. 배열관련 익셉션 처리 구문이다. 결과값을 보자
예상한대로 다섯개를 돌고 여섯번째는 0이기 때문에 연산오류 catch문이 동작했다.
그리고 배열이 모자른 7,8,9,10 번째 배열은 모두 배열익셉션이 났다.
오늘 배운 예외처리는 실무에서 기능 구현만큼이나 신경을 써야한다. 어느부분에서 어떤이유로
오류가 나던 이 try / catch 문을 이용하여 시스템이 죽어버리는 일이 생기면 안된다.
사용자 입장에서 보면
아무리 기능이 좋고 편리한 앱 또는 프로그램이라도 툭하면 꺼지고 죽어버리는 프로그램이라면
며칠 못가 지우거나 기능이 한단계 낮아도 안정적인 프로그램을 쓸 것이다.
출판사 : 한빛미디어 , 저자 : 김윤명 님의 뇌를 자극하는 Java프로그래밍에서 공부한 내용입니다.
익셉션 처리, 예외처리 같은 말이다. 다음 예제를 보자.
class ExceptionTest {
public static void main(String args[]){
int a = 3, b = 0;
int result;
result = a / b;
System.out.println(result);
System.out.println("Done");
}
}
위으 소스를 보면 3 을 0 으로 나누는 불가능한 연산을 하라그랬다. 로그에 보면
java.lang.ArithmeticException: 이런식으로 익셉션이 발생한 것을 확인 할 수 있다.
바로 이럴 때 try문을 사용하여 예외처리를 할 수 있다.
기본형식은 이렇다.
try{
}
catch{
}
finally{
}
java.lang.ArithmeticException: 이런식으로 익셉션이 발생한 것을 확인 할 수 있다.
바로 이럴 때 try문을 사용하여 예외처리를 할 수 있다.
기본형식은 이렇다.
try{
}
catch{
}
finally{
}
이렇게 세가지의 블록으로 나뉘며 하나씩 살펴보면 try 블록안에는 위 예제의 result = a / b; 처럼
예외상황이 발생할 가능성이 있는 명령문을 써넣어야 하고 catch문 에는 그 예외상황을 처리할 수 있는
명령문을 넣어야 한다. 그리고 finally 에는 위 블록의 익셉션 여부와 상관없이 마지막에 수행되는
명령문을 넣는다. 모두 넣은 예제를 보자.
class ExceptionTest2 {
public static void main(String args[]){
int a = 3, b = 0;
int result;
try{
result = a / b;
System.out.println(result);
}
catch(java.lang.ArithmeticException e){
System.out.println("연산이 잘못 되었습니다");
}
finally{
System.out.println("Done");
}
}
}
맨 위의 3을 0으로 나누어 오류가 났던 소스를 익셉션 처리한 것이다. 소스를 보면 try문에서
연산을 한다. catch 문에선 그 연산이 오류가 있을 때 연산이 잘못되었다고 찍게 만들고
마지막으로 작업이 완료되었다는 Done 을 finally에 찍어주었다.
컴파일 해보면 역시나 연산은 안되고 catch문의 "연산이 잘못 되었습니다" 가 뜬 뒤 아래에
Done. 이 찍혔다. finally 문은 생략이 가능하고 catch 아래에 System.out.println("Done");을
찍어도 위와 같은 결과가나온다. catch 안의 java.lang.ArithmeticException e 는 익셉션 변수타입과
이름이다. 이름에 해당하는 e 는 프로그래머가 정할 수 있지만 앞에 익셉션 변수 타입은 반드시
발생하는 익셉션 종류와 맞아야 한다. 지금 쓴 익셉션의 종류는 연산결과에 오류가 있을 때 사용하는
익셉션이고 자세한건 여기에 있다.
try문이 중첩되었을 때는 어떻게 하는지 보자.
class ExceptionTest3 {
소스를 살펴보면 divisor[cnt] 란 배열이 있고 값이 5,4,3,2,1,0 이 있다.
int share = 100 / divisor[cnt]; 여기에 100을 divisor[cnt] 로 나누는데
이 배열의 cnt 는 for문 때문에 열번을 돌게 된다, 5,4,3,2 이런식으로 차례대로 순번이 올라가면서
100을 나눠댄다. 하지만 마지막 여섯번째를 돌 때 값이 0이 들어오므로 연산이 안되고
첫번째 catch(java.lang.ArithmeticException e){ 문이 동작한다. 연산을 한다. catch 문에선 그 연산이 오류가 있을 때 연산이 잘못되었다고 찍게 만들고
마지막으로 작업이 완료되었다는 Done 을 finally에 찍어주었다.
컴파일 해보면 역시나 연산은 안되고 catch문의 "연산이 잘못 되었습니다" 가 뜬 뒤 아래에
Done. 이 찍혔다. finally 문은 생략이 가능하고 catch 아래에 System.out.println("Done");을
찍어도 위와 같은 결과가나온다. catch 안의 java.lang.ArithmeticException e 는 익셉션 변수타입과
이름이다. 이름에 해당하는 e 는 프로그래머가 정할 수 있지만 앞에 익셉션 변수 타입은 반드시
발생하는 익셉션 종류와 맞아야 한다. 지금 쓴 익셉션의 종류는 연산결과에 오류가 있을 때 사용하는
익셉션이고 자세한건 여기에 있다.
try문이 중첩되었을 때는 어떻게 하는지 보자.
class ExceptionTest3 {
public static void main(String args[]){
int divisor[] = { 5, 4, 3 ,2 ,1, 0};
for (int cnt = 0; cnt < 10; cnt++){
try{
int share = 100 / divisor[cnt];
System.out.println(share);
}
catch(java.lang.ArithmeticException e){
System.out.println("연산이 잘못 되었습니다");
}
catch(java.lang.ArrayIndexOutOfBoundsException e){
System.out.println("배열이 잘못 되었습니다");
}
}
System.out.println("Done");
}
}
소스를 살펴보면 divisor[cnt] 란 배열이 있고 값이 5,4,3,2,1,0 이 있다.
int share = 100 / divisor[cnt]; 여기에 100을 divisor[cnt] 로 나누는데
이 배열의 cnt 는 for문 때문에 열번을 돌게 된다, 5,4,3,2 이런식으로 차례대로 순번이 올라가면서
100을 나눠댄다. 하지만 마지막 여섯번째를 돌 때 값이 0이 들어오므로 연산이 안되고
그리고 하나더 문제가 있다. 배열의 갯수는 여섯개인데 포문은 열번을 돌아버리니 배열이 모자라
익셉션이 난다. 그래서 두번째 catch(java.lang.ArrayIndexOutOfBoundsException e){ 이것을
넣어준 것이다. 배열관련 익셉션 처리 구문이다. 결과값을 보자
20
25
33
50
100
연산이 잘못 되었습니다
배열이 잘못 되었습니다
배열이 잘못 되었습니다
배열이 잘못 되었습니다
배열이 잘못 되었습니다
Done
예상한대로 다섯개를 돌고 여섯번째는 0이기 때문에 연산오류 catch문이 동작했다.
그리고 배열이 모자른 7,8,9,10 번째 배열은 모두 배열익셉션이 났다.
오늘 배운 예외처리는 실무에서 기능 구현만큼이나 신경을 써야한다. 어느부분에서 어떤이유로
오류가 나던 이 try / catch 문을 이용하여 시스템이 죽어버리는 일이 생기면 안된다.
사용자 입장에서 보면
아무리 기능이 좋고 편리한 앱 또는 프로그램이라도 툭하면 꺼지고 죽어버리는 프로그램이라면
며칠 못가 지우거나 기능이 한단계 낮아도 안정적인 프로그램을 쓸 것이다.
출판사 : 한빛미디어 , 저자 : 김윤명 님의 뇌를 자극하는 Java프로그래밍에서 공부한 내용입니다.
'JAVA' 카테고리의 다른 글
JAVA] 14. 자바의 연산자 -1 (0) | 2011.06.08 |
---|---|
JAVA] 13. 자바의 타입 분류 체계와 프리미티브 타입 (0) | 2011.06.07 |
JAVA] 11. 매소드 호출문 (0) | 2011.06.02 |
JAVA] 10. 반복문 (0) | 2011.05.31 |
JAVA] 9. 조건문 (0) | 2011.05.31 |
JAVA
2011. 6. 2. 00:33
지금까지의 예제들을 보면 매소드가 main 매소드 하나였다. 하지만 클래스 안에 하나 이상의
매소드를 쓸 수 도 있다. 다음 예제를 살펴보자.
class MethodTest {
매소드를 쓸 수 도 있다. 다음 예제를 살펴보자.
class MethodTest {
public static void main(String args[]){
printCharater('*', 30);
System.out.println("Hello, Java");
printCharater('-', 30);
}
static void printCharater(char ch, int num) {
for(int i = 0; i < num; i++)
System.out.print(ch);
System.out.println();
}
}
붉은 색의 main 매소드와 녹색의 printCharater 매소드가 있다. 앞에서 말한 적이있는데
클래스는 main 매소드를 꼭 가져야 하며 이 매소드는 클래스가 실행될 때 처음 실행되는
부분이다. 그러므로 main 매소드는 자동으로 실행이 되지만 printCharater 매소드는
어디에선가 호출을 해줘야만 수행을 한다. 위의 소스를 보면
printCharater('*', 30);
printCharater('-', 30);
이 두 줄이 각각 printCharater 매소드를 실행시키는 매소드 호출문이 된다.
프로그램을 위에서부터 수행하는 도중 매소드 호출문을 만나면 실행의 흐름을
해당 매소드로 이동하여 그 매소드를 다 읽고 다시 돌아와서 나머지를 수행한다.
위에서 보면 main 매소드를 들어와 printCharater('*',30);을 만나 매소드가 호출되면
녹색의 printCharater 매소드를 전부 수행하고 다시 printCharater('*',30);으로 돌아와
다음줄인 System.out.println("Hello, Java"); 를 실행한다.
때로는 매소드를 실행하는데 필요한 데이터를 매소드를 호출하는 쪽에서 매소드로
넘겨주어야 할 때가 있다. 이럴 때 넘어가는 값을 파라미터(Parameter) 라고 하며
위 예제처럼 printCharater('*',30); 소괄호 안에있는 두 가지가 파라미터가 된다.
이렇게 넘겨주면 받는 쪽에선 static void printCharater(char ch , int num);
이런식으로 받는데 잘 보면 char라는 타입과 int 타입을 받는다,
위에서 매소드에 데이터를 넘겨줄 때에는 이 데이터타입에 맞게 넣어야 하며 타입이
일치하지않으면 수행하지 않는다, 타입에 맞게 순서대로 넣는 것이 중요하다.
매소드 호출문 작성방법
매소드 이름 ( 파라미터1, 파라미터2);
파라미터 갯수는 많아도 상관없지만, 받는 쪽에서도 그만큼의 갯수와 타입이 맞아야한다.
위 소스 를 수행해보면 아래와 같은 결과가 나온다.
******************************
어떤 매소드는 주어진 일만 실행하는 것이 아니라 실행의 결과를 호출한 쪽으로 돌려준다.
그런 결과를 매소드 리턴값 (return value) 이라고 하는데 이런 리턴값을 받으려면
다음과 같이 작성해야한다.
변수 = 매소드이름 ( 파라미터1, 파라미터2);
예) sum = add(1,2);
int 형의 result 변수에 add매소드를 호출한다 파라미터를 3,4 를 넘겼다 .
add매소드를 가보면 타입에 맞게 num1,num2로 파라미터를 받는다.
그럼 순서대로 num1엔 3이 , num2엔 4가 대입된다. 이제 add 매소드에서
num1 과 num2 를 사용하여 연산을 수행한다. 예제를 보면 이 둘을 더하여 sum이라는
변수에 담는다. 그럼 sum은 7이 될 것이다. 그러고 return sum; 을 한다.
return은 매소드의 호출부로 값을 되돌려 주는 것이다. 다시말해
이 의미는 result = add(3,4); 여기서 add(3,4)가 호출부이기 때문에 return sum; 의
sum이 add(3,4) 자리에 들어간다. 즉 result = 7 과 같은 의미이다.
붉은 색의 main 매소드와 녹색의 printCharater 매소드가 있다. 앞에서 말한 적이있는데
클래스는 main 매소드를 꼭 가져야 하며 이 매소드는 클래스가 실행될 때 처음 실행되는
부분이다. 그러므로 main 매소드는 자동으로 실행이 되지만 printCharater 매소드는
어디에선가 호출을 해줘야만 수행을 한다. 위의 소스를 보면
printCharater('*', 30);
printCharater('-', 30);
이 두 줄이 각각 printCharater 매소드를 실행시키는 매소드 호출문이 된다.
프로그램을 위에서부터 수행하는 도중 매소드 호출문을 만나면 실행의 흐름을
해당 매소드로 이동하여 그 매소드를 다 읽고 다시 돌아와서 나머지를 수행한다.
위에서 보면 main 매소드를 들어와 printCharater('*',30);을 만나 매소드가 호출되면
녹색의 printCharater 매소드를 전부 수행하고 다시 printCharater('*',30);으로 돌아와
다음줄인 System.out.println("Hello, Java"); 를 실행한다.
때로는 매소드를 실행하는데 필요한 데이터를 매소드를 호출하는 쪽에서 매소드로
넘겨주어야 할 때가 있다. 이럴 때 넘어가는 값을 파라미터(Parameter) 라고 하며
위 예제처럼 printCharater('*',30); 소괄호 안에있는 두 가지가 파라미터가 된다.
이렇게 넘겨주면 받는 쪽에선 static void printCharater(char ch , int num);
이런식으로 받는데 잘 보면 char라는 타입과 int 타입을 받는다,
위에서 매소드에 데이터를 넘겨줄 때에는 이 데이터타입에 맞게 넣어야 하며 타입이
일치하지않으면 수행하지 않는다, 타입에 맞게 순서대로 넣는 것이 중요하다.
매소드 호출문 작성방법
매소드 이름 ( 파라미터1, 파라미터2);
파라미터 갯수는 많아도 상관없지만, 받는 쪽에서도 그만큼의 갯수와 타입이 맞아야한다.
위 소스 를 수행해보면 아래와 같은 결과가 나온다.
******************************
Hello Java.
------------------------------
이유는 충분히 아실만하게 위에 설명했는데 이해가 안가신다면 난감효..
리턴값을 받는 매소드 호출문
리턴값을 받는 매소드 호출문
어떤 매소드는 주어진 일만 실행하는 것이 아니라 실행의 결과를 호출한 쪽으로 돌려준다.
그런 결과를 매소드 리턴값 (return value) 이라고 하는데 이런 리턴값을 받으려면
다음과 같이 작성해야한다.
변수 = 매소드이름 ( 파라미터1, 파라미터2);
예) sum = add(1,2);
예제를 보자.
class MethodTest2 {
public static void main(String args[]){
int result;
result = add(3,4);
System.out.println(result);
}
static int add(int num1, int num2) {
int sum;
sum = num1 + num2;
return sum;
}
}
int 형의 result 변수에 add매소드를 호출한다 파라미터를 3,4 를 넘겼다 .
add매소드를 가보면 타입에 맞게 num1,num2로 파라미터를 받는다.
그럼 순서대로 num1엔 3이 , num2엔 4가 대입된다. 이제 add 매소드에서
num1 과 num2 를 사용하여 연산을 수행한다. 예제를 보면 이 둘을 더하여 sum이라는
변수에 담는다. 그럼 sum은 7이 될 것이다. 그러고 return sum; 을 한다.
return은 매소드의 호출부로 값을 되돌려 주는 것이다. 다시말해
이 의미는 result = add(3,4); 여기서 add(3,4)가 호출부이기 때문에 return sum; 의
sum이 add(3,4) 자리에 들어간다. 즉 result = 7 과 같은 의미이다.
System.out.println(result); 이렇게 찍어보면 역시나 7이 딱 찍힌다.
여기서 주의 할점은 result = add(3,4); 이처럼 호출부를 담는 result 라는 변수는
int 형인데 이 타입을 호출받는 매소드도 이 타입이여야한다.
static int add(int num1, int num2) { 여기서의 int 가 그 이유이다.
만약 호출부에서
String arr;
arr = str("A, "B");
이런식으로 문자형으로 보내면 받는 쪽의 매소드도
static String str(String ar1, String ar2) 이여야 한다. 기억해야놔야 할 것 같다
호출부를 담는 변수의 타입에 맞게 매소드 타입도 맞춰줘야 된 다는 것을.
참고로 리턴 값이 없어도 되는 매소드는 return; 이런식으로 따로 넘겨줄 값을 적지않고
세미콜론(;) 으로 마무리짓는다, 이렇게 하면 맨처음 예제에서도 보았듯 호출부로
되돌아가기만 한다. 그리고 방금 말했던 타입을 넣는 부분엔 void 라는 것을 쓴다.
맨처음 예제의 static void printCharater(char ch, int num) 에서의 void가 그 이유이다.
printCharater 라는 매소드에는 리턴해주는 값이 없기때문이다.
void가 붙으면 이 매소드는 리턴값이 없고 그냥 작업을 다하면 호출부로 되돌아가는구나
라고 알고있으면 될 것 같다.
이것 만 알고 있어도 소스 흐름을 읽는데 많은 도움이 되고 이해할 수 있었다.
이해 안가는 부분이 없을 때까지 봐둬야 겠다. 설명이 구려서 이해를 못 할지도 모르겠다.. ☞☜
출판사 : 한빛미디어 , 저자 : 김윤명 님의 뇌를 자극하는 Java프로그래밍에서 공부한 내용입니다.
여기서 주의 할점은 result = add(3,4); 이처럼 호출부를 담는 result 라는 변수는
int 형인데 이 타입을 호출받는 매소드도 이 타입이여야한다.
static int add(int num1, int num2) { 여기서의 int 가 그 이유이다.
만약 호출부에서
String arr;
arr = str("A, "B");
이런식으로 문자형으로 보내면 받는 쪽의 매소드도
static String str(String ar1, String ar2) 이여야 한다. 기억해야놔야 할 것 같다
호출부를 담는 변수의 타입에 맞게 매소드 타입도 맞춰줘야 된 다는 것을.
참고로 리턴 값이 없어도 되는 매소드는 return; 이런식으로 따로 넘겨줄 값을 적지않고
세미콜론(;) 으로 마무리짓는다, 이렇게 하면 맨처음 예제에서도 보았듯 호출부로
되돌아가기만 한다. 그리고 방금 말했던 타입을 넣는 부분엔 void 라는 것을 쓴다.
맨처음 예제의 static void printCharater(char ch, int num) 에서의 void가 그 이유이다.
printCharater 라는 매소드에는 리턴해주는 값이 없기때문이다.
void가 붙으면 이 매소드는 리턴값이 없고 그냥 작업을 다하면 호출부로 되돌아가는구나
라고 알고있으면 될 것 같다.
이것 만 알고 있어도 소스 흐름을 읽는데 많은 도움이 되고 이해할 수 있었다.
이해 안가는 부분이 없을 때까지 봐둬야 겠다. 설명이 구려서 이해를 못 할지도 모르겠다.. ☞☜
출판사 : 한빛미디어 , 저자 : 김윤명 님의 뇌를 자극하는 Java프로그래밍에서 공부한 내용입니다.
'JAVA' 카테고리의 다른 글
JAVA] 13. 자바의 타입 분류 체계와 프리미티브 타입 (0) | 2011.06.07 |
---|---|
JAVA] 12. 익셉션 처리에 사용되는 try 문 (0) | 2011.06.02 |
JAVA] 10. 반복문 (0) | 2011.05.31 |
JAVA] 9. 조건문 (0) | 2011.05.31 |
JAVA] 8. 배열의 선언, 생성, 이용 (0) | 2011.05.28 |
JAVA
2011. 5. 31. 23:47
똑같은 명령을 반복 수행 하는 프로그램을 짜기위해 조건문을 무식하게 여러번쓰는건 비효율적이다.
그럴 때를 위해 반복문이란 것을 쓰는데, 자바에서의 반복문은 세가지로, while, do, for문이다.
while 반복문
while문의 기본형식은 다음과 같다.
while ( 조건식 ) ------ 조건식이 true 인지 false인지 판별한다
그럴 때를 위해 반복문이란 것을 쓰는데, 자바에서의 반복문은 세가지로, while, do, for문이다.
while 반복문
while문의 기본형식은 다음과 같다.
while ( 조건식 ) ------ 조건식이 true 인지 false인지 판별한다
실행 부분 ------ 조건식이 true 일 때 수행한다.
while문은 조건식을 판별하여 true이면 실행부분을 수행하고 조건식을 다시 판별하고,
이런식으로 조건식 > true > 실행부분 무한 반복이다. 한번 돌 때마다 조건식은 다시
계산되지만 계속 참이라면 무한루프에 빠진다.
안으로 들어가 System.out.println(i); 를 수행하여 0을 찍고 i++; 로 0에서 1이된다.
그러고 다시 while 조건식으로 가서 참인지 거짓인지 판별하고, 그렇게 0,1,2,3,4가 찍히고
5일 때 false가 뜨며 빠져나와 "Done."이 찍힌다.
do-while 반복문
do-while의 기본형식은 이렇다
do
실행부분 ----- 조건식이 참 일 동안 반복 실행되는 부분
while(조건식); ----- 참 또는 거짓 값을 산출할 수 있는 식.
do-while 은 while과 달리 do부분 , 즉 실행부분을 무조건 한번 실행하고 다음부터
조건식으로 참, 거짓을 판별한다.
for 반복문
for 문으로 만든 반복문은 주어진 횟수만큼 처리를 반복하거나 배열 항목을 순서대로 처리할 때
적합하다. 기본형식은 아래와 같다.
for ( 초기화식 ; 조건식 ; 업데이트식)
실행 부분
어려운 거 같아도, 초기화식은 사용할 값의 초기값, 조건식은 위 while문의 조건식마냥 조건이 들어가고
업데이트 식은 i++ 도는 i-- 등과 같이 변수의 값을 바꾸는 식이 들어간다.
for( int i = 0; i < 10; i++)
System.out.println(i); 이렇게 말이다.
for문의 카운트가 오로지 배열의 인덱스로만 사용된다면 향상된 for문을 사용할 수 있다.
* 향상된 for문은 JDK 5.0 부터 지원한다.
for ( 변수타입 변수이름 : 배열이름)
실행부분
for ( int i : arr)
System.out.println(i);
이런 형식으로 사용한다면 배열의 항목 수 만큼 실행부분을 반복하는데 매번 반복할 때마다
배열 항목의 값을 변수에 자동으로 대입한다. 예제는 아래와 같다.
위의 세가지 반복문을 빠져나가고 싶으면 빠져나가고 싶은 부분에 break;를 걸어주면
위에서 수행하고 break;를 만나며 그 반복문을 빠져나오게 된다.
반복문을 계속하는 continue 문
기본형식은 이렇다 .
continue;
이 문을 만나면 바로 반복문의 다음번 과정으로 넘어간다, continue 아래에 있는 구문은
수행되지않고 바로 위로 올라가 다음번 반복문을 수행한다.
길긴 하지만, 프로그램 짜보면서 가장 많이 써본 for문에 대해 다시 개념을 잡게됐다.
특히 향상된 for문은 잘쓰면 아주 간결하고 깔끔할 것 같다. 사용만 할 수 있는게
흠이긴 하다..
출판사 : 한빛미디어 , 저자 : 김윤명 님의 뇌를 자극하는 Java프로그래밍에서 공부한 내용입니다.
while문은 조건식을 판별하여 true이면 실행부분을 수행하고 조건식을 다시 판별하고,
이런식으로 조건식 > true > 실행부분 무한 반복이다. 한번 돌 때마다 조건식은 다시
계산되지만 계속 참이라면 무한루프에 빠진다.
class whileTest {
public static void main(String args[]){
int i = 0;
while ( i < 5){
System.out.println(i);
i++;
}
System.out.println("Done.");
}
}
위와 같이 프로그램을 짜면 처음에 i에 0이 들어가고 5미만이므로 while문을 만족하고 안으로 들어가 System.out.println(i); 를 수행하여 0을 찍고 i++; 로 0에서 1이된다.
그러고 다시 while 조건식으로 가서 참인지 거짓인지 판별하고, 그렇게 0,1,2,3,4가 찍히고
5일 때 false가 뜨며 빠져나와 "Done."이 찍힌다.
do-while 반복문
do-while의 기본형식은 이렇다
do
실행부분 ----- 조건식이 참 일 동안 반복 실행되는 부분
while(조건식); ----- 참 또는 거짓 값을 산출할 수 있는 식.
do-while 은 while과 달리 do부분 , 즉 실행부분을 무조건 한번 실행하고 다음부터
조건식으로 참, 거짓을 판별한다.
class dowhileTest {
public static void main(String args[]){
int i = 0;
do{
System.out.println(i);
i++;
} while ( i < 5);
System.out.println("Done.");
}
}
위와 같이 짜면 일단 무조건 0을 찍고 i++로 i를 1로 만든다음 조건식으로 간다.
뭐 대단한거 같아도 결과는 while과 같은 0,1,2,3,4 찍고 만다.
System.out.println("Done."); 얘가 while 아랫줄에 있다고 while조건식 읽고
찍히는게아니다. while조건식 판별하고 참이면 do로 올라간다.
뭐 대단한거 같아도 결과는 while과 같은 0,1,2,3,4 찍고 만다.
System.out.println("Done."); 얘가 while 아랫줄에 있다고 while조건식 읽고
찍히는게아니다. while조건식 판별하고 참이면 do로 올라간다.
for 반복문
for 문으로 만든 반복문은 주어진 횟수만큼 처리를 반복하거나 배열 항목을 순서대로 처리할 때
적합하다. 기본형식은 아래와 같다.
for ( 초기화식 ; 조건식 ; 업데이트식)
실행 부분
어려운 거 같아도, 초기화식은 사용할 값의 초기값, 조건식은 위 while문의 조건식마냥 조건이 들어가고
업데이트 식은 i++ 도는 i-- 등과 같이 변수의 값을 바꾸는 식이 들어간다.
for( int i = 0; i < 10; i++)
System.out.println(i); 이렇게 말이다.
class forTest {
public static void main(String args[]){
for(int i = 0; i < 5; i++){
System.out.println(i);
}
System.out.println("Done.");
}
}
위와 같다. 결과는 똑같다 0,1,2,3,4 찍히고 Done이다.
향상된 for 문
향상된 for 문
for문의 카운트가 오로지 배열의 인덱스로만 사용된다면 향상된 for문을 사용할 수 있다.
* 향상된 for문은 JDK 5.0 부터 지원한다.
for ( 변수타입 변수이름 : 배열이름)
실행부분
for ( int i : arr)
System.out.println(i);
이런 형식으로 사용한다면 배열의 항목 수 만큼 실행부분을 반복하는데 매번 반복할 때마다
배열 항목의 값을 변수에 자동으로 대입한다. 예제는 아래와 같다.
class forTest {
public static void main(String args[]){
int arr[] = {10,20,30,40,50};
for(int i : arr){
System.out.println(i);
}
System.out.println("Done.");
}
}
이런식으로 사용하면 저절로 arr[] 에 i 가 들어가서 arr[i] 가 찍힌다.
System.out.println(i); 여기에 i 가 찍힌다고 0,1,2,3,4 이렇게 수행 횟수가 찍히는게 아니다.
향상된 for 문에도 단점은 있는데 여기서 나온 값인 i 는 사용할 수만 있고 바꿀수는 없다.
break 문
System.out.println(i); 여기에 i 가 찍힌다고 0,1,2,3,4 이렇게 수행 횟수가 찍히는게 아니다.
향상된 for 문에도 단점은 있는데 여기서 나온 값인 i 는 사용할 수만 있고 바꿀수는 없다.
break 문
위의 세가지 반복문을 빠져나가고 싶으면 빠져나가고 싶은 부분에 break;를 걸어주면
위에서 수행하고 break;를 만나며 그 반복문을 빠져나오게 된다.
class breakTest {
public static void main(String args[]){
for(int row = 0 ; row <3; row++){
for(int col = 0 ; col < 3; col++){
System.out.println("("+ row+","+col+")");
if((row == 1 )&&(col == 1))
break;
}
}
System.out.println("Done.");
}
}
이렇게 하면
1,1 일 때 break; 가 걸려 빠져나와 버린다. 그럼 row의 1은 더이상 수행하지 않고 빠져나오고
2로넘어가 나머지를 수행한다. 여기서 중첩된 반복문을 전부 빠져나가는 방법은 이렇다.
앞에 반복문에 라벨을 붙여놓고 break 문에 해당 라벨을 같이 써주면 중간에 반복문이
몇개가 겹쳐있던 라벨이 있는 밖으로 빠져나간다.
이렇게 말이다.
(0,0)
(0,1)
(0,2)
(1,0)
(1,1)
(2,0)
(2,1)
(2,2)
Done.
.
1,1 일 때 break; 가 걸려 빠져나와 버린다. 그럼 row의 1은 더이상 수행하지 않고 빠져나오고
2로넘어가 나머지를 수행한다. 여기서 중첩된 반복문을 전부 빠져나가는 방법은 이렇다.
앞에 반복문에 라벨을 붙여놓고 break 문에 해당 라벨을 같이 써주면 중간에 반복문이
몇개가 겹쳐있던 라벨이 있는 밖으로 빠져나간다.
loop:
for(int row = 0 ; row < 3; row++){
for(int col = 0 ; col < 3; col++){
System.out.println("("+ row+","+col+")");
if((row == 1 )&&(col == 1))
break loop;
}
}
반복문을 계속하는 continue 문
기본형식은 이렇다 .
continue;
이 문을 만나면 바로 반복문의 다음번 과정으로 넘어간다, continue 아래에 있는 구문은
수행되지않고 바로 위로 올라가 다음번 반복문을 수행한다.
class continueTest {
public static void main(String args[]){
for(int col = 0 ; col < 10; col++){
if(col == 5)
continue;
System.out.println(col);
}
System.out.println("Done.");
}
}
이렇게 하면 5가 들어올 시 continue를 만나 바로 6으로 넘어가기 때문에
아래 System.out.println(col);가 안찍히게되고 0,1,2,3,4,6,7,8,9, 와같이
5가 안 찍힌다.
break 문은 라벨을 이용하여 밖의 반복문으로 빠져나왔지만 continue는
라벨을 이용하여 바깥쪽 반복문을 다음번 과정으로 수행할 수 있다.
아래 System.out.println(col);가 안찍히게되고 0,1,2,3,4,6,7,8,9, 와같이
5가 안 찍힌다.
break 문은 라벨을 이용하여 밖의 반복문으로 빠져나왔지만 continue는
라벨을 이용하여 바깥쪽 반복문을 다음번 과정으로 수행할 수 있다.
길긴 하지만, 프로그램 짜보면서 가장 많이 써본 for문에 대해 다시 개념을 잡게됐다.
특히 향상된 for문은 잘쓰면 아주 간결하고 깔끔할 것 같다. 사용만 할 수 있는게
흠이긴 하다..
출판사 : 한빛미디어 , 저자 : 김윤명 님의 뇌를 자극하는 Java프로그래밍에서 공부한 내용입니다.
'JAVA' 카테고리의 다른 글
JAVA] 12. 익셉션 처리에 사용되는 try 문 (0) | 2011.06.02 |
---|---|
JAVA] 11. 매소드 호출문 (0) | 2011.06.02 |
JAVA] 9. 조건문 (0) | 2011.05.31 |
JAVA] 8. 배열의 선언, 생성, 이용 (0) | 2011.05.28 |
JAVA] 7. 여러가지 대입문 (1) | 2011.05.26 |