추상 메서드와 생성자를 다시 복습하자.
이 책은 객체 지향에 포커싱되어있기 때문에 세세하게 다루지는 않았다.
세세한 부분들은 자바 기초를 참고하자.
📌 abstract 키워드 : 추상 메서드와 추상 클래스
📌 생성자
📌 클래스 생성 시의 실행 블록, static 블록
✏️ 추상메서드란, 선언부는 있는데 구현부가 없는 메서드이다. 또한 추상 메서드가 포함된 클래스는 모두 추상 클래스이다.
👉 따라서, 추상메서드를 어디에선가는 필수로 구현해야한다.
✏️ 추상 클래스란, abstarct
키워드를 통해 선언되는 클래스이다. 추상 메서드를 가진 클래스는 모든 추상 클래스이다. 추상 메서드를 가지지 않은 추상 클래스도 있을 수 있다.
👉 추상 클래스는 인스턴스를 가질 수 없다. 또한, 상속받는 하위 클래스에서 추상 메서드의 구현이 강제된다.
🤔 그러면 인터페이스를 쓰면 되는거 아니야...?
🤓 추상 메서드가 더 적절한 상황
- 일부 메서드의 기본 구현이 필요할 때: 추상 클래스는 일반 메서드도 포함 할 수 있다.
- 공통된 코드나 멤버 변수가 여러 하위 클래스에서 공유될 경우
- 하위 클래스들 간의 강한 결합이 필요 할 때
🤓 인터페이스를 사용하는 상황
- 다중 상속이 필요한 경우
- 클래스가 이미 다른 클래스를 상속하고 있는 경우
- 클래스 간의 강한 결합을 피하고자 하는 경우: 인터페이스는 느슨한 결합을 제공한다.
추상 클래스는 인스턴스를 만들 수 없다.
추상 클래스는 하위 클래스에게 메서드의 오버라이딩을 강제한다.
추상 메서드가 포함된 클래스는 반드시 추상 클래스다.
✏️ 생성자는 클래스의 인스턴스를 만드는 메서드이다.
📍 개발자 아무런 생성자도 만들지 않으면 자바는 인자가 없는 기본 생성자를 자동으로 만들어준다.
📍 인자가 있는 생성자를 하나라도 만든다면 자바는 기본 생성자를 만들어 주지 않는다.
static
블록✏️ static
블록은 클래스가 스태틱 영역에 실행되는 코드이다.
클래스는 여러 인스턴스가 생성되어도 클래스는 하나만 스태틱 영역에 배치된다.
따라서 A를 상속받은 B의 인스턴스가 생성되면 A는 스태틱 영역에 올라가고, 이후 A의 인스턴스가 실행되더라도 다시 스태틱 영역에 올라가지 않는다.
📍 메모리 자원으로 적게 사용하는 것이 바람직하다. 따라서 최대한 늦게 사용을 시작하고 최대한 빨리 변환해야한다.
package OOP04.staticBlock;
class ClassA {
static String Classname = "ClassA";
static {
System.out.println("ClassA가 스태틱 영역에 올라갔습니다.");
}
}
class ClassB extends ClassA{
static void staticMethod(){
System.out.println("ClassB의 정적 메서드");
}
static {
System.out.println("ClassB가 스태틱 영역에 올라갔습니다.");
}
}
class ClassC {
static {
System.out.println("ClassC가 스태틱 영역에 올라갔음");
}
}
package OOP04.staticBlock;
public class Driver {
public static void main(String[] args) {
/*
클래스 B의 정적 메서드 사용 -> 클래스 B가 스태틱 영역에 올라간다.
클래스 B가 상속받은 클래스 A도 스태틱 영역에 올라간다.
*/
ClassB.staticMethod();
/*
클래스 A의 정적 변수 사용 : 앞서서 클래스 B를 사용하면서 클래스 A가 스택영역에 올라갔다.
따라서 static블록 실행되지 않는다.
*/
System.out.println(ClassA.Classname + "의 정적 변수 출력");
/*
클래스 C의 인스턴스 생성 : 클래스 C가 스태틱 영역에 올라갔다.
*/
ClassC classC = new ClassC();
System.out.println("classC 생성 ");
}
}
🤔 인스턴스에는 이런거 없음?
있음;; 클래스내에서 아무런 예약어 없이 { }블럭을 사용하면 해당 블록이 인스턴스가 생성 될 때마다 실행된다. (객체 생성자가 실행되기전에)
class ClassC { static { System.out.println("ClassC가 스태틱 영역에 올라갔음"); } { System.out.println("ClassC의 인스턴스가 생성"); } }
ClassC classC = new ClassC(); System.out.println("classC 생성 ");
//🖥️ 실행화면 ClassC가 스태틱 영역에 올라갔음 ClassC의 인스턴스가 생성 classC 생성
static
블록과 기본블록을 기억만 해두자.최은진이 옆에서 집중을 못한다. 🥱😫