오늘은 다형성에 대해 다시 공부하면서 정리해 보았다. 객체지향에 있어서 중요한 부분이다!🌳
-여러가지 형태를 가질 수 있는 능력
-상속관계❗에서 성립가능한 문법
-참조형의 업/다운 캐스팅
(부모타입의 변수에 자식객체로 new한것이 들어갈 수 있다)
📍 instanceof 연산자
: 참조하는 변수가 가르키는 인스턴스(객체)의 실제 타입을
체크하는데 사용
참조변수 instanceof 클래스명 ---> true / false
클래스명 : 나부터 조상까지 모두 true로 리턴
내아래 자식이나 아예다른 클래스는 false
1) 개발할 때, 밑그림을 그리는 것. 설계쪽에 해당.
2) ✨키워드 : abstract
3) 추상메서드 : abstract 키워드를 붙혀 메서드의 선언부만 있고,
구현부({코드작성..})은 되어있지 않은 형태
public abstract String getName();
public abstract void setName(String name);
4) 추상클래스 : 일반 멤버들과 함께 추상 메서드를 포함하는 클래스
추상메서드가 하나라도 있으면 무조건 추상 클래스.
클래스 앞에 abstract 붙히기.
abstract class Shape {
...
abstract void draw(); // 추상메서드
}
1) 추상클래스는 객체 생성 불가. 불완전한/미완성인 클래스다~
Shape s = new Shape(); (X)
Shape s; (O)
2) 상속에서 수퍼클래스로 사용된다. 부모클래스가 될 수 있음. extends
3) 추상클래스를 물려받은 서브클래스를 완성 시키려면,
추상 메서드를 오버라이딩 해야한다.
추상 클래스를 단순히 상속만 받은 서브 클래스는
그 또한 추상 클래스가 된다.
추상 메서드를 그대로 상속받기 때문에
구현을 하지 않는다면 클래스 앞에 abstract키워드를 붙혀줘야한다.
# 추상클래스 단순 상속
abstract class Rect extends Shape { // 추상draw();
int width;
...
}
new Rect(); (X)
# ✨추상클래스를 사용할때 -> 상속받아 구현 완성
class Rect extends Shape {
int width;
...
@Override
void draw() { // 구현 코드 작성 }
}
new Rect(); (O)
// 오버라이딩으로 다형성 실현
class Shape {
public void draw() {
System.out.println("Shape");
}
}
class Line extends Shape {
@Override
public void draw() {
System.out.println("Line");
}
}
class Rect extends Shape {
@Override
public void draw() {
System.out.println("Rect");
}
}
class Circle extends Shape {
@Override
public void draw() {
System.out.println("Circle");
}
}
public class Test115 {
static void paint(Shape s) { // 매개변수의 다형성
s.draw(); // line, shape, rect, circle
}
public static void main(String[] args) {
Line line = new Line();
paint(line);
paint(new Shape());
paint(new Line());
paint(new Rect());
paint(new Circle());
}
}
- 부모 클래스 Shape에 drwa메서드를 통해 자식클래스 Line , Rect , Circle는 각자 다른 모양을 그릴 수 있다!
- 설명을 위한 예를 들면 롤게임 캐릭터라는 부모 클래스에 메서드가 Q,W,E,R이 있다고 하자!
- 자식 클래스 이즈리얼, 쉔, 리신 등은 부모 메서드의 Q,W,E,R을 오버라이드를 해서 다양한 캐릭터를 정해진 기준으로 만들어 낼수 있따!