Programming Language/Java

Java 6일차 곡뢀(Promotion[μžλ™ νƒ€μž… λ³€ν™˜], Casting[κ°•μ œ νƒ€μž… λ³€ν™˜], instanceof)

chaerlo127 2022. 2. 22. 00:07
728x90

: νƒ€μž…λ³€ν™˜μ€ νƒ€μž…μ„ λ‹€λ₯Έ νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜λŠ” ν–‰μœ„λ₯Ό 말함

1. μžλ™ νƒ€μž… λ³€ν™˜ (Promotion)

: ν”„λ‘œκ·Έλž¨ 싀행도쀑 μžλ™μ μœΌλ‘œ νƒ€μž…μ΄ λ³€ν™˜λ˜λŠ” 것

 μ¦‰, μžμ‹ λ³€μˆ˜κ°€ λΆ€λͺ¨ λ³€μˆ˜λ‘œ μžλ™ νƒ€μž… λ³€ν™˜ λ˜λŠ” 것(child κ°€ parent 의 type으둜 λ³€ν™˜)

λΆ€λͺ¨ νƒ€μž… λ³€μˆ˜ = μžμ‹ νƒ€μž…; // μžλ™ νƒ€μž… λ³€ν™˜

Parent parent = new Child(); // parent classκ°€ child type으둜 생성


//-------------------------------λ‹€μŒκ³Ό 같이도 κ°€λŠ₯------------------------------------
Child child = new Child();
Parent parent = child;

// child 와 parent λͺ¨λ‘ λ™μΌν•œ child 객체 μ°Έμ‘°

 

상속 된 μžμ‹ 클래슀의 λ°”λ‘œ μœ„μ˜ λΆ€λͺ¨κ°€ μ•„λ‹ˆλ”λΌλ„ μƒμœ„ νƒ€μž…μ΄λ©΄ μžλ™ νƒ€μž… λ³€ν™˜μ΄ 일어날 수 μžˆλ‹€.

 

μžλ™ νƒ€μž… λ³€ν™˜μ΄ 된 이 ν›„, λΆ€λͺ¨ ν΄λž˜μŠ€μ— μ„ μ–Έλœ ν•„λ“œμ™€ λ©”μ†Œλ“œλ§Œ 접근이 κ°€λŠ₯ν•˜λ‹€.

 

λ³€μˆ˜λŠ” μžμ‹ 객체λ₯Ό μ°Έμ‘°ν•˜μ§€λ§Œ, λ³€μˆ˜λ‘œ 접근이 κ°€λŠ₯ν•œ λ©€λ²„λŠ” λΆ€λͺ¨ 클래슀둜 ν•œμ •

-> μžμ‹ ν΄λž˜μŠ€μ—μ„œ method μž¬μ •μ˜μ‹œ μžμ‹ 클래슀의 λ©”μ†Œλ“œκ°€ λŒ€μ‹  호좜

 

// Parent.java
public class Parent{

	int a;
    
    public void method(int b){
    	b++;
        }
}


// Child.java

public class Child extends Parent{

	int b;
    
    @Override
    public void method(int b){
    	b+=2;
        }
	public void method2(int c){
    	c+=5;
        }      
        
}

//main java class

public static void main(String[] args){
	Parent parent = new Child();
    parent.a = 1;
    parent.method(2); // child 에 override 된 κ²ƒμœΌλ‘œ b의 값은 4
    
    /*
    Parent에 μžˆλŠ” method, field 만 호좜 κ°€λŠ₯
    parent.b = 1;
    parent.method2(3);
    */
}

 

2. ν•„λ“œμ˜ λ‹€ν˜•μ„±

: ν•„λ“œμ˜ νƒ€μž…μ„ λΆ€λͺ¨μ˜ νƒ€μž…μœΌλ‘œ μ„ μ–Έν•˜λ©΄ λ‹€μ–‘ν•œ μžμ‹ 객체듀이 μ €μž₯될 수 μžˆκΈ°μ— μ‚¬μš© κ²°κ³Όκ°€ λ‹¬λΌμ§ˆ 수 μžˆλ‹€.

 

public class Pet{
	public String petName;
	public int age = 0;

	
	public Pet(String petName){
    	this.petName = petName;
    }
        
    public void plusAge(int age){
    	this.age = age + 1;
    	System.out.println(this.age);
    }
}

//-------------------------------------------------------------------------------------
public class Cat extends Pet{
	public Cat(String petName){
    	super(petName);
    }
   
   @Override
    public void plusAge(int age){
    	this.age = age + 9;
    	System.out.println(this.age);
    }
}

//-------------------------------------------------------------------------------------
public class Dog extends Pet{
	public Dog(String petName){
    	super(petName);
    }
   
   @Override
    public void plusAge(int age){
    	this.age = age + 4;
    }
}
//-------------------------------------------------------------------------------------

public class Person {
	
	public Person() {}
	
	Pet pet1 = new Pet("μ½”μ½”");
	Pet pet2 = new Pet("감자");
	
}

//-------------------------------------------------------------------------------------

public static void main(String[] args){
		Person person = new Person(); // person 객체 생성
		boolean a = true;
		if(a) {
			person.pet1 = new Cat("μ½”μ½”"); // person 객체 λ‚΄ Pet 객체, Cat을 Pet 객체 Type으둜
			person.pet1.plusAge(4); // Override method
		}else {
			person.pet2 = new Dog("감자"); // person 객체 λ‚΄ Pet 객체, Dog을 Pet 객체 Type으둜
			person.pet2.plusAge(5); // Override method
		}
	}

 

 

3. λ§€κ°œλ³€μˆ˜μ˜ λ‹€ν˜•μ„±

