본문 바로가기

STUDY/국비교육

[Java 웹 프로그래밍] 국비지원 4일차 - 자바 이중 for문 예제, 메소드, 메소드 예제

이중 for문, 다중 for문

for문 안에 for문이 있는 형태를 말한다. 바깥쪽 for문이 다음 반복으로 넘어가기 위해서는 안쪽 for문이 완료되어야 한다.

따라서 (바깥쪽 for문의 반복 횟수) * (안쪽 for문의 반복 횟수)만큼 수행이 된다. 

 

이중 for문을 이용한 별그리기 연습을 해보자.

1. 직사각형 - for문 이용

		/*
		 	*****	
		 	*****	
		 	*****	
		 	*****	
		 	*****	
		 */
		
		for(int i = 1; i <= 5; i++) {
			System.out.println("*****");
		}

 

 

 

 

 

2. 직삼각형 - 이중 for문 이용

접근 방법

  • "변수 j의 조건 범위"를 하나씩 증가시켜서 출력해보면, 직삼각형이 나오는 것을 확인할 수 있다. 
  • 첫 번째에서는 별표 1개를 출력, 두 번째에서는 별표 2개를 출력, ....
		// 직각삼각형
		for(int j = 1; j <= 1; j++) {
			System.out.print("*");
		}
		System.out.println();
		
		for(int j = 1; j <= 2; j++) {
			System.out.print("*");
		}
		System.out.println();
		
		for(int j = 1; j <= 3; j++) {
			System.out.print("*");
		}
		System.out.println();
		
		for(int j = 1; j <= 4; j++) {
			System.out.print("*");
		}
		System.out.println();
		
		for(int j = 1; j <= 5; j++) {
			System.out.print("*");
		}
		System.out.println();

 

  • 연속해서 증가하는 부분을 반복문을 사용해서 for문 안에 넣어 이중 for문으로 만들어준다. 

 

풀이 방법

바깥쪽 for문(변수 i)

  • for(int i = 1; i <= 5; i++) : 변수 i를 1부터 5까지 증가시키며 반복한다. 세로의 줄 수를 증가시키면서 5칸이 나오도록 식을 적었다. 
  • 삼각형 높이를 나타낸다.

안쪽 for문(변수 j)

  • for(int j = 1; j <= i; j++) : 변수 j를 1부터 i까지 증가시키며 반복한다.
  • 각 줄마다 출력될 별표의 개수를 결정한다.  

안쪽 반복문을 돌면, 다음 줄로 줄을 바꾸기 위해서 System.out.println() 를 호출해준다. 

		/*
		 		*
		 		**
		 		***
		 		****
		 		*****
		 */
         
		for(int i = 1; i <= 5; i++) {
			for(int j = 1; j <= i; j++) {
				System.out.print("*");
			}
			System.out.println();
		}

 

 

 

 

 

3. 역직삼각형 - 이중 for문 이용

접근 방법

  • "변수 j의 조건 범위"를 하나씩 감소시켜서 출력해보면, 역직삼각형이 나오는 것을 확인할 수 있다. 
  • 첫 번째에서는 별표 5개를 출력, 두 번째에서는 별표 4개를 출력, ....
		// 역직삼각형
		for(int j = 1; j <= 5; j++) {
			System.out.print("*");
		}
		System.out.println();
		
		for(int j = 1; j <= 4; j++) {
			System.out.print("*");
		}
		System.out.println();

		for(int j = 1; j <= 3; j++) {
			System.out.print("*");
		}
		System.out.println();
		
		for(int j = 1; j <= 2; j++) {
			System.out.print("*");
		}
		System.out.println();
		
		for(int j = 1; j <= 1; j++) {
			System.out.print("*");
		}
		System.out.println();

  • 연속해서 감소하는 부분을 반복문을 사용해서 for문 안에 넣어 이중 for문으로 만들어준다. 

 

풀이 방법

위의 직삼각형과 비슷하다. 차이점은 바깥쪽 for문이 역순이 되도록 감소식을 적어준다. 

 

바깥쪽 for문(변수 i) 

  • for(int i = 5; i >= 1; i--) : 변수 i를 5부터 1까지 "감소"시키며 반복한다. 주의할 점은 증가식이 아니라 감소식을 적어야 한다.

안쪽 for문(변수 j)

  • for(int j = 1; j <= i; j++) : 변수 j를 1부터 i까지 증가시켜 반복한다.
		/*
		 		*****
		 		****
		 		***
		 		**
		 		*
		 */
		for(int i = 5; i >= 1; i--) {
			for(int j = 1; j <= i; j++) {
				System.out.print("*");
			}
			System.out.println();
		}

 

 

 

 

 

 

