오늘 배운 내용
01. 반복문 별찍기
02. 반복문과 break
03. 반복문과 continue
04. return
05. 리턴(반환) 자료형.
06. 메소드의 재귀 호출
+)
매개변수 vs 인수
01. 반복문 별찍기 (61~64)
과제로 받은 문제 4개. 풀이를 따로 안 해주셔서 내 코드만 남아있다..
출력은 성공했지만 더 효율적이거나 쉬운 방식이 있는 지 궁금하다.
실습 061
*
**
***
****
*****
for (int i = 1; i <= 5; i++ ) // 출력할 행 (5줄)
{
for (int j = 1; j <= 5-i; j++) // 루프마다 1씩 덜 출력
{
System.out.print(" "); //공백 (4~0 회 출력)
}
for (int k = 1; k <= i ; k++) // 루프마다 1씩 더 출력
{
System.out.print("*"); // 별 (1~5회 출력)
}
System.out.println(); // 한 행의 출력이 끝나면 개행.
}
실습 062
*
***
*****
*******
*********
for (int i = 1; i <= 5; i++ ) // 출력할 행
{
for (int j = 1; j <= 5-i; j++) // 루프마다 1씩 덜 출력
{
System.out.print(" "); //공백(4~0 회)
}
for (int k = 1; k <= i ; k++) // 루프마다 1씩 더 출력
{
if (k ==1) // 별 (1, 3, 5, 7, 9) (처음을 제외한 나머지 루프 2씩 증가)
System.out.print("*");
else
System.out.print("**");
}
for (int l = 1; l <= 5-i; l++) // 루프마다 1씩 덜 출력
{
System.out.print(" "); //공백(4~0 회 출력)
}
System.out.println(); // 한 행의 출력이 끝나면 개행.
}
실습 063
*********
*******
*****
***
*
for (int i = 1; i <= 5; i++ ) // 출력할 행(5줄)
{
for (int j = 1; j <= i; j++) // 루프마다 1씩 더 출력
{
System.out.print(" "); //공백 (1 ~ 5 회)
}
for (int k = 1; k <= 5-i ; k++) // 루프마다 1씩 덜 출력
{
if (k == 5) // 별 (9, 7, 5, 3, 1)
System.out.print("*");
else
System.out.print("**");
}
System.out.print("*"); // 마지막 모자란 별 1개 따로 찍기
for (int l = 1; l <= i; l++) // 루프마다 1씩 더 출력
{
System.out.print(" "); //공백 (1 ~ 5 회)
}
System.out.println(); // 한 행의 출력이 끝나면 개행
}
62번 실습에서 사용한 코드를 활용했다,
j와 l 루프로 공백 처리는 같고, k루프에서 감소하며 별을 찍을 때, 루프 변수는 1~5로 증가,
매 루프마다 반복 횟수는 4~ 0으로 감소한다.
조건이 0일 때 k가 5로 별을 1개만 출력하고 그 전까지는 2개씩 출력을 반복한다.
따라서 2*4 = 8개 + 1개 ( 9개), 2*3 = 6개 + 1개 (7개)... 이런 식으로 9, 7, 5, 3 개를 출력하고
마지막으로 k =5 라는 조건에 의해 1개를 출력한다.
실습 064
*
***
*****
*******
*********
*******
*****
***
*
제일 아쉬움이 많이 남는 마지막 문제.
증가하다가 다시 감소하게 만드는 게 어려워서
이전에 풀었던 문제 코드를 위 아래도 단순히 붙였다.
02. 반복문과 break
실습 065
사용자에게 y/Y를 입력받으면 루프를 계속 진행해야한다.
이 부분에서 y값이 변수에 정상적으로 담긴 것은 확인되나,
루프 종료되는 오류 발생. ..
원인은..입력값을 넘길 때 누른 엔터가 값에 포함되었던 것.
// 상략
int sum = 0; // 누적합
boolean retry = true; //재시작 여부
char a; // 재시작 답변
// 중략
if (a == 'Y' || a == 'y'){ // 답변이 yes
System.out.println("-----[ 재시작! ]----");
}else{
retry = false;
break;
}//하략
오랜만에 다시 보니 제일 먼저 보인 건 이 부분.
boolean 변수를 따로 만든 의미가 없다.. break만 해도 루프 나갈 수 있어!
▼ 내코드/ 강사님 코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Test065 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int sum = 0; // 누적합
char a; // 재시작 답변
while (true)
{
System.out.print("임의의 정수 입력: "); // 사용자 입력 받기
int num = Integer.parseInt(br.readLine()); // 입력값 저장
if (1 <= num && num <= 100) // 값이 정확하다면
{
for (int n = 1; n <= num; n++ ) // 1부터 num까지 누적합
sum += n;
System.out.printf(">> 1 ~ %d 까지의 합: %d\n", num , sum); // 합계 출력
System.out.print(">> 계속 하시겠습니까? (Y/N)?: "); // 재시작 여부 묻기
a = (char)System.in.read(); // 답변 저장
if (a == 'Y' || a == 'y'){ // 답변이 yes
System.out.println("-----[ 재시작! ]----");
System.in.skip(2); //엔터값 처리
}
else
break;
}
else // 값이 잘못되었다면
{
System.out.println("1~100 사이의 정수로 입력하세요!");
}
}//--------------------while 루프의 끝
}
}
불필요한 불리언 변수 제거, skip 함수만 추가한 코드.
최근에는 입력값은 do-while을 주로 썼는데 이때는 익숙하지 않아서 그냥 while문으로 처리했다.
강사님 코드는 do-while! 진행 여부 판별하는 조건문도 훨씬 깔끔하다..
y/Y 외의 모든 값은 루프를 종료하니 단일 if로 충분!
03. 반복문과 continue
continue: 뒤로 남은 실행부를 건너뛴다.
실습 066
1부터 100까지, 홀수값만 누적합하고 출력.
// 내 코드
int sum = 0;
for (int n = 1; n < 100 ; n++){
if (n % 2 == 0)
continue;
else{
sum += n;
System.out.println(n + ":" + sum);
}
}
// 강사님 코드
int n = 0, s =0 ;
while (n <100)
{
n++;
if(n % 2 == 0)
continue;
s+= n;
System.out.println(n + ":" + s);
}
04. return
○ return 키워드가 갖는 2가지 의미:
1. 값을 반환
2. 부모 메서드 종료
+) 추가 공부한 것.
: return에 명시하는 값은 1개만 가능하다. 여러 값을 반환하려면 배열 등으로 묶어야한다.
: 여러 번 중복 사용할 수 있지만, 주로 조건문에 따라 다른 값을 리턴할 때 사용된다.
조건과 관계없이 중복 실행되는 경우 컴파일 에러가 발생한다.
실습 067
// 상하략
int n,s; // 사용자 입력값, 누적합
System.out.print("10 이상의 정수 입력: ");
n = Integer.parseInt(br.readLine());
if (n < 10) // 잘못된 값 예외처리
{
System.out.println("10 이상의 정수를 입력하세요!");
return; // 메소드 종료 (== main 메소드인 경우 전체 프로그램 종료)
}
05. 리턴(반환) 자료형.
* 메소드 이름 앞에 붙는 반환 자료형(리턴 자료형) 은
반환하는 값에 대한 정보를 표현한다.
ex01 : void
public static void main().. // 값을 반환하지 않는다.
리턴 안 할거면 그냥 안 쓰면 되는데 왜 void 라고 명시할까?
→ 그 문법은 다른 곳에서 선점해서!(==, && 처럼)
참고: void 의 사전적 의미
형용사
빈, 헛된, 공허한(empty)무익한, 쓸모 없는;
[법] 무효의(opp. valid), 법적 구속력이 없는
명사
[the ~] (우주의) 공간, 허공, 무(無), 빈 곳[틈]
타동사
무효로 하다, 취소하다(nullify), 방출[배설]하다
ex02 : 매개 변수, 반환 자료형이 int
public static int adder(int num1, int num2) ...
adder라는 메소드는 int형의 인자를 2개 받고, int형 데이터를 반환!
int형 인자를 받았으면 처리하고 값을 반환할 것이므로..
int를 명시( 결과값이 int니까 공간 만들어둬~~!! 라는 표시)
ex03
public static double square( ) ...
: 매개변수는 없고, double형 값을 반환한다.
06. 메소드의 재귀 호출
메소드 내부 실행부에서 자기 자신을 다시 호출하여 반복한다.
// 상략
public static void main(String[] args)
{
showHi(3);
}
public static void showHi(int cnt) ---> 오류 코드 ! 고쳐보기
{
System.out.println("Hi~ "); // 출력문
showHi(cnt--); // 1 감소
if (cnt == 1) // 조건식
return;
}
위 코드는 컴파일은 정상실행되나, 런타임에서 무한 루프로 Hi~를 출력한다.
원인을 파악하고 수정해보자.
// 상략
public static void showHi(int cnt)
{
System.out.println("Hi~ "); // 출력문
if (cnt == 1) // 조건식
return;
showHi(--cnt);
}
실행부의 최상단에서 1회 출력했으므로 즉시 1을 감소하고 다시 실행해야 무한루프를 고칠 수 있다.
함수는 최하단에 위치해야한다. 안 그러면 뒤에 작성된 코드는 한 번도 실행되지 않는다.
프리픽스로 1 바로 감소시켜서 인자로 넘겼다.
+) 매개변수 vs 인수
인자, 인수, 매개변수, 파라미터..
엄밀히 따지면 다르지만 거의 같은 개념. 이라고 간단하게 언급해주셨는데.. 궁금해서 찾아보니 구글 왈..
parameter ( 매개변수) : 함수에서 정의할 때 넘겨받을 값으로 명시하는 변수.
argument (인자 /인수) : 실제 메소드가 호출될 때 넘겨주는 변수로 넘겨줄때 사용
오늘 느낀 점
파이썬으로 코딩 테스트를 연습할 때, return을 메소드 마지막에 써야
필요한 값이 반환되나보다~ 하고 두루뭉술하게 써왔다.
메소드 실행부 최하단에 필수로 써야하는 건가 싶었는데 중지하는 역할도 가지고 있는 줄 몰랐다.
아직 return에 대해 명확하게 파악하지 못했지만 전보다 많이 알게돼서 좋았다.
처음 배운 리턴 자료형.
매일 메인메소드에서 보던 void의 정체를 드디어 알아서 즐겁다~!
메소드를 설계하고, 사용할 때 매개변수와 반환값의 유무가 중요한 요소임을 처음 배웠다.
아주 기본적이고 필수적인 개념을 생각보다 많이 놓치고 있었다는 생각이 들었다.
이론이나 실습이 어느 한쪽에 치우치면 꼭 어딘가 놓치거나 비효율적이게 되는 것 같다. 주의하면서 공부해야겠다.
'정리 노트 > 쌍용 KDT_(자바 Spring)' 카테고리의 다른 글
23.02.13(월): 생성자(Constructor), 초기화 블록, 메서드 오버로딩, 배열 (0) | 2023.06.07 |
---|---|
23.02.10(금): 지역변수와 전역변수, 클래스와 인스턴스, null, classpath와 package (0) | 2023.05.30 |
23.02.08(수): 반복문 (while, do-while, for) + 다중 for문 (0) | 2023.02.27 |
23.02.07(화): 반복문 while / prefix, postfix(증감연산자) (0) | 2023.02.25 |
23.02.06(월): 조건문 if, switch (다중 선택문) (0) | 2023.02.23 |