// overloading : 메소드 중복정의
// 메소드 이름은 같지만 메소드 괄호안에 있는 매개변수의 개수가 다르거나 자료형이 다르면 다른메소드이다.
public class Ex10_overloading {
public static void main(String[] args) {
Test10 ob = new Test10();
ob.print();
short a = 10;
ob.print(a); // int: 10
// 동일한 기본자료형의 인수를 가진 메소드가 없으면
// 기본자료형중에 가장 가까운 큰 자료형의 메소드 호출
Short b = 10;
ob.print(b); // Short: 10
int c=10;
ob.print(c); // int: 10
long d=10;
ob.print(d); // Long: 10
// 매개변수 인수가 기본자료형 중 같거나 큰 것이 없는 경우
// Wrapper 클래스가 존재하면 Wrapper에서 찾는다.
// Wrapper 클래스도 없으면 컴파일 오류
// 기본자료형이 우선순위가 높음.
// long 은 8byte 이므로 기본자료형의 인스턴스 메소드에서 기본자료형은 int(4byte)형
// 밖에 없으므로 Wrapper 클래스 Long 으로 가서 출력!
}
}
class Test10 {
public void print() {
System.out.println("인자가 없는 메소드");
}
/* // 컴파일 오류. 메소드 오버로딩이 아니다. 오버로딩은 매개변수의 개수가 다르거나 자료형이 달라야한다.
public int print() {
return 1;
}
매개변수의 타입이 다르거나, 매개변수의 개수가 달라야 한다.
자료형이 다르다고 메소드 이름을 다 다르게 주면 가독성이 떨어짐.
System.out.println() 메소드의 중복정의의 예.
데이터타입이 달라도 출력하는 것은 다 같음
리턴타입으로 구분하는 것이 아님!
*/
// Wrapper 클래스 : 기본 자료형에 대응하는 클래스로 Short, Integer, Long 등...
// Short : Wrapper 클래스. 기본자료형인 short를 클래스로 작성한 것★★★
public void print(Short a) {
System.out.println("Short: "+a);
}
public void print(int a) {
System.out.println("int: "+a);
}
// Long : Wrapper 클래스. 기본자료형인 long을 클래스로 작성한 것.
public void print(Long a) {
System.out.println("long: "+a);
}
public void print(int a, int b) {
System.out.println("매개변수 2개: "+a+","+b);
}
}
// 재귀호출 : 메소드에서 자신의 메소드를 다시 호출. 처리하지 못한 데이터는 스택에 저장
public class Ex07_recursion {
public static void main(String[] args) {
Test7 ob = new Test7();
ob.print(5);
// stack이 넘치면 StackOverflowError 발생
}
}
class Test7 {
public void print(int n) {
if(n>1) {
print(n-1); // 메소드에서 자신의 메소드를 호출
}
System.out.println(n);
}
}
// 파라미터 전달 방법
public class Ex04_method {
public static void main(String[] args) {
Test4 tt = new Test4();
int n = 5;
// call by value
tt.sub1(n);
System.out.println(n); // 5
// call by reference
tt.sub2(tt); // tt객체의 주소값을 보냄
System.out.println(tt.x); // 15
int []ss = {10,20,30};
tt.sub3(ss);
System.out.println(ss[1]);
// 실인수와 가인수의 자료형은 같아야함.
}
}
class Test4 {
int x=10;
// call by value(기본) : 실매개 변수와 형식 매개변수가 기억공간 따로 확보
public void sub1(int a) {
a = a+10;
}
// call by reference : 레퍼런스변수(객체)
public void sub2(Test4 t) { // tt의 주소값을 t가 받음. 자료형이 Test4임.
// 보내는 것이 Test4의 레퍼런스변수 이므로 Test4의 레퍼런스변수로 받아야함
// 다시만드는 것이 아님. 메모리할당이 아님.
t.x +=5;
}
// call by reference : 레퍼런스변수(배열)
public void sub3(int[] nn) {
nn[1] += 100;
}
}
public class Ex03_method {
public static void main(String[] args) {
Rect r = new Rect();
int a, b;
r.width = 10;
r.height = 5;
a = r.area();
b = r.length();
System.out.println("넓이:"+a+", 둘레:"+b);
}
}
/*
- 직사각형의 넓이와 둘레계산
- 데이터(상태) : 가로, 세로
- 메소드 : 넓이계산, 둘레계산
*/
class Rect {
int width;
int height;
// 필드 선언 시, 자료형이 같아도 따로따로 선언한다.
// 넓이
public int area() {
return width * height;
}
// 둘레
public int length() {
return (width + height) * 2;
}
}