추상클래스
2019. 8. 14. 14:45ㆍ프로그래밍/Java
1. 추상 메소드 하나 이상 가지고 있는 클래스
this자기자신에게 접근하는
super부모에게 접근하는
상속...is a관계
is like a 관계xx
큰 개념에서 작은개념으로 내려가면서 구체화시킴---> 이게 어려움
정적바인딩: 내 객체를 만들어서 내거에 접근
동적바인딩:
부모의 레퍼런스로 자식에게 접근 (거꾸로)
동적바인딩을 쓰기위해 항상 부모가 공통적인 내용이 있어야함.
하나의 이름으로 여러 객체에 접근 가능
대신 바인딩을 해줘야함
/*추상 클래스
* 1. 추상 메소드 하나 이상 가지고 있는 클래스
* 2. 추상메소드는 함수선언만 되어있는 메소드
* 3. 추상메소드는 강제성을 부여한다.
*
*
* 부모클래스는 서브클래스의 공통된 사항을 가지고있음
*
*
* super()
* : 항상 subclass의 생성자 첫번째 라인에 항상 존재(default 생략)
* : 부모의 생성자를 호출해서 부모 객체를등록해준다
* : 명시적으로 호출할경우에는 부모의 생성자를선택할 수 있다.
*
*/
package 추상클래스;
class AA{
public AA() { //2번 그래서 동작함
System.out.println("AA 생성자");
}
public AA(int num) {
System.out.println(num);
}
public void disp() {
System.out.println("AA");
}
}
public class AbsTest extends AA{
//생성자만들기
public AbsTest() { //1번 AA를 상속받고있네?
super(900);//super();// 항상 super() 호출이 존재하고있다. 부모의 생성자 슈퍼 호출은 무조건 생성자의 첫번째줄에 와야함
System.out.println("Me");
}
public static void main(String[] args) {
AbsTest at = new AbsTest(); // 최초 여기서 AbsTest로 가고
//at.disp();
}
}
/*추상 클래스
* 1. 추상 메소드 하나 이상 가지고 있는 클래스
* 2. 추상메소드는 함수선언만 되어있는 메소드
* 3. 추상메소드는 강제성을 부여한다.
* 4. 오직 상속을 목적으로 사용한다.(익명클래스, annoymous, inner class)
* 5. 객체를 생성할 수 없고 상속받은 하위클래스도 추상클래스화 된다.
* 그래서 , 객체를 생성하고 싶으면 하위클래스에서 추상메소드는 무조건 오버라이드를 제공해야한다.
*
* 부모클래스는 서브클래스의 공통된 사항을 가지고있음
*
*
* super()
* : 항상 subclass의 생성자 첫번째 라인에 항상 존재(default 생략)
* : 부모의 생성자를 호출해서 부모 객체를등록해준다
* : 명시적으로 호출할경우에는 부모의 생성자를선택할 수 있다.
*
*/
package 추상클래스;
abstract class AA{ //추상클래스
public abstract void disp(); //추상메소드
}
public class AbsTest extends AA{
@Override //명시하는게 좋음
public void disp() {
System.out.println("오버라이드 함수");
}
public static void main(String[] args) {
//정적바인딩 방식
//AbsTest abs = new AbsTest();
//abs.disp();
}
}
/*추상 클래스
* 1. 추상 메소드 하나 이상 가지고 있는 클래스
* 2. 추상메소드는 함수선언만 되어있는 메소드
* 3. 추상메소드는 강제성을 부여한다.
* 4. 오직 상속을 목적으로 사용한다.(익명클래스, annoymous, inner class)
* 5. 객체를 생성할 수 없고 상속받은 하위클래스도 추상클래스화 된다.
* 그래서 , 객체를 생성하고 싶으면 하위클래스에서 추상메소드는 무조건 오버라이드를 제공해야한다.
*
* 부모클래스는 서브클래스의 공통된 사항을 가지고있음
*
*
* super()
* : 항상 subclass의 생성자 첫번째 라인에 항상 존재(default 생략)
* : 부모의 생성자를 호출해서 부모 객체를등록해준다
* : 명시적으로 호출할경우에는 부모의 생성자를선택할 수 있다.
*
*/
/*
* 동적바인딩
* 1. 부모의 레퍼런스 자식의 객체를 접근하는 방식
* 2. 부모가 인식하고 있는 멤버들만 접근이 가능하다.
* 즉, 자식만 존재하고 있는 멤버는 접근이 허용이 되지 않는다.
* */
package 추상클래스;
abstract class AA{ //추상클래스
public abstract void disp(); //추상메소드
}
public class AbsTest extends AA{
@Override //명시하는게 좋음
public void disp() {
System.out.println("오버라이드 함수");
}
public void disp2() {
System.out.println("sub class");
}
public static void main(String[] args) {
//동적바인딩
AbsTest abs = new AbsTest();
abs.disp();
abs.disp2();
AA aa = abs;
aa.disp();
//aa.disp2(); //부모가 모르니깐 에러가 생김
}
}