국비수업/CODE

code 실습 / 1️⃣4️⃣

밀김 2023. 3. 7. 17:07
728x90

 
 
 
 
✏️ Java 함수의 기본 형태를 안보고 손으로 적으세요..

static  반환타입  함수이름(){

return 반환값;

}

 
✏️ Java 함수의 기본 형태를 코드로 적어보세요.

static int num(int a, int b){

return a+b;

}

✏️ sum이라는 함수가 있을 때, “sum();”을 뭐라고 읽어야 할까요? 
sum() 호출
 
✏️ sum이라는 함수가 있을 때, “sum을 호출하다”를 코드로 어떻게 작성해야할까요?
sum( );
 
✏️ int형 변수 x, y를 인자로 받아 x, y 값을 더하여 리턴하는 함수를 선언하여 사용해보세요.

package ex6.fun;
public class Exam {
	
	static int add(int x,int y)
	{
		return x+y;
	}
	
	public static void main(String[] args) {
		int x = 3;
		int y = 6;
		int result = add(x,y);
		System.out.println(result);
	}

 
 
✏️ int형 변수 x, y를 인자로 받아 x, y 값을 곱하여 리턴하는 함수를 선언하여 사용해보세요.

package ex6.fun;
public class Exam {
	
	static int add(int x,int y)
	{
		return x*y;
	}
	
	public static void main(String[] args) {
		int x = 3;
		int y = 6;
		int result = add(x,y);
		System.out.println(result);
	}

 
 
⭐️ int형 변수 x를 인자로 받아 x의 값이 홀수 여부를 리턴하는 함수를 선언하여 사용해보세요.
함수는 세가지 버전을 만들어주세요.
 

	//If문 또는 if else문을 사용하여 구현 isOddNum1
    
    static int sum(int x,int y)
	{
		if(x%2==1)
			return x;
		else
			return y;
	}
	
	public static void main(String[] args) {
		int x = 3;
		int y = 5;
		int result = sum(x,y);
		System.out.println(result);
	}

 

 

	//삼항연산자를 사용하여 구현 isOddNum2
    
    static int sum(int x,int y)
	{
		int result = (x%2==1)?x:y;
		//참,거짓을 담을 변수 result = (참,거짓 판별받을 조건식)?참이면x반환:거짓이면y반환
		return result;
	}
	
	public static void main(String[] args) {
		int x = 7;
		int y = 5;
		int result = sum(x,y);
		System.out.println(result);
	}


 

 

 

 

	//오직 return문, 단항 연산자와 비교 연산자만 사용하여 구현 isOddNum3 (구현부가 코드 한줄로 끝나야함)

	static boolean sum(int x)//매개변수,인자
	{
		return x%2==1;
		//x를 2로 나누었을때 1이 나오면(=홀수면)
	}
	
	
	public static void main(String[] args) {
		boolean result = sum(5);
		System.out.println(result);
	}

 
 
 
 
 
✏️ 아무것도 리턴하지않는 함수 printHello()를 구현해보세요. 이 함수의 기능은 콘솔에 Hello!를 출력하는게 전부인 함수입니다

public class Program1 {
	
	//반환값이 없다면 void 사용
	static void printHello() {
		System.out.println("Hello!");
	}
	
	public static void main(String[] args) {
		printHello(); // 함수호출
	}
}
package ex6.fun;
public class Theglory {
	
	public static void main(String[] args) {
		String result = printHello();
		System.out.println(result);
	}
	
	static String printHello() {
		return "Hello!";
		
	}

}

 * 함수 호출은 main에서만 할수있다
 
 
 
 
 
 
⭐️ 정수형 배열 int[] nums를 인자로 받아 크기를 2배로 만들어 리턴하는 함수를 구현해보세요. 그림으로 치면 다음과 같습니다

package newlec;
public class Program {
	
//	static int num(int x,int y)
//	{
//		return x+y;
//		
//	}
//	
//	public static void main(String[] args) {
//		int x = 1;
//		int y = 2;
//		int result = num(x,y);
//		System.out.println(result);
//	}
	
//	static int num(int x,int y)
//	{
//		return x*y;
//	}
//	
//	
//	public static void main(String[] args) {
//		int x = 2;
//		int y = 3;
//		int result = num(x,y);
//		System.out.println(result);
//	}
	
//	static int sum(int x,int y)
//	{
//		
//		int result = (x%2==1)?x:y;
//		//참,거짓을 담을 변수 result = (참,거짓 판별받을 조건식)?참이면x반환:거짓이면y반환
//		return result;
//		
//	}
//	
//	public static void main(String[] args) {
//		int x = 7;
//		int y = 5;
//		int result = sum(x,y);
//		System.out.println(result);
//	}
	
