자바 매개변수 전달 방식(call by value, call by reference)

JAVA/JAVA 관련|2016. 12. 22. 08:05

기본 자료형으로 선언된 변수를 함수의 매개변수로 사용하는 것처럼  클래스로 선언된 객체도 함수의 매개변수로 사용할 수 있다. 또한 동일한 클래스형으로 선언된 객체끼리는 대입 연산자로 값을 치환할 수 있다(대입 외의 다른 연산자는 사용 불가. 객체에서 객체를 더하고 빼고 곱하고 나누면 이상하잖아?). 만약 객체 단위로 치환하면 객체 내의 모든 멤버변수 값이 복사된다.


- 객체에 대한 값에 의한 전달 방식


값에 의한 전달 방식은 함수를 호출할 때 기술한 실 매개변수(함수를 사용할 때 넘겨준 변수)의 값만 함수 측의 형식 매개변수(함수 내에서 매개변수를 받기 위해 선언한 변수)로 전달된다. 즉, 형식 매개변수는 실 매개변수와는 별개의 기억공간이 할당되고 여기에 값만 복사된다. 실 매개변수와 동일한 클래스형으로 선언된 형식 매개변수로 객체끼리 값을 치환할 수 있지만, 함수 내부에서 멤버변수의 값을 변경해도 함수 호출 후에는 실 매개변수의 값은 바뀌지 않는다.


- 객체를 함수의 결과값으로 사용하기


이것은 함수의 반환값이 객체인 경우이다. 정수형이나 실수형 같은 기본 자료형을 함수의 결과값으로 반환할 수 있듯이 return 문 다음에 객체를 기술해 객체를 반환할 수 있다. 물론 이때 함수의 자료형은 return 다음에 기술한 값과 같아야 하므로 함수의 자료형이 클래스로 선언되어야 한다.


- 객체에 대한 주소에 의한 전달 방식


값에 의한 전달 방식과 비슷하지만, 값이 아닌 객체의 주소를 넘겨주고 이를 사용해 계산하는 방식이다. 이렇게 되면 실 매개변수 = 형식 매개변수(포인터 이므로) 라는 공식이 성립된다. 그렇기에, 함수 호출 후에 내부에서 멤버변수의 값을 변경하면 그 값들이 실 매개변수에 적용되게 된다. 물론 함수 내부에서 객체를 다룰 때에는 포인터로서 다뤄야 한다.(이는 포인터 변수와 유사하므로 크게 어려움은 없을 것이다)


- 객체에 대한 레퍼런스에 의한 전달 방식


레퍼런스 변수는 메모리를 따로 할당받지 않고 실 매개변수의 별칭으로 이름만 하나 더 부여되기 때문에 레퍼런스 변수로 접근하여 값을 변경하면 실 매개변수의 값도 변경된다. 이와 같은 원리로 객체도 레퍼런스로 선언하여 함수 내부에서 실 매개변수의 값을 변경할 수 있다. 게다가 레퍼런스 변수의 경우 별도의 메모리 할당이 없으므로 메모리를 효율적으로 사용할 수 있다. 이건 특별히 예문을 써놓겠다.


void CopyComplex(Complex &des, const Complex &src)

{

des = src;

}


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


void main()

{

Complex x(10,20);

Complex y(30,40);

CopyComplex(y,x);

}


위의 예문에서 des와 src가 레퍼런스로 선언된 객체이다. main의 마지막 줄에서 CopyComplex가 호출되면 des는 객체 y를, src는 객체 x를 가르키는 레퍼런스 변수가 된다(엄밀히 따지면 객체지만 편의상 변수라고 쓰겠다). des는 실 매개변수 값이 변경되도록 하기 위해서 레퍼런스 변수로 선언한 것이고, src는 메모리를 효율적으로 사용하기 위해 레퍼런스 변수로 선언한 것이다. 이때문에 src 앞에 예약어인 const를 붙여서 함수 내부에서 src의 내용이 변질되는 것을 막아 놓았다. 이로써 CopyComplex 함수 내부에서 객체x의 값을 객체y에 대입할 수 있게 된다. 그리고 여기서 약간의 수정을 거치면 이러한 것도 가능하다.


void & CopyComplex(Complex &des, const Complex &src)

{

des = src;

return des;

}


