자바가 확장한 객체지향

자바 객체지향의 원리 책을 읽고 내용을 정리하는 글입니다.

자바는 확장한 객체지향을 위한 여러 키워드들과 기능을 제공한다.

abstract 키워드

추상 메서드란, 선언부는 있는데 구현부가 없는 메서드를 말하는데 자바에서는 추상 메서드를 하나라도 갖는 클래스를 abstrat Class로 선언해야한다.

public abstract class 동물 {
  abstract void 울어보세요();
}

동물이라는 클래스가 있다고 해보자. 동물은 어떻게 울어야할까? 알 수가 없다. 아니 정해지지 않았다. 동물이라는 것은 고양이, 말, 강아지 와 같은 하위 클래스를 상위 개념으로 추상화한 클래스이기 때문이다.

그렇다면 동물의 우는 특성(메소드)를 만들고 싶은데 누군가 동물 타입의 인스턴스를 만들면 울어보세요() 라는 메소드는 어떻게 처리해야되지? 라는 고민이 생긴다.

그리고 동물이 정상적으로 울어보세요라는 행위를 하려면 하위 클래스에서 울어보세요()를 오버라이딩해야한다는 고민이 생긴다.

이 두 가지 문제가 추상 메서드와 추상 클래스로 한 번에 해결된다. 그뿐만 아니라 만약 동물을 상속한 하위 클래스가 울어보세요() 메소드를 오버라이딩하지 않으면 컴파일 시점에서 에러가 발생한다.

즉, 추상 클래스는 상위 클래스의 생성을 막고 하위 클래스에서 메서드 구현을 강제하는 역할을 해줌으로 객체지향을 원활히 가능하게한다.

그외 키워드들

디폴트 생성자

객체를 만들때 사용되는 생성자를 제공한다. 또한 클래스를 정의할 때 생성자를 만들지 않더라도 아무런 인자값이 없는 디폴트 생성자를 제공한다. 또한, 생성자를 1개 이상 정의를 하게되면 디폴트 생성자를 만들어주지 않는다.

static block

클래스 생성자의 절반정도의 하는 역할인 static block을 제공한다. 클래스가 처음 사용될 때 클래스가 static 메모리 영역에 올라가게 되는데 이때 동작을 하게되는 코드블록을 제공한다. 이 static block은 static 메모리 영역에 올라가게 될 때 생성되므로 생성자가 실행되기 전에 먼저 실행된다.

final 과 Package, instanceof

Class, 객체의 변수, 객체의 메소드, 지역 변수에 적용할 수 있는 final 이라는 키워드를 제공한다. final은 마지막을 의미하며 클래스의 경우 상속을 막고 객체의 변수의 경우 값이 정의되면 변경을 막는다. 그리고 객체의 메소드의 경우 마지막 메소드의 의미가 되어 오버라이딩을 막고 지역 변수의 경의 마지막 값의 의미가 되어 수정을 막는다.

package는 소유자의 구분을 나타낸다. 이름이 같은 클래스가 있을 경우 소유자를 달리하여 사용할 수 있는 것과 같은 기능을 제공한다.

instanceof 라는 클래스의 상위 또는 같은 객체인지에 비교 연산을 해주는 연산자가 제공된다.

interface와 implements

interface 는 정적 멤버 상수와 추상 메소드만을 정의할 수 있다. 자바에서는 인터페이스를 만들면 정적 멤버 상수를 나타내는 static final과 abstract 키워드를 생략 가능하도록 했다. 물론 명시적으로 해주는 것이 명확하다.

자바 8부터 인터페이스의 큰 변화가 생겼는데 디폴트 메서드라고 하는 객체 구상 메서드와 정적 추상 메서드를 지원할 수 있게 되었다. 주의하자.

this 와 super

자바는 자기 자신을 지칭하는 키워드 this를 제공한다.

지역 변수와 객체 멤버변수 또는 객체 정적변수의 이름이 같은 문제가 있을 수 있다. 이때는 지역변수가 우선순위가 되는데 this.객체 멤버 변수 또는 클래스명.객체정적변수 를 이용해서 접근할 수 있다.

자바는현재 객체의 상위 클래스를 호출하는 키워드인 super를 제공한다.

super.super는 불가능하다.

추가 팁으로 객체의 멤버 메소드 호출할 때 힙 영역에서 객체의 멤버 메소드를 찾아 호출하는 것이 아니다. static 영역에 해당하는 클래스 공간에 객체 멤버 메소드의 공간을 만드는데 객체 자기 자신을 나타내는 this를 인자로 받는 형태로 존재하게 되며 JVM이 메모리 절약을 해주는 것이다.

⤧  Next post 객체 지향 설계 5원칙 SOLID ⤧  Previous post equals(), hashCode()