본문 바로가기
📖 책책책 책을 읽읍시다. 📖/자바 객체 지향의 원리와 이해

Chapter 4. 자바가 확장한 객체 지향

by 컴쏘 2024. 11. 26.

 

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

 

| abstract

추상 메서드와 추상 클래스에 대해서 알아보자. 

  • 추상 메서드 : 선언부는 있는데 구현부가 없는 메서드를 말한다. 
  • 추상 클래스 : 추상 메서드를 하나라도 갖고 있는 클래스를 말한다. 

 

이들은 공통 동작을 정의하고 다형성을 제공하기 위한 중요한 도구이다. 

  • Animal을 상속 받은 동물들에게 sound()라는 메서드는 공통 동작이다. 
  • 만약, abstract를 사용하지 않으면 개발자가 soud가 아니라 다른 메서드 명으로 정의하거나 누락 시켰을 때 이를 인지하지 못하게 된다. 
  • 따라서, abstract 키워드를 사용해서 반드시 sound()라는 메서드를 구현하면서, 공통 동작을 정의할 수 있게 하는 것이 좋다. 

 

추상 클래스와 추상 메서드에 정리해보면 다음과 같다. 

  • 추상 클래스는 인스턴스인 객체를 만들 수 없다. (new 연산자 사용 불가)
  • 추상 메서드는 하위 클래스에게 메서드의 구현을 강제한다. (오버라이딩 필수
  • 추상 메서드를 포함하는 클래스는 반드시 추상 클래스이어야 한다. 

 

| 생성자

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

Animal pororo = new Animal(); // 이때 Animal()도 메서드이다.
  • 위와 같이 클래스명() 도 메서드다. 
  • 반환 값이 없고, 클래스 명과 같은 이름을 가진 객체를 생성하는 메서드이다. (생성자라고 부른다.) 

 

자바는 자동으로 기본 생성자를 만들어 준다. 

그리고, 원한다면 인자가 있는 생성자를 만들고 싶다면, 직접 만들면 된다. (생성자 오버로딩)

 

하지만, 여기서 주의해야 할 점이 있다. 

  • 자바는 기본생성자를 자동으로 만들어 주지만, 인자가 있는 생성자를 하나라도 만들면 기본 생성자를 만들어주지 않는다. 

 

| static 블록

객체 생성자가 있다면, 클래스 생성자가 있을 법한데, 자바에는 클래스 생성자는 없다.

하지만, static 블록은 있다. 

 

 

여기서 잠깐 정정을 하고 가자면, 앞선 chapter2에서는 프로그램이 시작될 때 모든 패키지와 모든 클래스가 T 메모리의 static 영역에 로딩 된다고 했다. 하지만 사실은 해당 패키지 또는 클래스가 처음 사용될 때 로딩된다. 

 

 

클래스 정보해당 클래스코드에서 맨 처음 사용될 때 T 메모리의 static 영역에 로딩된다. 그리고 이때 단 한번 해당 클래스의 static 블록이 실행된다. 클래스가 제일 처음 사용될 때는 다음과 같다.

  • 클래스의 정적 속성(static 필드)을 사용할 때 
  • 클래스의 정적 메서드(static 메서드)를 사용할 때 
  • 클래스의 인스턴스를 만들 때 

 

| final

final은 3가지에 사용될 수 있다. (클래스, 변수, 메서드) 

 

클래스, 변수, 메서드 각각에 붙었을 때 의미가 다르다. 

 

 

| instanceof 연산자 

instanceof 연산자는 만들어진 객체가 특정 클래스의 인스턴스인지 물어보는 연산자이다. 

 

하지만, instanceof 연산자는 SOLID 5원칙 중에서 LSP 원칙을 어기는 코드에서 주로 나타나기 때문에 instanceof 연산자가 보인다면, 내 코드가 냄새나는 코드는 아닌지 확인해봐야 한다. 

 

 

| package 

package는 네임스페이스를 만들어주는 역할을 하는 키워드이다. 

 

좀 더 풀어서 설명하면, 클래스나 인터페이스와 같은 코드 요소들을 고유하게 구분하기 위해 패키지라는 이름 공간(namespace)을 제공한다는 뜻이다. 이를 통해 이름 충돌을 방지하고, 코드를 구조화하며, 관리하기 쉽게 만든다.

 

 

| interface와 implements

인터페이스는 public 추상 메서드public 정적 상수만 가질 수 있다. 

  • 자바가 자동으로 public abstract, public final을 붙여준다. 

 

| this

자기 자신을 지칭할 때 사용하는 키워드이다. 

 

변수 사용과 관련해서 간단하게 정리해보자.

  • 지역 변수와 속성(객체 변수, 정적 변수)의 이름이 같은 경우 지역 변수가 우선시된다. 
  • 객체 변수와 이름이 같은 지역 변수가 있는 경우 객체 변수를 사용하려면 this를 접두사로 사용한다. 
  • 정적 변수와 이름이 같은 지역 변수가 있는 경우 정적 변수를 사용하려면 클래스명을 접두사로 한다. 

 

| super

super는 바로 위 상위 클래스의 인스턴스를 지칭한다. 

 

super.super 이런건 불가능하다. 

 

 

 

final, instanceof, interface에 대해서 더 알아보고 싶다면 참고하자.

 

 

확실히 어떤 개념을 명확히 이해하면 코드가 더 잘 보이고, 작성할 때도 더 깊이 생각하며 작성하게 되는 것 같다.