2013년 8월 18일 일요일

08.12 클래스기초 - 객체의 필드(변수) 참조/GC

1.객체의 필드의 참조

- 객체의 필드들은 필드명에 의하여 접근된다.
- 외부의 코드는 반드시 객체레퍼런스(object reference), 필드명을 사용해야 한다.
- 예)
Class Rectangle {
   int width;
   public Rectangle(int w) {
      width=w; //내부에서 width필드의 접근.
   }
}

Class B {
   public static void main (String args[]) {
      Rectangle rect = new Rectangle(100);// width 초기화
      Int length = rect.width; // 외부에서 width 필드의 접근
   }
}

- 객체 참조를 통한  instance필드의 효출은, 특정한 객체의 필드 호출을 의미한다.
- 그밖에, 객체의 접근을 위하여, new 연산자가 반환하는 object reference값을 바로 사용할 수 있다.
이 경우, 프로그램은 객체의 reference를 갖지 않게 되므로, 이 객체는 Garbage Collection의 대상이 된다.
예) int width = new Rectangle(100).width;//

2.객체의 메서드 호출

- 객체의 instance 메서드를 호출하기 위해서
objectReference,메서드명(인수)을 사용해서 호출
- 예)
Class Rectangle {
   ...
   public Area getArea() {
      return area;
   }
}
Class B {
   public static void main (String args[]) {

   }
}

- 오브젝트레퍼런스를 통한 instance메서드의 호출을,특정한 object의 메서드의 호출을 의미한다.
- 이회에, 필드와 마찬가지로 객체의 접근을 위하여 new 연산자가 반환하는 object reference값을 바로 사용할 수 있다.
예) Int area = new Rectangle(100).getArea();//

3. Gargage Collection

- 객체가 더이상 사용되지 않고 있다는 것이 확정될때, JRE 가 그 객체를 삭제하는 프로세스.
- 객체는 자신을 가리키고 있는 어떠한 reference도 없을때 garbage collection에 대한 대상이 된다.
- 객체의 reference가 끊어지는 때는
1) reference를 보유하고 있던 참조변수가 자신의 scope을 벗어날때(지역변수)
2) 참조변수에 null값을 대입할때.

- JRE 의 Garbage collector는
reference가 없는 객체들을 메모리로부터 제거한다.

메서드로부터 값의 반환

- 메서드가 자신을 호출했던 곳으로 복귀하는 경우

  1. 메서드에 있는 모든 문들의 실행을 완료했을때
  2. return 문에 도달했을때.
  3. 예외를 던질때
- 메서드 선언문에서 반환할 값이 있는 경우 반환할 자료형을 명시하였는데, 메서드의 body내에서 값을 반환하기 위하여  return문을 사용한다.
- void 로 선언된 메서드도, return문을 사용할 수 있다.

- return값의 자료형은 메서드에서 선언된 반환 자료형과 일치되어야 함
   (단, 자동형병환, subclass는 예외)
- 메서드가 참조데이터형을 반환하는 경우는, 반환되는 자료형의 class는 메서드의 반환자료형과 동일한 class이거나, 또는 subclass 일수 있다.(다형성)


메서드 또는 생성자에 정보전달 :참고


1) 기본형 자료의 전달.
2) 참조형 자료의 전달.

기본형 자료의 전달

- call by value 로 전달.
- 매개변수의 값에 대한 변경은,. 그 메서드의 scope에서만 유지되고, 메서드가 복귀할때 매개변수와 어떤 변경들도 모두 사라진다.
- 예)
class MyUtil {
   void swap(int a, int b) {
      int temp = a;
      a=b; b=temp; //a 와 b 의 swap 은 메서드의 복귀후에는 유효하지 않음.
      return;
   }
}

참조형 자료의 전달

- call by reference 로 전달.
- 전달되는 reference값은 동일한 객체를 참조.
- 그러므로, 매개변수의 reference 가 가리키는 객체의 필드에 대한 변경은, 메서드가 복귀한 후에도 유지된다.
- 예)
class MyUtil {
   void swap(MyNums num) {
      int temp = num.a;
      num.a=num.b; num.b=temp; //MyNum의 a 와 b 의 swap 은 메서드의 복귀후에도 유지됨.
      return;
   }
}
=======================================

가변인자

- 메서드를 호출할때 전달하는 인자의 갯수가 정해져 있지 않음.(sdk5 부터) -- 타입은 동일
- 일반적으로, 메서드의 매개변수의 갯수와 메서드 호출시 전달되는 인자의 갯수는 동일해야 함.
- 형식 : 반환자료형 메서드명(매개변수타입... 변수명) {
             ... // 매개변수를 배열로서 사용.
}
- 예)
//가변인자를 갖는 메서드의 정의
public static void foo(int ... nums)
{
    for(int num : nums)
    {
        System.out.print(num);
    }
    System.out.println();
    System.out.printf("The last number of list is %d\n", nums[nums.length - 1]);
}
public static void main(String [] args
{//메서드의 호출
    foo(1);  //1개의 숫자 전달
    foo(1, 2, 3);//3개의 숫자 전달
    foo(1, 2, 3, 4, 5);//5개의 숫자 전달
}
----------------
public static void print(String ... args) { //
   for(int i=0; i< args.length;i++) {
      System.out.println(args[i]);
   }
}
//메서드의 호출
print("a","b","c"); //3개의 문자열 전달.
print("a","b"); //2개의 문자열 전달.
print("a"); //1개의 문자열 전달.


@실습 : 인수전달방식 테스트 ArgsTest.java (p156)
@VariableArgument.java(p162)











































댓글 없음:

댓글 쓰기