code 실습 / 1️⃣4️⃣
✏️ 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;
}
}