290570
24.05.21 본문
#추상메소드와 추상클래스
미래에 만들어질 후손들이 가져야할 공통적인 속성과 동작을 뽑아서 일반화할때(부모 클래스를 만들때)
반드시 자식 클래스가 가져야할 메소드
자식클래스들에게 맞도록 재정의해야하는 메소드가 있을때 부모클래스를 만드는 시점에서는 그 메소드의 body를 구체화 할 수 없을때 메소드선언만 하게 됨.
이와같이 메소드 body가 없고 메소드 선언부만 있는 메소드를 "추상메소드"라고 하고
메소드 앞에 abstract 키워드를 붙여줌
어떠한 클래스가 추상메소드를 하나라도 갖고있다면,
그 클래스 자신이 추상 클래스가 되어야 하며 클래스 이름 앞에 abstract 키워드를 붙여야 한다
(추상클래스가 반드시 추상메소드를 가질 필요는 없지만 / 일반메소드만 사용해도 됨
추상메소드가 있으면 반드시 추상클래스로 사용해야함)
따라서 어떠한 클래스가 추상 클래스로부터 상속받았다면 반드시 그 추상 클래스 안에 있는 모든 추상 메소드를 오버라이딩 해야 함
일반적으로 상속관계에 있을때 자식클래스는 부모의 메소드가 마음에 들면 그대로 사용하고 자신에게 맞지 않으면 선택적으로 메소드를 재정의(오버라이딩) 할 수 있음
그런데 만약 자식 클래스들에게 어떤 메소드를 반드시 필수적으로 오버라이딩 하도록 하고자 한다면
그 메소드를 추상메소드로 만들어 줌
추상클래스의 객체는 생성할 수 없음
(동물의 몸은 어떠하다 X , 쥐의 몸은 어떠하다 O)
추상클래스는 body가 구체화되지 않는 메소드를 갖고있기 때문에 추상클래스의 객체는 생성할 수 없음
그러나 추상클래스의 참조변수가 추상메소드를 오버라이딩한 자식 클래스의 객체는 생성할 수 있음 (참조할 수 있음)
부모의 참조변수가 자식의 객체를 생성할 수 있음
그러나
자식에서 새로 추가된 메소드를 호출할 수 없음
호출하려면 자식 클래스로 형변환 해야함
B(ob).pro();
*instance of ->
2차원 도형도 담고, 3차원 도형도 담기 위하여 data배열의 자료형을 2차원 도형과 3차원 도형 클래스의 부모클래스인 Shape으로 만들었음
배열의 요소로 끄집어오면 Shape임
만약 그것이 2차원 도형 클래스라면 2차원 도형 클래스로 변환한 후 면적을 계산시키는 메소드를 호출하고 3차원 도형이라면 3차원 도형 클래스로 변환한 후에 부피를 계산시키는 메소드를 호출할 수 있음
상속 관계에 있을때 부모의 참조변수가 자식클래스의 객체를 참조할 수 있음
그러나 자식클래스에 새로 추가된 메소드를 바로 호출할 수는 없고
자식클래스로 형변환한 후 호출할 수 있음
class A {
...
}
class B extends A {
...
public void pro(){
}
}
A ob = new B();
A ob = new B();
위의 코드에서 부모의 참조변수가 자식클래스인 B의 객체를 참조할 수 있음
그러나 다음과 같이 자식에서 부모에는 없는 자식에서 새로 추가된 메소드 pro를 바로 호출할 수 없음
ob.pro();
호출하려면 자식클래스로 형변환 한 후에 호출해야 함
((B)ob).pro();
class C extends A {
...
public void hello(){
}
}
A[] data = new A[];
배열의 자료형이 A이기 때문에 배열에는 A의 후손인 B, C의 자료형을 모두 담을 수 있음
배열의 요소만큼 반복실행하여 만약 그 배열의 요소가 B의 자료형이라면 B클래스에 추가된 pro를 동작시키고
그렇지 않으면 C클래스 추가된 hello를 동작시켜야한다면 해당 클래스의 객체인지 물어봐서 해당 클래스로 형변환 해야함
이때 해당 클래스의 객체인지 판별하기 위한 연산자가 instance of 임
for(A ob: data){
if (ob instanceof B){
((B)ob).pro();
}else{ ((C)ob).hello)
}
}
#instanceof
- 상속관계에 있을때 부모의 참조변수가 자식의 객체를 참조할 수 있음
많은 양의 데이터를 처리하기 위해 배열을 이용하는데
부모의 참조자료형으로 배열을 만들면 온갖 종류의 자식 클래스의 객체를 담을 수 있음
그러나 해당 자식 클래스에서 추가된 메소드를 바로 호출 할 수는 없어서 해당 자식 클래스로 형변환해야 하는데
이때 어떤 자식 클래스인지 판별할때 instanceof 를 사용함
**
클래스의 변수와 클래스 메소드에 대해 설명하시오
**
class person
public String name; >> 일반 멤버 변수 (객체마다 메모리 )
public static String addr; 차이를 설명하시오 >> 클래스 변수 ( 객체와 무관하게 사용가능)(객체가 있으면 모든 객체가 공동으로 사용가능)(클래스이름으로 접근가능)(public 필수/ private으로 사용불가)
**
abstract 키워드에 대해 설명하시오
'java_spring (2024.05 ~ 2024.10)' 카테고리의 다른 글
24.05.22 (0) | 2024.05.22 |
---|---|
인텔리제이 / 이클립스 코드 자동생성 (0) | 2024.05.22 |
5.20 프로그래밍 (0) | 2024.05.20 |
05.20 (0) | 2024.05.20 |
24.05.20 (0) | 2024.05.20 |