[JAVA] 좔상화(Abstraction)


Contents


좔상화 Abstraction

λͺ©μ κ³Ό 관련이 μ—†λŠ” 것을 μ œκ±°ν•˜κ³  ν•„μˆ˜μ μΈ μš”μ†Œλ§Œμ„ ν‘œν˜„ν•΄ λ‘” 것을 λ§ν•œλ‹€.

ν΄λž˜μŠ€μ™€ λ©”μ„œλ“œ μ•žμ— abstractλ₯Ό λΆ™μ—¬ μƒμ„±ν•œλ‹€.

ν΄λž˜μŠ€λŠ” 객체λ₯Ό 생성할 수 μžˆμ§€λ§Œ 좔상 ν΄λž˜μŠ€λŠ” 객체λ₯Ό 생성할 수 μ—†λ‹€.


동물 좔상 클래슀둜 μ˜ˆμ‹œλ₯Ό λ“€μ–΄λ³΄μž.

동물은 포유λ₯˜, μ‘°λ₯˜, μ–΄λ₯˜ λ“± λ‹€μ–‘ν•˜κ²Œ μ‘΄μž¬ν•˜λ©° λͺ¨λ“  동물은 μ›€μ§μž„κ³Ό 울음의 νŠΉμ§•μ„ κ°–κ³  있으며 λ‹€μŒκ³Ό 같이 μ •μ˜ν•  수 μžˆλ‹€.

// 좔상 클래슀
public abstract class 동물 {
    // 좔상 λ©”μ„œλ“œ
	abstract void μ›€μ§μž„();
	abstract void 울음();
    abstract void 호흑();
    void λ™λ¬Όλ§Œμ˜νŠΉμ§•() {};
}


이제 동물 좔상 클래슀λ₯Ό μƒμ†λ°›λŠ” 포유λ₯˜ 클래슀λ₯Ό μƒμ„±ν•΄λ³΄μž.

extends둜만 좔상 클래슀λ₯Ό μƒμ†λ°›μœΌλ©΄ compile errorκ°€ λ°œμƒν•œλ‹€. μ΄λŠ” 좔상 클래슀 μ•ˆμ˜ 좔상 λ©”μ„œλ“œλ₯Ό μ •μ˜ν•˜μ§€ μ•Šμ•„μ„œ λ°œμƒν•œλ‹€.

public class 포유λ₯˜ extends 동물 {
    // compile error
    // The type 포유λ₯˜ must implement the inherited abstract method 동물.μ›€μ§μž„()
}


이λ₯Ό ν•΄κ²°ν•˜λŠ” 방법은 λ‹€μŒκ³Ό κ°™λ‹€.

  1. 좔상 클래슀의 λͺ¨λ“  좔상 λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”© ν•œλ‹€.
     public class 포유λ₯˜ extends 동물 {
         @Override
         void μ›€μ§μž„() {
             System.out.println("포유λ₯˜μ˜ μ›€μ§μž„");
         }
         @Override
         void 울음() {
             System.out.println("포유λ₯˜μ˜ 울음");
         }
     }
    
  2. 포유λ₯˜ ν΄λž˜μŠ€λ„ 좔상 클래슀둜 μ •μ˜ν•œλ‹€.
     public abstract class 포유λ₯˜ extends 동물 {
         void 포유λ₯˜νŠΉμ§•() {};
    
         @Override
         void 호흑(){
             System.out.println("폐호흑");
         }
     }
    
    • 포유λ₯˜λ„ 개, 고양이, μ‚¬μž λ“±μœΌλ‘œ λΆ„λ₯˜ν•  수 μžˆμœΌλ‹ˆ 좔상 클래슀둜 생성할 수 μžˆλ‹€.


2번 방법을 μ„ νƒν•œ ν›„ 포유λ₯˜λ₯Ό μƒμ†λ°›λŠ” 개 클래슀λ₯Ό μ •μ˜ν•΄λ³΄μž

public class 개 extends 포유λ₯˜ {
	@Override
	void μ›€μ§μž„() {
		System.out.println("κ°œκ°™μ΄ κ±·κΈ°");
	}

	@Override
	void 울음() {
		System.out.println("κ°œκ°™μ΄ 울기");
	}
}


동물 클래슀의 호흑() 좔상 λ©”μ„œλ“œλŠ” 포유λ₯˜ 좔상 ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜ν–ˆκΈ° λ•Œλ¬Έμ— 포유λ₯˜λ₯Ό μƒμ†λ°›λŠ” 개 ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.

고양이 ν΄λž˜μŠ€λ„ 포유λ₯˜ 클래슀λ₯Ό μƒμ†λ°›μ•„μ„œ λ§Œλ“  ν›„ κ°œμ™€ 고양이 객체λ₯Ό λ§Œλ“ λ‹€λ©΄ 동물과 포유λ₯˜ μžλ£Œν˜•μœΌλ‘œ 객체λ₯Ό 관리할 수 μžˆλ‹€.

고양이 cat = new 고양이();
개 dog = new 개();

동물[] animal = new 동물[] {dog, cat};
포유λ₯˜[] mammalia = new 포유λ₯˜[] {dog, cat}

