본문 바로가기

국비과정/JAVA

20230615 _[10일차]_01. 객체타입 및 참조

[ 새로운 패키지 생성 ]

 

> class생성시 패키지 확인필요**

 

* abstract 추상화 (객체생성 목적이 아닌 대략적으로 만들때)


[ 객체생성 + 참조타입 ]

 

필요한 정보와 필요없는  정보 구분 --> 필요한 정보만 넣고 만들자 (간략화** diet)
필요한 필드, 메소드 생각하고 (설계먼저) 만들기

 

package jun15;
//프로그램 로직에 필요한 것과 필요없는 것 생각하기**

public class Human {
	// 필드
	// 사람에게 필요한 정보 -> 필요한 정보만 남기고 필요없는거 빼버림
	
	String name;
	int age;
	
	// 생성자
	// 메소드
	void myInfo() {
		
		name = "Haehyun_Pyo";
		age = 29;
		age--;
		System.out.println("내 이름은 " + name + "입니다.");
		System.out.println("내 나이는 " + name + "살 입니다.");
		
	}

	
	public static void main(String[] args) {

		Human h = new Human();	// 생성자
		System.out.println("h : " + h); // h : jun15.Human@3d012ddd --> 패키지명+클래스명+주소
		
		Human[] man = new Human[3];
		System.out.println("array : " + man); // array : [Ljun15.Human;@626b2d4a --> 배열표시+패키지명+클래스명+주소
		man[0] = h;		// h (=Human클래스)를 참조 *
		man[1] = new Human();
		man[2] = new Human();
		System.out.println("array[0] : " + man[0]);	// array[0] : jun15.Human@3d012ddd
		System.out.println("array[1] : " + man[1]);	// array[1] : jun15.Human@5e91993f
		System.out.println("array[2] : " + man[2]);	// array[2] : jun15.Human@1c4af82c
		
		
	}

}

* 이해 *

Human = new Human();

 

Human[] man = new Human[3];   => (배열)객체생성, Human이 배열 man의 객체타입이됨
man[0] = h;

 

int[] arr = new int[3];
arr[0] = 1;

 

비슷한 형태!!

man[0] 은 h값을 참조하기 때문에 h의 값이 변경되면 같이 변경됨 (메모리주소가 같음)

 

package jun15;

public class Human {
	
    ....
	}

	
	public static void main(String[] args) {

		Human h = new Human();
		System.out.println("h : " + h); // h : jun15.Human@3d012ddd
		
		Human[] man = new Human[3];
		System.out.println("array : " + man); // array : [Ljun15.Human;@626b2d4a
		man[0] = h;		
		man[1] = new Human();
		man[2] = new Human();
		man[1] = man[0];	// 값이 변경되면*********
		System.out.println("array[0] : " + man[0]);	// array[0] : jun15.Human@3d012ddd
		System.out.println("array[1] : " + man[1]);	// array[1] : jun15.Human@5e91993f 
        							//		-> *jun15.Human@3d012ddd
		System.out.println("array[2] : " + man[2]);	// array[2] : jun15.Human@1c4af82c
		
		
	}

}

* man[1] = man[0];

값이 변경되면, 메모리에 저장되어 있던 man[1]의 값은 소거되고, man[0]이 참조하는 h를 참조.
>> 값이 소멸되면 그 값을 가지고 있는 집 자체가 사라진다고 생각.

(GC(Garbage Collector) => 메모리 자동관리, 즉시는 아니고 원할때)

 


package jun15;

public class Human {
	
	String name;
	int age;

	void myInfo() {
		
		name = "Pyo";
		age = 2n;
		age--;
		System.out.println("내 이름은 " + name + "입니다.");
		System.out.println("내 나이는 " + name + "살 입니다.");
		
	}
	
	public static void main(String[] args) {

		Human h = new Human();	// 생성자

		Human[] man = new Human[3];
		man[0] = h;		
		man[1] = new Human();
		man[2] = new Human();
		man[1] = man[0];

		
		h.name = "홍길동";
		System.out.println(man[0].name); // 홍길동
		System.out.println(h.name); // 홍길동	-> man[0]이 h값을 참조하기 때문
		System.out.println(man[1].name); // 홍길동
		System.out.println(man[2].name); // null
		
		System.out.println(h == man[1]); // true _ R type에서 등호는 객체비교(값비교X)
		System.out.println(h == man[2]); // false
		
		Human h2 = man[0];
		Object[] arr01 = new Object[3];	// *Object는 최상위타입
		arr01[0] = h;
		arr01[1] = 1000;
		arr01[2] = "이것도 됩니다";
		
		System.out.println("h : " + h);		// h : jun15.Human@515f550a
		System.out.println("array[0] : " + arr01[0]);	// array[0] : jun15.Human@515f550a
		System.out.println("array[1] : " + arr01[1]);	// array[1] : 1000
		System.out.println("array[2] : " + arr01[2]);	// array[2] : 이것도 됩니다

		
		
		// 캐스트
//		int number = arr01[1];
//		int	 !=	 배열 		--> 배열 선언할때 int가 아니라 Oject로 선언__ String??
		int number = (int) arr01[1];
		System.out.println(number);	// 1000
		
		String str = (String) arr01[2];
		System.out.println(str);	// 이것도 됩니다
		
		Human h2 = arr01[0];
		Human h2 = (Human) arr01[0];		
		
	}
}

* Object는 최상위타입 -> 모든 데이터타입(배열도)으로 형변환가능