🔥 Vamos/Java

0405 | 구조적인 프로그래밍_강의 한줄요약

unikue 2023. 4. 5. 16:32

1. 구조적인 프로그래밍 = 동일한 프로그램이지만 방법을 달리 하기

: 자바프로그래밍 (기본구동) > 구조적 (재사용, 나눠서만들고 부담 줄이기) > 객체지향

 

❣ 잘라내면 절차에 구조가 생긴다.

ㄴ 잘라내기 = 함수가 가진 기능

ㄴ 함수의 기능 (① 코드 직접 사용 ② 작게 나눔 ③ 코드의 집중화 ④ 코드의 재사용)

 

2. 자바로 함수를 정의하기

 

2-1) 반환 값이 있는 경우

   static int power (int x) { return x+x*x; } // 매개변수 x는 타입을 적어준다

2-2) 반환 값이 없는 경우 (바로 출력)

   static void power () { System.out.println(...); }

 

3. 코드 구조화 Bottom up방식 = 함수 조각으로 구조를 만들어 감

 

3-1) 절차적인 코드 덩어리를 잘라 함수 조각 만들기

① 메인메서드 밖으로 함수를 떼낸다

② 메인메서드 내에서 공유하던 변수를 전역변수로 정리한다 (static) or 해당하는 메서드 내로 옮긴다

 

4. 함수 고립화 = 외부에서 변경하지 못하도록 만들기 위함

public static void main(String[] args) {
		int[] korList = new int[3]; // 배열의 주소가 korList에 전달
		
		int menu;
		boolean keepLoop = true;

		while (keepLoop) {
			menu = inputMenu(); // 메뉴입력 메서드의 반환값이 메뉴에 대입.

			switch (menu) {
		
			case 1:
				inputKors(korList);// korList안의 배열 주소를 가지고 메서드 작동. 즉 매개변수의 타입을 정해줌
				break;

			case 2:
				printKors(korList); // 성적입력시 대입된 korList를 매개변수로 해서 출력
				break;

			case 3:
				System.out.println("Bye~~");
				keepLoop = false;
				break;

			default:
				System.out.println("잘못된 값을 입력하셨습니다. 메뉴는 1~3까지입니다.");
			}
		} // while ends
	}// main ends

--------------------------------------------------------------

	static int inputMenu() {

		Scanner scan = new Scanner(System.in);

		System.out.println("\t1. 성적입력 ");
		System.out.println("\t2. 성적출력 ");
		System.out.println("\t3. 종료 ");
		System.out.println("\t선택> ");

		int menu = scan.nextInt(); // 메인메서드 메뉴와 별개로 여기에 메뉴 선언
		return menu; // 메뉴가 메뉴입력() 메서드의 반환값으로 남게 됨
	} // menu ends

	static void inputKors(int[] kors) { // 배열 타입을 받되, 지역변수로 kors 선언. 외부에서의 영향이 로컬에 끼치지 않음. 함수의 고립화
// kor 결과값 > kors[i]에 순차입력 > korList = int[] kors > korList를 성적출력에서 사용가능

		Scanner scan = new Scanner(System.in);
		int kor;

		for (int i = 0; i < 3; i++) { // 국어점수 3개 입력
			do {
				System.out.printf("국어%d : ", i + 1);
				kor = scan.nextInt();

				if (kor < 0 || 100 < kor) {
					System.out.println("국어성적은 0~100까지의 범위만 입력이 가능합니다.");
				}
			} while (kor < 0 || 100 < kor);
			
			kors[i]=kor;
		}

		System.out.println("────────────────────────");
	} // input ends

 

 

5. 함수 구조화 TOP down 방식 = 전체 뼈대를 잡으면서 그때그때 메서드같은 덩어리를 밖으로 빼냄

 

6. 데이터 구조화

* 클래스는 더 큰 단위의 자료형이다.

* 함수 단위에서 함수끼리 공유해야 하는 데이터라면 큰 단위의 구조체로 묶어서 공유 (클래스생성)

클래스를 생성해가며 데이터 구조를 정의할 수 있게 됨 & 기존 코드에 클래스를 참조시킴으로써 코드를 짧게 변경 가능.

 

7. 구조체 배열

// Exam class 내에 int kor, eng, math; 가 선언되어 있을때 = 선언만 된거지 참조형에서 사용은 불가 

Exam exam; 
/* 변수는 값/참조형식 둘로 나눠지는데 기본형이 아닌 것은 참조형.
1. 참조형은 기본적으로 널값을 갖는다.
2. 참조형은 new 객체를 참조시켜줘야만이 사용가능하다 */

Exam exam = new Exam();
exam.kor = 30; // 사용가능

Exam [] exams = new Exam[3];
Exam [].kor = 30; // 사용불가. 위의 배열은 배열 >공간<만 생성한 것일뿐, 객체가 참조되지 않았음.

Exam [] exams = new Exam[3];
Exam [0] = new Exam(); // 배열 안에 객체를 생성해서 넣어줘야 함
Exam [0].kor = 30; // 사용가능. 객체참조배열!

for(int i =0; i<3; i++)
	Exam [i] = new Exam(); // for문을 통하여 전체 배열 내에 객체 넣기도 가능.

 

8. 가변길이배열

: 필요에 따라 공간늘리기

 

8-1) 가변길이 배열 구현시

[기존배열 capacity] + current값 + [amount]

 

if(capacity == current) //  만약에 공간이 모자라면

① amount개 확장한 새 배열 temp 생성

② 기존 배열 데이터를 tmp로 옮기기 (for문 사용)

③ temp가 참조하는 객체를 기존 객체가 참조하게 변경  (ex. list = temp;)

④ 필요에 따라 현재 capacity의 값 증가시키기

 

9. 오버로딩

: 함수 이름 동일 = 같은 기능. 그러나 다른 인자를 지니는 함수. = 사용자 편의성 증가

: 공통 매개변수는 메서드 재호출을 통해 오버로딩을 더 쉽게 구현할 수 있다

// 생략
switch (menu) {
			case 2:
				//printList(list); 
				printList(list,2); 
				//printList(list,2,4); 매개변수에 따라 호출이 다르게 됨
				break;
	}
    
	private static void printList(ExamList list) { 
    	// 인자가 없는 쪽이라 (기본템) 재호출을 통해 구현 = 집중화
		// printList(list)면 자기자신을 호출하므로 무한루프에 빠짐
		
        printList(list, list.current); // 아래의 (ExamList list, int size) 메소드를 호출함
		// 즉 인자를 하나만 받을땐 아래의 size는 전체값으로 하겠다고 다시 메서드를 적어주는 것.
	} // printList1
	
	private static void printList(ExamList list, int size) {
		printList(list, 0, size);
	} // printList2 ends

	private static void printList(ExamList list, int offset, int size) {
		System.out.println("│     성적 출력       │");
		System.out.println();

		Exam[] exams = list.exams;

		for (int i = offset; i < size; i++) { // 시작값을 offset 반영.
			Exam exam = exams[i];
			int kor = exam.kor; // 변수가 반복될경우 임시변수 선언해서 코드수를 줄여줄것.exam.kor 계속 호출하지않아도되게.
			int eng = exam.eng;
			int math = exam.math;

			int total = kor + math + eng;
			float avg = total / 3.0f;

			System.out.printf("국어: %d\n", kor);
			System.out.printf("영어: %d\n", eng);
			System.out.printf("수학: %d\n", math);

			System.out.printf("총점 : %3d\n", total);
			System.out.printf("평균 : %6.2f\n", avg);
			System.out.println("────────────────────────");
		}
	} // printList3 ends