다형성

2023. 12. 7. 21:21Daily Codig Reminder

다형성 매개변수

 

다형성을 이용한 메서드 파라미터

 

class Employee{

}
class Engineer extends Employee{}
class Manager extends Employee{}

public class Ex06_8 {
public static void taxRate(Employee e) { //다형성 매개변수

if (e instanceof Manager) { //실제 객체의 타입 비교
Manager m =(Manager)e;
System.out.println("Manager  세금 구하기");
}
if (e instanceof Engineer) {
System.out.println("Engineer  세금 구하기");
Engineer m =(Engineer)e;
}

else if (e instanceof Employee) {
System.out.println("Employee 세금 구하기");
}
}
public static void taxRate2(Object e) { //다형성 매개변수

if (e instanceof Manager) { //실제 객체의 타입 비교
Manager m =(Manager)e;
System.out.println("Manager  세금 구하기");
}
if (e instanceof Engineer) {
System.out.println("Engineer  세금 구하기");
Engineer m =(Engineer)e;
}

else if (e instanceof Employee) {
System.out.println("Employee 세금 구하기");
}
}
public static void main(String[] args) {
// Employee e = new Employee();
// taxRate(e);
// taxRate2(e);
Manager m1 = new Manager() ;
taxRate(m1);
taxRate(m1);
// Employee e1= new Engineer(); //emgnieer 로 감
Engineer e1= new Engineer();
taxRate(e1);
}
}

 

다형성을 이용한 배열관리하기

 

public class Test2 {

public static void main(String[] args) {

Pet [] pets = { new Cat("나비",2,"암컷","흰색"),
new Cat("하늘",4,"수컷","회색"),new Dog("멍멍",3,"수컷","리트리버", "개"),
new Dog("망치",1,"수컷","불독", "개")};
//전체 출력
for (Pet pet : pets) {
System.out.println(pet.getPet());
}
System.out.println("==============================");
for(Pet p : pets) {
            if( p instanceof Cat) // cat 뽑기
            {
                Cat c = (Cat)p;
                System.out.println(c.name+"\t"+((Cat)p).getColor());
            }

        }
System.out.println("==============================");
for (int i = 0; i < pets.length; i++) {
Pet p = pets[i];

 if( p instanceof Dog) // dog 뽑기
            {
                Dog g = (Dog)p;
                System.out.println(g.name+"\t"+g.getSpeices());
            }

        }
System.out.println("==============================");
Cat[] cats= { new Cat("나비",2,"암컷","흰색"),
new Cat("하늘",4,"수컷","회색")};

for (Cat c : cats) {
System.out.println(c.getPet());
}


// Cat[] CatList = {c, c2};
//
// for (int i = 0; i < CatList.length; i++) {
// System.out.println(CatList[i].name+"\t"+CatList[i].age+"\t"+CatList[i].gender+"\t"+CatList[i].color);
// }

Dog[] dogs = {new Dog("멍멍",3,"수컷","리트리버", "개"),
new Dog("망치",1,"수컷","불독", "개")};
for (Dog d : dogs) {
System.out.println(d.getPet());
}
}
}

 

 

class Employee {
String name;
}
class Engineer extends Employee{
	int age;
}
class Manager extends Employee{
	String depart;
}

public class Ex06_10 {
public static Employee test() {
	Manager m = new Manager();
	Engineer en = new Engineer();
	Employee e = new Employee();
//	return e;
	return m;

	}//end
public static void main(String[] args) {
	Employee e = test();

	if (e instanceof Manager) { //실제 객체의 타입 비교
		Manager m =(Manager)e;
		System.out.println("Manager  세금 구하기");
	}
	if (e instanceof Engineer) {
		System.out.println("Engineer  세금 구하기");
		Engineer m =(Engineer)e;
	}
	
	else if (e instanceof Employee) {
		System.out.println("Employee 세금 구하기");
	}
}
}

 

 

6. Object 클래스

 

public static void main(String[] args) {
		
		Object [] pets = { new Cat("나비",2,"암컷","흰색"),
				new Cat("하늘",4,"수컷","회색"),new Dog("멍멍",3,"수컷","리트리버", "개"),
				new Dog("망치",1,"수컷","불독", "개")};
	for (Object obj : pets) {
		Pet p = (Pet)obj;
		System.out.println(p.getPet());
	}
		
		}
	}

 

 

import java.util.Objects;

class Person {
	String name;
	int age;
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	@Override
	public int hashCode() {
		return Objects.hash(age, name);
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		return age == other.age && Objects.equals(name, other.name);
	}
}

public class Ex06_9 {
	public static void main(String[] args) {
		Person p = new Person("홍길동", 44);
	Person p2 = new Person("홍길동", 44);
	System.out.println(p==p2);
	
	if (p.equals(p2)) {
		System.out.println("p와 p2는 같다");
	}else {
		System.out.println("p와p2는 다르다");
	}
	}

}

 

public class StudentUtil {
public char firstName (String name) {
	return name.charAt(0);
}
public int nameLength(String name) {
	return name.length();
}
}

 

Student stu = new Student ("홍길동",20,"서울");
	Student stu1 = new Student ("박혁거세",40,"경기");
	//Util 이용 홍길동의 성만 얻어와서 메인에서 출력
	StudentUtil stutil = new StudentUtil();
    System.out.println(stutil.firstName(stu.getName()));
    System.out.println(stutil.firstName(stu.getName())+stutil.nameLength(stu.getName()));
    System.out.println((stutil.firstName(stu1.getName()))+"\t"+(stutil.nameLength(stu1.getName())));

 

 

