πŸ“•JAVA

[JAVA]λ‹€ν˜•μ„±

λΉ™λ””μš© 2024. 4. 10.

1. λ‹€ν˜•μ„± μ‹œμž‘

- λ‹€ν˜•μ„±μ„ μ΄ν•΄ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ‹€ν˜•μ  μ°Έμ‘°, λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”© 두 개의 이둠을 μ•Œμ•„μ•Ό ν•œλ‹€.

1) λ‹€ν˜•μ  μ°Έμ‘°

public Class Parent {

	public String value = "parent";

	public void parentMethod(){
    	System.out.println("Parent.parentMethod");
	}
}
public class Child extends Parent {

	public String value = "child";

	public void childMethod() {
    	System.out.println("Child.childMethod");
	}
}
//λ‹€ν˜•μ  μ°Έμ‘° : λΆ€λͺ¨λŠ” μžμ‹μ„ ν’ˆμ„ 수 μžˆλ‹€.
public class PolyMain {
	public static void main(String[] args) {

        //λΆ€λͺ¨ λ³€μˆ˜κ°€ μžμ‹ μΈμŠ€ν„΄μŠ€ μ°Έμ‘°(λ‹€ν˜•μ  μ°Έμ‘°)
        System.out.println("Parent -> Child");
        Parent parent = new Child();
        parent.parentMethod(); //Parent.parentMethod
        
        //μžμ‹μ€ λΆ€λͺ¨λ₯Ό 담을 수 μ—†λ‹€(Child child = new Parent(); μ•ˆλ¨)
	}
}

- λΆ€λͺ¨ νƒ€μž…μ€ μžμ‹ νƒ€μž…μ„ 담을 수 μžˆλ‹€.

- Parent parentλŠ” λΆ€λͺ¨ νƒ€μž…μ΄λ‹€. new Childλ₯Ό 톡해 μƒμ„±λœ κ²°κ³ΌλŠ” Child νƒ€μž…μ΄λ‹€. 즉 μžμ‹ νƒ€μž…κΉŒμ§€ μ°Έμ‘°ν•  수 μžˆλ‹€. μ†μžκ°€ μžˆλ‹€λ©΄ κ·Έ ν•˜μœ„ νƒ€μž…λ„ μ°Έμ‘°ν•  수 μžˆλ‹€.

 

* λ‹€ν˜•μ  참쑰의 ν•œκ³„

- μœ„ 처럼 Parent parent = new Child() μƒν™©μ—μ„œ childMethod()λ₯Ό 찾으면 Parent ν΄λž˜μŠ€λΆ€ν„° μ‹œμž‘ν•΄μ„œ κΈ°λŠ₯을 찾을텐데, 상속 κ΄€κ³„λŠ” λΆ€λͺ¨ λ°©ν–₯으둜 올라갈 순 μžˆμ§€λ§Œ, μžμ‹ κ΄€κ³„λ‘œ λ‚΄λ €κ°ˆ 순 μ—†μœΌλ―€λ‘œ 컴파일 였λ₯˜κ°€ λ°œμƒν•œλ‹€.

- μΊμŠ€νŒ…μ„ 톡해 이λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€.

2. λ‹€ν˜•μ„±κ³Ό μΊμŠ€νŒ…

public class CastingMain {
	public static void main(String[] args){
    
    	//λΆ€λͺ¨ λ³€μˆ˜κ°€ μžμ‹ μΈμŠ€ν„΄μŠ€ μ°Έμ‘°(λ‹€ν˜•μ  μ°Έμ‘°)
        Parent parent = new Child();
        
        //μžμ‹μ˜ κΈ°λŠ₯은 호좜 λΆˆκ°€
        //parent.childMethod();
        
        //λ‹€μš΄μΊμŠ€νŒ…(λΆ€λͺ¨ νƒ€μž… -> μžμ‹ νƒ€μž…)
        Child child = (Child) parent; //λ‹€μš΄μΊμŠ€νŒ…μ„ 톡해 λΆ€λͺ¨νƒ€μž…을 μžμ‹ νƒ€μž…μœΌλ‘œ λ³€ν™˜ ν›„ λŒ€μž… μ‹œλ„
        child.childMethod();
	}
}

1) μΊμŠ€νŒ…μ˜ μ’…λ₯˜

* μΌμ‹œμ  λ‹€μš΄ μΊμŠ€νŒ…

public class CastingMain {
	publuc static void main(String[] agrs) {
    
    	Parent parent = new Child();
    	//μΌμ‹œμ  λ‹€μš΄ μΊμŠ€νŒ… - ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” μˆœκ°„λ§Œ λ‹€μš΄μΊμŠ€νŒ…
    	(Child)parent).childMethod(); //λ‹€μš΄μΊμŠ€νŒ…μ„ 톡해 λΆ€λͺ¨νƒ€μž…을 μžμ‹ νƒ€μž…μœΌλ‘œ λ³€ν™˜ ν›„ κΈ°λŠ₯ 호좜
    }
}

