| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
- JavaScript #선언적함수 #익명함수 #화살표함수 #함수선언방법 #복습
- springframework
- JavaScript #인라인 #인터널 #익스터널 #데이터입출력
- mybatis자료형 #참고자료
- WEB
- 페이징처리예제
- Java #Web #공부 #복습 #Servlet #서블릿 #포워드 #sendRedirect #dispatcher
- JavaScript #자바스크립트 #복습 #배열 #Array
- 복습
- mybatis
- List데이터조회
- Java #자바 #초보개발자 #다형성 #동적바인딩 #instanceof #학습 #요약정리 #복습
- 스프링
- 특징및기본구조
- Java #자바 #인터페이스 #implements #다형성 #interface #복습 #정리 #나만의공부
- fremework
- JavaScript #자바스크립트 #선택자 #HTML태그접근 #JS
- JavaScript #예제 #복습 #Web #웹 #개발자가되고파ㅜㅜ
- Java
- 정리
- 동적sql
- 데이터매핑
- 예제
- Spring
- 어노테이션
- 서블릿기초 #servlet #java #webprogramming
- 데이터조회예제
- 데이터베이스 #DataBase #Oracle #DB #DataBase개요
- Java #JDBC #Mybatis #동적SQL
- 프레임워크
- Today
- Total
개발군싹
[Java] 다형성(Polymorphism) 본문

다형성이란?
객체 지향 프로그래밍의 특징 중 하나로 상속을 이용해 부모 타입으로부터 생성된 여러가지 타입의 자식 객체를 부모 클래스 타입으로 다룰 수 있는 것이다.
형변환
업캐스팅(Up Casting)
상속관계에 있는 부모, 자식 클래스 간 부모타입의 참조형 변수가 모든 자식 타입의 객체 주소를 받을 수 있다.
Public class Student extends Person{
//Student Class 객체 생성에 필요한 멤버변수와 생성자, 메소드
//Studen Class는 부모 Class인 Person을 상속받고 있다. extends Person
}
Person p = new Student("홍길동", 28, '남', 1, "컴퓨터공학");
위 코드에서는 Student 클래스는 부모 클래스인 Person을 상속받고 있다.
아래에서 Person 타입으로 선언 된 p참조변수에 new Studen()객체를 생성하여 Person을 상속받고 있는 Student 객체타입을 저장할 수 있다.
다운캐스팅(Down Casting)
자식 객체의 주소를 받은 부모 참조형 변수를 이용하여 자식이 가지고 있는 멤버, getter / setter, 메소드 등에 접근하려고 하기 위해서는 부모 타입의 참조형 변수를 자식 클래스의 타입으로 형변환 하여 사용할 수 있다.
(다운캐스팅은 자동으로 처리되지 않기 때문에 반드시 자식클래스 타입을 명시해서 형 변환하여 사용하여야 한다.)
System.out.println(p.getName() + " " + p.getAge() + " " + p.getGender() + " " + ((Student) p).getGrade() + " "
+ ((Student) p).getMajor());
※ 클래스 간의 형변환은 반드시 상속관계에 있는 클래스끼리만 가능하다.
객체배열과 다형성
public class Teacher extends Person{
//Teacher 클래스 인스턴스화에 필요한 멤버변수와 생성자, getter/setter, 메소드 등...
public Teacher() {
// 기본생성자
}
}
우리는 Person 부모 클래스를 생성하였고, 이에 상속받은 Student 외에 Teacher, Employee 등의 클래스를 생성하여 저장 할 수 있다.
public class Employee extends Person{
//Employee에 필요한 멤버변수 생성자, getter / setter, 메소드 등...
}
Person[] p = {
new Studnet("홍길동",28,'남',1,"컴퓨터공학");
new Teacher("김철수",35,'남',"정규직","컴퓨터공학");
new Employee("김영희", 31, '여', 3000,"학생관리"); //name,age,gender,salary,dept
}
Person[] p 라는 배열을 생성하여 Person 부모 클래스를 상속받고 있는 Student, Teacher, Employee 등을 저장하여 관리 할 수 있다. 상속관계를 이용한 다형성에 의해서 기존에 하나의 자료형타입만 저장할 수 있는 배열과 달리 더욱 다양한 객체 타입을 저장할수 있게 되었다. 이는 조금 더 우리가 데이터를 관리하는데 다양한 정보의 저장과 관리의 용이성을 높여준다.
instanceof 연산자
이렇게 부모를 상속받고 있는 자식 클래스들의 저장을 돕기 위한 참조변수에 어떠한 타입의 객체가 들어있고, 해당하는 타입의 객체일 때 실행시킬수 있는 로직을 만들기 위해 'instanceof 연산자'를 이용할 수 있다.
if(p instanceof Student){
stdCount++; //p 참조형 변수에 저장된 타입이 Student이면 학생수를 저장하는 변수의 수를 증가시켜라.
}else if(p instanceof Teacher){
teacherCount++;
}else if(p instanceof Employee){
empCount++;
}
바인딩
실제 실행할 메소드 코드와 호출하는 코드를 연결 시키는 것이다. 프로그램이 실행되기 전에 컴파일이 되면서 모든 메소드는 정적 바인딩 된다.
동적바인딩
컴파일 시 정적 바인딩 된 메소드를 실행할 당시 객체 타입을 기준으로 바인딩 해주는 것을 말한다.
Dog클래스를 통해 동적바인딩을 이해해보자.
public abstract class Animal {
private String name;
private int age;
public Animal() {
// TODO Auto-generated constructor stub
}
public abstract String bark();
}
public class Dog extends Animal{
@Override
public String bark() {
return "멍멍멍!!";
}
}
animalBark(new Dog());
animalBark(new Hamster());
animalBark(new Fish());
animalBark(new Lion());
private void animalBark(Animal a) {
System.out.println(a.bark());
}
위 코드를 보면 Dog클래스의 오버라이딩 된 bark() 라는 메소드를 사용했을 경우 Animal 클래스의 bark()를 실행하는 것이 아니라 Dog 클래스에 오버라이딩된 bark() 메소드를 우선적으로 실행한다. 이와 같이 부모클래스를 상속받은 자식 클래스가 메소드를 실행할 때 오버라이딩 된 메소드를 사용 시 우선권을 갖게된다.
'Java' 카테고리의 다른 글
| [Java] 인터페이스(Interface) (0) | 2023.09.23 |
|---|---|
| [Java] 상속(Inherit) (0) | 2023.09.17 |
| [Java] 객체 배열(Object Array) (0) | 2023.09.17 |
| [Java]객체(2) - 생성자(Contructor)와 this (0) | 2023.09.15 |
| [Java] 객체란(1)? (0) | 2023.09.15 |