BackEnd🧡

2023.05.01 TIL (λ‹€ν˜•μ„± / 좔상화)

hae02y 2023. 5. 1. 20:52
λ°˜μ‘ν˜•

 

πŸ‘€Today...


μ € 아직 죽지 μ•Šμ•˜μŠ΅λ‹ˆλ‹€!

 

 

β˜•μ˜€λŠ˜μ˜ TIL(Today I Learn)


λ‹€ν˜•μ„±?

λ‹€ν˜•μ„±(Polymorphism)은 ν•˜λ‚˜μ˜ 객체가 μ—¬λŸ¬κ°€μ§€ ν˜•νƒœλ₯Ό κ°€μ§ˆμˆ˜μžˆλŠ” μ„±μ§ˆμ„ μ˜λ―Έν•œλ‹€. 즉 μžλ°”μ—μ„œμ˜ λ‹€ν˜•μ„±μ΄λž€ ν•œνƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜λ₯Ό 톡해 μ—¬λŸ¬ νƒ€μž…μ˜ 객체λ₯Ό μ°Έμ‘°ν• μˆ˜μžˆλ„λ‘ λ§Œλ“ κ²ƒμ„ μ˜λ―Έν•œλ‹€. μƒμœ„ 클래슀 νƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜λ₯Ό ν†΅ν•΄μ„œ ν•˜μœ„ 클래슀 객체λ₯Ό μ°Έμ‘°ν• μˆ˜μžˆλ„λ‘ ν—ˆμš©ν•œκ²ƒ 이라고도 ν• μˆ˜μžˆλ‹€.

 

μƒμœ„ 클래슀λ₯Ό μ°Έμ‘°λ³€μˆ˜μ˜ νƒ€μž…μœΌλ‘œ μ§€μ •ν•˜λ©΄, μ°Έμ‘°λ³€μˆ˜κ°€ μ‚¬μš©ν• μˆ˜μžˆλŠ” λ©€λ²„μ˜ κ°œμˆ˜λŠ” μƒμœ„ν΄λž˜μŠ€μ˜ λ©€λ²„μˆ˜κ°€ λœλ‹€.

 

public class FriendTest {

    public static void main(String[] args) {
        Friend friend = new Friend(); // 객체 νƒ€μž…κ³Ό μ°Έμ‘° λ³€μˆ˜ νƒ€μž…μ˜ 일치 -> κ°€λŠ₯
        BoyFriend boyfriend = new BoyFriend();
        Friend girlfriend = new GirlFriend(); // 객체 νƒ€μž…κ³Ό μ°Έμ‘° λ³€μˆ˜ νƒ€μž…μ˜ 뢈일치 -> κ°€λŠ₯
	//  GirlFriend friend1 = new Friend(); -> ν•˜μœ„ν΄λž˜μŠ€ νƒ€μž…μœΌλ‘œ μƒμœ„ν΄λž˜μŠ€ 객체 μ°Έμ‘° -> λΆˆκ°€λŠ₯

        friend.friendInfo();
        boyfriend.friendInfo();
        girlfriend.friendInfo();
    }
}

 

 

νƒ€μž…λ³€ν™˜ 및 심화

μ°Έμ‘°λ³€μˆ˜μ˜ νƒ€μž…λ³€ν™˜μ€ μ‚¬μš©ν• μˆ˜μžˆλŠ” λ©€λ²„μ˜ 개수λ₯Ό μ‘°μ ˆν•˜λŠ”κ²ƒμ„ μ˜λ―Έν•œλ‹€. νƒ€μž…λ³€ν™˜μ„ μœ„ν•΄μ„œλŠ” 3가지 쑰건을 μΆ©μ‘±ν•΄μ•Ό ν•œλ‹€.

  • μ„œλ‘œ 상속 관계에 μžˆλŠ” μƒμœ„ν΄λž˜μŠ€ - ν•˜μœ„ 클래슀 μ‚¬μ΄μ—μ„œλ§Œ νƒ€μž…λ³€ν™˜μ΄ κ°€λŠ₯
  • ν•˜μœ„ν΄λž˜μŠ€ => μƒμœ„ν΄λž˜μŠ€ νƒ€μž…μœΌλ‘œ νƒ€μž…λ³€ν™˜(μ—…μΊμŠ€νŒ…)은 ν˜•λ³€ν™˜ μ—°μ‚°μž μƒλž΅ κ°€λŠ₯
  • μƒμœ„ν΄λž˜μŠ€ => ν•˜μœ„ν΄λž˜μŠ€ νƒ€μž…μœΌλ‘œ νƒ€μž…λ³€ν™˜(λ‹€μš΄μΊμŠ€νŒ…)은 ν˜•λ³€ν™˜ μ—°μ‚°μž(κ΄„ν˜Έ) λ°˜λ“œμ‹œ λͺ…μ‹œ

