자바가 확장한 객체 지향(1)

de_sj_awa·2021년 6월 5일
0
post-custom-banner

1. abstract 키워드 - 추상 메서드와 추상 클래스

추상 메서드(Abstract Method)란 선언부는 있는데 구현부가 없는 메서드를 말한다. 추상 메서드를 하나라도 갖고 있는 클래스는 반드시 추상 클래스(Abstract Class)로 선언해야 한다. 그렇다면 추상 메서드는 왜 필요한 것일까?

상속 관계에서 상위 클래스 타입 객체 참조변수로 하위클래스 객체를 생성했을 때, 상위 클래스의 메서드는 반드시 존재해야 하지만 구현하기가 난감하다. 바로 이런 경우 추상 메서드를 사용하게 된다. 메서드 선언은 있으외 몸체는 없는 형태로 메서드를 구현하는 것이다.

또한 추상 클래스는 인스턴스, 즉 객체를 만들 수 없는 클래스가 된다.

따라서 추상 클래스를 사용하면 실수로 상위 클래스 객체를 만들지 않게 하거나 상위 클래스 타입 참조 변수 배열로 모든 하위 클래스에서 오버라이딩한 메서드를 사용하게 하려면 원래 상위 클래스에 해당 메소드가 필요한 문제를 해결할 수 있다.

이를 정리하면 다음과 같다.

  • 추상 클래스는 인스턴스, 즉 객체를 만들 수 없다. 즉, new를 사용할 수 없다.
  • 추상 메서드는 하위 클래스에게 메서드의 구현을 강제한다. 오버라이딩 강제.
  • 추상 메서드를 포함하는 추상 클래스는 반드시 추상 클래스여야 한다.

2. 생성자

클래스의 인스턴스, 즉 객체를 만들때마다 new 키워드를 사용한다.

동물 뽀로로 = new 동물();

new 클래스명()을 자세히 보면 열고 닫는 소괄호가 보인다. 열고 닫는 소괄호는 메서드를 의미한다. 따라서 클래스명() 또한 메서드다. 반환값이 없고 클래스명과 같은 이름을 가진 메서드를 객체를 생성하는 메서드라고 해서 객체 생성자 메서드라고 한다. 그리고 줄여서 생성자라는 이름으로 더 많이 부른다. 또한 이런 메서드를 따로 만들지 않아도 자바가 알아서 인자가 없는 기본 생성자를 자동으로 만들어준다. 또한 인자를 갖는 생성자를 더 만들 수도 있다. 하지만 인자가 있는 생성자를 하나라도 만든다면 자바는 기본 생성자를 만들어주지 않는다. 생성자는 개발자가 필요한 만큼 오버로딩해서 만들 수 있다.

이를 정리하면 다음과 같다.

  • 개발자가 아무런 생성자도 만들지 않으면 자바는 인자가 없는 기본 생성자를 자동으로 만들어준다.
  • 인자가 있는 생성자를 하나라도 만든다면 자바는 기본 생성자를 만들어주지 않는다.

3. 클래스 생성 시의 실행 블록, static 블록

자바에서는 객체 생성자와 달리 클래스 생성자는 따로 존재하지 않지만 클래스가 스태틱 영역에 배치될 때 실행되는 코드 블록이 있다. 바로 static 블록이다.

또한 밝혀둘 사실로는, 프로그램이 시작될 때 모든 패키지와 모든 클래스가 스태틱 영역에 로딩되는 것이 아니라 실제로는 해당 패키지 또는 클래스가 처음으로 사용될 때 로딩된다. 이때 단 한번 해당 클래스의 static 블록이 실행된다.

여기서 클래스가 제일 처음 사용될 때는 다음 세 가지 경우 중 하나이다.

  • 클래스의 정적 속성을 사용할 때
  • 클래스의 정적 메서드를 사용할 때
  • 클래스의 인스턴스를 최초로 만들 때

왜 프로그램이 실행될 때 바로 클래스들의 정보를 T 메모리의 static 영역에 로딩하지 않고 해당 클래스가 처음 사용될 때 로딩할까? 스태틱 영역도 메모리이기 때문이다. 메모리는 최대한 늦게 사용을 시작하고 최대한 빨리 반환하는 것이 메모리 효율에 좋다. 물론 자바는 스태틱 영역에 한 번 올라가면 프로그램이 종료되기 전까지는 해당 메모리를 반환할 수 없지만 그럼에도 최대한 늦게 로딩함으로써 메모리 사용을 최대한 늦춘다.

또한 static 블록과 유사하게 클래스의 인스턴스를 위한 인스턴스 블록도 존재한다. 아무런 표시없이 {} 블록을 사용하게 되면 인스턴스가 생성될 때마다 {} 블록이 실행된다. {} 블록은 객체 생성자가 실행되기 전에 먼저 실행된다.

4. final 키워드

final은 마지막, 최종이라는 의미를 가진 단어다. final 키워드가 나타날 수 있는 곳은 클래스, 변수, 메서드다.

1. final과 클래스

클래스에 final이 붙었다면 상속을 허락하지 않는다는 의미가 된다. 따라서 하위 클래스를 만들 수 없다.

2. final과 변수

package finalVariable;

public class 고양이 {
    final static int 정적상수1 = 1;
    final static int 정적상수2;
    
    final int 객체상수1 = 1;
    final int 객체상수2;
    
    static {
        정적상수2 = 2;
        
        // 상수는 한 번 초기화되면 값을 변경할 수 없다.
        // 정적상수2 = 4;
   }
   
   고양이() {
       객체상수2 = 2;
       
       // 상수는 한 번 초기화되면 값을 변경할 수 없다.
       // 객체상수2 = 4;
       
       final int 지역상수1 = 1;
       final int 지역상수2;
       
       지역상수2 = 2;
    }
}

변수에 final 키워드를 붙이면 변경 불가능한 상수가 된다. 정적 상수는 선언 시에, 또는 정적 생성자에 해당하는 static 코드 블록 내부에서 초기화가 가능하다. 객체 상수 역시 선언 시에, 또는 객체 생성자 또는 인스턴스 블록에서 초기화할 수 있다. 지역 상수 역시 선언 시에, 또는 최초 한 번만 초기화가 가능하다.

다른 언어에서는 읽기 전용 상수에 대해 final 키워드 대신 const 키워드를 사용하기도 하는데 자바에서는 이런 혼동을 피하기 위해 const를 키워드로 등록해두고 쓰지 못하게(not used) 하고 있다.

3. final과 메서드

메서드가 final이면 최종이니 재정의, 즉 오버라이딩을 금지하게 된다.

참고

  • 스프링 입문을 위한 자바 객체지향의 원리와 이해
profile
이것저것 관심많은 개발자.
post-custom-banner

0개의 댓글