-
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 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(); } }
'IT > Java & JSP & FW' 카테고리의 다른 글
java :: 유용한 API, String, StringBuffere, StringTokenizer (0) 2011.12.22 java :: Exception(예외처리) (0) 2011.12.21 java :: OOP-3, 상속, 다형성, pakage(패키지) (0) 2011.12.19 java :: OOP-2, 추상화, 은닉화, 다형성 (1) 2011.12.16 java :: OOP-1, Object Oriented Programming(OOP) (0) 2011.12.15