다형성
2023. 12. 7. 21:21ㆍDaily 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);
}
인터페이스 중요!!!!!!!!!!!!!!!★
- 함수, 오버라이딩 의무
- 객체 생성 X
- 자식클래스는 오버라이딩 반드시
public class Test implemments A, B a,b,c 함수 오버라이딩 필수 - 다형성적용 A aa = new Test;
- extends 가 아니라 implements 를 씀
- 다중구현이 가능
- 인터페이스 객체생성 안됨
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 |