이 글은 Newlecture의 자바 구조적인 프로그래밍 강의를 보며 정리한 글입니다.
구조적인 프로그램 : 자바 프로그래밍 → 구조적인 → 객체지향 → …
🤍 자바에서 함수를 정의하는 방법 🤍
자바로 함수를 정의하고 사용하는 방법
static int power (int x) {
return (x+3)*(x+3)+ x/3*(x-2);
} → (power(7) +3) * power(7) - power(7)
반환 값이 없을 때
static int power (int x) {
System.out.printf("power is %d\n", (x+3)*(x+3)+ x/3*(x-2));
}
🤍 구조적인 프로그래밍 #Bottom Up 방식 연습 1 🤍
case 1: 성적입력();
}(메인함수)
static void 성적입력() {
for(int i=0; i<3; i++)
do{
System.out.printf("국어%d : ", i+1);
Kors[i] = scan.nextInt();
if(kors[i] < 0 || 100 < kors[i]
System.out.println("국어 성적은 0~100까지의 범위만 입력해주세요.");
}while(kors[i] < 0 || 100 < kors[i];
}
↓
메인함수(public static void main String[] args), 성적입력함수(static void)
위에 전역변수(static int x;)를 사용한다.
예시) static int[] kors = new int[3];
🤍 구조적인 프로그래밍 #Bottom Up 방식 연습 2 🤍
while(keepLoop)
{
menu = 메뉴입력();
switch(menu) {
case 2: 성적출력();
}(메인함수)
static int 메뉴입력() {
Scanner scan = new Scanner(System.in);
System.out.println(\t1. 성적입력 ");
System.out.println(\t2. 성적출력 ");
System.out.println(\t3. 종료 ");
System.out.println(\t1선택> ");
int menu = scan.nextInt();
return menu; // 값을 반환하는 함수
}
static void 성적출력() {
int total = 0;
float avg;
for(int i=0; i<3; i++)
total += kors[i];
avg = total / 3.0f;
for(int i=0; i<3; i++)
System.out.printf("국어 %d : %3d\n", 3-i, kors[i]);
System.out.printf("총점 : %d\n", total);
System.out.printf("평균 : %d\n, avg);
}
🤍 매개변수를 이용한 함수 고립화 🤍
함수가 매개값을 가지고 있지 않다면 함수의 지역자체가 고립되지않고, 외부에 대한 영향을 받는다.
또한, 독립된 공간으로서의 자립도가 떨어진다.
public class StructructedProgram{
static void main(String[] args) { // static = 전역변수의 의미
int [] korsList = new int[3];
int menu;
boolean keepLoop = true;
while(keepLoop)
{
menu = 메뉴입력();
switch(menu) {
case 1: 성적입력(korList);
break;
case 2: 성적출력(korList);
break;
case 3:
System.out.println("Bye");
keepLoop = false;
break;
default;
}(메인함수)
static int 메뉴입력() {
Scanner scan = new Scanner(System.in);
System.out.println(\t1. 성적입력 ");
System.out.println(\t2. 성적출력 ");
System.out.println(\t3. 종료 ");
System.out.println(\t1선택> ");
int menu = scan.nextInt();
return menu; // 값을 반환하는 함수
}
}(메인함수)
static void 성적입력(int[] kors) {
Scanner scan = new Scanner(System.in);
int kor;
for(int i=0; i<3; i++)
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] = kors;
}
static void 성적출력(int [] kors) {
int total = 0;
float avg;
for(int i=0; i<3; i++)
total += kors[i];
avg = total / 3.0f;
for(int i=0; i<3; i++)
System.out.printf("국어 %d : %3d\n", 3-i, kors[i]);
System.out.printf("총점 : %d\n", total);
System.out.printf("평균 : %d\n, avg);
}
🤍 함수 이름 짓기 🤍
숫자로 시작할 수 없다.
문자 사이에 빈 공백은 사용할 수 없다.
특수문자(!@#$%…)는 사용할 수 없다.
예시 ) 로또번호생성 → gen(기능)Lotto(재료)()
로또번호출력 → printLotto()
로또번호정렬 → sortLotto()
예시)
public class StructructedProgram{
static void main(String[] args) { // static = 전역변수의 의미
int [] korsList = new int[3];
int menu;
boolean keepLoop = true;
while(keepLoop)
{
menu = inputMenu();
switch(menu) {
case 1: inputKors(korList);
break;
case 2: printKors(korList);
break;
case 3:
System.out.println("Bye");
keepLoop = false;
break;
default;
}(메인함수)
static int inputMenu() {
Scanner scan = new Scanner(System.in);
System.out.println(\t1. 성적입력 ");
System.out.println(\t2. 성적출력 ");
System.out.println(\t3. 종료 ");
System.out.println(\t1선택> ");
int menu = scan.nextInt();
return menu; // 값을 반환하는 함수
}
}(메인함수)
static void inputKors(int[] kors) {
Scanner scan = new Scanner(System.in);
int kor;
for(int i=0; i<3; i++)
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] = kors;
}
static void printKors(int [] kors) {
int total = 0;
float avg;
for(int i=0; i<3; i++)
total += kors[i];
avg = total / 3.0f;
for(int i=0; i<3; i++)
System.out.printf("국어 %d : %3d\n", 3-i, kors[i]);
System.out.printf("총점 : %d\n", total);
System.out.printf("평균 : %d\n, avg);
}
🤍 Top Down 방식으로 구현하는 간단 예제 🤍
public class Program {
public static void main(String[] args) {
int[][] lottos = null;
int menu;
boolean running = true;
while(running)
{
menu = inputMenu();
switch(menu) {
case 1:
lottos = createLottosAuto();
break;
case 2:
lottos = createLottoMaunual();
break;
case 3:
printLottos(lottos)
break;
case 4:
runniing = false;
break;
default;
}
}
}
private static void printLottos (int[][] lottos) {
}
private static int [][] createLottosManual() {
return null;
}
private static int [][] createLottosAuto(){
return null;
}
private staic int inputMenu(){
return 0;
}
}
🤍 데이터 구조화 🤍
public staic void main(String[] args) {
int[] korList = new int[3];
int[] engList = new int[3];
int[] mathList = new int[3];
Exam exam = new Exam();
exam.kor = 30;
exam.eng = 30;
exam.math = 30;
int menu;
boolean keepLoop = true;
while(keepLoop)
{
menu = inputMenu();
switch(menu) {
case 1:
inputKors(korList);
break;
case 2:
printKors(korList);
break;
case 3:
System.out.println("Bye")
keepLoop = false;
break;
default:
System.out.println("잘못된 값을 입력하셨습니다. 메뉴는 1~3까지입니다.");
}
~ public class Exam 생성 ~
{
int kor;
int eng;
int math;
}
→ 1 : 데이터 구조 정의
↓ 2 : 선언
public class Program {
public static void main(String[] args){
Exam exam; // 현재 exam 이 가르키고 있는 것은 null이다.
exam = new Exam(); → 3: 객체 생성 (Exam())
exam.kor = 30;
}
}
🤍 데이터 구조화 2 🤍
public class ExamProgram{
public static void main (String[] args) {
Extam exam = new Exam ();
input(exam);
print(exam);
}
private static void print (Exam exam) {
System.out.println ("성적 출력");
System.out.println();
int kor = exam.kor; // 임시변수
int eng = exam.eng;
int math = exam.math;
int total = kor+eng+math;
float avg = toatal/3.0f;
System.out.printf ("국어 : %d : %d\n, kor);
System.out.printf ("영어 : %d : %d\n, eng);
System.out.printf ("수학 : %d : %d\n, math);
System.out.printf ("총점 : %3d\n", total);
System.out.printf ("평균 : %6.2f\n, avg);
}
private static void input (Exam exam) {
Scanner scan = new Scanner(System.in);
System.out.println ("성적 입력");
System.out.println();
int kor, eng, math;
do {
System.out.printf("국어 : ");
kor = scan.nextInt();
if(kor < 0 || 100 < kor)
System.out.println("국어 성적은 0~100까지의 범위입니다.");
} while (kor < 0 || 100 < kor);
do {
System.out.printf("영어 : ");
eng = scan.nextInt();
if(eng < 0 || 100 < eng)
System.out.println("영어 성적은 0~100까지의 범위입니다.");
} while (eng < 0 || 100 < eng);
do {
System.out.printf("수학 : ");
math = scan.nextInt();
if(math < 0 || 100 < math)
System.out.println("수학 성적은 0~100까지의 범위입니다.");
} while (math < 0 || 100 < math);
exam.kor = kor;
exam.eng = eng;
exam.math = math;
}
}
🤍 구조체 배열 이용하기 🤍
public class Program {
public static void main (String[] args) {
Exam[] exams = new Exam [3]
int menu;
boolean keepLoop = true;
while(keepLoop)
{
menu = inputMenu();
switch(menu) {
case 1:
inputList(exams);
break;
case 2:
printList(exams);
break;
case 3:
System.out.println("Bye")
keepLoop = false;
break;
default:
System.out.println("잘못된 값을 입력하셨습니다. 메뉴는 1~3까지입니다.");
}
}
}
private static void printList (Exam [] exams) {
System.out.println ("성적 출력");
System.out.println();
for(int i=0; i<3; i++) {
Exam exam = exams[i];
int kor = exam.kor;
int eng = exam.eng;
int math = exam.math;
int total = kor+eng+math;
float avg = toatal/3.0f;
System.out.printf ("국어 : %d : %d\n, kor);
System.out.printf ("영어 : %d : %d\n, eng);
System.out.printf ("수학 : %d : %d\n, math);
System.out.printf ("총점 : %3d\n", total);
System.out.printf ("평균 : %6.2f\n, avg);
System.out.println ("----");
}
}
private static void input inputList (Exam[] exams) {
Scanner scan = new Scanner(System.in);
System.out.println ("성적 입력");
System.out.println();
for(int i=0; i<3; i++) {
int kor, eng, math;
do {
System.out.printf("국어 : ");
kor = scan.nextInt();
if(kor < 0 || 100 < kor)
System.out.println("국어성적은 0~100까지의 범위만 입력이 가능합니다.");
} while (kor < 0 || 100 < kor);
do {
System.out.printf("영어 : ");
eng = scan.nextInt();
if(eng < 0 || 100 < eng)
System.out.println("영어성적은 0~100까지의 범위만 입력이 가능합니다.");
} while (eng < 0 || 100 < eng);
do {
System.out.printf("수학 : ");
math = scan.nextInt();
if(math < 0 || 100 < math)
System.out.println("수학성적은 0~100까지의 범위만 입력이 가능합니다.");
} while (math < 0 || 100 < math);
Exam exam = new Exam();
exam.kor = kor;
exam.eng = eng;
exam.math = math;
exams[i] = exam; // 이 코드가 없다면 배열에 담겨지는 것이 없다.
}
}
static int inputMenu() {
Scanner scan = new Scanner (System.in);
System.out.println("메인 메뉴 ");
System.out.println("\t1. 성적입력 ");
System.out.printlb("\t2. 성적출력 ");
System.out.println("\t선택> ");
System.out.printf ("----");
int menu = scan.nextInt();
return menu;
}
}
🤍 가변 길이 배열 🤍
public class Program {
public static void main (String[] args) {
Exam[] exams = new Exam [3]
int current = 0;
int menu;
boolean keepLoop = true;
while(keepLoop)
{
menu = inputMenu();
switch(menu) {
case 1:
inputList(exams.current);
break;
case 2:
printList(exams,current);
break;
case 3:
System.out.println("Bye")
keepLoop = false;
break;
default:
System.out.println("잘못된 값을 입력하셨습니다. 메뉴는 1~3까지입니다.");
}
}
}
private static void printList (Exam [] exams, int size) {
System.out.println ("성적 출력");
System.out.println();
for(int i=0; i<size; i++) {
Exam exam = exams[i];
int kor = exam.kor;
int eng = exam.eng;
int math = exam.math;
int total = kor+eng+math;
float avg = toatal/3.0f;
System.out.printf ("국어 : %d : %d\n, kor);
System.out.printf ("영어 : %d : %d\n, eng);
System.out.printf ("수학 : %d : %d\n, math);
System.out.printf ("총점 : %3d\n", total);
System.out.printf ("평균 : %6.2f\n, avg);
System.out.println ("----");
}
}
private static void input inputList (Exam[] exams) {
Scanner scan = new Scanner(System.in);
private static void input inputList (Exam[] exams, int current) {
Scanner scan = new Scanner(System.in);
System.out.println ("성적 입력");
System.out.println();
for(int i=0; i<3; i++) {
do {
System.out.printf("국어 : ");
kor = scan.nextInt();
if(kor < 0 || 100 < kor)
System.out.println("국어성적은 0~100까지의 범위만 입력이 가능합니다.");
} while (kor < 0 || 100 < kor);
do {
System.out.printf("영어 : ");
eng = scan.nextInt();
if(eng < 0 || 100 < eng)
System.out.println("영어성적은 0~100까지의 범위만 입력이 가능합니다.");
} while (eng < 0 || 100 < eng);
do {
System.out.printf("수학 : ");
math = scan.nextInt();
if(math < 0 || 100 < math)
System.out.println("수학성적은 0~100까지의 범위만 입력이 가능합니다.");
} while (math < 0 || 100 < math);
Exam exam = new Exam();
exam.kor = kor;
exam.eng = eng;
exam.math = math;
exams[current] = exam;
current++;
🤍 가변 길이를 위한 구조체 생성 🤍
public class ExamList {
Exam[] exams = new Exam[3];
int current;
}
↓
public class ListProgram {
public static void main (String[] args) {
ExamList list = new ExamList();
list.exams = new Exam [3]
int current = 0;
int menu;
boolean keepLoop = true;
while(keepLoop)
{
menu = inputMenu();
switch(menu) {
case 1:
inputList(list);
break;
case 2:
printList(list);
break;
case 3:
System.out.println("Bye")
keepLoop = false;
break;
default:
System.out.println("잘못된 값을 입력하셨습니다. 메뉴는 1~3까지입니다.");
}
}
}
private static void printList (ExamList list) {
System.out.println ("성적 출력");
System.out.println();
int size = list.current;
Exam[] exams = list.exams;
for(int i=0; i<size; i++) {
Exam exam = exams[i];
int kor = exam.kor;
int eng = exam.eng;
int math = exam.math;
int total = kor+eng+math;
float avg = toatal/3.0f;
System.out.printf ("국어 : %d : %d\n, kor);
System.out.printf ("영어 : %d : %d\n, eng);
System.out.printf ("수학 : %d : %d\n, math);
System.out.printf ("총점 : %3d\n", total);
System.out.printf ("평균 : %6.2f\n, avg);
System.out.println ("----");
}
}
private static void input inputList (Exam[] exams) {
Scanner scan = new Scanner(System.in);
private static void input inputList (ExamList list) {
Scanner scan = new Scanner(System.in);
System.out.println ("성적 입력");
System.out.println();
for(int i=0; i<3; i++) {
do {
System.out.printf("국어 : ");
kor = scan.nextInt();
if(kor < 0 || 100 < kor)
System.out.println("국어성적은 0~100까지의 범위만 입력이 가능합니다.");
} while (kor < 0 || 100 < kor);
do {
System.out.printf("영어 : ");
eng = scan.nextInt();
if(eng < 0 || 100 < eng)
System.out.println("영어성적은 0~100까지의 범위만 입력이 가능합니다.");
} while (eng < 0 || 100 < eng);
do {
System.out.printf("수학 : ");
math = scan.nextInt();
if(math < 0 || 100 < math)
System.out.println("수학성적은 0~100까지의 범위만 입력이 가능합니다.");
} while (math < 0 || 100 < math);
Exam exam = new Exam();
exam.kor = kor;
exam.eng = eng;
exam.math = math;
if(!exams의 공간이 있는지) {
공간을 늘려주기
}
list.exams[list.current] = exam;
list.current++;
}
🤍 가변 길이 배열 구현하기 🤍
공간을 점진적으로 늘리는 위치와 방법
// 만약 공간이 부족하다면
if(capacity == current)
{
new Exam[capacity+amount];
for(int=0; i<current; i++)
temp[i] = list[i];
list = temp;
capacity += amount;
}
---
public class ListProgram {
public static void main (String[] args) {
ExamList list = new ExamList();
list.exams = new Exam [3]
int current = 0;
int menu;
boolean keepLoop = true;
while(keepLoop)
{
menu = inputMenu();
switch(menu) {
case 1:
inputList(list);
break;
case 2:
printList(list);
break;
case 3:
System.out.println("Bye")
keepLoop = false;
break;
default:
System.out.println("잘못된 값을 입력하셨습니다. 메뉴는 1~3까지입니다.");
}
}
}
private static void printList (ExamList list) {
System.out.println ("성적 출력");
System.out.println();
int size = list.current;
Exam[] exams = list.exams;
for(int i=0; i<size; i++) {
Exam exam = exams[i];
int kor = exam.kor;
int eng = exam.eng;
int math = exam.math;
int total = kor+eng+math;
float avg = toatal/3.0f;
System.out.printf ("국어 : %d : %d\n, kor);
System.out.printf ("영어 : %d : %d\n, eng);
System.out.printf ("수학 : %d : %d\n, math);
System.out.printf ("총점 : %3d\n", total);
System.out.printf ("평균 : %6.2f\n, avg);
System.out.println ("----");
}
}
private static void input inputList (Exam[] exams) {
Scanner scan = new Scanner(System.in);
private static void input inputList (ExamList list) {
Scanner scan = new Scanner(System.in);
System.out.println ("성적 입력");
System.out.println();
for(int i=0; i<3; i++) {
do {
System.out.printf("국어 : ");
kor = scan.nextInt();
if(kor < 0 || 100 < kor)
System.out.println("국어성적은 0~100까지의 범위만 입력이 가능합니다.");
} while (kor < 0 || 100 < kor);
do {
System.out.printf("영어 : ");
eng = scan.nextInt();
if(eng < 0 || 100 < eng)
System.out.println("영어성적은 0~100까지의 범위만 입력이 가능합니다.");
} while (eng < 0 || 100 < eng);
do {
System.out.printf("수학 : ");
math = scan.nextInt();
if(math < 0 || 100 < math)
System.out.println("수학성적은 0~100까지의 범위만 입력이 가능합니다.");
} while (math < 0 || 100 < math);
Exam exam = new Exam();
exam.kor = kor;
exam.eng = eng;
exam.math = math;
Exam[] exams =list.exams;
int size = list.current;
if(exams.length == size) {
// 1. 크기가 5개 정도 더 큰 새로운 배열을 생성하시오
Exam[] temp = new Exam [size + 5];
// 2. 값을 이주시키기
for(int i=0; i<size; i++)
temp[i] = exams[i]
// 3. exams = temp; (X) → list.exams가 새로만든 temp 배열을 참조하도록 한다.
list.exams = temp;
}
list.exams[list.current] = exam;
list.current++;
}
🤍 함수 오버로딩(overloading) 🤍
public class ListProgram {
public static void main (String[] args) {
ExamList list = new ExamList();
list.exams = new Exam [3]
int current = 0;
int menu;
boolean keepLoop = true;
while(keepLoop)
{
menu = inputMenu();
switch(menu) {
case 1:
inputList(list);
break;
case 2:
printList(list);
break;
case 3:
System.out.println("Bye")
keepLoop = false;
break;
default:
System.out.println("잘못된 값을 입력하셨습니다. 메뉴는 1~3까지입니다.");
}
}
}
private static void printList(ExamList list) {
printList(list, list.current);
}
private static void printList (ExamList list, int size) {
System.out.println ("성적 출력");
System.out.println();
//int size = list.current;
Exam[] exams = list.exams;
for(int i=0; i<size; i++) {
Exam exam = exams[i];
int kor = exam.kor;
int eng = exam.eng;
int math = exam.math;
int total = kor+eng+math;
float avg = toatal/3.0f;
System.out.printf ("국어 : %d : %d\n, kor);
System.out.printf ("영어 : %d : %d\n, eng);
System.out.printf ("수학 : %d : %d\n, math);
System.out.printf ("총점 : %3d\n", total);
System.out.printf ("평균 : %6.2f\n, avg);
System.out.println ("----");
}
}
private static void inputList (ExamList list) {
Scanner scan = new Scanner(System.in);
System.out.println ("성적 입력");
System.out.println();
for(int i=0; i<3; i++) {
int kor, eng, math;
출처 : 링크텍스트