참조 타입과 메소드

  • 메소드인자의 타입에 따라 분류
    • call by value : 로 데이터 값을 전달. 메소드 인자가 원시 타입
    • call by reference : 메소드 인자로 객체의 참조값을 전달.메소드 인자가 배열 또는 클래스 타입.
  • call by reference 예외 클래스 String
    • String은 불변(immutabel)객체
      • 문자열 객체의 내용을 바꾸지 않는다.문자열 메소드 또는 연결 연산으로 내용이 바뀌면 객체가 서로 생성된다.
      • (문자열 리터럴로 String 선언할 때)동일한 문자열을 한 번만 생성해서 상수풀에 저장하여 사용하는 방식으로 효율을 높이는 장점이 있다.단,메소드 또는 연결 연산이 많아지면 새로운 문자열 객체가 계속 생성되는 단점도 있다.
      • hashcode 값은 문자열 내용으로 만드는 방식으로 변경되어 다른 클래스 객체와 다른 점이 있다.
      • new산으로 문자열 내용과 상관없이 객체를 새로 생성할 수 있다.

문자열과 char 배열 사이의 변환 메소드

System.out.println("1.문자열을 char배열로 변환");
		String temp = "hello~java!";
		char[] tempArr =temp.toCharArray();
		for(int i=0;i<tempArr.length;i++)
			System.out.println(String.format("tempArr[%d] = %c\n", i,tempArr[i]));
		System.out.println(Arrays.toString(tempArr));
System.out.println("2.char배열을 문자열로 변환");
		tempArr[5]='*';
		temp = String.valueOf(tempArr);		//문자열로 변환후에 temp에 넣어줌
		System.out.println(temp + ",문자열 길이 : " + temp.length());
		System.out.print(tempArr);		//tempArr 을 출력을 위해 자동으로 String변환
		System.out.println(",배열 길이 : " + tempArr.length);
		System.out.println(tempArr + ",배열 길이 : " + tempArr.length);
		//문자열과 char배열의 + 연산을 실행하면 char 배열의 String 자동변환 하지 않음.
		
		//[C@7a79be86 에서 7a79be86 는 해시코드값이고 해시함수를 통해서 만들어지는 4바이트 값.
		//	  자바의 객체들을 식별하기 위해 객체가 갖는 여러가지 값들을 복합적으로 계산해서 만듭니다.

배열의 인덱스의 값 변환과 String 참조 값의 불변성

public class A40CallByRef {
	
	public static void main(String[] args) {
		int test = 100;
		changeTest(test);
		System.out.println("changeTest 실행 후 test = " + test);
		
		int[] intArr = {1,2,3,4,5};
		changeIntArr(intArr);
		System.out.println("changeIntArr 실행 후 intArr = " + Arrays.toString(intArr));
		System.out.println(intArr.hashCode());
		String temp = "hello";
		changeString(temp);
		System.out.println("changetString 실행 후 main 지역변수 temp = " + temp);


private static void changeString(String temp) {
		temp =temp.replace("ll", "**");	
		//문자열은 문자열 내용이 바뀌면 객체의 위치가 바뀝니다.(불변 객체)
		//   -> temp가 "hello" 를 참조했던 값에서 "he**o" 객체의 참조값으로 바뀝니다.
		System.out.println("changetString 메소드 지역변수 temp =" + temp);
		
	}
	private static void changeIntArr(int[] temp) {
	//temp는	changeIntArr 메소드의 지역변수이다. 메소드가 changeIntArr(intArr); 실행될 때
	//      intArr 배열의 참조값을 temp 가 전달받아 저장합니다.	
			temp[3]=100;	
	}

	private static void changeTest(int test) {
		test = 200;
	}
}

출력을 해보면 스트링에 의한 해쉬타입은 같게 나온다 하지만 참조하고 있는 위치가 다르다

profile
ㅋㅎ딩초보

0개의 댓글

Powered by GraphCDN, the GraphQL CDN