a battle with myself

[java] call by reference/call by value 본문

java

[java] call by reference/call by value

열공_중 2016. 6. 13. 18:22

java의  method 의 경우 3가지가 존재한다.

 

1. main method

 

- java 컴파일 시 JVM이 제일 먼저 읽어  메모리에 올린다.

- 해당 메소드는 JVM이 제일 먼저 인식하고 메모리에 올려지므로 어느 클래스 안에 있건 상관없이

  인스턴스화되지 않은 class의 전역 변수 사용이 불가하다.

- 만약 전역 변수를 main method 안에서 사용하고자 하면 static 으로 지정 또는  class를 인스턴스화 시켜

  메모리에 올려야 한다.

 

일반     method

 

- 일반적인  method

 

생성자  method

 

- class가 생성될때 생성자를 만들어주지않아도 default 생성자가 있는 것으로 JVM이 인식 한다.

- super를 가진 default 생성자는 생략이 가능하다.

- 다양한 parameter를 가진 생성자를 생성 가능하다.

 

 

생성자  method

 

---------------------------------------------------------------------------------------------------------------------------------

 

변수 

 

call by reference(참조에 의한 호출)

 

method parameter / return 이 class 형태일 경우

 

그 값은 주소값을 호출 한다.

 

이 경우  parameter값이 동일한  주소 값을 가지기 때문에

 

넘겨준 값이든 넘어간 값이든 변경이 되면  같은 주소에 값이 변경된다.

 

 

class Car{

    public void carTest(Test t){

        t.value = 10;        // t 클래스의 int 형 value 값을 10으로 변경

        System.out.println("car의 t.value :"+t.value);

    }

}



class test{

    public int value = 0;

}



public class MainTest{



    public static void main(String[] args){

        Car a = new Car();
        Test t = new Test();     // 두 클래스를 인스턴스화 시킴

        t.carTest(t); //<--- t 객체를 넘김

        System.out.println("mainTest의 t.value :"+t.value);

    }

}

 

 

Console

---------------------------------------

car의 t.value : 10

mainTest의 t.value : 10

---------------------------------------

 

 

출력문의 두 값은 동일 한 값을 가진다.

---------------------------------------------------------------------------------------------------

 

call by value(값에 의한 호출)

 

parameter 값이 Primitive type 일경우 값 자체를 넘김

 

// Primitive type(byte, short, int, long,char,float,double,boolean)

 

이경우(int a = 0; 등) 변수명이 주소를 가지고 그 주소값에 값이 담겨져있다.

 

parameter로 받아진 method 에서는 새로운 변수에 인스턴스를 생성하여 값을

가지므로 변경시 서로 영향을 받지않는다.

 

 

class Car{

    public void carTest(int value){

        value = 10;        // t 클래스의 int 형 value 값을 10으로 변경

        System.out.println("car의 value :"+value);

    }

}



class test{

    public int value = 0;

}



public class MainTest{



    public static void main(String[] args){

        Car a = new Car();

        Test t = new Test();     // 두 클래스를 인스턴스화 시킴
        t.carTest(t.value); //<--- t 객체의 value 라는 값 0 을 넘김.

        System.out.println("mainTest의 t.value :"+t.value);

    }

}

 

 

Console

---------------------------------------

car의 value : 10

mainTest의 t.value : 0

---------------------------------------

 

----------------------------------------------------------------------------------------------

 

method overloading

 

같은 class 에서 같은 이름의 method 구현 할수 있게 다형성의 기법으로 method를 구현

 

예) public void write(int a){}

 

     public void write(String a){}

 

     public void write(double a){}

 

 

등과 같이 parameter 의 type이 틀리거나 parameter의 갯수가 틀린경우 또는 다른 타입의

parameter를 순서를 바꾸어 놓을 경우등에는 동일한 method명을 가질수있다.