본문 바로가기
JAVA

추상클래스(abstract), 익명클래스

by EUN-JI 2023. 7. 15.

추상클래스

: 클래스 이름 앞에 abstract를 붙인 추상 클래스

: 객체를 생성할 수 없다.

: 몸체가 없는 메소드를 가질 수 있다.

: 추상 클래스는 추상 메소드를 가진다.

 

필요한가? ★

: 서브클래스 만들수 있음(추상 클래스 상속받은 서브클래스는 객체 생성위해)

: 추상 클래스에서 상속받은 추상 메소드의 몸체를 서브 클래스에서 오버라이딩 구현작업 필요

 

: 추상클래스를 상속받은 모든 서브 클래스는 추상메소드 (show()메소드) 와 같은 이름의 메소드를 가지고 있다.

: 추상클래스를 사용하면 "서브 클래스 관리가 용이"해진다.

 

= 추상 클래스와 그를 상속받은 서브 클래스를 사용하면 이해하기 쉬운 코드를 작성할 수 있다. 

 

익명클래스

:  객체를 생성하면서 곧바로 그자리에서 클래스 설계를 하는 문법

:  다른 곳에서는 못쓰는 1회용 설계도이면서 객체가 1개

:  상속하는 이름없는 클래스

Anonymous class (테스트를 상속한 이름없는 클래스 ..생략가능한 문법)

 

 

 

 

 

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		//추상 메소드와 추상 클래스
		//Animal <- dog, cat , pig (상속)
		Animal[] anis= new Animal[5]; 
//		anis[0]=new Animal(); //추상클래스는 객체생성불가 
		anis[0]=new Dog();
		anis[1]=new Dog();
		anis[2]=new Cat();
		anis[3]=new Pig();
		anis[4]=new Pig();
		
		anis[0].say();
		anis[1].say();
		anis[2].say();
		anis[3].say();
		anis[4].say();
		System.out.println();
		
		//추상클래스를 사용하면 실수로 객체를 만드는 오류를 막아줌 
		
		//추상클래스의 문법적 특징만 간단히 알아보기 ..
		
		//Test t=new Test(); //error -추상클래스는 new로 객체생성불가
		//추상클래스는 상속해서 사용함.
		//테스트를 상속하는 aaa,bbb 클래스생성 
		AAA obj = new AAA();
		obj.aaa();
		
		BBB obj2 = new BBB();
		obj2.aaa();
		
		obj2.aaa();
		System.out.println();
		
		//업캐스팅도 가능할 것임
		Test t=new AAA();
		t.aaa();
		System.out.println();
		
		Test t2=new BBB();
		t2.aaa();
		
		System.out.println();
		//딱 한번만 사용할 클래스를 설계- test 추상클래스의 자식으로 ..
		//test의 자식클래스이지만 딱 1개의 객체만 만들고 싶을때..  >>많이 쓰임. ***
		//객체를 생성하면서 곧바로 그자리에서 클래스의 설계를 하는 문법***
		//사실은 test를 상속하는 이름없는 클래스를 설계하는 것임.
		//익명클래스라함: Anonymous class (테스트를 상속한 이름없는 클래스 ..생략가능한 문법)
		Test t3=new Test() {
			void aaa() {
				System.out.println("익명클래스의 aaa메소드");
			}
		};  //다른곳에서는 못씀. 1회용 설계도면 객체가 1개임 
		t3.aaa();
		
		
		
	}

}//Main class..


//상속용 클래스 설계
//추상메소드를 가지고 있는 클래스는 객체로 만들면 안됨. 
//추상클래스로 만들어야 함.
abstract class Animal{
	//이름만 있고 내용은 없는 메소드 - 오버라이드용
	abstract void say();  //추상메소드
}

class Dog extends Animal{
	//상속받은 추상메소드는 반드시 오버라이드를 해서 기능을 구현해야만 함.
	@Override
	void say() {
		System.out.println("멍멍");
		
	}
	
}
class Cat extends Animal{
	@Override
	void say() {
		System.out.println("야옹");
		
	}
}
class Pig extends Animal{
	@Override
	void say() {
	System.out.println("꿀꿀");	
	}
}
-------------------------------------------------------------------------------

public class AAA extends Test{
	
	//상속받은 추상클래스안에 추상메소드가 있다면 반드시 구현(implement)해야함. 
	void aaa() {
		System.out.println("AAA클래스의 aaa 메소드");
	}
	//생성자 메소드
	public AAA() {
		//super();
		System.out.println("AAA 객체 생성");
	}

}
--------------------------------------------------------------------------------

public class BBB extends Test{
	void aaa() {
		//오버라이드
		System.out.println("BBB클래스의 aaa 메소드");
	}
	public BBB() {
		System.out.println("BBB객체생성");
	}

}
-------------------------------------------------------------------------------
//추상클래스: 직접객체생성은 불가. 대신 상속하면 객체로 될 수있음.//반드시 추상메소드가 없어도 됨 .
public abstract class Test {
	
	int a; //(일반변수) 인스턴스변수
	static int b;
	
	//인스턴스 메소드  (일반메소드)
	void show() {
		System.out.println("show...");
	}
	
	//생성자 가질수 있음
	public Test() {
		System.out.println("Test 객체 생성");
	}
	
	//추상메소드   있어도 되고 없어도 됨. -추상있으면 abstract 있어야함
	abstract void aaa();
	
	//static 메소드
	static void bbb() {
		System.out.println("Test bbb...");
	}
}