★ 추상클래스 ★
: 클래스 이름 앞에 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...");
}
}
'JAVA' 카테고리의 다른 글
예외처리: try-catch-finally, throws, throw (0) | 2023.07.15 |
---|---|
Object 클래스: 모든 클래스의 (최상위) (0) | 2023.07.15 |
인터페이스(Interface) (0) | 2023.07.15 |
연산자(Operator) (0) | 2023.07.15 |
변수(Variable), 변수타입(Variable Type), 상수(Constant), 리터럴(literal) (0) | 2023.07.15 |