개발군싹

[Java] 다형성(Polymorphism) 본문

Java

[Java] 다형성(Polymorphism)

개발자군싹 2023. 9. 21. 09:00

Java

다형성이란?

객체 지향 프로그래밍의 특징 중 하나로 상속을 이용해 부모 타입으로부터 생성된 여러가지 타입의 자식 객체를 부모 클래스 타입으로 다룰 수 있는 것이다.

 

형변환

업캐스팅(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