위와 같이 함수명 앞에 &를 붙이면, 함수의 결과값을 저장할 기억공간이 따로 마련되지 않고 return문 다음에 기술한 변수의 별칭이 된다. 즉, CopyComplex 함수는 des의 별칭이 되고 des는 x의 별칭이므로 하나의 기억공간이 3개의 이름으로 사용되는 것이다.

댓글()

java 향상된 for문

JAVA/JAVA 관련|2016. 12. 22. 08:04

1. 배열

for( 배열의 타입 변수명 : 배열) {

//문장

}


2. 컬렉션

for( 컬렉션에 저장된 요소의 타입 변수명 : 컬렉션){

//문장

}


ex)

1. 배열

int [] arr = {10,20,30,40,50};


구 반복문

for(int i=0; i<arr.length;i++)

  ystem.out.println(arr[i]);


향상된 for문

for(int i: arr){

   system.out.println(i);

}



2. 컬렉션

ArrayList<Integer> list = new ArrayList<integer>();

list.add(new Integer(10));

list.add(new Integer(20));

list.add(new Integer(30));


Iterator it = list.iterator();


구 반복문

for(;it.hasNext();){

System.out.println(it.next());

}


향상된 for문

for(Integer i : list)

 System.out.println(i);

태그 : java, 반복문, 자바

댓글()
  1. 2018.11.20 10:46 댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  2. 2018.11.20 10:49 댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  3. 김태민test 2018.11.20 10:50 댓글주소  수정/삭제  댓글쓰기

    헉 비공개 댓글 수정및 삭제시 비밀번호를 입력해도 수정 삭제가 안되네요 확인번호가 따로 안 나왔는데 비밀번호랑 동일한거 아닌가요?

java 오토박싱 예제

JAVA/JAVA 관련|2016. 12. 22. 08:04

구 사용(언박싱)

ArrayList list = new ArrayList();

list.add(new Integer(10));

list.add(new Integer(20));

list.add(new Integer(30));


Integer i = (Integer) list.get(0);

int value = i.intValue();



현 사용 (오토 박싱)

ArrayList<Integer> list = new ArrayList<Integer>();

list.add(10);

list.add(20);

list.add(30);


int value = list.get(0);

댓글()

java 객체 비교를 위한 equals 예제

JAVA/JAVA 관련|2016. 12. 22. 08:03

Value v1 = new Value(10);

Value v2 = new Value(20);



v1.equal(v2)를 하면 v1과 v2의 주소값을 비교하기 때문에 false가 나올 수밖에 없다.


이런경우 overiding을 통해 해결할 수 있다.