- μœ„ μ½”λ“œλŠ” Parent νƒ€μž…μ„ μž„μ‹œλ‘œ Child둜 λ³€κ²½ν•œλ‹€. 이후 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ Child νƒ€μž…μ—μ„œ μ°Ύμ•„ μ‹€ν–‰ν•œλ‹€.

- ν•΄λ‹Ή 참쑰값을 κΊΌλ‚΄κ³  κΊΌλ‚Έ 참쑰값이 Childνƒ€μž…μ΄ λ˜λŠ” 것이닀. λ”°λΌμ„œ parent νƒ€μž…μ€ Parent둜 μœ μ§€λœλ‹€.

 

* μ—…μΌ€μŠ€νŒ…

public class CastingMain{
	public static void(String[] args){
    	
        Child child = new Child();
        Parent parent1 = (Parent) child; //μ—…μΊμŠ€νŒ…μ€ μƒλž΅ κ°€λŠ₯, μƒλž΅ ꢌμž₯
        Parent parent2 = child; // μƒλž΅ ver
        
        parent1.parentMethod();//Parent.parentMethod
	}
}

- Child νƒ€μž…μ„ Parent νƒ€μž…μ— λŒ€μž…ν•˜λŠ” 경우 μ‚¬μš©λœλ‹€. 

- λΆ€λͺ¨ νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜λŠ” κ²½μš°μ—λŠ” (νƒ€μž…)을 μƒλž΅ν•  수 μžˆλ‹€.

 

* μ‚¬μš©ν•  수 μ—†λŠ” νƒ€μž…μœΌλ‘œ λ‹€μš΄μΊμŠ€νŒ…ν•  경우 ClassCastExceptionμ΄λΌλŠ” μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€λ―€λ‘œ, λ‹€μš΄μΊμŠ€νŒ…μ€ μ‘°μ‹¬ν•΄μ„œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

 

3. instanceof

- λ³€μˆ˜κ°€ μ°Έμ‘°ν•˜λŠ” μΈμŠ€ν„΄μŠ€μ˜ νƒ€μž…μ„ ν™•μΈν•˜κ³  싢을 λ•Œ μ‚¬μš©λœλ‹€.

public class CastingMain{
	
    private static void call(Parent parent) {
    	if (parent instanceof Child) {
        	System.out.println("Child μΈμŠ€ν„΄μŠ€ 맞음");
            Child child = (Child) parent;
            child.childMethod();
		}
	}
}

- μœ„ λ§€μ„œλ“œλŠ” λ§€κ°œλ³€μˆ˜λ‘œ λ„˜μ–΄μ˜¨ parentκ°€ μ°Έμ‘°ν•˜λŠ” νƒ€μž…μ— λ”°λΌμ„œ λ‹€λ₯Έ λͺ…령을 μˆ˜ν–‰ν•¨.

- λ‹€μš΄μΊμŠ€νŒ…μ„ μˆ˜ν–‰ν•˜κΈ° μ „μ—λŠ” μœ„μ²˜λŸΌ instanceofλ₯Ό μ‚¬μš©ν•΄ μ›ν•˜λŠ” νƒ€μž…μœΌλ‘œ λ³€κ²½ κ°€λŠ₯ν•œμ§€ ν™•μΈν•œ λ‹€μŒ μˆ˜ν–‰ν•˜λŠ” 것이 μ•ˆμ „ν•¨.

4. λ‹€ν˜•μ„±κ³Ό λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”©

public class OverrideingMain {
	public static void main(String[] args) {
    	
        Parent parent = new Child();
		System.out.println("value = " + parent.value); //value = parent
        //λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”©
        parent.methid(); //Child.method
	}
}

- parent λ³€μˆ˜λŠ” Parent νƒ€μž…. λ”°λΌμ„œ parent.value / parent.methodλ₯Ό ν˜ΈμΆœν•˜λ©΄ Parentμ—μ„œ μ°Ύμ•„μ„œ 싀행함

- μ˜€λ²„λΌμ΄λ”© 된 λ©”μ„œλ“œλŠ” 항상 μš°μ„ κΆŒμ„ 가진닀. λ•Œλ¬Έμ— Parent.methodκ°€ μ•„λ‹Œ, Child.method()κ°€ μ‹€ν–‰λœλ‹€.

 

5. λ‹€ν˜•μ„± ν™œμš©

1) λ‹€ν˜•μ„±μ˜ μž₯점

예) 각자 λ‹€λ₯Έ 동물 μ†Œλ¦¬λ₯Ό ν…ŒμŠ€νŠΈ ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€κΈ°

 

