abstract class : 추상 클래스
: 추상 메서드를 하나 이상 포함하고 있는 클래스
abstract method : 추상 함수
: 함수의 내용은 없고 proto type 만 선언되어 있는 함수
// 일반함수
public void method(){
처리
}
// 추상함수
public abstract void method(int n, double d);
: 추상함수는 무조건 상속한다. 상속한 클래스에서 추상 메서드를 정의해 준 후에 사용이 가능하다.
: 추상함수 형태를 proto type(사양) 이라고 한다.
proto type이 뭐냐?라고 묻는다면 : 리턴값은 int와 double이고 리턴값은 void이다.
추상 클래스와 메서드 사용법
public class MainClass {
public static void main(String[] args) {
// AbstractClass ac = new AbstractClass(); 이렇게 생성은 불가능
MyClass mycls = new MyClass();
mycls.abstractMethod();
}
}
// 추상 클래스
abstract class AbstractClass{
private String name; // 멤버변수는 포함할 수 있다.
public void method(){
System.out.println("AbstractClass method()");
}
// 추상 메서드
public abstract void abstractMethod();
}
class MyClass extends AbstractClass{
@Override
public void abstractMethod() {
System.out.println("MyClass abstractMethod()");
}
}
: 추상 클래스와 메서드에 abstract를 붙이면 추상 클래스를 의미한다.
: 추상 클래스를 객체로는 생성이 불가능하다.
: 자식 클래스를 생성 후 자식 클래스를 호출해야한다.
결과값 : "MyClass abstractMethod()"
다른 문법
public class MainClass {
public static void main(String[] args) {
AbstractClass ac = new MyClass();
ac.method();
ac.abstractMethod();
}
}
: 부모와 자식 관계이기 때문에 자식 클래스가 부모를 참조하도록 객체를 생성할 수 있다.
결과값 : "AbstractClass method()", "MyClass abstractMethod()"
다른 문법
public class MainClass {
public static void main(String[] args) {
AbstractClass ac1 = new AbstractClass() {
@Override
public void abstractMethod() {
System.out.println("ac1 abstractMethod()");
}
}; // 이렇게 정의를 내려주면 위 코드에 맞는 코드는 ac1 한개
ac1.method();
ac1.abstractMethod();
}
}
: 오버라이드를 하게 되면 "AbstractClass method()" 해당 결과값은 나오게 된다.
: "MyClass abstractMethod()" 해당 값에서 "ac1 abstractMethod()" 오버라이드 된 값으로 변경되어 나온다.
결과값 : "AbstractClass method()", "ac1 abstractMethod()"
Shape 클래스 상속과 다형성 구현 실습
public class MainClass {
public static void main(String[] args) {
Rect rect = new Rect(3, 5);
System.out.println("x * y : " + rect.process());
// 해당 방법으로도 호출 가능
Shape sh = new Rect(3, 5);
sh.process();
}
}
abstract class Shape{
protected int x, y;
public Shape(int x, int y){
this.x = x;
this.y = y;
}
abstract int process();
}
class Rect extends Shape{
public Rect(int x, int y){
super(x, y);
}
@Override
public int process() {
return(x * y);
}
}
: 마찬가지로 부모 클래스 타입을 사용해서도 호출 가능( Shape sh = new Rect(3, 5) )
결과값 : x * y : 15
'Java' 카테고리의 다른 글
Java) final 키워드: 변수, 메서드, 클래스 제약 이해하기 (0) | 2025.01.09 |
---|---|
Java) 인터페이스와 다중 상속 예제 코드 (0) | 2025.01.09 |
Java) 객체지향 프로그래밍 : 상속성 및 다형성(3) (0) | 2025.01.09 |
Java) 객체지향 프로그래밍 : 상속성 및 다형성(2) (0) | 2025.01.08 |
Java) 객체지향 프로그래밍 : 상속성 및 다형성 (0) | 2025.01.08 |