4. 피라미드 - 이중 for문 이용

공백과 별표 2가지의 반복문을 생각해야 한다. 

 

바깥쪽 for문(변수 i) 

  • for(int i = 1; i <= 5; i++)  : 변수 i를 1부터 5까지 증가시키며 반복한다.
  • 세로의 줄 수를 증가시킨다.

첫 번째 안쪽 for문(변수 k)

  • for(int k = 1; k <= 5 - i; k++)  : 변수 k를 1부터 '5 - i'까지 증가시키며 반복한다.
  • 각 줄마다 출력될 "공백"의 개수를 결정한다.
  • 예를 들어, 첫 번째 줄에서는 공백 4개가 필요하고, ..., 다섯 번째 줄에서는 공백이 없다.

두 번재 안쪽 for문(변수 j)

  • for(int j = 1; j <= i*2 -1; j++) : 변수 j를 1부터 'i * 2 - 1'까지 증가시키며 반복한다. 홀수가 나오는 식을 적어주었다.
  • 각 줄마다 출력될 "별표"의 개수를 결정한다.  
  • 예를 들어, 첫 번째 줄에서는 별표 1개가 필요하고, ..., 다섯 번째 줄에서는 9개의 별표가 필요하다. 
		/*
				    *
		 		   ***
		 		  *****
		 		 *******
		 		*********
		 */
         
		// 공백: 4 3 2 1 0
		// 별: 1 3 5 7 9 // 홀수 개수 만큼(O) or 2개씩 증가(X)
        
		for(int i = 1; i <= 5; i++) {	
			
			for(int k = 1; k <= 5 - i; k++) {
				System.out.print(" ");
			}
				
			for(int j = 1; j <= i*2 -1; j++) {
				System.out.print("*");
			}
			System.out.println();
		}

 

 

 

 

 

 

5. 역피라미드 - 이중 for문 이용

위의 피라미드와 비슷하다. 차이점은 바깥쪽 for문이 역순이 되도록 감소식을 적어준다. 

 

바깥쪽 for문(변수 i) 

  • for(int i = 5; i >= 1; i--)  : 변수 i를 5부터 1까지 "감소"시키며 반복한다. 감소식을 적어준다.
  • 세로의 줄 수를 증가시킨다.

첫 번째 안쪽 for문(변수 k)

  • for(int k = 1; k <= 5 - i; k++)  : 변수 k를 1부터 '5 - i'까지 증가시키며 반복한다.
  • 각 줄마다 출력될 "공백"의 개수를 결정한다.
  • 예를 들어, 첫 번째 줄에서는 공백 0개가 필요하고, ..., 다섯 번째 줄에서는 공백 4개가 필요하다.

두 번재 안쪽 for문(변수 j)

  • for(int j = 1; j <= i*2 - 1; j++) : 변수 j를 1부터 'i * 2 - 1'까지 증가시키며 반복한다.  홀수가 나오는 식을 적어주었다.
  • 각 줄마다 출력될 "별표"의 개수를 결정한다.  
  • 예를 들어, 첫 번째 줄에서는 별표 9개가 필요하고, ..., 다섯 번째 줄에서는 1개의 별표가 필요하다. 
		/*
		 		*********
		 		 *******
				  *****
				   ***
		 		    *
		 */
         
		//공백: 0 1 2 3 4
		//*: 9 7 5 3 1
        
		for(int i = 5; i >= 1; i--) {	
        
			for(int k = 1; k <= 5 - i; k++) {
				System.out.print(" ");
			}
				
			for(int j = 1; j <= i*2 - 1; j++) {
				System.out.print("*");
			}
			System.out.println();
		}

 

 

 

 

 

 

 

중첩 반복문 이용해서 2차원 배열 출력

바깥쪽 for문(i 변수)은 2차원 배열의 행 인덱스를, 안쪽 for문(j 변수)은 열 인덱스를 출력한다.

public class NestedFor {
	public static void main(String[] args) {
		
		int[][] arData = {
				{10,20,30},
				{40,50,60}
		};
        
		for(int i = 0; i < 2; i++) {
			for(int j = 0; j < 3; j++) {
				System.out.println(arData[i][j]);
			}	
		}
        
    }
}

 

 

 

 

 

 