+ λ‹€μš΄μΊμŠ€νŒ…μ€ μ—…μΊμŠ€νŒ… λ˜μ–΄μžˆλŠ” μ°Έμ‘°λ³€μˆ˜μ— ν•œν•΄μ„œλ§Œ κ°€λŠ₯

public class VehicleTest {
    public static void main(String[] args) {
        Car car = new Car();
        Vehicle vehicle = (Vehicle) car; // μƒμœ„ 클래슀 Vehicle νƒ€μž…μœΌλ‘œ λ³€ν™˜(μƒλž΅ κ°€λŠ₯)
        Car car2 = (Car) vehicle; // ν•˜μœ„ 클래슀 Carνƒ€μž…μœΌλ‘œ λ³€ν™˜(μƒλž΅ λΆˆκ°€λŠ₯)
        MotorBike motorBike = (MotorBike) car; // 상속 관계가 μ•„λ‹ˆλ―€λ‘œ νƒ€μž… λ³€ν™˜ λΆˆκ°€ -> μ—λŸ¬λ°œμƒ
    }
}

class Vehicle {
}

class Car extends Vehicle {
    }
}

class MotorBike extends Vehicle {
    }
}

 

# instanceof μ—°μ‚°μž

instanceof μ—°μ‚°μžλŠ” νƒ€μž…λ³€ν™˜(μ—…/λ‹€μš΄μΊμŠ€νŒ…)이 κ°€λŠ₯ν•œμ§€ μ—¬λΆ€λ₯Ό booleanνƒ€μž…μœΌλ‘œ ν™•μΈν• μˆ˜μžˆλŠ” μš”μ†Œμ΄λ‹€.

μ°Έμ‘°λ³€μˆ˜ instanceof type

>> 객체의 νƒ€μž…μ„ ν™•μΈν•˜κΈ° μ–΄λ €μš΄ μƒν™©μ—μ„œ ν˜•λ°˜ν™˜ μ—¬λΆ€λ₯Ό ν™•μΈν•˜μ—¬ μ—λŸ¬λ₯Ό μ΅œμ†Œν™”ν•œλ‹€.

>> ifλ¬Έκ³Ό ν•¨κ»˜ ν•˜μ—¬ νš¨μœ¨μ„ λ‚Όμˆ˜μžˆλ‹€.

 

 

좔상화 / μΆ”μƒν΄λž˜μŠ€

좔상화(Abstracet)λŠ” 기쑴의 ν΄λž˜μŠ€λ“€μ˜ 곡톡적인 μš”μ†Œλ₯Ό λ½‘μ•„μ„œ μƒμœ„ν΄λž˜μŠ€λ₯Ό λ§Œλ“€μ–΄ λ‚΄λŠ”κ²ƒμ„ 가리킨닀. 

