ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • java :: OOP-4, 추상(Abstract, 추상클래스, 추상메소드)
    IT/Java & JSP & FW 2011. 12. 20. 12:39
    추상클래스?
    한 개 이상의 추상메소드를 가지는 클래스

    추상메소드?
    Method에 몸체없이 선언만 하는 것.
    추상 메소드 앞에 abstract란 modifier를 붙여야 한다.
    ex) abstract public void sub();

    abstract 특징
    1. 추상메소드를 한개라도 가진 클래스는 역시 class 앞에 abstract를 붙여주어 추상 클래스로 만들어야 한다.
    2. 추상클래스를 상속받은 클래스에서는 추상 메소드를 강제적으로 오버라이딩해야 한다. 그렇지 않을 경우 그 자식 클래스도 추상클래스가 되어야 한다.
    3. 추상클래스는 타입선언은 할 수 있으나 new해서 객체선언은 할 수 없다.
    4. 반드시 상속을 통해서만 완성된다.
    5. 상속받은 자식 클래스로는 객체 생성이 가능하다. 

    형식-메소드일 경우

    abstract 접근제한자 반환타입 메소드명(매개변수){

    내용..............

    * abstract 와 접근제한자의 위치는 바뀌어도 상관없다.

    형식-클래스일 경우

    abstract class 클래스명{

    내용..............


    추상예제-1
    (Dtest.java)
    //추상클래스 (강제성을 띄고 있다.)
    abstract class Dohyung{
    	int x;
    	int y;  //맴버변수
    	
    	public void getInfo(){
    		System.out.println("도형의 넓이를 구하는 프로그램입니다.");
    	}
    	
    	//추상메소드
    	abstract public void area(int i, int j);  // ;(세미콜론)을 적으면 종료가 되면서 추상메소드가 된다.
    }
    
    //아래부터 추상클래스를 상속받아 작성
    //둘리-사각형넓이
    class Rect extends Dohyung{
    	public void area(int m, int n){
    		int k=m*n;
    		System.out.println("사각형의 넓이는 :"+k);
    	}
    }
    
    //도우너-삼각형넓이
    class Triangle extends Dohyung{
    	@Override  //최근  개발할 때엔 오버라이딩한 메소드는 @Override 라고 적어준다.
    	public void area(int i, int j) {
    		int k=(i*j)/2;
    		System.out.println("삼각형의 넓이는 : "+k);
    	}
    }
    
    //또치-원넓이
    abstract class circle extends Dohyung{
    	abstract public void area(int i);  //부모의 추상메소드를 상속받고 여기서 다시 추상 메소드를 선언함
    }
    
    //마이클 - 또치의 추상메소드를 받음
    class circle2 extends circle{
    	public void area(int i){
    		double k=i*i*Math.PI;
    		System.out.println("원의 넓이 : "+k);
    	}
    	
    	//또치의 추상메소드 외에 또치의 부모추상클래스를 쓰지 않아도 강제적인 오버라이딩을 해주어야 한다.
    	public void area(int i, int j){}
    }
    
    public class Dtest {
    	
    	public void goArea(int i, int j){
    		System.out.println("가로="+i+"/세로="+j+"인 각각도형의 넓이");
    		
    		Triangle t=new Triangle();
    		t.area(i, j);
    		
    		Rect r=new Rect();
    		r.area(i, j);
    		
    		circle2 c=new circle2();
    		c.area(i);
    		
    		//Dohyung d=new Dohyung();
    		//추상클래스는 객체를 못 만든다.
    		
    		//추상클래스로 객체는 못 만들어도, 부모 이름으로 선언은 가능하다.(관리 용이)
    		Dohyung d2=new Triangle();
    		d2.area(i, j);
    		
    		Dohyung d3=new Rect();
    		d3.area(i, j);
    		
    		Dohyung d4=new circle2();
    		d4.area(i, j);  //이렇게 하면 값이 나오지 않는다 다운캐스팅을 해야한다.
    		
    		circle d5=(circle)d4;  //다운 캐스팅을 위한 객체 생성 후 d4 값을 d5에 넣음
    		d5.area(i);  
    		
    		((circle2)d4).area(5);  //()화 시키면 캐스팅을 한 객체로 변한다.
    		
    		System.out.println("===========================");
    		
    		Dohyung arr[]=new Dohyung[3];  //배열을 만드면 관리를 용의하게 한다.
    		arr[0]=new Rect();
    		arr[1]=new Triangle();
    		arr[2]=new circle2();
    		
    		for(int z=0;z<arr.length;z++){
    			if(z==2){
    				((circle)arr[2]).area(5);
    			}else{
    				arr[z].area(5, 5);
    			}
    		}
    	}
    	
    	public static void main(String[] args) {
    		Dtest dt=new Dtest();  // main을 제외한 나머지 메소드와 속성들로 객체를 만든다.
    		dt.goArea(10,20);
    	}
    }
    
    추상예제-2
    (AnimalTest.java)
    import java.io.*;
    
    abstract class Animal{
    	public abstract void crySound();
    	abstract public void getBady(int j);
    }
    
    class Dog extends Animal{
    	public void crySound(){
    		System.out.println("개는 멍멍하고 울어요.");
    	}
    	public void getBady(int j){
    		System.out.println("개가 "+j+"마리 태어났어요.");
    	}
    }
    
    class Cat extends Animal{
    	public void crySound(){
    		System.out.println("고양이는 야옹하고 울어요.");
    	}
    	public void getBady(int j){
    		System.out.println("고양이는 "+j+"마리 태어났어요.");
    	}
    }
    
    class Duck extends Animal{
    	public void crySound(){
    		System.out.println("오리는 꽥꽥하고 울어요.");
    	}
    	public void getBady(int j){
    		System.out.println("오리는 "+j+"마리 테어났어요.");
    	}
    }
    
    public class AnimalTest {
    	public static void main(String[] args) 
    	throws IOException{
    		BufferedReader in=
    				new BufferedReader(new InputStreamReader(System.in));
    		
    		System.out.println("1.강아지 2.고양이 3.오리");
    		System.out.print("입력>");
    		int i=Integer.parseInt(in.readLine());
    		System.out.println("몇 마리");
    		System.out.print("입력>");
    		int j=Integer.parseInt(in.readLine());
    		
    		//배열을 사용하는 방법
    		Animal arr[]=new Animal[3];
    		arr[0]=new Dog();
    		arr[1]=new Cat();
    		arr[2]=new Duck();
    		
    		for(int z=0;z<arr.length;z++){
    			if((z+1)==i){
    				arr[z].crySound();
    				arr[z].getBady(j);
    			}
    		}
    		
    		System.out.println("---------------------");
    		
    		//다른방법
    		Animal ani=null;
    		switch(i){
    		case 1:ani=new Dog();break;
    		case 2:ani=new Cat();break;
    		case 3:ani=new Duck();
    		}
    		ani.crySound();
    		ani.getBady(j);
    	}
    }
    
    * class & abstract & interface 차이가 무엇인지 알아보자.


    final 지정자 (modifier)
    final 지정자는 abstract와 반대 개념

    abstract와 final 차이점
                               abstract                                 final 
    클래스          상속받게하는게 목적           상속을 못 받게하는게 목적
    메소드          강제오버라이딩이 목적        오버라이딩방지
    변수             사용안함                           상수지시(final public static)   <-메모리에 바로 올리면서 고정시켜버림

    final예제
    (FinalTest.java)
    //final+class : 상속 방지
    //final+method : 오버라이딩 방지
    //final+var : 상수(값변경을 금지한다.)
    
    class Super{  //final을 앞에 붙이면 Sub클래스에서 에러가 난다.
    	int a=100;  //final을 붙이면 값 고정이 되어 밑에서 에러가 난다.
    	
    	public void test(){
    		System.out.println("test()!!");
    	}
    }
    
    class Sub extends Super{
    	int b=200;
    	
    	public void test2(){
    		a=200;
    		System.out.println("test2()!!");
    	}
    }
    
    public class FinalTest {
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    
    	}
    }
    


    인터페이스
    자바의 단일상속의 제약을 보완하기 위해 새롭게 제안한 다중상속 개념

    형식

    접근지정자 interface 인터페이스명 extends 인터페이스{

    추상메소드..............


    인터페이스예제
    (InterTest.java)
    class Human{
    	String name;
    	int age;
    	public void getInfo(){
    		System.out.println("이름:"+name);
    		System.out.println("나이:"+age);
    	}
    }
    
    class Fly{
    	public void flying(){
    		System.out.println("나는 무조건 납니다.");
    	}
    }
    
    interface InterFly{  //인터페이스는 추상메소드의 집합체로써 abstract 키워드를 안써도 된다.
    	public void flying();
    }
    
    class SuperMan extends Human implements InterFly{
    	int power;
    	public void getInfo(){  //오버로딩
    		super.getInfo();
    		System.out.println("파워:"+power);
    		flying();
    	}
    	@Override
    	public void flying() {
    		//나는 기능을 구현함
    		System.out.println("슈퍼맨이 납니다.");
    	}
    }
    
    public class InterTest {
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		SuperMan sm=new SuperMan();
    		sm.name="클락켄트";
    		sm.power=90;
    		sm.age=20;
    		sm.getInfo();
    	}
    }
Designed by Tistory.