- λ‹€ν˜•μ„±μ„ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 경우

public class Dog {
	public void sound(){
    	System.out.println("멍멍")
	}
}

public class Cat {
	public void sound(){
    	System.out.println("멍멍")
	}
}

public class Caw {
	public void sound(){
    	System.out.println("멍멍")
	}
}

public class AnimalMain {
	public static void main(String[] args) {
    	Dog dog = new Dog();
        Cat cat = new Cat();
        Caw caw = new Caw();
        
        //이뢀뢄이 계속 쀑볡됨
        System.out.println("동물 μ†Œλ¦¬ ν…ŒμŠ€νŠΈ μ‹œμž‘");
        dog.sound();
        System.out.println("동물 μ†Œλ¦¬ ν…ŒμŠ€νŠΈ μ’…λ£Œ");
        
        System.out.println("동물 μ†Œλ¦¬ ν…ŒμŠ€νŠΈ μ‹œμž‘");
        cat.sound();
        System.out.println("동물 μ†Œλ¦¬ ν…ŒμŠ€νŠΈ μ’…λ£Œ");
        
        System.out.println("동물 μ†Œλ¦¬ ν…ŒμŠ€νŠΈ μ‹œμž‘");
        caw.sound();
        System.out.println("동물 μ†Œλ¦¬ ν…ŒμŠ€νŠΈ μ’…λ£Œ");
	}
}

- 쀑볡을 μ œκ±°ν•˜κΈ° μœ„ν•΄μ„œλŠ” ν†΅μƒμ μœΌλ‘œ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜, λ°°μ—΄ λ˜λŠ” for문을 μ‚¬μš©ν•˜μ§€λ§Œ Dog, Cat, CawλŠ” λͺ¨λ‘ λ‹€λ₯Έ 클래슀라 λΆˆκ°€λŠ₯ν•˜λ‹€.

 

- λ‹€ν˜•μ„±μ„ μ‚¬μš©ν•˜μ—¬ 쀑볡 μ—†μ• κΈ°

public calss Animal {
	public void sound() {
    	System.out.println("동물 울음 μ†Œλ¦¬");
	}
}

calss Dog extends Animal {
	@Override
    public void sound(){
		System.out.println("멍멍");
	}
}

calss Cat extends Animal {
	@Override
	public void sound(){
		System.out.println("λƒμ˜Ή");
	}
}

calss Caw extends Animal {
	@Override
	public void sound(){
		System.out.println("음맀");
	}
}

class AnimalPolyMain {
	public static void main(String args){
    	Dog dog = new Dog();
        Cat cat = new Cat();
		Caw caw = new Caw();
        Animal[] animalArr = {dog, cat, caw};
        
        //λ³€ν•˜μ§€ μ•ŠλŠ” μ½”λ“œ
        for (Animal animal : animalArr{
        	System.out.println("동물 μ†Œλ¦¬ ν…ŒμŠ€νŠΈ μ‹œμž‘");
        	animal.sound();
        	System.out.println("동물 μ†Œλ¦¬ ν…ŒμŠ€νŠΈ μ’…λ£Œ");
		}
	}
}

- Animal 클래슀λ₯Ό 상속 λ°›λŠ” κ³³μ—μ„œ sound() λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”©μ„ ν•˜μ§€ μ•ŠλŠ” μ‹€μˆ˜λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄μ„œλŠ” 좔상 λ©”μ„œλ“œλ₯Ό ν™œμš©ν•˜λ©΄ λœλ‹€.

6. 좔상 클래슀

1) 좔상 클래슀

- Animal class와 같이 λΆ€λͺ¨ ν΄λž˜μŠ€λŠ” μ œκ³΅ν•˜μ§€λ§Œ μ‹€μ œ μƒμ„±λ˜λ©΄ μ•ˆλ˜λŠ” 클래슀λ₯Ό 좔상 클래슀라고 함.

- 좔상 ν΄λž˜μŠ€λŠ” 좔상적인 κ°œλ…μ„ μ œκ³΅ν•˜λŠ” 클래슀. 즉, μΈμŠ€ν„΄μŠ€κ°€ μ‘΄μž¬ν•˜μ§€ μ•Šκ³  상속을 λͺ©μ μœΌλ‘œ μ‚¬μš©λ¨.

 

*μ‚¬μš© 예) abstract class AbstractAnimal {...}

- 좔상 ν΄λž˜μŠ€λŠ” κΈ°μ‘΄ ν΄λž˜μŠ€μ™€ μ™„μ „νžˆ κ°™μœΌλ‚˜ new AbstracAnima()κ³Ό 같이 직접 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ λͺ»ν•˜λŠ” μ œμ•½μ΄ 좔가됨.

2) 좔상 λ©”μ„œλ“œ

