[ 다형성 _ Polymorphism ]
다양한 형태로 변할 수 있는 것.
다형성은 동적 바인딩 : 런타임 때 최종 타입이 결정되는 것
다형성을 지원하라면 그 언어가 동적바인딩을 지원해야 합니다.
컴파일 타임 때 에러 판정이 납니다.
다형성의 한계 : 상위 클래스에 만들어진 메소드에 한해 가능합니다.
부모 > 자식
class Hero _ attack()
> class Ironman _ attack() , makeSuit()
> class Hulk _ attack()
> class Spiderman _ attack()
attack() 은 각 자식클래스 내에서 전부 오버라이드됨
package polymorphysm;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
class Hero{ // 부모클래스
public String name;
public void attack() {
System.out.println("기본 공격");
}
}
class Ironman extends Hero{
public int suitCount;
@Override
public void attack() {
System.out.println("레이저 공격");
}
public void makeSuit() {
System.out.println("Javis! 슈트 만들어.");
}
}
class Hulk extends Hero{
@Override
public void attack() {
System.out.println("주먹 공격");
}
}
class SpiderMan extends Hero{
@Override
public void attack() {
System.out.println("거미줄~~~");
}
}
public class Polymorphysm {
public static void main(String[] args) {
Hero h1; // 컴파일
h1 = new Ironman(); // 런타임때
// 반드시 상위 타입이 앞에 와야 합니다.
h1.attack(); // 레이저 공격 _ Ironman에서 오버라이드한 출력문 나옴.
// h1.makeSuit(); // 자비스 못불러옴, Hero안에는 자비스가 없음
Ironman ironman = (Ironman) h1; // 타입을 Ironman으로 캐스트 걸어주면
ironman.makeSuit(); // Ironman만 가지고 있는 슈트문구 출력
System.out.println(h1);
System.out.println(ironman); // 두개 주소값 같음.
레이저 공격 // 오버라이드한 ironman의 attack() 메소드 실행값
Javis! 슈트 만들어. // ironman이 단독으로 가지고 있는 makeSuit() 메소드 실행값
polymorphysm.Ironman@5e91993f // h1의 주소값
polymorphysm.Ironman@5e91993f // ironman의 주소값
package polymorphysm;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
class Hero{ // 부모클래스
public String name;
public void attack() {
System.out.println("기본 공격");
}
}
class Ironman extends Hero{
public int suitCount;
@Override
public void attack() {
System.out.println("레이저 공격");
}
public void makeSuit() {
System.out.println("Javis! 슈트 만들어.");
}
}
class Hulk extends Hero{
@Override
public void attack() {
System.out.println("주먹 공격");
}
}
class SpiderMan extends Hero{
@Override
public void attack() {
System.out.println("거미줄~~~");
}
}
public class Polymorphysm {
public static void main(String[] args) {
Hero h1 = new Ironman();
Ironman ironman = (Ironman) h1;
Hulk hulk = new Hulk();
SpiderMan man = new SpiderMan();
ironman.attack();
hulk.attack();
man.attack();
// attack 세번 반복이니 set에 넣어서 한꺼번에 돌려보기
// ==================================================================
Set<Hero> set = new HashSet<Hero>();
set.add(ironman);
set.add(hulk);
set.add(man);
for (Hero hero : set) {
hero.attack();
} // 공격문구 세개 출력~
}
}
레이저 공격
주먹 공격
거미줄~~~
==================================================================
주먹 공격
레이저 공격
거미줄~~~ // set은 index가 존재하지 않음. 값을 뽑아내는 순서도 없음.
// 랜덤인데 랜덤이 아닌..............아아아아ㅏㅇ강ㅇㄱ
[ 추상클래스 ] _ 인터페이스의 역할을 하면서 클래스 같은..
돌연변이 같은 클래스
추상 : 대략적으로 만들었기 때문에 내부 구성을 완벽히 만들어야 객체 생성 가능
정물 : 객체를 생성할 수 있는 클래스
자바에서 추상화 라는 개념이 있습니다.
일단 추상이라는 의미는 현실화 되어질 필요가 없는
즉, 인스턴스화 할 필요가 없는 성질의 클래스입니다.
자바에서는 객체지향을 통해 프로그램이 실행되는데
이 추상이라는 개념을 클래스에 적용시키면 자신의 인스턴스를 발생시킬 수 없는 형태로 만들어지게 됩니다.
이렇게 인스턴스화 될 필요가 없지만 상속 개념에서 중요한 위치를 갖게 될 때
보통 추상 클래스로 선언하여 사용합니다.
추상 클래스 선언규칙
1. 클래스에 정의된 메소드 중 추상 메소드가 하나라도 있다면
추상클래스가 되어야 합니다.
2. 추상 메소드는 메소드 바디가 없는 형태.
리턴타입 앞에 abstract라고 붙입니다.
메소드 괄호 뒤에 ; 를 붙여 명령문 끝을 나타냅니다.
abstract void print();
3. 추상 클래스는 자신의 인스턴스를 만들 수 없습니다.
추상 메소드가 있다면, 클래스 앞에 abstract라고 붙여줍니다.
생성자, 메소드, 필드 모두 선언 가능합니다. 상속도 가능합니다.
4. 만약 추상 메소드가 없지만 클래스를 추상화 하고 싶다면
abstract 키워드를 클래스 앞에 붙여주면 추상클래스가 됩니다.
위에서 했던 상속관계에서
모든 자식클래스들이 오버라이드로 attack() 메소드에 대한 별개의 기능을 가지고 있기 때문에
부모클래스인 Hero는 사실상 부모의 역할을 제외하고는 필요없어짐. 인스턴스화할 필요가 없음
=> 추상화 시키자.
package abstractor;
abstract class Hero{ // 추상클래스(부모)
public String name;
public abstract void attack(); // 추상 메소드 { }없어요.
}
class Ironman extends Hero {
@Override
public void attack() {
System.out.println("부모에서 미완이라면 자식에서 만들어주면 됨");
}
}
class Hulk extends Hero{
@Override
public void attack() { // 강제 구현
System.out.println("강제적으로 만들어주기");
}
}
class SpiderMan extends Hero{
@Override
public void attack() {
System.out.println("이렇게 추상 클래스가 있으면 나머지 강제로 진행");
}
}
public class Abstractor {
public static void main(String[] args) {
Hero h = new Hero(); // 추상클래스여서 인스턴스화 필요없음
}
}
따라서, 부모클래스 Hero는 미완성(추상)이지만 자식클래스에서 강제구현으로 완성시켜줌!!
DAO ??
DTO(VO) ??
'국비과정 > JAVA' 카테고리의 다른 글
20230621 _[14일차]_01. 인터페이스 (0) | 2023.06.22 |
---|---|
20230620 _[13일차]_02. 접근제어자_ 상속 * (0) | 2023.06.22 |
20230619 _[12일차]_02. Set & Map (0) | 2023.06.21 |
20230620 _[13일차]_01. 접근제어자 (0) | 2023.06.21 |
20230619 _[12일차]_01. ArrayList (0) | 2023.06.20 |