다형성
: 다양한 형태나 성질
하나의 객체를 여러개의 클래스로 표현하는 것을 말한다
상속이 기본
클래스를 기능별로 분리하여 통합적인 처리를 하기 위해 사용된다 ; 다중상속
업캐스팅을 바탕으로 이루어진다
부모의 참조형변수 안에 자식클래스의 인스턴스 공간의 정보가 저장되는 형태
ex.
// Animal class
public class Animal {
private String name;
public Animal (String name) {
this.name = name;
}
public void info () {
System.out.println("이름 : " + name);
}
public void bark () {
System.out.println("????????????????????????????");
}
}
// Cat class
public class Cat extends Animal {
public Cat (String name) {
super(name);
}
public void bark () {
System.out.println("야옹");
}
public void eat () {
System.out.println("생선");
}
}
// Dog class
public class Dog extends Animal {
public Dog (String name) {
super(name);
}
public void bark () {
System.out.println("멍멍");
}
public void eat () {
System.out.println("뼈다귀");
}
}
// Main class
public class Main {
public static void main(String[] args) {
// 타입 일치형
Cat c = new Cat("고양이");
c.info();
c.bark();
c.eat();
// 타입 불일치형
// 업캐스팅 : 자식 -> 부모
// 자식 인스턴스 공간을 부모의 참조형 변수에 저장하는 형태
/*
Animal a = new Animal ("고양이");
a.info(); // 부모클래스의 고유한 기능은 사용가능
a.bark(); // 오바라이드된 메소드는 자식클래스의 메소드를 사용한다
a.eat(); // 자식클래스의 고유한 기능은 사용불가 -> 터진다
// 다운캐스팅 : 부모 -> 자식
다운캐스팅에서 주의할 점 ; 인스턴스 공간은 반드시 자식클래스 인스턴스 공간이어야 한다
c = (Cat)a; // 다운캐스팅 ; c에다가 a를 담고 싶다
=>터진다
*/
Animal a = new Cat ("고양이");
c = (Cat)a;
// => 가능
}
}
// Main class2
public class Main {
public static void bark(Animal a) {
a.bark();
}
public static void eat(Dog d) {
d.eat();
}
public static void eat (Cat c) {
c.eat();
}
public static void main(String[] args) {
Dog d = new Dog ("강아지");
Cat c = new Cat ("고양이");
eat(d);
eat(c);
bark(d);
bark(c);
int su = (int)(Math.random()*2);
Animal a = null;
switch(su) {
case 0:
a = new Cat("고양이");
break;
case 1:
a = new Dog("강아지");
break;
}
if(a !=null) {
a.bark();
}
}
}
추상 클래스
: 부모의 역할을 수행하기 위해 만들어지는 클래스
다형성을 위해 만들어진다
abstract를 붙여 만든 클래스
추상메소드를 하나라도 포함하고 있는 클래스
기본적으로 객체 생성 불가
상속을 통해 추상메소드 오버라이드해서 사용
-> 추상클래스는 필요에 따라 만들어 사용 (굳이 만들어 사용하는 일 많지 않음)
추상 메소드
빈 껍데기 메소드
abstract를 붙여 만든 메소드
정의부가 없다
반드시 오버라이드가 되어야 사용 가능하다
ex.
// Animal class
public abstract class Animal { // 'abstract'는 추상 메소드가 없는 경우 사용할 필요 없다
private String name;
public Animal (String name) {
this.name = name;
}
public void info () {
System.out.println("이름 : " + name);
}
abstract public void bark();
}
// Bark class
** interface 다중 상속 전용 클래스
클래스의 변형으로 빈 껍데기 클래스
-> CPP에서의 다중상속의 문제점을 보완하고자 만들어졌다
제한적 구성
확실하면 적고 확실하지 않으면 사용하지 말 것
interface에서의 상속
- extends 키워드를 통해 상속이 가능
- 클래스 상속은 불가
** interface는 여러개 상속 가능...
public interface Bark extends Eat,Disp{
멤버 변수 - 상수화 변수만 가능하다...
/* public static final */String SKILL1 = "q";
멤버 메소드
1. 추상 메소드 : 기본
/* public abstract */void bark();
2. static 메소드
static void info() {
System.out.println("Bark");
}
3. default 메소드 : interface에서만 정의가 가능한 메소드 ; 자바 SE8
- 유지 보수에 용이 하도록 만들어졌다
public default void disp() {
System.out.println("disp");
}
}
// Bark class
public class Cat extends Animal/* ,Bark */ implements Bark,Eat {
public Cat(String name) {
super(name);
}
public void disp() {
System.out.println("Cat Disp");
}
public void bark() {
System.out.println("야옹");
}
public void eat() {
System.out.println("생선");
}
}
// Disp class
public interface Disp {
}
// Dog class
public class Dog extends Animal implements Bark,Eat{
public Dog(String name) {
super(name);
}
public void bark() {
System.out.println("멍멍");
}
public void eat() {
System.out.println("뼈다구");
}
}
// Eat
public interface Eat {
void eat();
}
// Main class
public class Main {
public static void info(Animal a) {
a.info();
}
public static void bark(Bark b) {
b.bark();
}
public static void eat(Eat e) {
e.eat();
}
public static void main(String[] args) {
Animal a = new Cat(null);
Bark b = new Cat(null);
Eat e = new Cat(null);
Cat c = new Cat("고양이");
c.disp();
eat(c);
bark(c);
info(c);
}
}
'Backend > JAVA' 카테고리의 다른 글
JAVA 코딩 API (Application Programming Interface) - Collections Framework (0) | 2023.02.23 |
---|---|
JAVA 코딩 API (Application Programming Interface) - Integer, Exception (0) | 2023.02.23 |
JAVA 코딩 객체지향프로그래밍 OOP, 배열 클래스 Array Class (0) | 2023.02.22 |
JAVA 코딩 객체지향프로그래밍 OOP, Class 중첩클래스 - 일반중첩클래스, static중첩클래스, 지역중첩클래스, 익명중첩클래스 (0) | 2023.02.21 |
JAVA 코딩 객체지향프로그래밍 OOP, 클래스 Class, static (0) | 2023.02.16 |