ㅇTL

Polymorphism and abstract classes 본문

2-1/객체지향 - java

Polymorphism and abstract classes

정노르레기 2022. 4. 20. 20:04

* OOP 의 세가지 중요 특징

- encapsulation

- inheritance

- polymorphism ! (다형성)

Polymorphism

= 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미함 !

 

-> 부모 class type에 자식 클래스타입의 인스턴스 참조할 수 ㅇ !

= late binding 매커니즘을 통해 하나의 메소드 이름에 많은 의미를 연결하는 기능 !

-> late binding / dynamic binding 이라는 특별한 매커니즘을 통해 이루어진다

 

* binding

= 메소드 호출과 메소드 정의를 연결하는 과정 ! 어떤 함수 부를지 결정하는 것

( 프로그래머가 코딩을 해서 컴파일을 하게 되면 프로그래머가 값을 변경할 수 없는 상태가 되는 것)
♡ early(static) binding : 코드가 컴파일될 때, 메소드 정의가 메소드 호출과 연결되는 것! (코드 작성시) 

late(dynamic) binding : 메소드가 런타임에 호출될 때 메소드 정의가 호출과 연결되는 것 (실행시) => 런타임 시점에 객체를 기준으로 실행될 함수 호출함! (실제로 어떤 객체가 생성되었는지!!)

- java는 모든 메소드에 대해 late binding ! -> static, final 제외 !!

( new연산자 통해 객체 생성 후 객체 통해 호출되는 메소스들은 런타임에서 바인딩되지만

 static, final의 경우 객체 생성없이 컴파일 타임에 바인딩된다 !! early/static binding)

-private, final, static method 에는 static binding 사용 !

-> private, final 메소드의 경우 상속xxx. 그래서 late binding은 어떠한 목적도 제공 x 하게 됨!

 

ex) Person a = new Student(); 해서 오버라이드 되어잇는 show() 호출

-> 컴파일 시에는 person 객체의 show()로 인지

-> 그러나 실제로 실행될 때는 동적바인딩이 발생 ! -> 생성된 객체 타입을 기준으로 실행될 함수 호출한다 ! -> student객체가 생성되었으므로 해당객체의 show()를 호출하게 된다 !!

 

- static final에 대해서는 오버라이드 되어 있어도 원래 변수의 type에 맞는게 불린다 ! (early binding)

 

-final의 의미

method : 자식 클래스에서 오버라이드 불가능

class : 상속 불가능( = 자식 클래스 만들기 불가능. 부모 클래스로 사용 불가능 )

(-> late binding의 의미가 업숨 !!)

 

toString ~

System.out.println(클래스이름)하면

해당 클래스의 toString()을 불러 그걸 프린트하는 것!

->

public void println(Object obj){ //Object형이지만, late binding이기 때문에 해당 오브젝트께 불린다 !

    System.out.println(obj.toString);

}

 

toString은 Object에 존재 ! -> 오버라이드 하면 이제 그게 불림 ~~ late binding

 


Upcasting & Downcasting

Upcasting

: base 타입 = derived 타입 ! (베이스 클래스의 변수에 derived 클래스의 변수를 배정하는 것)

(위로, 부모로 올린다고 해서 upcasting!)

Downcasting

: 자식클래스타입에 base넣는거 -> 오류난다

Base b=new Base();

Child c =b; -> 컴파일 오류

Child c=(chlid) b; -> 런타임 오류 (타입을 바꿔주면 컴파일 오류는 안나지만 런타임에서 오류 발생!)

그러나 정말 필요할 때에는 가능하게 할 수 있음

Parent parent = new Child(); 

Child child = (Child)parent;

이렇게 업캐스팅이 선행된 객체에 대해서는 다운캐스팅 가능! (먼의미;;)

 

instanceof

a instance of b

= b가 a로 할당이 되는지, 형변환이 가능한지 확인한다

b=a 이게 가능한지 보는것!!

-> 부모 instanceof 자식

이게 안된다 !!

b가 base ! 부모 또는 같은타입 이어야한다 !!

저걸로 casting이 가능한지 확인한다 !!

 


clone

: Object 클래스에 clone이라는 메소드 존재

= parameter은 없고 deep copy를 해서 반환해주는 메소드 ! 

-> 오버라이드 각각 클래스에서 해줘야대영 - 카피constructor사용하여 딥카피 해서 리턴하면 됨

 

protected Object clone() 이렇게 정의되어 잇습니노르

-> public 해당클래스 clone() 이렇게 바꿔줘서 오버라이드 가능 !!

 

public Sale clone(){

    return new Sale(this);

이러캐 합니다

 

* copy constructor의 문제점

-> 이럴땐 clone만 정상작동한다 !!

 

ex) 클래스의 배열이 있어서 새 배열에 이 배열의 내용을 copy해서 옮길때

b[i]=new Class(a[i]); 

이렇게 copy constructor를 사용하여 카피를 할 수 있다

-> 근데 그랬을 때 배열 a에들어있는 친구들이 Class형이 아니라 그거의 자식형일 수 있다 -> 부모의 copy constructor을 사용하면 bad !!

-> 저거 대신에 clone함수를 사용 -> late binding 을 통해 적절한 clone을 찾아 적절한 copy constructor 사용하게 됨

b[i]=a[i].clone();

 


Abstract Class (추상 클래스)

= 하나 이상의 abstract method를 포함한 클래스 ! 

abstract method = 완전한 정의가 없는 메소드 ! 단순한 placeholder ! -> 선언만 되어있고 구현부가 비어잇슴

정의는

public abstract class A{ // abstract 키워드 붙여줌! 

    ~~;

    public abstract int a(); // 정의 안하고 선언만 !

abstract int sum(int num1, int num2...); 

출처: https://data-make.tistory.com/205 [Data Makes Our Future]

}

-> 자식에서 무조건 오버라이드 ㅎ ㅐ줘야대 !!!!

( concrete class = abstract 없는겅. 객체화 당연가눙^^ 일반적인거)

 

언제쓰나용?

-밀접하게 관련댄 클래스들이 코드를 공유하게 만들고 싶은 경우

Abstract class를 확장하는 클래스가 여러 개의 공통 메소드 혹은 필드를 가지고 있거나 public이 아닌 다른 Access modifier를 요구할 수 있을 경우(protected)

- non-static, non-final 필드를 원할 경우 흠

 

* 추상클래스의 객체는 만들 수 x! -> 더 자세화된 derived class만들 때만 추상 클래스 사용!!

  이 추상클래스의 constructor은 외부에서 new해서 절대 객체 안만듦 ! -> 자식에게 super로만 사용됨

* Type name으로는 사용 가능하다 !

'2-1 > 객체지향 - java' 카테고리의 다른 글

19- Threads  (0) 2022.05.31
Chap 9. Exception handling  (0) 2022.05.30
Chap 7. Inheritance (상속)  (0) 2022.04.12
Chap 6. Arrays ..  (0) 2022.04.06
Chap5-2  (0) 2022.04.04