JAVA 18강_추상클래스

YEONG EUN LEE (Chloe)·2023년 12월 28일
0

JAVA 기초

목록 보기
24/42
post-thumbnail

추상클래스

: 구현부(몸체)가 없는 메소드를 하나 이상 가지고 있는 abstract 키워드가 있는 클래스를 말한다.

  1. class 정의시 abstract 키워드가 붙어있어야 한다.
    abstract 키워드가 붙어있는 클래스는 (추상클래스)
  2. 반드시 abstract 메소드를 한 개 이상은 꼭 가지고 있어야 한다.
    abstract 메소드 반드시 상속받은 자식 클래스에서 재정의가 이루어져야 한다.
    (재정의되는 부분에서는 몸체구현을 해야 하며, abstract 키워드가 제거된다.) ---> 실체화
  3. 객체생성을 할 수 없다. ---> But 생성자를 가질 수 있다.
    (생성자, 메소드, 멤버필드 모두 가질 수는 있다.)
  4. 일반클래스에는 abstract 키워드를 사용할 수 없다.

형식:

[접근제어자] abstract class 클래스명{
	// 반드시 필수
	public abstract 리턴타입 메소드명([매개변수들...]); // 실행문이 따로 없음.}

기능만 변경을 해야할 때, 사용함

class A extends p{
	op(){덧셈연산};
}

class B extends p{
	op(){곱셈연산};
}

abstract calss p{
	abstract op();
}

// 메인 메소드에서 호출할 때? 인가??
P p = new A(); //---> P p= new B(); 곱셈연산으로 바뀜
p.op();
p.op();
p.op();
abstract class Animal { // 추상클래스에서는 abstract 키워드를 꼭 사용
	private String astr = "추상클래스";
	abstract void cry();// 접근 ---> default
	public String getAstr() {
		 return astr;
	 }
}

class Cat extends Animal{ // 추상클래스를 상속받으면 반드시 재정의 해줘야 함. 
	public void cry() { // 추상클래스 실체화함. 재정의는 원래 접근이상으로 선언해줘야함.
		System.out.println("냐옹냐옹!"); 
	}
}

class Dog extends Animal{
	void cry() {
		System.out.println("멍멍!");
	}
}

public class AbstractEx {
	public static void main(String[] args) {
		// 추상 클래스는 인스턴스를 생성할 수 없음.
		// Animal a = new Animal();
		Cat c = new Cat();
		Dog d = new Dog();
		
		c.cry();
		d.cry();
		System.out.println(d.getAstr());
		System.out.println(c.getAstr());

	}

abstract class Shape{
	public abstract void draw();
}

class Circle extends Shape{
	@Override
	public void draw() {
		System.out.println("원을 그리다."); // 실체화
	}
}

public class AbstractEx02 {
	public static void main(String[] args) {
		Shape ref;
//		Shape ref = new Shape(); 로 객체를 생성할 수 없음.
		ref = new Circle(); // 상속받은 자식으로만 객체를 생성할 수 있음
		// 상속받은 자식 관계가 반드시 성립되어야함.
		ref.draw();

	}

}


@이름(At 기호) : 어노테이션(Annotation)

: 특수한 기능을 가진 주석

형식 => @ 명령이름

abstract class Shape1{
	public double res = 0;
	public abstract double area();
	public void printArea() {
		System.out.println("면적은 "+ res);
	}
}

class Circle1 extends Shape1{
	public int r = 5;
	
	@Override
	public double area() {
		System.out.println("Circle area()메소드");
		res = r * r * Math.PI; // java.lang 패키지에 들어있음, static으로 선언되어 있으며, class Math임, 또한 상수임.
		// 원의 면적
		return res;
	}
}

class Rectangle extends Shape1{
	public int w = 10, h = 10;
	
	@Override
	public double area() {
		System.out.println("Rectangle area()메소드");
		res = w*h;
		return res;
	}
}


public class AbstractEx03 {

	public static void main(String[] args) {
		Shape1 ref = new Circle1();
		ref.area();
		ref.printArea();
		ref = new Rectangle();
		ref.area();
		ref.printArea();

	}

}

인터페이스 (Interface)

: 추상메소드와 상수만 가지고 있는 집합체(묶음)

  • 인터페이스는 class와 급이 다름
  • 상속받는 키워드가 다름 implements 임
  • 기능을 쉽게 바꿀 수 있도록 하기 위해, 보안을 위해서

형식

\[접근제어자] interface 인터페이스명{
	\[public static final 숨어있다.] 자료형 필드명;
	int a; // 이렇게만 선언불가
	int a = 5; // -->public static final int a = 5;  이렇게 선언되어 있는 것임.
	\[public abstract 숨어있다.]리턴타입 메소드명(\[매개변수들...]);
	ex) public abstract void setA(int a);
	void setA(int a);
}

인터페이스의 조건

  1. 멤버필드는 반드시 public static final 상수만 가능
  2. (권장) 메소드는 public abstract메소드만 가능
  3. 생성자를 가질 수 없다.( 객체 생성을 할 수 없다.)
  4. abstract 메소드는 반드시 자식 클래스에서 재정의(Override) 되어야 한다.
  5. 객체 생성 시 자식클래스로 생성을 해야 한다.

상속 정리

extends : 같은 동급인 경우 사용하는 키워드
ex)
1. 자식클래스 extends 부모클래스
2. 자식클래스 extends 부모추상클래스
3. 자식인터페이스 extends 부모인터페이스

implements : 다른 급인 경우 사용하는 키워드
ex)
1. 자식클래스 implements 부모인터페이스
2. 자식추상클래스 implements 부모인터페이스
**인터페이스는 클래스를 상속받을 수 없다.

인터페이스 목적;

  1. 기능을 수비게 바꿀 수 있다.
  2. 보안을 위해
  3. 다중상속을 하기 위해 ( ,,,로 다중상속을 받을 수 있음)

0개의 댓글