6-2장. 클래스
객체의 대입연산
- 기본 타입을 제외한 모든 변수는 다 참조자 타입이다.
- 주소값이 복사된다. 즉, 참조변수 이기 때문에 동일한 객체를 가리키게 된다.
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 멤버 : 멤버는 멤버인데, 객체 내부에 존재하지 않는 녀석.
this
- 어떤 특정 객체를 만들었을때, 자동적으로 만들어져서 가지고 있는 참조 변수. 이 녀석이 가리키는 것은 자기 자신이다.
가비지 컬렉션
- 잘 몰라도 되는 내용. 수업 때 설명해주더라도 가볍게 설명해주실 예정
Author And Source
이 문제에 관하여(6-2장. 클래스), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@msung99/6-2장.-클래스저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)