- μžμ‹ ν΄λž˜μŠ€κ°€ λ°˜λ“œμ‹œ μ˜€λ²„λΌμ΄λ”© ν•΄μ•Ό ν•˜λŠ” λ©”μ„œλ“œλ₯Ό λΆ€λͺ¨ ν΄λž˜μŠ€μ— μ •μ˜ν•˜λŠ” 것.

- 싀체가 μ‘΄μž¬ν•˜μ§€ μ•Šκ³  λ©”μ„œλ“œ λ°”λ””κ°€ μ—†λ‹€.

 

*μ‚¬μš© 예) public abstract void sound();

- 좔상 λ©”μ„œλ“œκ°€ ν•˜λ‚˜λΌλ„ 있으면 좔상 클래슀둜 μ„ μ–Έν•΄μ•Ό ν•œλ‹€.

- 좔상 λ©”μ„œλ“œλŠ” 상속 λ°›λŠ” μžμ‹ ν΄λž˜μŠ€κ°€ λ°˜λ“œμ‹œ μ˜€λ²„λΌμ΄λ”© ν•΄μ„œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

3) 순수 좔상 클래슀

- λͺ¨λ“  λ©”μ„œλ“œκ°€ 좔상 λ©”μ„œλ“œμΈ 좔상 클래슀

- μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μ—†λ‹€.

- μƒμ†μ‹œ μžμ‹μ€ λͺ¨λ“  λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”© ν•΄μ•Ό ν•œλ‹€.

- 주둜 λ‹€ν˜•μ„±μ„ μœ„ν•΄ μ‚¬μš©λœλ‹€.

- μžλ°”λŠ” 이 κΈ°λŠ₯을 νŽΈλ¦¬ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλŠ” μΈν„°νŽ˜μ΄μŠ€λΌλŠ” κ°œλ…μ„ μ‚¬μš©ν•œλ‹€.

7. μΈν„°νŽ˜μ΄μŠ€

- 순수 좔상 클래슀λ₯Ό 더 νŽΈλ¦¬ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλŠ” κΈ°λŠ₯

- μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μ—†λ‹€.

- μƒμ†μ‹œ λͺ¨λ“  λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”© ν•΄μ•Ό ν•œλ‹€.

- 주둜 λ‹€ν˜•μ„±μ„ μœ„ν•΄ μ‚¬μš©λœλ‹€.

- μΈν„°νŽ˜μ΄μŠ€ λ©”μ„œλ“œλŠ” λͺ¨λ‘ public, abstract 이닀.

- λ©”μ„œλ“œμ— public abstractλ₯Ό μƒλž΅ν•  수 μžˆλ‹€.

- 닀쀑 κ΅¬ν˜„μ„ μ§€μ›ν•œλ‹€.

- μΈν„°νŽ˜μ΄μŠ€λŠ” class λŒ€μ‹ μ— interface둜 μ„ μ–Έλœλ‹€.

- μΈν„°νŽ˜μ΄μŠ€λ₯Ό 상속받을 λ•ŒλŠ” implementsλΌλŠ” κ΅¬ν˜„ ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.

 

*μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•΄μ•Όν•˜λŠ” 이유

- μ œμ•½μ„ λ§Œλ“€μ–΄ λ°˜λ“œμ‹œ κ΅¬ν˜„ν•΄μ•Ό ν•˜λŠ” ν•­λͺ©λ“€μ„ 지정할 수 μžˆλ‹€.

- 닀쀑 κ΅¬ν˜„μ΄ κ°€λŠ₯ν•˜λ‹€.

1) 닀쀑 κ΅¬ν˜„

- μΈν„°νŽ˜μ΄μŠ€λŠ” λͺ¨λ‘ 좔상 λ©”μ„œλ“œλ‘œ 이루어져 있기 λ•Œλ¬Έμ— 닀쀑 κ΅¬ν˜„μ΄ κ°€λŠ₯ν•˜λ‹€.

public interface InterfaceA {
    void methodA();
    void methodCommon();
}
public interface InterfaceB {
    void methodB();
    void methodCommon();
}
public class Child implements InterfaceA, InterfaceB {
    @Override
    public void method(){
    	System.out.println("Child.methodA");
    }
    
    @Override
    public void methodB(){
    	System.out.println("Child.methodB");
    }
    
    @Override
    public void methodCommon(){
    	System.out.println("Child.methodCommon");
    }
}
public class DiamondMain {
	public static void main(String[] args){
    	InterfaceA a = new Child();
        a.methodA();
        a.methodCommon();
        
        InterfaceB b = new Child();
        b.methodB();
        b.methodCommon();
	}
}

좜처 : κΉ€μ˜ν•œμ˜ μ‹€μ „ μžλ°”-기본편 

λŒ“κΈ€