중첩 반복문 이용해서 구구단 출력

  • 바깥쪽 for문(변수 i)는 2단부터 9단까지 반복하여 출력한다.
  • 안쪽 for문에 들어가기 전에 System.out.println() 을 이용해 각 단의 제목을 출력한다. 
  • 안쪽 for문(변수 j)는 1부터 9까지 증가시키며 반복한다. (각 단에서 곱해지는 수를 나타낸다)
  • System.out.printf()을 이용하여 형식화된 문자열을 출력할 수 있다.
  • %d 는 정수를 나타내며 각각 들어갈 정수인 i, j, i*j를 순차적으로 적어준다. 
		// 구구단 출력
		for(int i = 2; i <=9; i++) {			
			System.out.println("---- " + i +"단 출력 ----");
			for(int j = 1; j <= 9; j++) {
				System.out.printf("%d x %d = %d\n", i, j, i*j);
			}
		}

 

 

 

 

 

 

학생수, 과목수, 과목명 입력 받아서 총점, 평균 출력

		/*
		 	학생수 입력 -> 과목수, 과목명 입력 받기 -> 첫 번째 학생 ~ n 번째 학생까지의 점수 입력받기
		 	한 사람당 총점, 평균/ 전체 평균
		 	각 과목별 평균
		 */
		// 소배열이 각 학생수 마다, 과목수 마다 생김 -> 2차원 배열
		
		
		// 학생수 stuCnt 과목수 subjCnt -> 2차배열 arrScore
		// 1차 배열 과목명 arrSubject
		
		
		// 입력
		Scanner sc = new Scanner(System.in);
		System.out.print("학생수를 입력하세요: ");
		int stuCnt = sc.nextInt();
		
		System.out.print("과목수를 입력하세요: ");
		int subjCnt = sc.nextInt();
		
		// 처리
		int[][] arrScore = new int[stuCnt][subjCnt]; //학생수, 과목수 
		String[] arrSubject = new String[subjCnt]; //과목명 
		
		for(int i = 0; i < subjCnt; i++) {
			System.out.print(i+1 + "번째 과목명: ");
			arrSubject[i] = sc.next();
		}
		
		int[] arSum1 = new int[stuCnt];  //학생별 총점
		int[] arSum2 = new int[subjCnt];  //과목별 총점
		
		for(int i = 0; i < stuCnt; i++) {
			for(int j = 0; j < subjCnt; j++) {
				System.out.print(i+1 + "번째 학생의 " + arrSubject[j] + "점수: ");
				arrScore[i][j] = sc.nextInt();
				arSum1[i] += arrScore[i][j];
				arSum2[j] += arrScore[i][j];
			}
		}
		
		//총점과 평균을 출력하기 위해 '학생수'만큼 반복한다.
		for(int i = 0; i < stuCnt; i++) {
			System.out.println(i+1 + "번째 학생의 총점: " + arSum1[i]);
			System.out.println(i+1 + "번째 학생의 평균: " + arSum1[i]/(double)subjCnt);
		}
		
		for(int i = 0; i < subjCnt; i++) {
			System.out.println(arrSubject[i] + " 과목의 평균: " + arSum2[i]/(double)stuCnt);
		}

 

 

 

 

메소드

처리하는 과정들을 구분지어 놓는다. 반복되는 코드, 기능, 행위, 차이 등을 쉽게 관리하기 위해 따로 선언되어 있는 블럭을 이야기한다. 메소드를 선언하고 사용하기 위해서는 호출이 되야 한다. 

 

메소드 선언 구조

메소드는 다른 메소드 바깥, 클래스 내부에 선언이 된다. 

①리턴타입 ②메소드명(③자료형 매개변수1, 자료형 매개변수2, ... ) {
		④호출시 실행할 문장
		⑤return 리턴값;
}
  • ① return 뒤의 값의 타입에 맞는 자료형을 작성해준다. 리턴갑이 없다면 void로 작성한다.
  • ② 동사형으로 작성한다. ( eat("연어"), eat("참치"), ... )
  • ③ 생략 가능하다. 하지만 생략시에는 외부(호출하는 곳)에서 값을 전달받을 수 없다. 여러 값을 전달받아야 할 경우에는 콤마로 구분하여 그 값들만큼 선언해 주어야 한다. 호출시에는 매개변수(인자)의 타입과 개수에 맞게 순서대로 값들(인수)을 전달해 주어야 한다.
  • ④ 생략 가능하다. 메소드 호출 때마다 수행해야 하는 코드를 그대로 작성한다.(로직 작성)
  • ⑤ 생략 가능하다. 

 

메소드 사용

메소드는 클래스 내부에 있으므로 그 메소드가 속해 있는 클래스의 타입으로 변수를 먼저 만들어야 한다(즉, 객체화를 진행해 주어야 한다).

클래스명 변수명 = new 클래스명();

 

 

