728x90
객체 배열 (Array of Objects)
- 배열을 매개변수로 받는 메서드
- 배열이 들어가는거지 숫자나 문자, 문자형이 들어가는게 아님
호출시 배열을 호출하는 것!!!
package dayo4;
import java.util.Arrays;
public class MethodEx04 {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5}; // int형으로 된 배열 있음
method01(arr); // 변수명 or 생성구문
} // end main
// 정수 배열을 매개변수로 받는 메서드
static void method01(int[] a) {
// a를 이용해서 배열밖의 사용 가능
System.out.println( Arrays.toString(a) ); // [1, 2, 3, 4, 5]
}
}
package dayo4;
import java.util.Arrays;
public class MethodEx04 {
public static void main(String[] args) {
String[] arr2 = {"월", "화", "수"};
method02(arr, arr2);
} // end main
// 정수 배열과 문자열 배열을 매개변수로 받는 메서드
static int method02(int[] arr, String[] arr2) {
for(int a : arr) { // 향상된 for문: 정수형 배열a를 배열 arr에 담겠다!
System.out.print(a); // 12345
} // 중간에 sysout해서 문단 나누기
for(String b : arr2) { // 향상된 for문: 문자형 배열b를 배열 arr2에 담겠다!
System.out.print(b); // 월화수
}
return 0;
}
}
package dayo4;
import java.util.Arrays;
public class MethodEx04 {
public static void main(String[] args) {
int[] arr3 = method03(); // return이 있는 메서드는 반드시 반환을 해줘야 함
System.out.println(Arrays.toString(arr3));
} // end main
// 배열을 반환하는 메서드
static int[] method03() {
int[] arr = new int[5];
arr[0] = 0;
arr[1] = 1;
arr[2] = 2;
arr[3] = 3;
arr[4] = 4;
return arr;
}
}
Quiz 23
import java.util.Arrays;
public class Quiz23 {
public static void main(String[] args) {
char[] arr = {'A', 'B', 'C'};
String result = method6(arr); // 결과변수(굳이 return한 str아니어도 됨) = 메서드이름(변수명)
System.out.println(result); // A, B, C
// System.out.println(method6(arr)); // 바로 넣어서 출력
} // end main
// method6 / String / char[] / char배열의 요소를 문자열로 모두 붙여서 리턴
static String method6(char[] arr) { // char[] arr 배열이 들어올 것이라고 확신
String str = ""; 문자열 붙이기
for(int i = 0; i < arr.length; i++ ) {
str += arr[i];
}
return str;
}
}
import java.util.Arrays;
public class Quiz23 {
public static void main(String[] args) {
int [] arr2 = {1, 2, 3, 4, 5};
int result2 = method7(arr2); // 여기도 굳이 sum 아니어도 됨
System.out.println(result2); // 15
// System.out.println(method7(arr2));
} // end main
// method7 / int / int[] / 배열의 요소의 합을 리턴
static int method7(int[] arr2) {
int sum = 0;
for(int i = 0; i < arr2.length; i++) {
sum += arr2[i];
}
return sum;
}
// static int method7(int[] arr2) { // int a는 요소값
// for(int a : arr) {
// sum += a;
// }
// return sum;
// }
}
import java.util.Arrays;
public class Quiz23 {
public static void main(String[] args) {
String[] arr3 = method8("홍길동", "이순신");
System.out.println( Arrays.toString(arr3)); // [홍길동, 이순신]
// System.out.println( Arrays.toString(method8("월", "화")) ); // [월, 화]
} // end main
// method8 / String[] / String, String / 매개 변수를 배열에 저장하여 배열 리턴
static String[] method8(String a, String b) {
String[] arr = {a, b};
return arr;
}
}
메서드의 실행
동기적 실행
- 순서대로 실행
- 함수 안에서는 필요하면 언제든 불러서 출력 가능
test01 사이에 test02 부르기 가능 → test01-1 / test02-1 / test02-2 / test01-2 순서로 진행
재귀적 실행 (재귀호출)
- 다시 돌아오기 때문에 리턴으로 중지
- 효율성이 떨어져서 된다고만 알면 됨. 잘 안 씀
- 팩토리얼, 피보나치 수열
- java study에서 다시 확인함
package dayo4;
public class MethodEx05 {
public static void main(String[] args) {
// 메서드의 (동기적) 실행
test01(); // test01-1 / test02-1 / test02-2 / test01-2
// 메서드의 재귀적 실행
recursive(0); // 0번 호출 ~ 9번 호출
int result = fac(5);
System.out.println(result); // 5*4*3*2*1 = 120, fac(1) = 1
} // main 끝
static void test01() {
System.out.println("1번 메서드 실행");
test02();
System.out.println("1번 메서드 종료");
}
static void test02() {
System.out.println("2번 메서드 실행");
System.out.println("2번 메서드 종료");
}
static void recursive(int a) {
// 재귀적 함수는 탈출의 구문을 반드시 명시한다.
if(a == 10) return;
System.out.println(a + "번 호출");
a++; // 1증가
recursive(a); // 다시 나 자신 실행
}
static int fac(int a) {
if(a == 1) return 1; // f(1) = 1
return a * fac(a-1);
}
}
- recursive 메서드는 a == 10이면 출력하지 않고 return되므로, 0 ~ 9번까지만 호출됨
- fac 메서드는 fac(1) = 1이 나오고, 5를 넣으면 5*fac(4)=5*4*fac(3)= 5*4*3*2*1 = 120
피보나치 수열
- 첫째 및 둘째 항이 1이며 그 뒤의 모든 항은 바로 앞 두 항의 합인 수열
- 1, 1, 2, 3, 5, 8, 13, 21 . . .
1. 배열 사용 - 오버플로우 발생
class Solution {
public int solution(int n) {
int[] answer = new int[n+1]; //인덱스 0부터 시작하므로 크기는 n+1
return fibo(n, answer);
}
public static int fibo(int i, int[] answer) {
if (answer[i] != 0) {
} else {
if (i <= 2) {
// 1번 항과 2번 항은 1로 초기화
answer[i] = 1;
} else {
// 3번째 항 부터는 계산
answer[i] = fibo(i - 1, answer) + fibo(i - 2, answer);
}
}
return answer[i];
} //end fibo
}
2. 재귀함수 사용 - 오버플로우 발생
//배열을 사용하는 것보다 더 느림
class Solution {
public int solution(int n) {
return fibo(n);
}
public static int fibo(int i) {
if (i <= 1) {
return i;
} else {
return fibo(i - 1) + fibo(i - 2);
}
} //end fibo
}
- n이 매우 큰 경우 n번째 피보나치 수는 언어가 표현할 수 있는 자료형의 범위를 넘어가, 오버플로우 생성
- int 형은 -2,147,483,648 ~ 2,147,483,647 (32비트)
- 44번째 피보나치 수만 가도 2,971,215,073로 int 범위를 넘어버림
모듈러 연산 : (A + B) % C ≡ ( ( A % C ) + ( B % C) ) % C
https://school.programmers.co.kr/questions/11991
3. 정답
class Solution {
public int solution(int n) {
int[] answer = new int[n+1]; //인덱스 0부터 시작하므로 크기는 n+1
for(int i = 0; i <= n; i++) {
if(i == 0)
answer[i] = 0;
else if(i == 1) {
answer[i] = 1;
} else {
int sum = answer[i-2] + answer[i-1];
answer[i] = sum % 1234567;
}
}
return answer[n];
}
}
- 매번 1234567로 나눈 나머지를 넣어줌
오늘 하루
더보기
기억에 남는 부분
- 메서드는 보통 동기적으로 = 순서적으로 실행됨
- 결과 변수는 굳이 return한 값과 같지 않아도 되고, 두줄로 만들지 않고 한번에 출력도 가능
하지만 나중에 제대로 출력되지 않을수도 있으니 정석대로 만들어서 출력 하는 것 추천!
어려운 부분
- 메서드에서 배열을 넣으면 메인에서 부를때도 배열 이름으로 호출해야 함
- 배열값을 입력하는게 아니라 그냥 배열을 만드는 매서드이므로 값을 따로 넣거나 만들어져 있는 것을 불러서 사용
문제 해결 부분
- 재귀적 함수는 제대로 이해하지 못했지만 fac메서드가 어떻게 돌아가는지 이해함
728x90
'프로그래밍 언어 > Java' 카테고리의 다른 글
[Java] Garbage Collecting, package(패키지), 데이터타입, 객체지향 프로그래밍 기술(상속, 은닉, 다형성) (0) | 2022.10.06 |
---|---|
[Java] object(객체), class(클래스), 변수(멤버/지역), 생성자(constructor) (0) | 2022.10.05 |
[Java] method(메서드) (0) | 2022.10.04 |
[Java] String 클래스, 문자열 자르기(subString, split, toCharArray) (0) | 2022.09.30 |
[Java] Array insert, update, delete (배열의 삽입, 수정, 삭제) (0) | 2022.09.29 |