java

자바 객체 지향의 원리와 이해_Chapter04_자바가 확장한 객체 지향

강용민 2023. 3. 21. 21:01

객체 지향 4대 특성을 넘어 자바가 객체 지향을 확장하기 위해 사용하는 키워드와 개념을 살펴보자.

 

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

추상 메서드(Abstract Method)를 간단하게 설명하면 선언부는 있는데 구현부가 없는 메서드를 말한다. 추상 메서드를 하나라도 갖고 있는 클래스는 반드시 추상 클래스(Abstract Class)로 선언해야 한다. 

추상 클래스는 인스턴스, 즉 객체를 만들 수 없다. 다시말해 new를 사용할 수 없다. 추상 클래스는 하위 클래스에 상속되고, 하위 클래스에서는 추상 메서드의 구현을 강제한다.

보통 absctract 키워드는 모든 하위 클래스에는 필요하지만 상위 클래스에서는 사용하면 안되는 경우나 필요없는 경우에 사용한다.

 

생성자

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

바환값이 없고 클래스명과 같은 이름을 가진 메서드를 객체를 생성하는 메서드라고 해서 객체 생성자 메서드라 한다. 보통 생성자라고 부르는 그것이다. 만약 개발자가 객체 생성자를 명시하지 않는다면 자바는 인자가 없는 기본 생성자를 자동으로 만들어준다.

 

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

객체 생성자와 다르게 클래스 생성자는 존재하지 않는다. 그러나 클래스가 스태틱 영역에 배치될 때 실행되는 코드 블록이 있다. 바로 static 블록이다.

public class 동물 {
    static{
        System.out.println("동물 클래스 레디 온!");
    }
}

여기서 한 가지 밝혀둘 사실이 있다. 프로그램이 시작될 대 모든 패키지와 모든 클래스가 T 메모리의 스태틱 영역에 로딩되는게 아니라 해당 패키지 또는 클래스가 처음으로 사용될 때 로딩된다. 즉, 해당 클래스가 호출될때 스태틱 영역에 배치된다. 그리고 스태틱 영역에 배치된 클래스는 프로그램이 종료되기 전까지 메모리에 저장돼있다.

왜 프로그램이 실행될 때 바로 클래스들의 정보를 T 메모리의 static 영역에 로딩하지 않고 해당 클래스가 처음 사용될 때 로딩할까? 스태틱 영역도 메모리이기 때문이다. 메모리는 최대한 늦게 사용을 시작하고 최대한 빨리 반환하는 것이 정석이다.

 

final 키워드

final 키워드가 나타날 수 있는 곳은 딱 세 군데다. 사실 객체 지향 언어의 구성 요소는 딱 세 가지 뿐이다. 바로 클래스, 변수, 메서드다. 그럼 각 구성 요소마다 final이 붙었을 때의 의미를 알아보자.

  • final 클래스 : 상속을 허락하지 않겠다. 즉, 하위 클래스를 만들 수 없다.
  • final 변수 : 변경 불가능한 상수이다.
  • final 메서드 : 메서드를 재정의, 즉 오버라이딩을 금지하게 된다.

 

instanceof 연산자

만들어진 객체가 특정 클래스의 인스턴스인지 물어보는 연산자다. return값은 boolean으로 이뤄져 있다.

객체_참조_변수 instanceof 클래스명

instanceof 연산자는 클래스들의 상속 관계뿐만 아니라 인터페이스의 구현 관계에서도 동일하게 적용된다..

그런데 instanceof 연산자가 강력하기는 하지만 객체 지향 설계 5원칙 가운데 LSP(Liscov Substitution Principle)를 어기는 코드에서 주로 나타나는 연산자기에 리팩터링의 대상이 아닌지 점검해 봐야 한다.

 

interface 키워드와 Implements 키워드

인터페이스는 public 추상 메서드와 public 정수 상수만 가질 수 있다. 자바 8부터는 디폴트 메서드라고 하는 객체 구상 메서드와 정적 추상 메서드를 지원할 수 있게 언어 스펙이 바뀌었다.