	static int[] array(int[] nums)
	{
		int[] tmp = new int[nums.length*2];
		//nums의 길이 두배인 tmp배열을 만든다
		for(int i=0; i<nums.length; i++)
			tmp[i] = nums[i];
		//길이 작은 배열의 값을 길이 큰 배열에 넣어줌
			nums = tmp;
		//길이가 큰 배열의 참조변수를 길이 작은 배열 참조변수 이름과 바꿔준다. 이 과정에서 배열 크기가 늘어남
			return nums;
		//최종적으로 int[] nums 값 반환	
	}//재사용성이 높은 애들만 함수쪽에 넣어준다. 그래서 함수를 만들땐 재사용성이 높게 만드는게 좋다
	//내가 만든거 = 함수 , 자바가 만들면(기본제공) = 메소드
	
	public static void main(String[] args) {
		int[] nums = new int[2];
		//길이 작은 nums배열 생성
		int[] result = array(nums);
        //늘린 배열의 결과값을 출력해줄 result배열 생성
		System.out.println(result.length);
        
		//옮겨지는 순서 array(nums)→array(int[] nums)→return nums;→int[] result = array(nums);
	}
}

 
 
 
 
 
 
 
⭐️ 호출할 때마다 중복되지 않는 로또번호를 반환하는 함수를 구현해보세요. 로또번호는 int형 배열로 반환해야 합니다.
⭐️ 위 문제에서 하나의 함수(로또번호 생성)가 여러 기능을 갖고 있다고 생각하시나요?
- 그렇게 생각한다면 로또번호를 생성하는 함수 내부를 또 함수로 쪼개보세요.
- 그리고 함수명과 구현을 조원들과 논의해보세요.

	static int[] createLotto()//lotto배열의(int[]) createLotto객체니까
	{
		Random rand = new Random();
		//로또 랜덤 객체 생성
		int[] lotto = new int[6];
		//로또 담을 6개 배열 생성
		for(int i=0; i<lotto.length; i++) {
			lotto[i] = rand.nextInt(45)+1;
			//로또 배열에 랜덤값 순서대로 담는 과정
			i = checkDup(i,lotto);
			//중복제거 함수 checkDup를 호출해준다(로또배열의 i값을 호출해서 최종 출력하고 싶은 거니까)
		}return lotto;
	}
	
	//중복제거 함수 
	static int checkDup(int i,int[]lotto)//checkDup의 매개변수 (int i,int[]lotto)
	{
		for(int j=0; j<i; j++)
			if(lotto[i]==lotto[j])
				//중복이 발생하면
				i--;
				//로또의 인덱스 하나를 감소시켜준다(빠꾸한다)
		return i;
		
	}
	
	public static void main(String[] args) {
		int[] lotto = createLotto();
		//lotto배열에다가 createLotto 객체 생성
		for(int i=0; i<lotto.length; i++)
			System.out.printf("%d ",lotto[i]);
	}

 

 

흐름 그림 설명




 
 
 
- 이런 작업을 하면 무엇이 좋을까요?
직관적으로 볼수 있어서 좋나?~~~~~~~기분이 째진다~~~~~~~^^
 
 
 


 

 

 

<성적관리 프로그램 배열크기 늘리기>

		Exam[] exams = new Exam[5];
		int index = 0;