class person{

long id;


public boolean equals(Object obj){

if(id == ((Person)obj).id){

return true;

else

return false;

}

}


class test{

public static void main(String args[])

{

person p1 = new person(10);

person p2 = new person(20);


if (p1 == p2) // 이제 제대로 값 비교가 된다.


}

'JAVA > JAVA 관련' 카테고리의 다른 글

java 향상된 for문  (5) 2016.12.22
java 오토박싱 예제  (0) 2016.12.22
java 객체 비교를 위한 equals 예제  (0) 2016.12.22
java 문자열 형변환  (0) 2016.12.22
자바 얕은 복사, 깊은복사 개념 및 예제  (0) 2016.12.22
java iterator 간단 사용법  (0) 2016.12.22

태그 : equals, JACA, 자바

댓글()

java 문자열 형변환

JAVA/JAVA 관련|2016. 12. 22. 08:02

- 기본형 -> 문자열

String valueOf(boolean b)

String valueOf(char c)

String valueOf(int i)

String valueOf(long l)

String valueOf(float f)

String valueOf(double d)





- 문자열 -> 기본형

boolean Boolean.getBoolean(String s)

byte Byte.parseByte(String s)

short short.parseShort(String s)

int Integer.parseInt(String s)

long Long.parseLong(String s)

float Float.parseFloat(string s)

double Doubel.parseDouble(string s)

'JAVA > JAVA 관련' 카테고리의 다른 글

java 오토박싱 예제  (0) 2016.12.22
java 객체 비교를 위한 equals 예제  (0) 2016.12.22
java 문자열 형변환  (0) 2016.12.22
자바 얕은 복사, 깊은복사 개념 및 예제  (0) 2016.12.22
java iterator 간단 사용법  (0) 2016.12.22
java HashSet 설명 및 예제  (0) 2016.12.22

댓글()

자바 얕은 복사, 깊은복사 개념 및 예제

JAVA/JAVA 관련|2016. 12. 22. 08:01

1. shallowCopy

public static int [] shallowCopy(int arr[])

return arr;


얉은 복사를 의미하고 배열이나 객체를 복사할 때 단순히 참조만 복사하는것으로써 원본이 변경되면 복사본도 같이 변경된다.



2. deep copy

public static int [] deepCopjy(int arr[]){

if (arr == null)

return null;


int  result[] = new int[arr.length];


System.arraycopy(arr, 0 , result, 0, arr.length);

return result;

}



ex)


package javas;


public class javas {

public static void main(String args[]) {


int temp[] = { 1, 2, 3, 4, 5, 6 };

int shallow[] = shallowCopy(temp);

int deep[] = deepCopy(temp);


System.out.println("original : " + toString(temp));

System.out.println("shallow Copy : " + toString(shallow));

System.out.println("deep Copy : " + toString(deep));

System.out.println();


temp[0] = 19;

System.out.println("original : " + toString(temp));

System.out.println("shallow Copy : " + toString(shallow));

System.out.println("deep Copy : " + toString(deep));

System.out.println();


}


public static int[] shallowCopy(int arr[]) {

return arr;

}


public static int[] deepCopy(int arr[]) {

if (arr == null)

return null;

int result[] = new int[arr.length];

System.arraycopy(arr, 0, result, 0, arr.length);

return result;


}


public static String toString(int temp[]) {

StringBuffer sb = new StringBuffer("[");

for (int i = 0; i < temp.length; i++)

sb.append(" " + temp[i]);

sb.append(" " + "]");

return sb.toString();

}

}




결과화면

original : [ 1 2 3 4 5 6 ]
shallow Copy : [ 1 2 3 4 5 6 ]
deep Copy : [ 1 2 3 4 5 6 ]

original : [ 19 2 3 4 5 6 ]
shallow Copy : [ 19 2 3 4 5 6 ]
deep Copy : [ 1 2 3 4 5 6 ]


'JAVA > JAVA 관련' 카테고리의 다른 글

java 객체 비교를 위한 equals 예제  (0) 2016.12.22
java 문자열 형변환  (0) 2016.12.22
자바 얕은 복사, 깊은복사 개념 및 예제  (0) 2016.12.22
java iterator 간단 사용법  (0) 2016.12.22
java HashSet 설명 및 예제  (0) 2016.12.22
Comparable vs Comparator  (0) 2016.12.22

댓글()

java iterator 간단 사용법

JAVA/JAVA 관련|2016. 12. 22. 08:00

public static void main(String args[]) {

LinkedList list = new LinkedList();

list.add(1);

list.add(2);

list.add(3);

list.add(4);

Iterator<LinkedList> it = list.iterator();

while(it.hasNext()){

System.out.println(it.next());

}

}


boolean hasNext()  : 읽어 올 요소가 남아있는지 확인

Object next() : 다음요소를 읽어온다.,

void remove() : next()로 읽어 온 요소를 삭제한다.

'JAVA > JAVA 관련' 카테고리의 다른 글

java 문자열 형변환  (0) 2016.12.22
자바 얕은 복사, 깊은복사 개념 및 예제  (0) 2016.12.22
java iterator 간단 사용법  (0) 2016.12.22
java HashSet 설명 및 예제  (0) 2016.12.22
Comparable vs Comparator  (0) 2016.12.22
java stringtokenizer 예제  (0) 2016.12.22

댓글()

java HashSet 설명 및 예제

JAVA/JAVA 관련|2016. 12. 22. 07:59

Hashset


HashSet은 Set인터페이스를 구현한 가장 대표적인 컬렉션이며, Set인터페이스의 특징대로 HashSet은 중복된 요소를 저장하지 않는다.


HashSet은 저장 순서를 유지하지 않기때문에 저장순서를 유지하고 싶은경우에는 LinkedHashSet을 사용하면 된다.(JDK 1.4 부터 추가됨)


사용예


public static void main(String args[]) {

Set set = new HashSet();

for(int i=0;i<35;i++)

set.add((int)(Math.random()*100) + 1 + " ");

System.out.println(set);

}


결과 화면


[77 , 11 , 43 , 31 , 75 , 63 , 73 , 93 , 7 , 5 , 28 , 58 , 56 , 12 , 88 , 44 , 76 , 10 , 30 , 74 , 96 , 72 , 92 , 70 , 80 , 2 , 27 , 47 ]

태그 : HashSet, java, 자바

댓글()