* OOP 의 세가지 중요 특징
- encapsulation
- inheritance
- polymorphism ! (다형성)
Polymorphism
= 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미함 !
-> 부모 class type에 자식 클래스타입의 인스턴스 참조할 수 ㅇ !
= late binding 매커니즘을 통해 하나의 메소드 이름에 많은 의미를 연결하는 기능 !
-> late binding / dynamic binding 이라는 특별한 매커니즘을 통해 이루어진다
* 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 |