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

  • 어떤 특정 객체를 만들었을때, 자동적으로 만들어져서 가지고 있는 참조 변수. 이 녀석이 가리키는 것은 자기 자신이다.

가비지 컬렉션

  • 잘 몰라도 되는 내용. 수업 때 설명해주더라도 가볍게 설명해주실 예정

좋은 웹페이지 즐겨찾기