JAVA - Newlecture (2)

suesue lee·2022년 2월 21일
0

JAVA

목록 보기
3/6

이 글은 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++; 

	}

🤍 가변 길이 배열 구현하기 🤍

공간을 점진적으로 늘리는 위치와 방법

  1. amount개 확장한 새로운 배열 temp 를 생성한다.
  2. list에 있는 데이터를 temp 배열로 옮긴다.
  3. temp가 참조하는 객체를 list 가 참조하게 한다.
  4. 현재 capacity의 값을 +10 증가시킨다.

// 만약 공간이 부족하다면

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;

출처 : 링크텍스트

profile
미래의 웹프로그래머

0개의 댓글