[자바와 객체 지향 그리고 스프링] 4. 자바가 확장한 객체 지향 - abstract: 추상 메서드와 추상 클래스, 생성자, static 블록

코린이서현이·2024년 1월 6일
0

🤓들어가면서🤓

추상 메서드와 생성자를 다시 복습하자. 
이 책은 객체 지향에 포커싱되어있기 때문에 세세하게 다루지는 않았다.
세세한 부분들은 자바 기초를 참고하자.

🎯 목표

📌 abstract 키워드 : 추상 메서드와 추상 클래스
📌 생성자
📌 클래스 생성 시의 실행 블록, static 블록

📌 abstract 키워드

👉 추상 메서드와 추상 클래스 포스팅 보러가기

✏️ 추상메서드란, 선언부는 있는데 구현부가 없는 메서드이다. 또한 추상 메서드가 포함된 클래스는 모두 추상 클래스이다.
👉 따라서, 추상메서드를 어디에선가는 필수로 구현해야한다.

  1. 해당 클래스를 상속받은 하위클래스에서 구현하던지
  2. 해당 클래스를 생성자를 통해 생성할 때, 추상 메서드를 구현해야한다.

✏️ 추상 클래스란, abstarct 키워드를 통해 선언되는 클래스이다. 추상 메서드를 가진 클래스는 모든 추상 클래스이다. 추상 메서드를 가지지 않은 추상 클래스도 있을 수 있다.
👉 추상 클래스는 인스턴스를 가질 수 없다. 또한, 상속받는 하위 클래스에서 추상 메서드의 구현이 강제된다.

적절한 상황

  1. 하위 클래스에서 해당 메서드를 ⭐필수로 오버라이딩해야할때
  2. 상위클래스의 인스턴스를 만들 수 없게 할 때
  3. 하위클래스의 공통 메서드를 상위클래스에서 구현내용을 정하기 힘들 때

🤔 그러면 인터페이스를 쓰면 되는거 아니야...?

🤓 추상 메서드가 더 적절한 상황

  • 일부 메서드의 기본 구현이 필요할 때: 추상 클래스는 일반 메서드도 포함 할 수 있다.
  • 공통된 코드나 멤버 변수가 여러 하위 클래스에서 공유될 경우
  • 하위 클래스들 간의 강한 결합이 필요 할 때

🤓 인터페이스를 사용하는 상황

  • 다중 상속이 필요한 경우
  • 클래스가 이미 다른 클래스를 상속하고 있는 경우
  • 클래스 간의 강한 결합을 피하고자 하는 경우: 인터페이스는 느슨한 결합을 제공한다.

✏️ 기억하자!!

추상 클래스는 인스턴스를 만들 수 없다.
추상 클래스는 하위 클래스에게 메서드의 오버라이딩을 강제한다.
추상 메서드가 포함된 클래스는 반드시 추상 클래스다.

📌 생성자

✏️ 생성자는 클래스의 인스턴스를 만드는 메서드이다.
📍 개발자 아무런 생성자도 만들지 않으면 자바는 인자가 없는 기본 생성자를 자동으로 만들어준다.
📍 인자가 있는 생성자를 하나라도 만든다면 자바는 기본 생성자를 만들어 주지 않는다.

👉 생성자 포스팅 보러가기

📌 클래스 생성시에 기본으로 실행되는 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 생성 ");
  }
}
  • 클래스 B의 정적 메서드 사용 -> 클래스 B가 스태틱 영역에 올라간다.
    클래스 B가 상속받은 클래스 A도 스태틱 영역에 올라간다.
  • 클래스 A의 정적 변수 사용 : 앞서서 클래스 B를 사용하면서 클래스 A가 스택영역에 올라갔다.
    따라서 static블록 실행되지 않는다.
  • 클래스 C의 인스턴스 생성 : 클래스 C가 스태틱 영역에 올라갔다.

🤔 인스턴스에는 이런거 없음?

있음;; 클래스내에서 아무런 예약어 없이 { }블럭을 사용하면 해당 블록이 인스턴스가 생성 될 때마다 실행된다. (객체 생성자가 실행되기전에)

class ClassC {
  static {
    System.out.println("ClassC가 스태틱 영역에 올라갔음");
  }
  {
    System.out.println("ClassC의 인스턴스가 생성");
  }
}
    ClassC classC = new ClassC();
    System.out.println("classC 생성 ");
//🖥️ 실행화면
ClassC가 스태틱 영역에 올라갔음
ClassC의 인스턴스가 생성
classC 생성 

🤓마무리하면서🤓

📌 기억하고 싶은 것

  • 추상 클래스의 추상 메서드는 하위 클래스에서 필수로 구현해야한다.
  • 추상 클래스는 인스턴스를 만들 수 없다.
  • 개발자가 생성자를 만들었을 때, 자동으로 기본 생성자를 만들어주지 않는다.
  • static블록과 기본블록을 기억만 해두자.
최은진이 옆에서 집중을 못한다. 🥱😫
profile
24년도까지 프로젝트 두개를 마치고 25년에는 개발 팀장을 할 수 있는 실력이 되자!

0개의 댓글