ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JAVA μžλ°” μΆ”μƒν΄λž˜μŠ€ abstract
    JAVA 2020. 8. 7. 23:58

    🎯 μžλ°”μ˜ μΆ”μƒν΄λž˜μŠ€λ₯Ό μ•Œμ•„λ³Έλ‹€.

     

     

     

     

    μΆ”μƒν΄λž˜μŠ€

    "이 ν•¨μˆ˜λ§Œμ€ λ°˜λ“œμ‹œ μžμ‹μ—κ²Œ μ£Όκ² λ‹€!"

    public abstract class 클래슀λͺ…{
      :μΈμŠ€ν„΄μŠ€ λ³€μˆ˜
      :일반 λ©”μ†Œλ“œ (concrete method)
      :μƒμ„±μž
      :좔상 λ©”μ†Œλ“œ (abstract method)}

    abstract ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄ μΆ”μƒν΄λž˜μŠ€λ₯Ό μ„ μ–Έν•œλ‹€. ν•˜μœ„ν΄λž˜μŠ€μ—μ„œ λ°˜λ“œμ‹œ λΆ€λͺ¨ν΄λž˜μŠ€μ˜ λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜λ„λ‘ κ°•μ œν•  수 μžˆλŠ” ν΄λž˜μŠ€λ‹€. `{블둝}`이 μ—†λŠ” λ©”μ†Œλ“œλ₯Ό μΆ”μƒλ©”μ†Œλ“œλΌκ³  ν•˜λ©°, 블둝이 μ—†κΈ° λ•Œλ¬Έμ— μ•„λ¬΄λŸ° μˆ˜ν–‰λ°©λ²•λ„ μ œμ‹œλ˜μ§€ μ•Šμ€ μƒνƒœλ‹€. public abstract void λ©”μ†Œλ“œλͺ…([인자]); 이 μΆ”μƒλ©”μ†Œλ“œλ₯Ό ν•˜λ‚˜λΌλ„ ν¬ν•¨ν•˜λ©΄ μΆ”μƒν΄λž˜μŠ€κ°€ λ˜λŠ”λ°, κ΅¬ν˜„λ˜μ§€ μ•Šμ€ λ―Έμ™„μ„± μƒνƒœμ˜ 좔상적인 클래슀λ₯Ό μ˜λ―Έν•œλ‹€. 이 μΆ”μƒν΄λž˜μŠ€λ₯Ό ꡬ체적으둜 κ΅¬ν˜„ν•  μ±…μž„μ€ 상속받아 μ‚¬μš©ν•˜λŠ” ν•˜μœ„ν΄λž˜μŠ€μ—κ²Œ λ„˜κΈ΄λ‹€.

    μΆ”μƒν΄λž˜μŠ€μ—λŠ” μΆ”μƒλ©”μ†Œλ“œκ°€ 포함될 수 있기 λ•Œλ¬Έμ— 객체생성이 λΆˆκ°€λŠ₯ν•˜λ‹€. λ”°λΌμ„œ ν•˜μœ„ν΄λž˜μŠ€λŠ” 일반클래슀λ₯Ό μ΄μš©ν•˜μ—¬ μΆ”μƒν΄λž˜μŠ€μ˜ μΆ”μƒλ©”μ†Œλ“œλ₯Ό λ°˜λ“œμ‹œ μ˜€λ²„λΌμ΄λ”©(μž¬μ •μ˜) ν•΄μ•Όν•œλ‹€. 

     

    abstract class MyClass{
    	int num = 3;
    	public MyClass() {}
    	public MyClass(int num) {
    		this.num = num;
    	}  
    	public void methodA() {
    		System.out.println("methodA");
    	}
    	public abstract void methodB();
    }
    
    class MyClassImpl extends MyClass {
    	public void print() {
    		System.out.println(num);
    	}
    	@Override
    	public void methodB() {
    		System.out.println("methodB");
    	}
    }
    
    public class Ex07_1 {
    	public static void main(String[] args) {
    		 MyClassImpl imp = new  MyClassImpl();
    		 imp.print();
    		 imp.methodB();
    	}
    }

    MyClass ν΄λž˜μŠ€λŠ” κ΅¬ν˜„λ˜μ§€ μ•Šμ€ μΆ”μƒλ©”μ†Œλ“œ methodBλ₯Ό ν¬ν•¨ν•˜κ³  있기 λ•Œλ¬Έμ— μΆ”μƒν΄λž˜μŠ€λ‘œ μž‘μ„±ν•΄μ•Ό ν•œλ‹€. 이 μΆ”μƒν΄λž˜μŠ€λ₯Ό κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄μ„œ MyClassλ₯Ό μƒμ†λ°›λŠ” 일반 클래슀 MyClassImpl을 λ§Œλ“€κ³ , μΆ”μƒλ©”μ†Œλ“œ methodBλ₯Ό μ˜€λ²„λΌμ΄λ”©ν•΄μ„œ μ›λž˜ μ—†λ˜ {블둝}을 μ—΄κ³ , κ·Έ μ•ˆμ— ꡬ체적으둜 μˆ˜ν–‰μ½”λ“œλ₯Ό λ§Œλ“€μ–΄μ„œ κ΅¬ν˜„ μž„λ¬΄λ₯Ό μ™„λ£Œν–ˆλ‹€. 

    κ²°κ³Ό 싀행을 μœ„ν•΄ mainν•¨μˆ˜ μ•ˆμ— κ΅¬ν˜„μ΄ μ™„λ£Œλœ 일반클래슀 MyClassImpl을 κ°μ²΄μƒμ„±ν•˜κ³  ν”„λ¦°νŠΈν•¨μˆ˜μ™€ methodBν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œλ‹€.

    MyClass my = new MyClassImpl();

    μΆ”μƒν΄λž˜μŠ€λŠ” 객체생성이 λΆˆκ°€λŠ₯ν•˜μ§€λ§Œ μœ„μ™€ 같이 λ‹€ν˜•μ„±μ„ μ μš©ν•΄μ„œ λ³€μˆ˜νƒ€μž…μœΌλ‘œ μΆ”μƒν΄λž˜μŠ€λ₯Ό μ‚¬μš©ν•  μˆ˜λ„ μžˆλ‹€.

     

     

    클래슀λ₯Ό μͺΌκ°œμ„œ μΆ”μƒν΄λž˜μŠ€ μ‚¬μš©ν•΄λ³΄κΈ°

    public abstract class Abstract {
    	private int num;
    	public abstract void a(); //블둝이 μ—†λŠ” μΆ”μƒλ©”μ†Œλ“œ μ„ μ–Έ
    	public abstract int b(); //블둝이 μ—†λŠ” μΆ”μƒλ©”μ†Œλ“œ μ„ μ–Έ
    	public abstract void c(int x); //블둝이 μ—†λŠ” μΆ”μƒλ©”μ†Œλ“œ μ„ μ–Έ
    	public int getNum() {
    		return num;
    	}
    	public void setNum(int num) {
    		this.num = num;
    	}
    	public Abstract() {
    		super();
    	}
    	public Abstract(int num) {
    		super();
    		this.num = num;
    	}
    }

    abstractλ₯Ό λΆ™μ—¬ μΆ”μƒν΄λž˜μŠ€μž„μ„ μ„ μ–Έν•œ Abstract 클래슀λ₯Ό λ§Œλ“ λ‹€. 이 μ•ˆμ—λŠ” a, b, c 3개의 μΆ”μƒλ©”μ†Œλ“œκ°€ λ“€μ–΄μžˆλ‹€. μ™ΈλΆ€ν΄λž˜μŠ€μ—μ„œ private λ³€μˆ˜μΈ num에 μ ‘κ·Όν•  수 있게 getter와 setter ν•¨μˆ˜λ₯Ό λ§Œλ“€κ³  μƒμ„±μžλ₯Ό λ§Œλ“ λ‹€.

    public class ConcreteClass extends Abstract{
    	public ConcreteClass() {
    		super();
    	}
    	public ConcreteClass(int num) {
    		super(num);
    	}
    	@Override
    	public void a() {  //μΆ”μƒλ©”μ†Œλ“œ ν˜•μ‹λ§Œ κ·ΈλŒ€λ‘œ 상속받고
    		System.out.println("a");  //κ΅¬ν˜„μ€ μ—¬κΈ°μ„œν•œλ‹€
    	}
    	@Override
    	public int b() {
    		System.out.println("b");
    		return 0;
    	}
    	@Override
    	public void c(int x) {
    		System.out.println("c");
    	}
    }

    μΆ”μƒν΄λž˜μŠ€λ₯Ό μƒμ†λ°›λŠ” 일반클래슀 ConcreteClassλ₯Ό λ§Œλ“ λ‹€. κ³ μœ ν•œ λ³€μˆ˜λŠ” μ—†κ³  λΆ€λͺ¨μ—μ„œ 상속받은 num만 μƒμ„±μžλ‘œ λ§Œλ“€μ—ˆλ‹€. 이제 λΆ€λͺ¨μ˜ λ―Έμ™„μ„± μΆ”μƒλ©”μ†Œλ“œλ₯Ό μ™„μ „ν•œ ν˜•νƒœλ‘œ κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ μΆ”μƒν΄λž˜μŠ€κ°€ 가진 μΆ”μƒλ©”μ†Œλ“œ 3개λ₯Ό κ·ΈλŒ€λ‘œ μ˜€λ²„λΌμ΄λ”© ν•΄μ„œ κ΄„ν˜Έ μ•ˆμ— μƒˆλ‘œμš΄ λ‚΄μš©μ„ κ΅¬ν˜„ν•œλ‹€.

    public class ConcreteClass2 extends Abstract{	
    	public ConcreteClass2() {
    		super();
    	}
    	public ConcreteClass2(int num) {
    		super(num);
    	}
    	@Override
    	public void a() {
    		System.out.println("ConcreteClass2====a");
    	}
    	@Override
    	public int b() {
    		System.out.println("ConcreteClass2====b");
    		return 0;
    	}
    	@Override
    	public void c(int x) {
    		System.out.println("ConcreteClass2====c");		
    	}	
    }

    μΆ”μƒν΄λž˜μŠ€λ₯Ό μƒμ†λ°›λŠ” 또 λ‹€λ₯Έ ConcreteClass2 클래슀λ₯Ό λ§Œλ“ λ‹€. μΆ”μƒν΄λž˜μŠ€λ„ 클래슀이기 λ•Œλ¬Έμ— μžμ‹μ€ ν•˜λ‚˜μ˜ λΆ€λͺ¨λ§Œ κ°€μ§ˆ 수 μžˆλŠ” λ‹¨μΌμƒμ†λ§Œ κ°€λŠ₯ν•˜λ‹€.  μ—¬κΈ°μ„œλ„ μ—­μ‹œ μΆ”μƒλ©”μ†Œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”©ν•΄μ„œ κ΅¬ν˜„ μž„λ¬΄λ₯Ό μ™„λ£Œν–ˆλ‹€.

    public class TestMain {
    	public static void main(String[] args) {
    	//	Abstract x = new Abstract();
    		ConcreteClass y = new ConcreteClass(100);
    		System.out.println(y.getNum());
    		y.a();
    		int n = y.b();
    		y.c(100);
            
    		ConcreteClass2 y2 = new ConcreteClass2();
    		System.out.println(y2.getNum());
    		y2.a();
    		int n2 = y2.b();
    		y2.c(100);
    	}
    }

    ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•  수 μžˆλŠ” main λ©”μ†Œλ“œλ₯Ό 가진 TestMain 클래슀λ₯Ό λ§Œλ“ λ‹€. λΆˆμ™„μ „ν•œ μΆ”μƒν΄λž˜μŠ€λŠ” 객체생성을 ν•  수 μ—†κΈ° λ•Œλ¬Έμ— μ£Όμ„μ²˜λ¦¬λœ λ¬Έμž₯은 μ‚¬μš©ν•  수 μ—†λ‹€. μΆ”μƒν΄λž˜μŠ€λ₯Ό 상속받아 λ§Œλ“€μ–΄μ§„ ConcreteClass의 객체λ₯Ό μƒμ„±ν•˜λ©° 인자 num에 100을 λ„£μ–΄ μƒμ„±μžμ˜ 기본값을 μ €μž₯ν–ˆλ‹€. 그리고 μ°Έμ‘°λ³€μˆ˜ y둜 λΆ€λͺ¨ν΄λž˜μŠ€μ˜ getNum λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜κ³  μžˆλ‹€.

    그런데 getNum λ©”μ†Œλ“œλŠ” ConcreteClass에 μ•ˆ λ§Œλ“€μ–΄μ€¬λŠ”λ° μ–΄λ–»κ²Œ 좜λ ₯이 될까? 상속관계에선 μžμ‹ν΄λž˜μŠ€κ°€ λΆ€λͺ¨μ˜ λͺ¨λ“  멀버λ₯Ό μ„ μ–Έ 없이 μ‚¬μš©ν•  수 μžˆλ‹€. 

    int n = y.b(); μ—μ„œ y.b()λŠ” b ν•¨μˆ˜μ—μ„œ μž‘μ„±ν•œ 문자 bλ₯Ό ν”„λ¦°νŠΈν•˜λŠ” κ±Έ λ³Ό 수 있고, int n μ—λŠ” 리턴값 0이 μ €μž₯λ˜μ–΄ μžˆλ‹€. y.c() ν•¨μˆ˜λŠ” 인자둜 100을 λ„£κΈ΄ν–ˆλŠ”λ° 뭘 λ„£λ“  cλ₯Ό 좜λ ₯ν•˜λŠ” λ©”μ†Œλ“œλ‘œ λ§Œλ“€μ–΄μ‘Œλ‹€. 

    ConcreteClass2 ν΄λž˜μŠ€λŠ” μƒμ„±μž 호좜 μΈμžμ— 아무것도 μž…λ ₯ν•˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— κΈ°λ³Έμƒμ„±μžλ₯Ό ν˜ΈμΆœν•œλ‹€. int의 기본값인 0으둜 μ΄ˆκΈ°ν™”λœλ‹€. λ‚˜λ¨Έμ§€ μ½”λ“œλŠ” μœ„μ™€κ°™μ€ λ°©μ‹μœΌλ‘œ μ‹€ν–‰λœλ‹€.

     

     

     

    😜 NEXT : μžλ°” μΈν„°νŽ˜μ΄μŠ€ κ³΅λΆ€ν•˜κΈ°

    λ°˜μ‘ν˜•

    λŒ“κΈ€

κ°œλ°œκ³΅λΆ€