이번주 수업은 내용 이해(메소드,힙, 스택영역)와 실습, 지난주 진도 반복(for문, while문)이 주였어서 크게 트러블 슈팅을 작성할 게 없었다.
따라서 [주간 정리]에서 이론적으로 이해한 내용을 정리하고, 미니 프로젝트 코드 리뷰를 통해 트러블 슈팅을 작성하였다.
자바 프로그램은 중간 단계의 바이트 코드이다. 이것을 해석하고 실행을 하려면 가상의 운영체제가 필요하다.
그 가상의 운영체제가 jvm(java virtual Machine)이다. 자바 가상 기계라고도 한다.
jvm의 메모리 영역은 크게 3가지 영역으로 구분된다.
① 메소드(Method) 영역 : 클래스들을 클래스 로더로 읽어 클래스별로 런타임 상수 풀, 필드 데이터, 메소드 데이터 등을 분류해서 저장
② 힙(Heap) 영역 : 객체와 배열이 생성되는 영역. jvm 스택 영역에서 생성된 변수나 다른 객체의 필드를 이 곳에 있는 객체와 배열을 참조.
③ JVM 스택(stack) 영역 : 스레드마다 하나씩 존재. 스레드가 시작할 때마다 JVM 스택 영역이 할당
*스택(stack) : LIFO(후입선출) 나중에 들어온 객체가 가장 먼저 나간다는 뜻.
■ 오버로딩
- 하나의 메소드 이름으로 여러 기능을 담는다 하여 붙여진 이름.
- 같은 목적으로 비슷한 동작을 수행하는 메소드들은 같은 이름으로 일관되게 작업
- 같은 클래스 내에서 [같은 이름의 메서드]를 여러 개 선언
- jvm은 같은 이름의 메서드가 있으면 파라미터 [타입]과 [갯수]로 비교하여 다른 메서드로 인식함
- 생성자 오버로딩 : 매개 변수를 달리하는 생성자를 여러 개 선언하는 것
- 메소드 오버로딩 : 클래스 내에 같은 이름의 메소드를 여러 개 선언하는 것.
1.public static void star() --- 오류안남
2.public static void star(int a) --- 오류안남
3.public static void star(int b) --- 오류남 //2번이랑 같은 이름의 메서드인데 파라미터의 타입이 동일
4.public static int star(int b) --- 오류남 //리턴값은 영향 주지 않음(void와 int 어떤 것을 사용하던지 같은 메소드로 인식)
5.public static void star(int b, int b) --- 오류안남 //위의 메소드와 파라미터의 갯수가 달라서 다른 메소드로 인식
■ 트러블 슈팅
- 현상
줄바꿈 미출력
- 원인
if(num % 7 == 6){System.out.println();}
//나머지가 6이 될 때 마다 줄바꿈을 선언하고자 코드 작성
- 해결책
코드 작성할 때 String 변수 result에 출력 값들을 저장해두었으면서 줄바꿈 출력 코드는 result에 대입하지 않았음. 그래서 마지막 '//출력'에서 System.out.println(result)을 해도 줄바꿈 코드가 출력되지 않았다. 또한, 나머지 6인 곳에서 줄바꿈을 하고자 했지만 num%7 == 0을 선언해야 내가 원하는 위치에서 줄바꿈이 출력되었음
- 현상
메소드 오버로딩
- 원인
파라미터가 int, 1개인 star 메소드가 리턴값이 void, String인 2개의 동일한 메소드가 선언됨. 리턴값은 영향을 주지 못하므로 동일한 이름의 메소드가 선언된 것임.
- 해결책
String star(int a) 또는 void star(int a) 둘 중 하나를 삭제해야 함.
- 현상
'최대공약수 : 5' 가 두 번 출력됨
- 원인
최소공배수를 구할 때, 최대공약수를 이용해야 해서 최소공배수 소스에 gcd=gcd(a,b)를 작성했다. gcd 메소드에서 System.out.println(b);로 최대공약수를 이미 출력했고, 최소공배수를 구하기 위해서 lcm메소드에 gcd메소드의 리턴값를 이용했는데 이 때문에 lcm메소드가 돌아가면서 gcd 메소드의 System.out.println(b); 소스가 작동하면서 '최대공약수 : 5' 가 다시 출력됨.
- 해결책
gcd 메소드와 lcm메소드에서 System.out.println(); 코드를 사용하지 않고 main메소드에서 gcd(int a, intb), lcm(int a, int b)를 사용해서 리턴값을 따로 출력했더니 원하는 출력값이 나왔다.
//수정한 코드
import java.util.Scanner;
public class Recusive_ex002 {
public static int inputNum() {
Scanner sc = new Scanner(System.in);
int a = 0;
System.out.print("숫자를 입력해주세요 > ");
a = sc.nextInt();
return a;
}
public static int gcd(int a, int b) {
int max = 0;
max = (a > b) ? a : b;
if (a % b == 0)
return b;
return gcd(b, a % b);
}
public static int lcm(int a, int b) {
int gcd = 0, num1 = 0, num2 = 0, lcm = 0;
gcd = gcd(a, b);
num1 = a / gcd;
num2 = b / gcd;
lcm = gcd * num1 * num2;
return lcm;
}
public static void main(String[] args) {
int num1 = inputNum();
int num2 = inputNum();
System.out.println("최대 공약수 : " + gcd(num1, num2));
System.out.println("최소 공배수 :" + lcm(num1, num2));
}// end main
}// end class
'Java 실습' 카테고리의 다른 글
[220524]Class_수정하기 (0) | 2022.05.24 |
---|---|
[220523] Method, JavaApi (0) | 2022.05.24 |
[220518] Method (0) | 2022.05.19 |
[220516] Array[][] 2차원 배열 (0) | 2022.05.16 |
[220513] 배열 (0) | 2022.05.15 |