선언부는 있는데 구현부가 없는 메소드
추상 메소드를 하나라도 갖고 있는 클래스여야 하지만,
추상 메소드가 없어도 추상 클래스 선언 가능
어떤 클래스의 메소드를 초기화할 수 없을 때 / 만약 실수로 인스턴스화하면 안되는 클래스의 객체를 만들 때
=> 동물 객체는 어떻게 울어야 하지? / 누가 실수로 동물 객체를 만들면 어떡하지?
어떤 클래스 참조 변수 배열로 다양한 하위 클래스들에서 오버라이딩할 메서드를 클래스에 선언해줘야할 때 ( overriding을 위해 )
=> 동물 참조 변수 배열로 모든 동물을 울게 하려면 하위 클래스에서 오버라이딩할 울어보세요() 메서드가 동물 클래스에 필요할 때
자 위와 같은 클래스들이 있다고 가정할 때 (쥐를 예시로 보여줬으니 나머지 클래스 구조도 알 것이라 생각한다)아래와 같은 반복문을 통해서 간결하게 출력하기 위해서 필요한 것이다 만약에 없다면 배열로써 관리는 어떻게 해야할까..엄청난 노가다를 반복할 것이다 그것이 abstract 의 사용 이유이다.
추상 클래스의 단점을 써보자
클래스의 인스턴스, 만들 때마다 new 키워드를 사용
클래스 명과 같고 반환값이 없는 메서드를 객체를 생성하는 메서드 = 객체 생성자 메서드 => 줄여서 생성자 라고함
펭귄 뽀로로 = new 펭귄();
생성자는 너무도 기본적인 것이기에 까먹거나 헷갈리기 쉬운 특징들만 간략하게 짚고 넘어가겠다
클래스 생성자는 존재하지 않지만 클래스가 스태틱 영역에 로딩될 때, 실행되는 코드 블록
maiin 메서드 시작
동물 클래스 레디 온
아직까진 static 블록의 역할이 와닿진 않는다 한가지 예시를 더 들어보겠다
자 위와 같은 경우는 어떻게 될까
main 메서드 시작!
Animal class ready on!
0
자 대충 정리가 된다 적어도 클래스가 직접 언급이 될 때 사용이 된다고 유추가 가능하다..이제 바로 정리에 들어가면
명심할 것은 딱 하나이다 위 경우들이 발생했을 시점에 단 한번만 실행이 된다..위의 설명을 보면 클래스가 스태틱 영역에 로딩될 때 실행된다고 했는데 그렇다면 왜 클래스는 시작부터 바로 스태틱 영역에 할당되지 않고 위의 경우들이 발생했을 때 로딩이 될까?라는 의문을 가질 수 있다..
=> 이는 스태틱 영역 또한 메모리이기 때문이다.
메모리는 최대한 늦게 사용을 시작하고 최대한 빨리 반환하는 것이 정석이며, 스태틱 영역에 한번 올라가면 프로그램이 종료되기 전까지 해당 메모리를 반환 못한다는 특성 또한 있기 때문이다
final 이 붙은 클래스는 하위 클래스를 만들 수 없다 끝
final 이 붙은 변수도 간략하게 정리하겠다
final 이 붙은 함수는 overriding 재정의가 금지된다
instanceof 연산자는 만들어진 객체가 특정 클래스의 인스턴스인지 물어보는 연산자다.
=> 중요 : 객체 참조 변수의 타입이 아니라 실제 객체의 타입에 의해 처리
Ex) 동물, 조류 extends 동물, 펭귄 extends 조류
위 같이 3개의 클래스가 있다고 치자..그런 경우
위와 같이 실행하면 결과가 어떻게 나올까?
위의 중요 표시한 내용의 의미를 잘 생각해보자
부연 설명을 조금 붙이자면 어떤 메소드 안에서 지역 변수 혹은 파라미터와 객체의 멤버 변수의 이름이 중복될 시에 객체 멤버 변수의 이름을 지정할 수 있다
말 그대로이다 주의할 점 하나만 알려주자면 부모의 부모 클래스로 접근하고자 한다해도 super.super 같은 방식으로 키워드를 중첩시킬 수 없다
사실 이미 다 아는 내용들이 대부분이고 복습하는 기분으로 가볍게 보고 있긴 하지만 막상 정리하려니 어떻게 설명해야 중점을 잘 파악할까 핵심은 뭘까란 고민을 많이 하게된다.. 지금은 여행와서 숙소에서 급히 쓰는거라 내용이 정확하지 않을 수 있고 이전 글들도 100퍼센트 정답이라고 생각하진 않는다 그럼에도 글을 쓰는 이유는 누군가의 도움이 되길 바람과 동시에 누군가의 조언 또한 바라기 때문이다..어제도 얘기하지만 오늘도 어김없이 이 책을 추천한다