본문 바로가기

국비과정/JAVA

20230615 _[10일차]_02. 객체 생성 연습 (인스턴스)

[ 인스턴스화 ]

 

package zoo;
// 각각 동물들에 대한 클래스 생성, 내부에 sleep() 메소드, 내부에 출력명령어.

class Cat {	
	void sleep() {
		System.out.println("Zzzz");
	}
}

class Dog {	
	void sleep() {
		System.out.println("Zzzz");
	}
}

class Mouse {
	void sleep() {
		System.out.println("Zzzz");
	}
}

class Horse {
	void sleep() {
		System.out.println("Zzzz");
	}
}

public class Animal {
	public static void main(String[] args) {
		// 동물들을 인스턴스화 해보기
		
		Cat cat = new Cat();
		Dog dog = new Dog();
		Mouse mouse = new Mouse();
		Horse horse = new Horse();
		
		cat.sleep();
		dog.sleep();
		mouse.sleep();
		horse.sleep(); // sleep() 메소드 실행 --> Zzzz 출력실행
		
	}
}

 


(만약 모든 동물들을 다 한꺼번에 재우고 싶다면)

package zoo;

class Cat {	
	void sleep() {
		System.out.println("Zzzz");
	}
}

class Dog {	
	void sleep() {
		System.out.println("Zzzz");
	}
}

class Mouse {
	void sleep() {
		System.out.println("Zzzz");
	}
}

class Horse {
	void sleep() {
		System.out.println("Zzzz");
	}
}


public class Animal {
	public static void main(String[] args) {
		
		Object[] ani = new Object[4];	// 배열객체 생성 (Object는 최상위 객체)
		ani[0] = new Cat();			// 배열요소에 자식객체들 생성해서 넣기 
		ani[1] = new Dog();		
		ani[2] = new Mouse();
		ani[3] = new Horse();
		
		
		for (int i = 0; i < ani.length; i++) {
			((Dog) ani[i]).sleep();	// 동물들의 객체타입이 달라서 실행안됨 ** Error!!
		}

		
	}
}

ERROR!!


Object(최상위 객체) 아래에 ->  Ancestor 클래스 생성 ->  sleep() 메서드 넣어주기

각 동물들 클래스에서 sleep() 메서드 지워주고, 클래스명 뒤에 extends Ancestor 추가!! (상속)

 

Object 아래 Ancestor 아래 각 동물들(Cat, Dog, Mouse, Horse) 클래스 두고

 for문으로 sleep() 메서드(Ancestor 의 기능) 반복실행.

 

         Object        -->       Ancestor
최상위타입에서  -->  동물들 바로 위타입으로 바꿔줌.

 

package zoo;

// 동물들의 선조 (부모클래스) - 개, 고양이, 말, 쥐 (자식클래스)
class Ancestor { 
	void sleep() {
		System.out.println("Zzzz");
	}
}

class Cat extends Ancestor {	
}

class Dog extends Ancestor {	
}

class Mouse extends Ancestor {
}

class Horse extends Ancestor {
}


public class Animal {
	public static void main(String[] args) {
		
		Ancestor[] ani = new Ancestor[4];	// Ancestor에 대한 배열객체 생성
		ani[0] = new Cat();		
		ani[1] = new Dog();
		ani[2] = new Mouse();
		ani[3] = new Horse();
		
		for (int i = 0; i < ani.length; i++) {	// 부모의 기능인 sleep() 한꺼번에 실행
//			ani[i].sleep();		
			((Ancestor) ani[i]).sleep();	// Ancestor로 캐스트 필요*

		}
			
	}
}

* (Ancestor) ani [ i ]. sleep();

 ani [ i ] 를 Ancestor로 캐스트 걸어서

 (Ancestor) ani [ i ]  요만큼에 대해서 sleep() 메서드 실행


Zzzz
Zzzz
Zzzz
Zzzz

[ 배객체참조 이해하기 ] __ ㅠㅠㅠㅠㅠㅠㅠㅠ

package jun15;

import java.util.Arrays;

class Ancestor { // 개, 고양이, 말, 쥐의 선조
	void sleep() {
		System.out.println("Zzzzz...");
	}
}

class Dog extends Ancestor{
	String name;
	int age;
}

class Mouse extends Ancestor {
	String name;
	int age;
}

class Horse extends Ancestor{
	String name;
	int age;
}



public class Animal {
	public static void main(String[] args) {

		// 각각 동물들을 인스턴스화 해보기
		Object[] ani = new Object[3];
		ani[0] = new Dog();
		ani[1] = new Mouse();
		ani[2] = new Horse();
		
		ani[0] = "possible!";		// 배열의 타입이 Object여서 모든 타입의 값 저장가능
		ani[1] = 1;			// 배열의 타입이 Ancestor 일때는 불가능
		ani[2] = true;
		
		System.out.println(ani[0]);	// possible!
		System.out.println(ani[1]);	// 1
		System.out.println(ani[2]);	 true
	
	}

}

                                      힙 영역

배열 ani[3]                      Dog

[ 0 ][ 1 ][ 2 ]                     Mouse

                                       Horse

 