μ΄λŸ¬ν•œ 좔상화λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μžλ°” 문법은 μΆ”μƒν΄λž˜μŠ€λΌκ³  ν•œλ‹€. abstract μ œμ–΄μžλ₯Ό μ΄μš©ν•΄μ„œ λ‚˜νƒ€λ‚΄λ©°, λ©”μ„œλ“œμ•žμ— λΆ™μœΌλ©΄ μΆ”μƒλ©”μ„œλ“œ, ν΄λž˜μŠ€μ•žμ— λΆ™μœΌλ©΄ 좔상 클래슀 라고 λΆ€λ₯Έλ‹€. λ˜ν•œ μ–΄λ–€ ν΄λž˜μŠ€μ— μΆ”μƒλ©”μ„œλ“œκ°€ ν¬ν•¨λ˜μ–΄μžˆμœΌλ©΄ ν•΄λ‹Ήν΄λž˜μŠ€λŠ” μžλ™μœΌλ‘œ 좔상 ν΄λž˜μŠ€κ°€ λœλ‹€. 

abstract class AbstractExample { // 좔상 λ©”μ„œλ“œκ°€ μ΅œμ†Œ ν•˜λ‚˜ 이상 ν¬ν•¨λΌμžˆλŠ” 좔상 클래슀
	abstract void start(); // λ©”μ„œλ“œ λ°”λ””κ°€ μ—†λŠ” μΆ”μƒλ©”μ„œλ“œ
}

보면 μΆ”μƒλ©”μ„œλ“œλŠ” λ―Έμ™„μ„±λœ λ©”μ„œλ“œμ΄κ³ , 이λ₯Ό ν¬ν•¨ν•œ ν΄λž˜μŠ€λ„ λ―Έμ™„μ„±λœ ν΄λž˜μŠ€μ΄λ‹€. μΆ”μƒν΄λž˜μŠ€λŠ” λ©”μ„œλ“œλ°”λ””κ°€ μ™„μ„±λ˜κΈ° μ „κ°€μ§€λŠ” 객체생성이 λΆˆκ°€λŠ₯ν•˜λ‹€. => μƒμ„±μ‹œ μ˜€λ²„λΌμ΄λ”©μ„ 톡해 상속받은 좔상 λ©”μ„œλ“œμ˜ λ‚΄μš©μ„ λ°˜λ“œμ‹œ κ΅¬ν˜„ν•˜μ—¬μ•Όν•œλ‹€.

abstract class Animal {
	public String kind;
	public abstract void sound();
}

class Dog extends Animal { // Animal ν΄λž˜μŠ€λ‘œλΆ€ν„° 상속
	public Dog() {
		this.kind = "포유λ₯˜";
	}

	public void sound() { // λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”© -> κ΅¬ν˜„λΆ€ μ™„μ„±(κ°•μ œλœλ‹€)
		System.out.println("멍멍");
	}
}

class Cat extends Animal { // Animal ν΄λž˜μŠ€λ‘œλΆ€ν„° 상속
	public Cat() {
		this.kind = "포유λ₯˜";
	}

	public void sound() { // λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”© -> κ΅¬ν˜„λΆ€ μ™„μ„±(κ°•μ œλœλ‹€)
		System.out.println("μ•Όμ˜Ή");
	}
}

class DogExample {       
    public static void main(String[] args) throws Exception {
       Animal dog = new Dog();
       dog.sound();

       Cat cat = new Cat();
       cat.sound();
    }
 }

μΆ”μƒν΄λž˜μŠ€λ₯Ό μ‚¬μš©ν•˜μ—¬ μƒμ†λ°›λŠ” ν•˜μœ„ν΄λž˜μŠ€μ—μ„œ μ˜€λ²„λΌμ΄λ”©μ„ ν•˜κ²Œ 되면 각각 상황에 λ§žλŠ” λ©”μ„œλ“œμ˜ κ΅¬ν˜„μ΄ κ°€λŠ₯해진닀. 

 

# final

finalν‚€μ›Œλ“œλŠ” 클래슀,λ©”μ„œλ“œ,λ³€μˆ˜ μ•žμ— μ‚¬μš©λ˜κ³  더이상 ν•΄λ‹Ή λŒ€μƒμ€ 변경이 λΆˆκ°€λŠ₯ν•˜κ±°λ‚˜ ν™•μž₯λ˜μ§€ μ•ŠλŠ” μ„±μ§ˆμ„ 띀닀.

 

