Java Language
기본 제어 구조
수색…
비고
달리 명시되지 않는 한 모든 제어 구조는 블록 명령문 을 사용 합니다 . 이것들은 중괄호 {}
로 표시됩니다.
이것은 중괄호를 필요로하지 않는 일반 명령문 과 다르지만 이전 명령문 바로 다음 행만 고려한다는 점에서주의해야합니다.
따라서, 중괄호없이 이러한 제어 구조를 작성하는 것은 처음부터 단 하나의 명령문 만 따르는 한 완벽하게 유효합니다. 그러나 버그가있는 구현이나 깨진 코드로 이어질 수 있으므로 강력하게 권장하지 않습니다 .
예:
// valid, but discouraged
Scanner scan = new Scanner(System.in);
int val = scan.nextInt();
if(val % 2 == 0)
System.out.println("Val was even!");
// invalid; will not compile
// note the misleading indentation here
for(int i = 0; i < 10; i++)
System.out.println(i);
System.out.println("i is currently: " + i);
If / Else If / Else Control
if (i < 2) {
System.out.println("i is less than 2");
} else if (i > 2) {
System.out.println("i is more than 2");
} else {
System.out.println("i is not less than 2, and not more than 2");
}
if
블록은 i
가 1 이하일 때만 실행됩니다.
else if
조건은 else if
이전의 모든 조건 (이전 else if
구문 및 parent if
구문)이 false
로 테스트 된 if
검사됩니다. 이 예제에서 else if
조건은 i
가 2보다 크거나 같은 경우에만 검사됩니다.
결과가 true
이면 해당 블록이 실행되고 건너 뛴 후에는 else if
및 else
구문이 실행됩니다.
if
및 else if
조건이 true
로 테스트되지 않은 if
끝에있는 else
블록이 실행됩니다.
For 루프
for (int i = 0; i < 100; i++) {
System.out.println(i);
}
세 가지 구성 요소 for
(에 의해 분리 루프 ;
) 변수 선언 / 초기화있다 (여기서 int i = 0
), 상태 (여기 i < 100
) 및 증분 문 (여기 i++
). 변수 선언은 {
첫 번째 실행에서 {
바로 안쪽에 배치 된 것처럼 한 번 수행됩니다. 이 경우 다음 조건은, 체크 true
이있는 경우 루프의 몸이, 실행됩니다 false
루프가 중지됩니다. 루프가 계속되면 본문이 실행되고 마지막으로 }
에 도달하면 increment 문은 조건을 다시 검사하기 직전에 실행됩니다.
루프에 단 하나의 명령.이 있으면 중} 호는 선택적입니다 (세미콜론으로 한 행이 가능함). 그러나 오해와 버그를 피하기 위해 항상 중괄호를 사용하는 것이 좋습니다.
for
루프 구성 요소는 선택 사항입니다. 비즈니스 로직에 이러한 부분 중 하나가 포함되어 있으면 for
루프에서 해당 구성 요소를 생략 할 수 있습니다.
int i = obj.getLastestValue(); // i value is fetched from a method
for (; i < 100; i++) { // here initialization is not done
System.out.println(i);
}
for (;;) { function-body }
구조체는 while (true)
루프와 같습니다.
Nested For Loops
내부에 또 다른 루프 문이있는 모든 루핑 문은 중첩 루프라고 불립니다. 더 많은 내부 루프를 갖는 루핑에 대한 동일한 방법을 'for nested for loop'라고합니다.
for(;;){
//Outer Loop Statements
for(;;){
//Inner Loop Statements
}
//Outer Loop Statements
}
중첩 된 for 루프는 삼각형 모양의 숫자를 인쇄 할 수 있습니다.
for(int i=9;i>0;i--){//Outer Loop
System.out.println();
for(int k=i;k>0;k--){//Inner Loop -1
System.out.print(" ");
}
for(int j=i;j<=9;j++){//Inner Loop -2
System.out.print(" "+j);
}
}
While 루프
int i = 0;
while (i < 100) { // condition gets checked BEFORE the loop body executes
System.out.println(i);
i++;
}
while
루프는 괄호 안의 조건이 true
됩니다. 주 루프 몸체가 매번 수행되기 전에 조건문이 충족되어야하기 때문에이를 "사전 테스트 루프"구조라고도합니다.
루프에 단 하나의 명령문 만 있으면 중괄호는 선택 사항이지만 일부 코딩 스타일 규칙은 상관없이 중괄호를 갖는 것을 선호합니다.
do ... while 루프
do...while
루프는 적어도 한 번 이상 실행된다는 점에서 다른 루프와 다릅니다. 조건문은 주 루프 본문 뒤에 수행되므로 "테스트 후 루프"구조라고도합니다.
int i = 0;
do {
i++;
System.out.println(i);
} while (i < 100); // Condition gets checked AFTER the content of the loop executes.
이 예제에서 루프는 루프가 실행 된 후에 루프 조건이 평가되기 때문에 번호 100
이 인쇄 될 때까지 실행됩니다 (조건은 i < 100
이고 i <= 100
아님).
하나 이상의 실행이 보장되면 루프 외부의 변수를 선언하고 내부에서 초기화 할 수 있습니다.
String theWord;
Scanner scan = new Scanner(System.in);
do {
theWord = scan.nextLine();
} while (!theWord.equals("Bird"));
System.out.println(theWord);
이 컨텍스트에서 theWord
는 루프 외부에서 정의되지만 자연 흐름을 기반으로하는 값을 보장하므로 theWord
가 초기화됩니다.
각각
Java 5 이상에서는 for-each 루프 (향상된 for 루프라고도 함)를 사용할 수 있습니다.
List strings = new ArrayList();
strings.add("This");
strings.add("is");
strings.add("a for-each loop");
for (String string : strings) {
System.out.println(string);
}
각 루프는 Iterable
인터페이스의 배열 및 구현을 반복하는 데 사용할 수 있으며 나중에 List
또는 Set
와 같은 Collections 클래스를 포함합니다.
루프 변수는 소스 유형에서 할당 할 수있는 모든 유형이 될 수 있습니다.
Iterable<T>
또는 T[]
에 대한 향상된 for 루프의 루프 변수는 S
유형 일 수 있습니다. if
-
T extends S
-
T
와S
는 모두 원시 타입이며 캐스트없이 할당 가능하다. -
S
는 기본 유형이며T
는 변환을 언 박싱 한 후S
할당 할 수있는 유형으로 변환 할 수 있습니다. -
T
는 기본 유형이며 autoboxing 변환을 통해S
로 변환 될 수 있습니다.
예 :
T elements = ...
for (S s : elements) {
}
티 | 에스 | 컴파일 |
---|---|---|
int [] | 긴 | 예 |
긴[] | int | 아니 |
Iterable<Byte> | 긴 | 예 |
Iterable<String> | CharSequence | 예 |
Iterable<CharSequence> | 끈 | 아니 |
int [] | 긴 | 아니 |
int [] | 정수 | 예 |
다른 경우라면
int i = 2;
if (i < 2) {
System.out.println("i is less than 2");
} else {
System.out.println("i is greater than 2");
}
if
문은 괄호 안의 조건 결과에 따라 조건부로 코드를 실행합니다. 괄호 안의 조건이 참일 때 {
와 }
와 같이 중괄호로 정의 된 if 문 블록에 들어갑니다. 닫는 대괄호가 if 문의 범위가 될 때까지 여는 대괄호.
else
블록은 선택적이며 생략 될 수 있습니다. 경우는 실행 if
문이 false
과 경우 실행되지 않는 if
문이 때문에이 경우에 해당하는 if
문이 실행됩니다.
또한보십시오 : 삼원조 If
스위치 문
switch
문은 Java의 다중 방향 분기 문입니다. 이것은 long if
- else if
- else
체인을 대체하여 더 읽기 쉽게 만들어줍니다. 그러나 if
문과 달리 부등식을 사용할 수 없습니다. 각 값은 구체적으로 정의되어야합니다.
switch
문에는 세 가지 중요한 구성 요소가 있습니다.
-
case
:switch
문에 대한 인수와 동등한 지 평가되는 값입니다. -
default
:case
문이true
평가되지 않는case
선택적인 catch-all 식true
. -
case
진술의 갑작스러운 완성; 일반적으로break
: 추가case
명세서의 바람직하지 않은 평가를 방지하기 위해 필요합니다.
continue
제외하고는 명령문의 갑작스런 완료를 초래하는 명령문을 사용할 수 있습니다. 여기에는 다음이 포함됩니다.
-
break
-
return
-
throw
아래 예에서 일반적인 switch
문은 default
포함하여 네 가지 경우로 작성됩니다.
Scanner scan = new Scanner(System.in);
int i = scan.nextInt();
switch (i) {
case 0:
System.out.println("i is zero");
break;
case 1:
System.out.println("i is one");
break;
case 2:
System.out.println("i is two");
break;
default:
System.out.println("i is less than zero or greater than two");
}
갑작스러운 완료가 될 break
나 어떤 문장을 생략함으로써 우리는 여러 가지 값에 대해 평가하는 "fall-through"사례로 알려진 것을 활용할 수 있습니다. 이 값을 사용하여 값의 범위를 만들 수는 있지만 여전히 부등식만큼 유연하지는 않습니다.
Scanner scan = new Scanner(System.in);
int foo = scan.nextInt();
switch(foo) {
case 1:
System.out.println("I'm equal or greater than one");
case 2:
case 3:
System.out.println("I'm one, two, or three");
break;
default:
System.out.println("I'm not either one, two, or three");
}
foo == 1
경우 출력은 다음과 같습니다.
I'm equal or greater than one
I'm one, two, or three
foo == 3
경우 출력은 다음과 같습니다.
I'm one, two, or three
switch 문은 enum
과 함께 사용할 수도 있습니다.
enum Option {
BLUE_PILL,
RED_PILL
}
public void takeOne(Option option) {
switch(option) {
case BLUE_PILL:
System.out.println("Story ends, wake up, believe whatever you want.");
break;
case RED_PILL:
System.out.println("I show you how deep the rabbit hole goes.");
break;
}
}
switch
문은 String
에서도 사용할 수 있습니다.
public void rhymingGame(String phrase) {
switch (phrase) {
case "apples and pears":
System.out.println("Stairs");
break;
case "lorry":
System.out.println("truck");
break;
default:
System.out.println("Don't know any more");
}
}
삼항 연산자
때로는 조건을 확인하고 변수의 값을 설정해야합니다.
예를 들어.
String name;
if (A > B) {
name = "Billy";
} else {
name = "Jimmy";
}
이것은 한 행에 다음과 같이 쉽게 작성할 수 있습니다.
String name = A > B ? "Billy" : "Jimmy";
변수의 값은 조건이 참이면 조건 바로 다음 값으로 설정됩니다. 조건이 거짓이면 두 번째 값이 변수에 주어집니다.
단절
break
문은 (같은 루프를 종료 for
, while
) 또는 평가 switch 문 .
고리:
while(true) {
if(someCondition == 5) {
break;
}
}
예제의 루프는 영원히 계속 실행됩니다. 그러나 someCondition
이 일부 실행 지점에서 5
와 같으면 루프가 종료됩니다.
여러 개의 루프가 계단식 연결되면 가장 안쪽의 루프 만이 break
끝납니다.
시도하십시오 ... 잡으십시오 ... 마지막으로
try { ... } catch ( ... ) { ... }
제어 구조는 Exceptions 처리에 사용됩니다.
String age_input = "abc";
try {
int age = Integer.parseInt(age_input);
if (age >= 18) {
System.out.println("You can vote!");
} else {
System.out.println("Sorry, you can't vote yet.");
}
} catch (NumberFormatException ex) {
System.err.println("Invalid input. '" + age_input + "' is not a valid integer.");
}
그러면 다음과 같이 인쇄됩니다.
잘못된 입력. 'abc'는 유효한 정수가 아닙니다.
catch
다음에 finally
절을 추가 할 수 있습니다. finally
절은 예외가 발생했는지 여부에 관계없이 항상 실행됩니다.
try { ... } catch ( ... ) { ... } finally { ... }
String age_input = "abc";
try {
int age = Integer.parseInt(age_input);
if (age >= 18) {
System.out.println("You can vote!");
} else {
System.out.println("Sorry, you can't vote yet.");
}
} catch (NumberFormatException ex) {
System.err.println("Invalid input. '" + age_input + "' is not a valid integer.");
} finally {
System.out.println("This code will always be run, even if an exception is thrown");
}
그러면 다음과 같이 인쇄됩니다.
잘못된 입력. 'abc'는 유효한 정수가 아닙니다.
이 코드는 예외가 발생하더라도 항상 실행됩니다.
중첩 된 중단 / 계속
label 문을 사용하여 외부 루프를 break
하거나 continue
수 있습니다.
outerloop:
for(...) {
innerloop:
for(...) {
if(condition1)
break outerloop;
if(condition2)
continue innerloop; // equivalent to: continue;
}
}
Java의 레이블에는 다른 용도가 없습니다.
자바로 계속 선언문
continue 문은 현재 반복에서 나머지 단계를 건너 뛰고 다음 루프 반복으로 시작하는 데 사용됩니다. 컨트롤은 continue
문에서 단계 값 (증가 또는 감소)으로 이동합니다 (있는 경우).
String[] programmers = {"Adrian", "Paul", "John", "Harry"};
//john is not printed out
for (String name : programmers) {
if (name.equals("John"))
continue;
System.out.println(name);
}
continue
문은 명명 된 루프의 단계 값 (있는 경우)으로 프로그램을 제어 할 수 있습니다.
Outer: // The name of the outermost loop is kept here as 'Outer'
for(int i = 0; i < 5; )
{
for(int j = 0; j < 5; j++)
{
continue Outer;
}
}