: μžλ™ νƒ€μž… λ³€ν™˜μ€ λ©”μ†Œλ“œ ν˜ΈμΆœν•  λ•Œμ—λ„ 많이 λ°œμƒν•œλ‹€. 맀개 λ³€μˆ˜μ˜ νƒ€μž…κ³Ό λ™μΌν•˜κ²Œ 값을 μ§€μ •ν•˜κΈ°λ„ ν•˜μ§€λ§Œ, μžμ‹ κ°μ²΄λ‘œλ„ 지정이 κ°€λŠ₯

public class Example{

	public void method(Pet pet){
		pet.plusAge(3);}
}

 

μœ„ method λ₯Ό ν˜ΈμΆœν•  λ•Œμ—λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

 

Example example = new Example();
Pet pet = new Pet("μ½”μ½”");
example.method(pet);

μ΄λŠ” μžμ‹μ˜ 클래슀인 Cat, Dog 객체λ₯Ό λ„˜κ²¨μ£ΌλŠ”κ²ƒλ„ κ°€λŠ₯ν•˜λ‹€.

Example example = new Example();
Cat cat = new Cat("μ½”μ½”");
Dog dog = new Dog("도그");
example.method(cat); // Pet pet = cat;
example.method(dog); // Pet pet = dog;

즉, 맀개 λ³€μˆ˜μ˜ νƒ€μž…μ΄ 클래슀 일 경우, 클래슀의 객체 뿐만 μ•„λ‹ˆλΌ μžμ‹ κ°μ²΄κΉŒμ§€λ„ 맀개 κ°’μœΌλ‘œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€.

 

 

4. κ°•μ œ νƒ€μž… λ³€ν™˜ (Casting)

: λΆ€λͺ¨ νƒ€μž…μ„ μžμ‹ νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€.

 μ¦‰, μžλ™ νƒ€μž… λ³€ν™˜λ˜μ–΄ λΆ€λͺ¨ νƒ€μž…μœΌλ‘œ λ³€ν™˜ 된 μžμ‹μ„ λ‹€μ‹œ μžμ‹ νƒ€μž…μœΌλ‘œ κ°•μ œλ‘œ λ³€ν™˜ν•˜λŠ” 것이닀.

Pet pet = new Cat("캐츠"); // μžλ™ νƒ€μž… λ³€ν™˜
Cat cat = (Cat) pet; // κ°•μ œ νƒ€μž… λ³€ν™˜

/*
	μžμ‹ νƒ€μž… λ³€μˆ˜ = (μžμ‹ νƒ€μž…) λΆ€λͺ¨ νƒ€μž…;
*/

 

κ°•μ œ νƒ€μž… λ³€ν™˜μ„ ν•˜κ²Œ 되면, λΆ€λͺ¨ κ°μ²΄μ—λŠ” μ—†κ³  μžμ‹ κ°μ²΄μ—λŠ” μžˆλŠ” field와 method λ₯Ό μ‚¬μš©ν•  수 있게 λœλ‹€.

 

5. 객체 νƒ€μž… 확인 (instanceof μ—°μ‚°μž)

: μžμ‹ νƒ€μž…μ΄ λΆ€λͺ¨ νƒ€μž…μœΌλ‘œ λ³€ν™˜λ˜μ–΄ μžˆλŠ” μƒνƒœμΈμ§€, λΆ€λͺ¨ νƒ€μž…μœΌλ‘œ μƒμ„±λœ 객체인지 확인할 수 μžˆλŠ” 방법은 뭐가 μžˆμ„κΉŒ?

// μžμ‹ νƒ€μž…μ΄ λΆ€λͺ¨ νƒ€μž…μœΌλ‘œ λ³€ν™˜ 
Pet pet = new Cat("μ½”μ½”");

// λΆ€λͺ¨ νƒ€μž…μœΌλ‘œ 생성 된 객체
Pet pet = new Pet("μ½”μ½”");
Cat cat = (Cat) pet;

 

이λ₯Ό 확인할 수 μžˆλŠ” 방법은 instanceof이닀.

 

// instanceofλ₯Ό μ‚¬μš©
// true : μš°ν•­μ˜ νƒ€μž…μœΌλ‘œ 객체 생성
// false : 생성 μ•ˆλ¨
boolean result = μ’Œν•­(객체) instanceof μš°ν•­(νƒ€μž…)

 

public void method(Pet pet){
	if(pet instanceof Cat){
    	System.out.println("μžλ™ νƒ€μž… λ³€ν™˜");
        Cat cat = (Cat) pet;
        // κ°•μ œ νƒ€μž… λ³€ν™˜
        } else{
        System.out.println("μžλ™ νƒ€μž… λ³€ν™˜ μ•„λ‹˜");}
}

 

 

instanceof μ—°μ‚°μžλ‘œ 객체 νƒ€μž…μ„ ν™•μΈν•˜μ§€ μ•Šκ³  κ·Έλƒ₯ κ°•μ œ νƒ€μž… λ³€ν™˜μ„ ν•˜κ²Œ 되면 μžλ™ νƒ€μž… λ³€ν™˜μ΄ 아닐 경우 μ—λŸ¬κ°€ λ°œμƒν•˜κ²Œ λœλ‹€.

 

즉, μ—λŸ¬κ°€ λ°œμƒν•˜λŠ” κ²½μš°λŠ”

Pet pet = new Pet("μ½”μ½”");
Cat cat = (Cat) pet;

 

인 κ²½μš°μ΄λ‹€.

 

Casting κ³Ό Promotion λͺ¨λ‘ λ³΅μž‘ν•˜λ‹€...λ‹€ν˜•μ„± ,,, μ•žμœΌλ‘œ λ”μš±λ” 곡뢀 μ—΄μ‹¬νžˆ 해야지,, ΰ²₯_ΰ²₯

 

[좜처] p. 332 ~ p. 353

728x90