티스토리 뷰
『제어문』
:: 위부터 아래로 흐르는 코드의 흐름을 바꿔주는 것
// 종류 ≫ 조건문 / 반복문 / 분기문
「01.조건문」
:: 프로그램 수행 흐름을 바꾸는 역할을 하는 제어문 중 하나로 조건에 따라
다른 문장이 수행되도록 함 (조건에 부합하면 해당 코드를 실행)
[if문]
// 메소드 아님
// 결과 값은 항상 boolean
[if]
// 조건 1개
· if문 안의 조건식 결과가 true여야 내용이 실행
false가 나오면 실행되지 않고 건너뜀
≫ 조건식 결과 값은 boolean 값이 나옴을 추론 가능
[if~else]
// 조건 2개
else에는 조건식이 들어가지 않음 ≫ 결과 값이 false일 때 실행되어야 하니까
≫ 2로 수를 나눴을 때 나머지가 0이면 짝수, 나머지가 1이면 홀수이다.
≫ 조건식 결과가 true면 "짝수" 출력, false면 else문에 있는 "홀수" 출력
[if~else if~else]
// 조건 원하는 만큼 생성 가능
// 마지막 else는 없어도 됨
* if는 true, false와 상관 없이 조건절 실행,
if~else if~else는 조건문이 true면 이후 조건은 실행하지 않음
≫ 아래에 아무리 true 조건식이 있더라도 위에 true가 걸리면
아래의 조건식들은 수행하지 않고 if문 전체를 빠져나간다.
[중첩 if]
[중첩 if문 예시]
▼ 직접 코드 입력해보기
★ Tap(들여쓰기) 유의해서 적기
1)
2)
3)
4)
4+) method3()에서 반복되는 System.out.println("~~입니다") 모으는 법
그런데, 맨 아래 result이 변수로 입력이 안 됐다고 함!
4++) point ★
메소드 안에 위치한 변수(지역 변수)는 해당 메소드 영역에서
한 번만 사용할 수 있다. (같은 공간에 같은 이름 사용은 불가능)
▼ 예시
4+++) 메소드 영역을 참고해서 다시 4+)의 if문을 살펴보면?
'result'가 위치한 곳을 토대로 색을 나눠보았다.
초록, 분홍, 파랑 각 영역은 어느 부분도 겹치지 않는다.
아예 서로의 영역이 달라서 같은 이름 'result'라 해도
가장 가깝게 속해있는 각자의 영역이 끝나면 다른 곳에 영향을 줄 수 없다.
(초록 끝나면 분홍에 영향 X / 분홍 끝나면 파랑에 영향 X)
≫ 아무리 많은 result가 위에 분포해도 영향을 줄 수 없음.
≫ 그래서 result가 변수로 초기화 되지 않았다 뜨는 것임
4++++)
▲ 처음 선언한 result의 범위는 오른쪽 드래그한 범위에 속하는 것이기 때문에 ▼
if문 안에 속해있는 result와 맨 아래 result까지 영향을 줄 수 있다.
5) if문 사용과 동시에 문자열 비교하기
+) 참조 자료형(클래스) 도 기본 값과 주소 값이 있음 ≫ null(널값), 텅 비어있는 값을 의미
≫ null 값인 상태에서 무언가를 불러오거나 호출하면 에러가 생긴다.
String result = ""; ≫ 이건 값이 저장되어 있는 상태.
∴ 기본 값을 넣고 싶다면 null로 초기화를 해야 한다.
[switch문]
≫ switch문 조건식의 결과 값은 정수, 문자, 문자열 (boolean X)
결과 값과 일치하는 case문으로 이동 후 안의 문장 수행 후 문장을 빠져나감
* break가 없으면 밑을 쭉 실행해버리니 주의하기
('default'는 if문으로 치면 else의 역할.)
// 메뉴 만들 때 많이 사용한다.
일치하는 case문으로 이동해서
빠져나가게 하려면 'break;'를
꼭 써주어야 한다.
아니라면 내려가면서 만나는
모든 case문을 다 걸리며 내려감
break; 덕에 일치하는 case문을
만나면 거기에 걸리고 빠질 수 있음
▼ 직접 코드 입력해보기
1)
2)
≫ case는 위처럼 묶어줄 수 있다.
3)
4) switch문은 메뉴 만들 때 많이 이용한다.
4+) 그런데 선택할 메뉴 안에서 실행을 하고 싶다면?
→ 위에서 만든 메소드 1, 2, 3을 각각 case에 호출해보자.
「02.반복문」
[for문]
// 특정 코드를 반복해서 수행
// 조건이 false가 되었을 때, 문장 전체를 빠져나감
· 무한 반복문 : 조건식이 계속 true여서 무한히 반복되는 문장
[공부하는 법]
[중첩 반복문]
// for if switch 등 서로 중첩이 가능하다
≫ 1. 바깥 큰 for문에서 시작해 초기값 1 → 조건식 1이 true면
문장 1이 수행되고 흐름상 안쪽 작은 for문을 만나게 된다.
2. 바깥 for문과 마찬가지로 안의 조건식이 false가 될 때까지
계속 반복하다가 false가 되면 흐름상 문장 3을 수행한다. (큰 for문)
3. 그리고 증감식 1로 돌아가 조건식 1이 true면
위의 과정을 반복하고, false가 나오면 전체 for문을 빠져나간다.
[공부하는 법]
:: 예시를 들어 원리를 생각해보자
ex) 구구단의 원리를 적용 : 큰 for문은 구구단의 단(2단, 3단)
작은 for문은 단 안에 있는 x1, x2, x3 …
ex2) 시계의 시침이 1시간에 1번 돌면, 시침에 속한 분침은 60번 돈다.
▼ 직접 코드 입력해보기
1)
2)
3)
3-1)
4)
5)
5-1)
6)
+ 풀이 (for문 변수 sum으로 반복되는 방식 꼭 이해하기)
6-1)
7)
8)
9) 별찍기 두 번 반복하기
https://coding-factory.tistory.com/68
10) 숙제
public void method10() {
// 한 줄에 별표 문자를 입력된 줄 수와 칸 수만큼 출력
// 단, 줄 수와 칸 수가 일치하는 위치에는 줄 번호에 대한 정수 출력
/*
줄 수 : 6 줄 수 : 5
칸 수 : 6 칸 수 : 4
1***** 1***
*2**** *2**
**3*** **3*
***4** ***4
****5*
*****6
*/
[while문]
// 조건식 하나 밖에 안 들어감. (조건식이 false가 될 때까지 반복 수행)
// for문과의 차이 : while문은 조건식 위(밖)에 초기식, 안에 증감식을 넣어줌.
≫ 예시의 int = 1; 가 초기식
≫ 증감식을 까먹으면 무한 반복 루트
≫ * { } 안에 조건을 벗어나게 할 연산(증감식, 분기문) 필요
[do ~ while]
:: 일단 한 번 냅다 실행하고 조건식 수행 (무조건 한 번 실행 보장)
▼ 직접 코드 입력해보기
1)
2)
3)
4)
5)
반복문의 크기를 지정해놓았을 때, 반복될 수가 적거나 크면 에러가 날 수 있음.
예를 들어 위 apple이라면 무조건 int i = 0; i < 5; 여야 함. (5글자니까)
Q. 만약 사용자가 입력한 문자열의 문자 수 만큼 인덱스를 입력하고 싶다면?
:: 해결 방법 : for문이 도는 횟수를 문자열이 갖고 있는 길이 만큼 늘리면 됨. (3글자면 3번 돌도록)
문자열의 길이를 반환하는 메소드 : length()
문자열이 같은지 확인하는 메소드 : equals()
int length = str.length();
for(int i = 0; i < str.length(); i++) {
6) 위의 1, 2, 3을 토대로 메뉴 만들기
1. 먼저 스위치로 메뉴판 만들어보기
2. 한 번 실행하고 끝나니까 종료하고 싶을 때까지 반복하고 싶음
(몇 번 반복할 지 횟수는 모름 → while문)
그렇담. 사용자의 편의성을 위해 처음부터 반복을 제공하자!
▼
3. 9. 종료가 아닐 때만 반복하도록 한다. (9면 나가야 함.)
근데 종료해서 아예 메소드를 빠져나가고 싶다?
리턴을 써 보자.
일단 method7()을 method6()과 같이 만들어서
case 9 뒤에 break; 대신 return;을 붙여준다. ▼
4. 메인 메소드가 돌면 stack에 메모리가 쌓인다. (메모리 영역에 올라감)
메소드가 일을 다 하면 Stack에서 빠져나감.
메소드 1이 일을 다 하고 나가면 다시 메소드 7로 돌아온다. 하지만 메소드 1 뒤로 돌아옴.
리턴 : 나를 호출해준 메소드에게 돌아겠다는 의미.
(리턴을 만나면 무조건 돌아간다.)
순서 : 메인 메소드 실행 - 스택 메모리에 올라감 - 메인 메소드에서 메소드 7 호출 - 스택 메모리에 올라가 수행됨 - 9번 누름 - return 만남 - 나를 호출한 메소드로 돌아감 (메인 메소드) - while(true)라 무한 반복이지만, 그에 상관 없이 return을 만나면 날 호출했던 메인 메소드로 돌아감 - 메인 메소드도 나감 - 종료
결론 ▼ 9. 종료를 선택했을 때 더 이상 반복되지 않고 method7을 빠져나간다.
7)
메인 메소드로 호출해 실행을 시켰더니
▼
String str = null; 이라고 해서 클래스가 텅 비어있는데 꺼내려고 하니 에러가 생김.
Cannot invoke "String.equals(Object)" because "str" is null
≫ 스트링 클래스 안에 있는 equals()라는 메소드를 부를 수가 없다.
왜냐하면 str이라고 하는 게 null이기 때문이다.
널포인터 에러가 나면 '.' 앞을 살펴보면 된다. 대부분 그 곳이 비어있음.
해결 방법 : 이런 상황에서는 null만 아니면 해결할 수 있다.
▼
8)
위의 method8과 method8_1의 차이는 while / do~while인데 조건문을 만났냐 안 만났냐에 대한 차이
do~while은 do에 있는 부분이 먼저 실행되기 때문에 str에 사용자가 입력한 값이 사라지고,
null이 사라지고 더 이상 에러가 뜨지 않는다. (조건을 나중에 만나서 그럼.)
str에 넣어두었던 null(텅 빈 값)은 사용자가 nextLine()을 통해 문자열을 입력하고
그로 인해 받아온 문자열이 str에 저장되기 때문에 있던 null이 사라진다.
9)
「03.분기문」
switch의 break는 switch에서 나가는 것이지만,
반복문 안의 break는 본인과 가장 가까운 반복문을 빠져나가는 역할
[TIP]
1. if문은 전부를 switch문으로 바꿀 수 없다.
하지만 switch문은 모두 if문으로 바꿀 수 있다.
(if문은 결과 값이 boolean, switch문은 정수/문자/문자열)
2. for문은 while문과 서로 전부 바꿀 수 있다.
3. 많이 쓰이는 영역
for문 : 내가 반복할 횟수가 정해져 있을 때. (5번 돈다. 문자열 길이 만큼 돈다 등등..)
while문 : 내가 반복할 횟수가 정해져 있지 않을 때. (얼마나 돌릴지는 모르고 나가는 시점만 정해졌을 때)
4. for문
for (초기식; 조건식; 증감식) ◁ 생략 가능
5. for문이든 while문이든 한 번에 작성하려 하지 말고
일단 적어본 다음 어딜 묶어줄지 천천히 생각을 해 본다.
'KH' 카테고리의 다른 글
[JAVA] 2023년 2월 14일 火 (객체) (0) | 2023.02.14 |
---|---|
[JAVA] 2023년 2월 13일 (배열) (0) | 2023.02.12 |
[JAVA] 2023년 2월 8일 (연산자) (0) | 2023.02.08 |
2023년 2월 8일 (에러 zip 만들어보자) (0) | 2023.02.08 |
[JAVA] 2023년 2월 7일 (변수_2) (0) | 2023.02.06 |