▶ 다형성 사용 이유 및 순수 추상클래스
https://zoooom-in.tistory.com/62
[김영한_자바기본][11. 다형성2] 다형성 사용 이유 및, 순수 추상 클래스(p.1-20)
1. 다형적 참조 / 메서드 오버라이딩을 통해 각자 다른 타입을 모두 동일화하여 중복을 제거할 수 있다. 2. 추상 클래스 : 상속을 목적으로 사용되고, 부모 클래스 역할을 담당, 인스턴스 존재X 3.
zoooom-in.tistory.com
▶ 상속과 메모리 구조
https://zoooom-in.tistory.com/61
[김영한_자바기본][10. 다형성1] 상속과 메모리 구조(p.1-23)
1. 자식 객체를 부모 참조 변수에 할당하면 부모 메서드에 접근이 가능하다. 2. 다운캐스팅은 '일시적으로' 부모 타입의 참조 변수를 자식 타입으로 형변환하는 것이다. 3. 다운 캐스팅 수행 전 ins
zoooom-in.tistory.com
추상 클래스/메서드는 불완전한 코드로 상속받아 완성해 사용해야 함
또한, 클래스 생성은 불가한 것이 특징
부모는 자식을 담을 수 있지만, 자식은 부모는 담을 수 없는 다형성 존재
상속(Inheritance) | 부모 클래스의 속성과 메서드를 자식 클래스가 상속받아 사용 |
다형성(Polymorphism) | 부모 타입의 참조 변수가 자식 클래스 객체를 참조할 수 있으며, 메서드 오버라이딩을 통해 다형성을 구현 |
추상 클래스(Abstract Class) | 하나 이상의 추상 메서드를 포함하는 클래스. 인스턴스 생성 불가, 상속을 통해 사용 |
다운캐스팅(Downcasting) | 상위 클래스 타입의 참조 변수를 하위 클래스 타입으로 변환. 변환하려는 객체가 실제로 해당 하위 클래스의 인스턴스여야 함 |
인터페이스(Inteface) | 메서드만 모아놓은 공간 |
[예시 코드_Animal]
//클래스 생성 불가, 클래스 선언은 가능
public abstract class Animal { //완전하지 않은 클래스, 상속받아 사용해라
int age;
String name;
//추상 메서드 -> 동일하게 상속받아 사용해라
public abstract void sleep(); //불완전 메서드
}
[예시 코드_Bird]
public abstract class Bird extends Animal {//상속
public Bird() {
super(); //부모에게 상속받은 경우 생성자는 대부분 super()가 있다.
//이는 첫줄에 작성되어 있어야 함
}
int wing;
public abstract void fly(); //abstract class가 선언되어야 abstract 메서드 사용 가능
//불완전한 메서드가 있기 때문에 해당 메서드를 완성해서 사용해야 함
@Override
public void sleep() {
System.out.println("서서 잡니다.");
}
}
[예시 코드_Eagle]
public class Eagle extends Bird{
@Override
public void fly() {
System.out.println("Eagle은 납니다.");
}
@Override
public void sleep() {
System.out.println("Eagle은 서서 잡니다.");
}
}
[예시 코드_Penguin]
public class Penguin extends Bird{
@Override
public void fly() {
System.out.println("Penguin은 납니다.");
}
@Override
public void sleep() {
// TODO Auto-generated method stub
System.out.println("Penguin은 서서 잡니다.");
}
}
[예시 코드_Tiger]
public class Tiger extends Animal {
int power;
@Override
public void sleep() { //추상메서드는 메서드를 완성 시켜줘야 한다.
System.out.println("Tiger는 잡니다.");
}
}
[예시 코드_S3Main]
public class S3Main {
//Animal은 추상클래스이기 때문에 선언은 가능하다.(객체 생성 불가)
public static void main(String[] args) {
Tiger tiger = new Tiger();
tiger.age = 5;
tiger.name = "호돌이";
tiger.power = 500; //객체에 데이터 모두 넣음
Penguin penguin = new Penguin();
penguin.age = 3;
penguin.name = "펭수";
penguin.wing = 2;
Animal animal = tiger; //부모는 자식을 담을 수 있음 (주소값 전달)
animal = penguin;
//penguin = animal; -> 부모는 자식을 담을 수 있지만, 자식은 부모를 담을 수 없다. (디형성)
animal.sleep();
//animal.fly(); -> penguin타입을 담았지만 Type자체가 Animal이기 때문에 penguin type의 fly 접근 불가
//즉 부모가 가지고 있는 것만 접근 가능
//메모리 자체에 fly는 만들어져 있으나 타입 때문에 접근 불가
//다만 Animal이라는 부모가 존재함에 따라 다양한 자식들을 담을 수 있음
Animal[] dropShip = new Animal[8];
dropShip[0] = tiger;
dropShip[1] = penguin;
Tiger animal3 = (Tiger) dropShip[0]; //Tiger type 형변환 가능
}
}
[형변환이 아닌 다운캐스팅이 안되는 이유]
public class S3Main {
public static void main(String[] args) {
Tiger tiger = new Tiger();
tiger.age = 5;
tiger.name = "호돌이";
tiger.power = 500; //객체에 데이터 모두 넣음
Penguin penguin = new Penguin();
penguin.age = 3;
penguin.name = "펭수";
penguin.wing = 2;
Animal animal = new Animal();
//tiger = (Tiger) animal;
//Animal이라는 객체에 Tiger를 담는게 아니라 Aniaml 자체를 다운캐스팅하려고 함
//상기에서 언급했듯 Tiger에 접근할 수 있는 객체나 메서드가 없기 떄문에 다운 캐스팅 불가
}
}
- Tiger에 접근할 수 있는 객체/메서드 존재 자체가 없기 때문에 Tiger type이 될 수 없음
728x90
'Java > [국비] JAVA' 카테고리의 다른 글
[국비][JAVA] 불변 객체 String 알아보기 (2) | 2024.06.03 |
---|---|
[국비][JAVA] 불변 객체 String의 동일성/동등성 (0) | 2024.06.03 |
[국비][JAVA] 그 외 제어자(지정자) Static 이해 및 클래스 영역/스택영역/힙영역 이해 (0) | 2024.06.01 |
[국비][JAVA] this 이해하기 (0) | 2024.05.30 |
[국비][JAVA] Class, Object이해_심화 예시 (0) | 2024.05.29 |