Circle ob1 = new Circle(1);
Circle ob2 = new Circle(2);
Circle s;
s = ob2;
ob1 = ob2; // 객체 대입연산 => 주소값이 복사됨
Circle[] c;
c = new Circle[5]; // 참조 변수 5개를 가지는 배열을 생성한 것.
// 즉, 주소값을 저장하고 있는 배열 생성.
각 인덱스에 들어있는 참조변수들을 힙 영역에 있는 실제 Circle 객체들을 가리키고 있다.
for(int i=0; i < c.length; i++)
c[i] = new Circle(i); // 반복문을 돌려서 힙 영역에 실제 객체 생성
자바는 Pass by reference 방식으로 보일 수 있겠지만, 실제로는 pass by value 방식으로 전달이 된다.
다만, 값을 복사한 녀석이 기본 타입 변수가 아닌 참조변수라면 그 녀석의 특성상 마치 pass by reference 방식으로 인자를 전달받는 방식인 것 것 처럼 보인다.
하지만 이것도 실제로는 pass by value 방식이다 (방식은 똑같지만 결과가 다른 것뿐이다)
=> 주소 "값" 을 전달(복사하게)하는 것이므로 Pass by Value 방식이다. 결국 값을 복사해줬지만 참조변수가 주소를 가지고 있으므로 동일한 대상 객체를 공유하는 것이다. 근데 pass by reference 처럼 보이는 것일 뿐이다.
생성자 오버로딩과 모든 규칙이 동일함
오버로딩 조건 : 매개변수의 타입, 개수, 순서가 달라야함
실제로는 메소드 오버로딩 자주 사용안함 (모호한 상황이 자주 발생해서)
예시
아래의 두 메소드가 동일한 클래스 내에서 오버로딩 되었다고 하자.
double sum(int a, double b) // 1번 메소드
{
return a + b;
}
double sum(double a, int b) // 2번 메소드
{
return a + b;
}
그리고 아래처럼 main 함수에서 함수를 호출했다고 하자.
이때 둘 다 int값을 넣는다.
a.sum(1,2);
1번 메소드에서 1이 int 로 가는것은 문제가 없고, 2가 double 로 가는것도 문제없다.
2번 메소드에서도 아무 문제가 없다.
즉, sum(1,2); 이렇게 호출하는 과정에서 두개의 오버로딩된 메소드로 갈 수 있다. (모호한 상황 발생)
=> 양쪽이 둘다 동등한 비중을 가지고 있어서 에러 발생!
예제 9번
sum1 메소드
클래스 메소드의 매개변수 형식으로 int[] values 와 같이 배열 형식을 명시해주면 실제로 메소드 sum1 을 호출시 배열을 넘겨줘야한다.
sum2 메소드
그런데 매개변수 형식을 배열 형식으로 명시하지않고 ... 와 같이 명시하면
매개변수에 값을 넘겨줄때 꼭 배열을 안넘겨줘도, 그냥 값을 여러개를 넘겨줘도 배열화가 되어서 넘어간다.
<=> static 멤버 : 멤버는 멤버인데, 객체 내부에 존재하지 않는 녀석.