		END: while (true) {
			if(index == exams.length) {//공간이 충분한지 또는 여유공간이 잇는지
				//인덱스가 exams길이의 최대만큼 됐을때
				//공간을 늘리는 코드 작성
				Exam[] temp = new Exam[exams.length+3];
				//배열을 옮길 큰방을 마련
				for(int i=0; i<exams.length; i++)
					temp[i] = exams[i];
				//큰방 temp에 exams값을 옮긴다
					exams = temp;
				//temp로 exams를다시 정의해주면서 exams는 가비지 콜렉터로 이동	
			}
			int menu;//switch작동을 위한
			{
				System.out.println("┌────────────────────────┐");
				System.out.println("│          성적관리         │");
				System.out.println("└────────────────────────┘");

				Scanner sc = new Scanner(System.in);
				System.out.println("번호를 입력해 주세요");
				System.out.println("1. 성적 입력");
				System.out.println("2. 성적 출력");
				System.out.println("3. 성적 저장");
				System.out.println("4. 성적 로드");
				System.out.println("5. 종료");
				System.out.print("번호를 입력해주세요 >");

				menu = sc.nextInt();
			}
			switch (menu) {
			case 1:
				System.out.println("┌──────────────┐");
				System.out.println("┃    성적입력    ┃");
				System.out.println("└──────────────┘");

				Scanner sc = new Scanner(System.in);
				while (true) {
					Exam exam = new Exam();
					exams[index] = exam;
					//exams객체 인덱스값에 exam을 넣어준다.

					System.out.print("국어 성적을 입력하세요: ");
					exam.kor = sc.nextInt();
					System.out.print("영어 성적을 입력하세요: ");
					exam.eng = sc.nextInt();
					System.out.print("수학 성적을 입력하세요: ");
					exam.math = sc.nextInt();

					index++;
					System.out.println("계속하겠습니다 1번, 아니면 그외번호");
					menu = sc.nextInt();//메뉴switch문이 다시 작동된다
					if(menu==1) { //계속하겠다고하면
						continue;//컨티뉴문에 의해 성적 입력으로 다시 돌아간다
					}else {
						System.out.println("첫화면"); //성적관리로 돌아간다
						break; //while break
					}
					//계속 하쉴? 
				} //while
				break; //case1 break

			case 2:
				System.out.println("┌──────────────┐");
				System.out.println("┃    성적출력    ┃");
				System.out.println("└──────────────┘");
				for (int i = 0; i <index; i++) { 
					Exam exam = exams[i];
					int kor = exam.kor;
					int eng = exam.eng;
					int math = exam.math;
		
					System.out.printf("국어%d : %d\n",i+1,kor);
					System.out.printf("영어%d : %d\n",i+1,eng);
					System.out.printf("수학%d : %d\n",i+1,math);
				}
				break;
			case 3:
				System.out.println("┌──────────────┐");
				System.out.println("┃    성적저장    ┃");
				System.out.println("└──────────────┘");
				//fileout을 이용해 입력받은 exams[i]값을 파일에 쏴주는
				FileOutputStream fos = new FileOutputStream("res/exam-grad.txt");
				PrintStream ps = new PrintStream(fos);
				for(int i=0; i<index; i++) {
					Exam exam = exams[i];
					int kor = exam.kor;
					int eng = exam.eng;
					int math = exam.math;
					ps.printf("%d %d %d", exam.kor, exam.eng, exam.math);
				}
		
				System.out.println("<성적 저장 완료>");
				fos.close();
				break;
			case 4:
				System.out.println("┌──────────────┐");
				System.out.println("┃    성적로드    ┃");
				System.out.println("└──────────────┘");
				//fileInput을 이용해 콘솔에 출력하는
				FileInputStream fis = new FileInputStream("res/exam-grad.txt");
				Scanner fsc = new Scanner(fis);
				for(int i=0; i<index; i++) {
					//값을 처음 생성한 배열길이만큼 넣어놓고 늘린 배열의 전체길이인 8을 출력하려고 해서 오류가 났다?
					exams[i].kor = fsc.nextInt();
					exams[i].eng = fsc.nextInt();
					exams[i].math = fsc.nextInt();
					System.out.printf("국어:%d\n영어:%d\n수학:%d\n",exams[i].kor,exams[i].eng,exams[i].math);
				}//exams[i]는 객체배열이라서 객체 자체를 출력하려고 하면 오류가 나고, 객체안에 들어있는 값을 출력해줘야한다
				fis.close();
				break;
			case 5:
				System.out.println("성적관리 프로그램을 종료합니다.");
				break END;
			default:
				System.out.println("다시 입력해주세요.");
				break;

			}

		}


 
 

 

 

 

 

 

 

 

 

728x90