메소드 선언 순서

	// 두 정수의 덧셈 메소드

	1. 메소드 명을 생각한다.
		void add() {	
		
		}

	2. 매개변수를 생각한다.
		입력값이 다르면(처리 결과가 다르면) 매개변수가 필요하다.
		void add(int num1, int num2) {	
			// 로직 작성
			int result = num1 + num2;
		}

	3. 실행한 문장을 생각한다.
		로직 작성

	4. 리턴값을 생각한다.
		void add(int num1, int num2) {	
			// 로직 작성
			int result = num1 + num2;
			return result;
		}

	5. 리턴타입 수정
		"int" add(int num1, int num2) {	
			// 로직 작성
			int result = num1 + num2;
			return result;
		}

 

 

 

 

메소드 만들기 예제

1번. 1 ~ 10 출력하는 메소드

		void print1To10() {
			for(int i = 1; i <= 10; i++) {
				System.out.println(i);
			}
		}

 

2번. 1 ~ 10 합 구해주는 메소드

public class MethodTask {
	public static void main(String[] args) {
    
		MethodTask mt = new MethodTask();
		System.out.println(mt.sumTo10);
	}

		int sum1To10() {
			int sum = 0;
			for(int i = 1; i <= 10; i++) {
				sum += i;
			}
			return sum;
		}
     
     // 출력값
     // 55
}

 

3번. 1 ~ n 합 구해주는 메소드

public class MethodTask {
	public static void main(String[] args) {
		MethodTask mt = new MethodTask();
		int n = 3;
		System.out.println(mt.sum1ToN(n));
        
        }
        
		int sum1ToN(int n) {
			int sum = 0;
			for(int i = 1; i <= n; i++) {
				sum += i;
			}
			return sum;
		}
        
        // 출력값
        // 6
}

 

7번. 문자열을 전부 대문자로 바꿔주는 메소드(hEllo~123 -> HELLO~123) - 아스키코드 이용

public class MethodTask {
	public static void main(String[] args) {
		MethodTask mt = new MethodTask();
		
		String str = "abcd";
		int n = 3;
		System.out.println(mt.changeToUpperCase(str));
		System.out.println(mt.checkStringToNum(str, n));
		System.out.println(mt.changeEnglish(str));
    }
    
        String changeToUpperCase(String str) {
        String result = "";

            // (반복문을 이용해) 문자열을 문자로 변환 : charAt()메소드 이용
            for(int i = 0; i < str.length(); i++) {
                char ch = str.charAt(i);

                // (조건문을 이용해) 소문자인 경우, 대문자로 바꿔주는 로직 작성 // 32차이 이용 : (char)(ch-32) // ch - 'a' + 'A' 이런 식도 있구나.
                if(ch >= 'a' && ch <= 'z') {
                    result += (char)(ch - 'a' + 'A'); 
                } else {  // 대문자인 경우
                    result += ch;
                }
            }
            return result;
    }
        
        // 출력값
        // ABCD
}

 

 

8번. 문자열을 거꾸로 바꿔주는 메소드(Hello -> olleH)

		String reverseStr(String str) {
			String reverse = "";
			
			// 처음 문자가 마지막 문자가 될 수 있도록
			// 문자열을 문자로 변환
			for(int i = str.length() - 1; i >= 0; i--) { // 역순으로 반복(마지막 문자부터 첫 번째 문자까지 역순
				reverse = reverse + str.charAt(i);
			}
			return reverse;
		}
        
        // 출력값
        // dcba

 

 

9번. 문자열이 숫자로 이루어져 있는지 검사하는 메소드(숫자가 아닌것이 포함되어 있다면 false)

		boolean checkStringToNum(String str, int n) {
			
			// 반복문을 이용해 문자열을 문자로 하나씩 확인
			for(int i = 0; i < str.length(); i++) {
				char ch = str.charAt(i);

				// 조건문: 숫자인지 아닌지 판단. (만약 숫자만 있으면 true, 문자가 포함되어 있다면 false) - 아스키코드 이용
				if(ch < '0' || ch > '9') {
					return false; // 숫자 아닌 것이 포함되어 있음
				} 
			}
			return true;
		}
        
        // 출력값
        // false

 

10번. 문자열의 소문자는 대문자로, 대문자는 소문자로 바꿔주는 메소드(hEllo~123 -> HeLLO~123)

		String changeEnglish(String str) {
			String result = "";
			
			for(int i = 0; i < str.length(); i++) {
				char ch = str.charAt(i);
				
				if(ch >= 'a' && ch <= 'z') { // 소문자인 경우 대문자로 변환
					result += (char)(ch - 32);
				} else if(ch >= 'A' && ch <= 'Z') { // 대문자인 경우 소문자로 변환
					result += (char)(ch + 32);
				} else {	// 그렇지 않은 경우 추가??
					result += ch;
				}
			}
			return result;
		}
        
        // 출력값
        // ABCD