개, 고양이 ν΄λž˜μŠ€λŠ” 포유λ₯˜ 클래슀λ₯Ό μƒμ†λ°›μ•˜κ³  포유λ₯˜ ν΄λž˜μŠ€λŠ” 동물 클래슀λ₯Ό μƒμ†λ°›μ•„μ„œ κ°€λŠ₯ν•˜λ‹€.




interface

μ™„μ „ν•œ 좔상 ν΄λž˜μŠ€μ΄λ‹€.

javaμ—μ„œλŠ” 닀쀑 상속이 λΆˆκ°€λŠ₯ν•˜μ§€λ§Œ interfaceλŠ” 닀쀑 상속을 ν•  수 μžˆλ‹€.

interfaceλ₯Ό 톡해 관계가 μ—†λŠ” ν΄λž˜μŠ€λ“€μ— 연관성을 λΆ€μ—¬ν•  수 μžˆλ‹€.

μ •μ˜λœ λ©”μ„œλ“œλ₯Ό κ°€μ§ˆ 수 μ—†μ–΄μ„œ λͺ¨λ“  λ©”μ„œλ“œλŠ” 좔상 λ©”μ„œλ“œλ‘œ μ •μ˜ν•΄μ•Ό ν•œλ‹€.

interfaceλ₯Ό μƒμ†λ°›λŠ” ν΄λž˜μŠ€λŠ” interface의 λͺ¨λ“  좔상 λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•΄μ•Ό ν•œλ‹€.

interface ν‚€μ›Œλ“œλ₯Ό 톡해 μ„ μ–Έν•  수 있으며 implements ν‚€μ›Œλ“œλ₯Ό 톡해 상속받을 수 μžˆλ‹€.

λ˜ν•œ, v1.8μ΄μ „μ—λŠ” μƒμˆ˜, 좔상 λ©”μ„œλ“œ μ„ μ–Έλ§Œ κ°€λŠ₯ν–ˆμ§€λ§Œ 이후 λ²„μ „μ—μ„œλŠ” default, static λ©”μ„œλ“œκ°€ μΆ”κ°€λ˜μ—ˆλ‹€.

  • default method
    • interfaceλ₯Ό μƒμ†λ°›λŠ” λͺ¨λ“  ν΄λž˜μŠ€μ— μž¬μ •μ˜ν•˜μ§€ μ•Šμ•„λ„ μ‚¬μš©μ΄ κ°€λŠ₯ν•œ λ©”μ„œλ“œ
    • ν•„μš”μ— μ˜ν•΄ μž¬μ •μ˜ν•  수 μžˆλ‹€.
  • static method
    • interface의 정적 λ©”μ„œλ“œλ„ 클래슀의 정적 λ©”μ„œλ“œμ™€ λ˜‘κ°™μ€ λ°©μ‹μœΌλ‘œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€.



interface 상속

  • interfaceλ₯Ό 상속받아 interfaceλ₯Ό μƒμ„±ν•˜κΈ°
    • extends ν‚€μ›Œλ“œ μ‚¬μš©
  • interfaceλ₯Ό 상속받아 class μƒμ„±ν•˜κΈ°
    • implements ν‚€μ›Œλ“œ μ‚¬μš©
        public class 고래 extends 포유λ₯˜ implements λ¬Όμ—μ„œμ‚¬λŠ”μƒλ¬Ό {
        @Override
        void 움직인닀() {
            System.out.println("κ³ λž˜κ°™μ΄ 움직인닀.");
        }
        }
      



interface κ΅¬ν˜„

public interface λ¬Όμ—μ„œμ‚¬λŠ”μƒλ¬Ό {
    // 1) public static final이 μžλ™μœΌλ‘œ λΆ™μ§€λ§Œ μƒλž΅λœλ‹€.
    int a = 1;

    // 2) interfaceμ—μ„œλŠ” λ©”μ„œλ“œλ₯Ό μ •μ˜ν•  수 μ—†λ‹€.
    void method(){};

    // 3) public abstractκ°€ μžλ™μœΌλ‘œ λΆ™μ§€λ§Œ μƒλž΅λœλ‹€.
    void λ¬Όμƒν™œ();

    // 4) default λ©”μ„œλ“œ
    default void methodD() {
		System.out.println("default method");
	}

    // 5) 정적 λ©”μ„œλ“œ
	static void methodS() {
		System.out.println("static method");
	}
}
  1. μƒμˆ˜ μ„ μ–Έ μ‹œ μ•žμ— public static final이 μžλ™μœΌλ‘œ μƒμ„±λœλ‹€.
    • int a = 1 = public static final int a = 1
  2. interfaceμ—μ„œ λ©”μ„œλ“œλŠ” μ„ μ–Έλ§Œ ν•  수 μžˆλ‹€. λ§Œμ•½ body({ })λ₯Ό 적을 경우 μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.
  3. λ©”μ„œλ“œλ₯Ό μ„ μ–Έν•  λ•Œ public abstractκ°€ μžλ™μœΌλ‘œ μƒμ„±λœλ‹€.
  4. default ν‚€μ›Œλ“œλ₯Ό 톡해 λ””ν΄νŠΈ λ©”μ„œλ“œλ₯Ό 생성할 수 μžˆλ‹€.
  5. static ν‚€μ›Œλ“œλ₯Ό 톡해 정적 λ©”μ„œλ“œλ₯Ό 생성할 수 μžˆλ‹€.