배열의 각각 0, 1, 2 가 객체 Dog, Mouse, Horse 를 참조하고 있음.

 

ani[0] 에 값이 없는 상태라면 

System.out.println( ani[0] );  //  주소값 

 

ani[0] = "possible!";  값을 넣어주면

System.out.println( ani[0] );  //  주소값 에 저장되어 있는 값인 possible! 이 출력

 

 

(책 p.227) ****************


 

[ 다른 패키지의 클래스 호출 ]

 

Project (jun15)

 

Ancestor(부모)

Dog , Mouse , Horse , Cat (자식)

 

package zoo

> class Ancestor ()  

  > public sleep() 메서드 (void) -> 출력문

 

> class Dog  _ 인스턴스변수 name, age

> class Mouse _ 인스턴스변수 name, age

> class Horse _ 인스턴스변수 name, age

 

package zoo

> public class 

Cat _ 인스턴스변수 name, age

 

package jun15

> public class Hunam 

  > public main 메서드 _ 여기에서  동물들(Dog , Mouse , Horse , Cat)불러올거

 

 

package zoo;

class Ancestor { // 개, 고양이, 말, 쥐의 선조
	public void sleep() {
		System.out.println("Zzzzz...");
	}
}

// 각 동물클래스 내부에 인스턴스 변수 선언
class Dog extends Ancestor{	
	String name;		
	int age;
}

class Mouse extends Ancestor{
	String name;
	int age;
}

class Horse extends Ancestor{
	String name;+
	int age;
}


public class Animal {
	public static void main(String[] args) {
		
		Ancestor[] ani = new Ancestor[4];
		ani[0] = new Cat0();
		ani[1] = new Dog0();
		ani[2] = new Mouse();
		ani[3] = new Horse0();
		
		
		for (int i = 0; i < ani.length; i++) {
			 ani[i].sleep();
		}

		
	}
}

package zoo;

public class Cat extends Ancestor {	// public 필수!
	public String name;	// public 필수!
	public int age;		// public 필수!
}

package jun15;

import zoo.Cat02;
    
public class Human {
		....
 	public static void main(String[] args) {   
		....
    
		// 다른 패키지(zoo)에 있는 클래스(Cat) 호출
        // Cat이 public class고 내부의 인스턴스 변수들도 public이여야 함
		Cat tom = new Cat();
		tom.sleep();
		tom.name = "톰";
		tom.age = 5;
        
//		Dog dog = new Dog();   Error코드**
//		dog.sleep();
        
        
    }
}

** Error 

다른 패키지에 있는 Dog 클래스를 불러오고 싶으면 Dog 클래스가 public일 때만 가능

(Dog 클래스가 public : 파일명과 클래스명이 같아야함! public 클래스는 하나!!!)


어쩌다보니 찾아서 정리하게된....참고!!

 

[  Extends 상속 ]

package zoo;
// extends (상속) __ 다시 배울예정
// 클래스를 부모-자식 관계로 연결 --> 자식의 클래스에 부모의 정보들이 생성

class Ancestor { // 동물들의 선조 (부모클래스) - 개, 고양이, 말, 쥐 (자식클래스)
	void sleep() {
		System.out.println("Zzzz");
	}
}

class Dog extends Ancestor {	
}

class Mouse extends Ancestor {
}

class Horse {
}


public class Animal {
	public static void main(String[] args) {
		// 동물들을 인스턴스화 해보기
		
		Ancestor anc = new Ancestor();
		Dog dog = new Dog();
		Mouse mouse = new Mouse();
		Horse horse = new Horse();
		
		dog.sleep();	// Zzzz (Dog extends Ancestor - 상속시킴)
		mouse.sleep();	// Zzzz	(Mouse extends Ancestor - 상속시킴)
//		horse.sleep();	// Error *
		
	}
}

* Error : The method sleep() is undefined for the type Horse02

 

Ancestor (부모클래스)와 상속시킨 Dog, Mouse (자식클래스)는 

Ancestor (부모클래스) 내부에 있는 기능인 메소드 sleep() 사용가능. --> 출력문 실행.

 

** 배우고 나면 다시 보기 **

상속을 하더라도 자식 클래스가 부모의 모든 것들을 물려받는 것은 아닙니다. 필드나 메소드의 접근제어자가 public이거나 protected일 때만 상속이 가능합니다.

 


 

[  Extends 상속 ] _ 같은 패키지 - 다른 파일인 경우

 

package zoo;

class Ancestor { // 동물들의 선조 (부모클래스) - 개, 고양이, 말, 쥐 (자식클래스)
	void sleep() {
		System.out.println("Zzzz");
	}
}

public class Animal {
	public static void main(String[] args) {
		// 동물들을 인스턴스화 해보기
		
		Ancestor anc = new Ancestor();
        
		Cat cat = new Cat();
		cat.sleep();		// 부모기능 실행가능
		cat.name = "톰";
		cat.age = 5;

		System.out.println(cat.name);	// 톰
		System.out.println(cat.age);	// 5
				
	}
}

package zoo;

class Cat extends Ancestor {
	  String name;
	  int age;
}

Zzzz
톰
5