0405 | 구조적인 프로그래밍_강의 한줄요약
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