public char firstName (Student stu) {
	//이름 얻기, 첫글자 추출, 추출한 글자 리턴
		String name = stu.getName();
		char first = name.charAt(0);
		return first;
	}
	
	public int nameLength(Student stu) {
        String name = stu.getName();
        int len = name.length();
        return len;
    }

 

Student stu = new Student("홍길동",20,"서울");
    StudentUtil stuu = new StudentUtil();

    System.out.println("성은 ======"+stuu.firstName(stu));
    System.out.println("길이는 ======"+stuu.nameLength(stu));

 

 

public class StudentUtil {
	
	public void firstName (Student stu) {
	//이름 얻기, 첫글자 추출, 추출한 글자 리턴
		String name = stu.getName();
		char first = name.charAt(0);
		System.out.println("성은 ========="+first);
	}
	
	public void nameLength(Student stu) {
        String name = stu.getName();
        int len = name.length();
        System.out.println("길이는 ========="+len);
    }

 

 

public static void main(String[] args) {
	Student stu = new Student("홍길동",20,"서울");
    StudentUtil util = new StudentUtil();
    util.firstName(stu);
    util.nameLength(stu);
   
}
}

 

public class Test {

public static void main(String[] args) {
	Student stu1 = new Student("홍길동",20,"서울");
	
	StudentUtil util =new StudentUtil();
    util.setStu(stu1);
    util.nameLength();
    util.nameLength();
    
    util.setStu(new Student("이순신",20,"경기"));
    util.firstName();
    util.nameLength();
}
}

 

 

7. 인터페이스/추상클래스/중첩클래스

 

 

  • 추상 클래스 (abstract class)
    • 객체 생성 안됨
    • 상속관계 구현 ⇒ 다형성 적용됨.
  • 일반 클래스와 동일 + 추상함수 가 포함됨(구현이 안된 함수 ⇒ 자식에서 오버라이딩 해야함)
public static void main(String[] args) {
//		AbstractClass X = new AbstractClass();
		//추상클래스 객체 생성 불가

		ConcreteClass y = new ConcreteClass(100);//구현괸 클래스 객체
		System.out.println(y.getNum());
		//다형성 생성 가능
		AbstractClass y2 = new ConcreteClass(200);
		System.out.println(y2.getNum());
		
	}

 

 

public  abstract class AbstractClass {

	private int num;
	
	//추상메서드
	public abstract void a(); 
	//추상 함수, 구현안된 함수, {} 없음, abstract 명시, 자식에서 반드시 오버라이딩 의무
	public abstract int b();
	public abstract void c(int x);

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public AbstractClass() {
		super();
		// TODO Auto-generated constructor stub
	}

	public AbstractClass(int num) {
		super();
		this.num = num;
	}
	
	
}

 

 

public class ConcreteClass extends AbstractClass {
	public ConcreteClass () {
		super();
	}

	public ConcreteClass (int num) {
		super(num);
	}

	@Override
	public void a() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public int b() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public void c(int x) {
		// TODO Auto-generated method stub
		
	}
	
	
}

 

 

public static void main(String[] args) {
//		AbstractClass X = new AbstractClass();
		//추상클래스 객체 생성 불가

		ConcreteClass y = new ConcreteClass(100);//구현괸 클래스 객체
		System.out.println(y.getNum());
		//다형성 생성 가능
		y.a();
		int n = y.b();
		y.c(100);
		
		ConcreteClass y2 = new ConcreteClass(100);//구현괸 클래스 객체
		System.out.println(y2.getNum());
		//다형성 생성 가능
		y2.a();
		int n2 = y2.b();
		y2.c(100);
		
	}

 

 

인터페이스 중요!!!!!!!!!!!!!!!★

 

 

  1. 함수, 오버라이딩 의무
  2. 객체 생성 X
  3. 자식클래스는 오버라이딩 반드시
    public class Test implemments A, B a,b,c 함수 오버라이딩 필수
  4. 다형성적용 A aa = new Test;
  5. extends 가 아니라 implements 를 씀
  6. 다중구현이 가능
  7. 인터페이스 객체생성 안됨
public static void main(String[] args) {
		// TODO Auto-generated method stub
		Flyer b = new Bird();
	Flyer m = new SuperMan();
		Flyer a = new Airplane();
	// 다형성을 이용한 관리
		Flyer [] flyer = {b,m,a};
for (Flyer f : flyer) {
	if (f instanceof Bird) f.fly(); //sysout 안됨 리턴값없어서
}
	}

}

 

디커플링

 

package com.service;
import com.dao.*;
public class DBService {
DBDAO dao;

public void setDAO(DBDAO dao) {
	this.dao=dao;
}
public void connect(){

	dao.connect();
}
}

 

 

public class DBMain {

	public static void main(String[] args) {

		DBService service = new DBService();
		
		service.setDAO( new OracleDAO());
		service.connect();
		
		service.setDAO( new MySQLDAO());
		service.connect();
	}
}

 

 

public interface DBDAO {
public abstract void connect();

'Daily Codig Reminder' 카테고리의 다른 글

예외처리 와 제네릭컬렉션  (1) 2023.12.11
핵심클래스  (0) 2023.12.09
static, 클래스들의 관계  (1) 2023.12.06
메소드  (1) 2023.12.06
클래스(객체), 메소드  (1) 2023.12.05