0404 | 자바프로그래밍_제어구조, 선택문(if), 반복문(if,while), 분기문(switch)
1. 제어구조 : 컴퓨터 프로그램의 기본 흐름. : 흐름을 다루는 사람 == 프로그래머 2. 선택문 - if, else, else if : break;를 통해 빠져나옴 3. 반복문 3-1) if : 다시 입력할 필요가 없이 조건만 확인할 때 3-2
ala-nueva.tistory.com
▲ 기존에 기본적으로 정리해둔 제어구조
[1] 흐름에서 빠져나오는 법
✅ 반복흐름을 끝내는 break;
✅ 흐름을 건너뛰면서 계속 이어주는 continue;
❓ break로 빠져나올때와 return으로 빠져나올때는 무슨 차이가 있는지...? |
✅ break
👉 가장 가까이에 있는 반복문을 빠져나온다. 중첩 if문일경우 가장 가까운 if하나만 빠져나올 수 있다.
✅ return
👉 해당 함수를 빠져나온다. 즉, 반복문을 포함하는 메서드 자체를 종료시킴.
👉 메소드 안에서 return문 뒤에 코드가 있어도 실행하지 않고 메서드 종료
👉 리턴 자료형이 없는 void method() 일때만 return; 으로 종료 가능.
[2] if문과 while문의 차이
: 모든 제어에는 조건이 붙으므로 조건문/반복문은 큰 차이가 없다. 조건문이 더 특화되어있을 뿐.
✅ if : 조건에 따른 실행. 참을 만났으면 실행하고 이어가거나 끝남. 단발성 조건에 적합. 즉 if를 while처럼 쓰려면 if{조건문} 구조를 여러번 복사붙여넣기 하거나, 반복횟수를 설정해줘야 한다. ✅ while (true조건) : 조건에 따른 반복. 참을 만나고 실행 후 조건으로 돌아감. 거짓을 만날때까지 계속 반복. : 특정 조건을 만드려면 외부 변수를 만들어서 가져와야 하므로 그리 적합하지 않다. ▶ for문을 사용 : 필요한 조건 3가지 (시작점, 종료지점, 증감식)가 흩어져서 파악이 어렵다. ▶ for문을 사용 int i=0; while(i<18){ // 외부 변수 끌어오게 됨 i++; System.out.println("출력");} |
실습1 ) while문을 이용해 이미지 파일 복사하기
: 이미지의 바이트값을 그대로 복사해와서 동일한 이미지파일 만들기
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Program {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("res/pic1.bmp"); // 727,358 bytes
FileOutputStream fos = new FileOutputStream("res/pic1-copy.bmp");
// 방법 1 -------
int n = fis.read(); // 최초 값은 받아오고 다음 반복은 조건문 안에서 받아오는게 포인트.
while (n != -1) {
fos.write(n);
n = fis.read();
}
//------------------
// 방법 2----------
int n = -1;
while ((n = fis.read()) != -1)
fos.write(n);
//------------------
fis.close();
fos.close();
System.out.println("작업완료");
}
}
// 잘못된 코드
// 초기화에서 read()를 읽어올경우 while문 안에서 두번째 read()를 가지고 시작하므로 이미지생성이 되지 않는다.
int n = fis.read();
while ((n = fis.read()) != -1) {
fos.write(n);
n = fis.read();
}
실습2 ) 조건문을 이용해 텍스트 마지막열 안나오도록 하기
<문제점>
: 조건문 없이 scan 값을 println()으로만 출력할 경우 가장 마지막줄이 개행된 상태로 저장된다.
👉 용량이 2바이트 차이나서 동일하게 복제 되었다고 볼 수 없다
👉 조건문을 통해 마지막줄 형태를 지정해준다
while (fscan.hasNext()) {
String line = fscan.nextLine();
fout.print(line);
if(fscan.hasNext()) { // true값이 반환되면 println()을 출력한다.
fout.println();
}
}
연습1) 오답 정리
❣ 생각의 오류
: 원래 생각했던건 fscan.nextLine()의 String을 읽어와서 null이면 조건문에서 break; 하도록 작성했었는데, 계속 읽을 element가 없다는 오류가 떴었다. 아예 다음 요소 자체가 없으니 읽어올 값이 없고, 그러니 null 체크도 불가한거였다.
❣ 정리
: hasNext()는 T/F를 반환하므로 boolean값을 가지고 조건문에 넣어서 다음 라인의 유무를 판단 후, 읽어오도록 한다.
while(fscan.hasNext()) {
String name_ = fscan.nextLine();
String name = (2 <= name_.length()) && (name_.length() <= 3) ? name_ : "오류";
if (false == fscan.hasNext()) { // 더 좁은 조건을 if문에 넣어주기
fout.print(name);
break;
}else{
fout.printf("%s%n", name);
}
} // while ends
[3] for문
for (변수선언; 조건문; 증감문){
//반복되는 수가 한 눈에 파악 될 수 있도록 하기 - 그래서 0으로 시작하고 1씩 증가시키는 것.
}
//while문으로 반복 횟수가 정해진 반복문 표현하기
int i = 0; // --- 변수 시작점
while (i < 18) { // --- 반복 조건
fis.read();
i++; // --- 증감식
}
//for문으로 변경
for(int i=0; i<18; i++) { // 한줄에 표현 가능
fis.read();
}
'😵 ~23.11.10' 카테고리의 다른 글
0614 | 연습 문제 > for문 인덱스 사용 방법 이해하기 (0) | 2023.06.14 |
---|---|
0613 | git - 개인 private repository에 자료 올리고 내려보기 (0) | 2023.06.13 |
0612 | 실습 > 비트 연산자를 이용해서 데이터 뽑아내기 (1) | 2023.06.12 |
0612 | 연산자 (0) | 2023.06.12 |
0612 | 연습문제 > 실수 & 개선방안 정리 > 파일 입출력+문자열 다루기 (0) | 2023.06.12 |