JVM 메모리 영역 - 추상메소드와 오버라이딩 부분
추상메소드를 통해 메모리를 절약하고, 오버라이딩으로 자식클래스에 선언된 메소드를 부모 참조변수를 통해 참조하는 과정
추상메소드가 메모리를 절약하는이유는 {}안의 내용이 메소드 영역에 올라가지 않고 단지 null을 가지기 때문이다. object클래스의 vfptr이라는 테이블에서 메소드와 주소를 연관지어 저장하고 있는데 컴파일러가 자식클래스를 스캔했을때 동일한 메소드가 있다면 그 메소드를 가리키는 주소값으로 변경해서 테이블에 저장한다. 만약 추상클래스가 부모클래스에 선언되어있다면 메소드 영역에서는 최소한의 공간을 차지하면서 테이블에만 연관된 주소를 저장하기 때문에 메모리를 절약할 수 있다.
instanceof
부모변수를 통해서 자식을 참조하고 있을때 자식객체로 캐스팅하고 싶을 때 에러가 나지 않게 확인해보는 것이다.
이 객체를 ~로 바꿀 수 있니?
직관적인 코드 -> 캐스팅을 함
public void method(Parent parent){
if(parent instanceof Child){
Child child = (Child)parent;
}
}
아래 코드와 같이 instanceof에서 객체의 종류를 확인해주고 참이면 바로 child에 대입해서 사용할 수 있다.
public void method(Parent parent){
if(parent instanceof Child child){
}
}
이것이 자바다 교재 321페이지의 InstanceofExample.java를 instanceof 없이 오버라이딩을 통해서 구현할 수 있다.
부모에서 쓴 메소드를 자식에서 오버라이딩하는 방법으로 super로 부모메소드를 호출한 다음 자식메소드에서 수행할 코드를 작성해주면 된다.
class Person{
public void personInfo() {
System.out.println("name: " + name);
walk();
}
}
public class Student extends Person {
public void personInfo() {
super.personInfo();
System.out.println("studentNo: " + studentNo);
study();
}
}
public static void main(String[] args) {
//Person 객체를 매개값으로 제공하고 personInfo() 메소드 호출
Person p1 = new Person("홍길동");
p1.personInfo();
System.out.println();
//Student 객체를 매개값으로 제공하고 personInfo() 메소드 호출
Person p2 = new Student("김길동", 10);
p2.personInfo();
}
추상메소드는 부모의 참조 변수를 통해 자식의 메소드로 접근하기 위해 선언하는 것임을 기억하자
public static void animalSound(Animal animal){
animal.sound();//부모클래스 Animal로 일반화한 참조변수를
//통해 오버라이딩으로 재정의된 서로 다른 자식클래스의 메소드를 호출할 수 있다.
}
봉인된 클래스 (sealed~permits)
final로 선언된클래스를 상속해주고 싶어서 자식클래스 몇개만 상속을 허용하는 클래스이다.
public sealed class Person permits Employee, Manager{
}
sealed 클래스를 상속받은 자식클래스에서는 반드시 sealed(자식클래스도 sealed클래스로), final(자식만들지 않음), non-sealed(봉인해제)등의 키워드를 써서 봉인여부를 결정해야한다.
인터페이스
두 장치를 연결하는 접속기를 말한다. 선이 서로다른 장치를 생각하면 좋다.
객체 |||||인터페이스 ||||||객체
인터페이스를 통해 객체끼리 상호작용하므로 한쪽의 객체가 변경되어도 영향을 미치지 않는다.
인터페이스의 구성
//public 은 자동으로 붙는다. 디폴트와 private, static빼고는 다 자동으로 붙음
●상수필드(public static final) --> 인터페이스 명으로 바로 접근가능
●추상메소드(public abstract)
●디폴트메소드(public default) --> 생략불가
인터페이스 안에서 구현된 메소드로 상수나 인터페이스 내의 메소드만 불러올 수 있다. 구현클래스의 객체를 생성하면 사용가능, 이를 구현 클래스에서 재정의 해서 사용할 수 있다. 재정의 할 때는 public 을 붙이고 default 키워드를 생략해야한다.
●정적메소드(public static)-->생략불가
구현 객체 없이 인터페이스만으로 호출할 수 있다. 내부에서 추상 메소드, 디폴트 메소드, private메소드 등을 호출할 수 없다.
●private형태
인터페이스 외부에서 접근할 수 없다. private메소드는 디폴트 메소드 안에서만 호출 할 수 있고 private 정적 메소드는 디폴트 메소드, 정적메소드에서 호출 할 수 있다. --> 디폴트와 정적 메소드의 중복코드를 줄이기 위함이다.
다중 인터페이스
여러개의 인터페이스를 implements할 수 있다.
public class 구현클래스명 implements 인터페이스A, 인터페이스B{
}
인터페이스 참조변수에 구현 클래스의 객체를 할당할 수 있다.
인터페이스끼리 상속
인터페이스가 여러개의 인터페이스를 상속하려면 extends 키워드로 상속 받는다.
부모인터페이스 변수에 대입되면 부모인터페이스에 선언된 추상 메소드만 사용가능하다.
public interface 자식인터페이스 extends 부모인터페이스1,부모인터페이스2{
}
인터페이스의 장점
메모리를 덜쓴다
여러개를 상속받을 수 있다.
상속의 단점
단일로만 상속할 수 있다.
불필요한 변수까지 상속 받아 메모리를 낭비한다.
'JAVA공부(이것이 자바다)' 카테고리의 다른 글
중첩클래스 이어서 (0) | 2023.06.05 |
---|---|
인터페이스 이어서 (0) | 2023.06.02 |
상속 (0) | 2023.05.30 |
클래스 이어서 (0) | 2023.05.29 |
java참조타입 이어서 (0) | 2023.05.26 |