프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만든후 그 객체들간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.
장점
다형성이란 하나의 객체 혹은 메소드가 여러 타입을 참조할수 있음을 의미한다.
즉 자식객체가 부모의 타입에 들어갈수있다.
다형성은 크게 객체의 다형성, 메소드의 다형성으로 구분된다.
객체의 다형성
class Account
{
// 메소드
}
class CheckingCard extends Account
{
// 메소드
}
public class Main {
public static void main(String[] args) {
Account card = new CheckingCard();
}
}
위 코드에서 CheckingCard 는 Account를 상속받았다.
이때 Account card = new Account()
로 객체를 생성하는 대신 위와같이 객체를 생성할수 있다는게 바로 다형성중 객체의 다형성이다.
메소드의 다형성
public class Main
{
public static void main(String[] args)
{
System.out.println("문자");
System.out.println(1234);
System.out.println(true);
}
}
캐스팅이란 타입을 변환한다는 것이다.
캐스팅의 종류는 업 캐스팅 과 다운 캐스팅 2가지이다.
업 캐스팅
class Account
{
// 메소드
}
class CheckingCard extends Account
{
// 메소드
}
public class Main {
public static void main(String[] args) {
CheckingCard child = new CheckingCard();
Account parent = child;
}
}
위와 같은 코드가 있을때 Account parent = child
부분이 자식클래스가 부모 클래스 타입으로 캐스팅이 된 부분이다.Account parent = (Account) child;
와 같이 (Account)
를 붙여줄 필요가 없다.주의
업캐스팅을 하게되면 부모의 참조변수를 통해 자식의 인스턴스를 지정한다. 따라서 자식 클래스에 있는 속성과 메서드는 실행할수 없게 된다.
업 캐스팅후 메소드 실행시, 자식클래스에서 오버라이딩한 메서드가 있을경우, 부모 클래스의 메소드가아닌 오버라이딩한 메소드가 실행되게 된다.
업 캐스팅 사용이유
업케스팅을 하게되면 상속관계에서 상속받은 서브클래스의 개수에 상관없이 하나의 인스턴스로 묶어 관리가가능하다.
위 와 같은 코드에서 만약 Account
를 상속받은 다른 서브 클래스가 있더라도 업캐스팅을 통해 Account[] a = new Account[];
라는 a배열을 통해 서브 클래스들을 한번에 정리하는등.. 가독성과 유지보수성을 높일수있다.
다운 캐스팅
주의
instanceof 연산자를 통해 어느 객체 변수가 어느 클래스 타입인지 판별해준다 (return 값은 true/false).
class Account
{
// 메소드
}
class CheckingCard extends Account
{
// 메소드
}
public class Main {
public static void main(String[] args) {
CheckingCard child = new CheckingCard();
Account parent = new Account();
System.out.println(parent instanceof CheckingCard); // false
System.out.println(parent instanceof Account); // true
System.out.println(child instanceof Account); // true
}
}
위 코드에서 보면 parent는 CheckingCard(자식)의 인스턴스가 아니기때문에 false가 출력된다.
반면 3번째 출력문에서 child는 Account(부모)의 인스턴스로도 보기때문에 false가 아닌 true가 나온다.