Backend/JAVA

JAVA 코딩 Class 클래스 다형성

쏠솔랄라 2023. 2. 23. 08:47

 

 

다형성


: 다양한 형태나 성질


하나의 객체를 여러개의 클래스로 표현하는 것을 말한다
상속이 기본
클래스를 기능별로 분리하여 통합적인 처리를 하기 위해 사용된다 ; 다중상속
업캐스팅을 바탕으로 이루어진다
부모의 참조형변수 안에 자식클래스의 인스턴스 공간의 정보가 저장되는 형태

 

 

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);

}

}