μœ„μΉ˜ 의미
클래슀 λ³€κ²½ λ˜λŠ” ν™•μž₯ λΆˆκ°€λŠ₯ν•œ 클래슀, 상속 λΆˆκ°€
λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”© λΆˆκ°€
λ³€μˆ˜ κ°’ 변경이 λΆˆκ°€ν•œ μƒμˆ˜

 

 

μΈν„°νŽ˜μ΄μŠ€?

μΈν„°νŽ˜μ΄μŠ€(interface)λŠ” μΆ”μƒν™”μ˜ κ°€μž₯ 핡심적인 역할을 λ‹΄λ‹Ήν•œλ‹€. μΈν„°νŽ˜μ΄μŠ€λž€ λ‹€λ₯Έ λŒ€μƒ 사이λ₯Ό μ—°κ²°ν•œλ‹€λŠ” 의미λ₯Ό κ°€μ§€κ³ μžˆλ‹€. μΈν„°νŽ˜μ΄μŠ€λŠ” 기본적으둜 μΆ”μƒλ©”μ„œλ“œμ™€ μƒμˆ˜λ§Œμ„ λ©€λ²„λ‘œ κ°€μ§ˆμˆ˜μžˆλ‹€. (μžλ°”8 이후에 default/static λ©”μ„œλ“œλ₯Ό μΈν„°νŽ˜μ΄μŠ€μ—μ„œ μ‚¬μš©ν• μˆ˜μžˆλ„λ‘ ν—ˆμš©)

public interface InterfaceEx {
    public static final int rock =  1; // μΈν„°νŽ˜μ΄μŠ€ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ μ •μ˜
    final int scissors = 2; // public static μƒλž΅
    static int paper = 3; // public & final μƒλž΅

    public abstract String getPlayingNum();
		void call() //public abstract μƒλž΅ 
}

μΈν„°νŽ˜μ΄μŠ€λŠ” 일반 ν΄λž˜μŠ€μ™€ λ‹€λ₯΄κ²Œ λ‚΄λΆ€μ˜ λͺ¨λ“ ν•„λ“œκ°€ public static final둜 μ •μ˜λœλ‹€. 그리고 λͺ¨λ“  λ©”μ„œλ“œλŠ” public abstract둜 μ •μ˜λœλ‹€. λ§Œμ•½ μƒλž΅μ΄ λœλ‹€λ©΄ μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μœΌλ‘œ μΆ”κ°€ν•˜κ²Œ λœλ‹€.

//μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„
class 클래슀λͺ… implements μΈν„°νŽ˜μ΄μŠ€λͺ… {
		... // μΈν„°νŽ˜μ΄μŠ€μ— μ •μ˜λœ λͺ¨λ“  μΆ”μƒλ©”μ„œλ“œ κ΅¬ν˜„
}

//μΈν„°νŽ˜μ΄μŠ€ λ‹€μ€‘κ΅¬ν˜„
class ExampleClass implements ExampleInterface1, ExampleInterface2, ExampleInterface3 { 
				... μƒλž΅ ...
}

//상속 & μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„
class Dog extends Animal implements Pet { // Animal 클래슀 상속 & Pet μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„
    public void cry(){
        System.out.println("멍멍!");
    }

 

 

DI(Dependency Injection)

DI 즉 μ˜μ‘΄μ„± μ£Όμž…μ€ 객체가 μžμ‹ μ΄ μ˜μ‘΄ν•  객체λ₯Ό 슀슀둜 λ§Œλ“€λ„λ‘ ν•˜λŠ”κ²ƒμ΄ μ•„λ‹ˆλΌ μ™ΈλΆ€μ—μ„œ μ£Όμž…μ„ ν•΄μ£ΌλŠ” 것을 μ˜λ―Έν•˜λ‹€.  

=> 쒀더 곡뢀 ν•„μš”ν•¨, 버거퀸 μ™„μ„±ν•˜κ³  볡슡 ν•„μš”


πŸ‘Šν˜Όμžμ„œ ν•΄κ²°ν•˜κΈ°


λ‚΄μš©

 

 

λ°˜μ‘ν˜•