본문 바로가기

언어/Java

클래스의 용도

클래스의 용도 일반클래스 final클래스 abstract클래스
- 객체를 만드는 틀 X
- 하위클래스들의 공통점을 모아둔다 X

final/abstract 예약어 붙이는 클래스, abstract ↔ final 서로 반대개념
public abstract final class A{ } 이렇게 사용은 절대 불가능하다

 

※ final 클래스

final 선언

public final class String

→ 이 string으로부터 상속받는 하위클래스 만들지 않겠다
public class MyString extends String{ } X 

 

final : 끝이다. final을 선언하면 상속 금지

변수, class,메서드 앞에 final 붙으면 끝이란 뜻
변수 앞에 final 붙으면 변수값 변경금지
class 앞에 final 붙으면 상속금지
메서드 앞에 final 붙으면 오버라이딩(재정의) 금지

 

※ abstract 메서드

반드시 재정의해야할 메서드

abstract 메서드를 갖는 클래스는 abstract로 선언한다. 아니면 컴파일 에러 발생

객체를 직접 생성할 수 없으며, 다른 클래스에서 상속 받아 완성된 클래스를 만들어야함

추상 클래스를 상속받은 하위 클래스에서는 반드시 모든 추상 메서드를 구현해야 한다.

Abstract 클래스의 주된 목적은 다른 클래스들에 공통된 기능을 뽑아내고, 이를 하위 클래스들이 구현하도록 하는 것

 

메서드와 클래스 앞에 abstract 붙일 수 있으나 변수 앞에는 붙일 수 없다.

class Parent{
/**
* 반드시 재정의해야한다 → 그럼 앞에 abstract 붙였어야 한다.
*/
	abstract void m();
}

class A extends Parent {
	void m(){ }
}

class B extends Parent {
	void m(){ }
}

추상 클래스로 선언되어 있음

GregorianCalendar gc = new GregorianCalendar();
/* GregorianCalendar 클래스를 직접 인스턴스화하는 것입니다.
따라서 gc 변수는 GregorianCalendar 클래스의 인스턴스를 참조하게 됩니다.
이 방법은 코드의 결합도가 높습니다.
즉, 코드가 특정 구현에 강하게 결합되어 있다는 의미입니다.
만약 나중에 다른 달력 시스템으로 변경하려면 GregorianCalendar 클래스와 관련된
모든 코드를 수정해야 할 수 있습니다.
*/

Calendar c = Calendar.getInstance();
/*이 코드는 Calendar 클래스의 스태틱 메서드인 getInstance()를 호출하여
Calendar 클래스의 인스턴스를 얻는 방법입니다. 이 방법은 코드의 결합도를 낮춥니다.
getInstance() 메서드는 현재 시스템의 기본 달력(그레고리안 달력)을 사용하는 인스턴스를 반환합니다.
따라서 반환된 인스턴스의 실제 타입은 런타임 시점에 결정됩니다. 이를 업캐스팅이라고 합니다.
따라서 이 방법은 유연성과 유지 보수성을 제공합니다.
나중에 getInstance() 메서드 내부 구현이 변경되어도 호출하는 코드를 수정할 필요가 없습니다.*/

 

Calendar 클래스는 추상 클래스로 선언되어 있습니다. 따라서 직접 인스턴스를 생성할 수 없으며, 구체적인 하위 클래스를 통해 객체를 생성해야 합니다. GregorianCalendar은 Calendar 클래스의 하위 클래스 중 하나로, 구체적인 날짜와 시간을 다루는 기능을 제공합니다.

먼저, Calendar 클래스가 추상 클래스인 이유는 날짜와 시간에 관련된 다양한 달력 시스템을 지원하기 위함입니다. Calendar 클래스는 추상 메서드와 추상 멤버 변수를 가지고 있으며, 하위 클래스에서 각 달력 시스템에 맞게 구현해야 합니다. 예를 들어 GregorianCalendar 클래스는 그레고리안 달력을 지원하는 구체적인 구현체입니다.

그러나 프로그래머가 직접 GregorianCalendar를 인스턴스화하면, 코드의 결합도가 높아질 수 있습니다. 즉, 하위 클래스에 종속되는 코드가 되므로 나중에 다른 달력 시스템으로 변경하려면 모든 관련 코드를 수정해야 합니다. 따라서 이런 유연성과 확장성을 제공하기 위해 Calendar 클래스는 getInstance()와 같은 static 메서드를 통해 인스턴스를 얻을 수 있도록 설계되었습니다.

getInstance() 메서드를 사용하면 해당 시스템의 기본 달력(그레고리안 달력)을 사용하는 인스턴스를 얻을 수 있습니다. 하지만 이 메서드를 호출하는 시점에 자바가 런타임에 알맞은 하위 클래스의 인스턴스를 반환할 수 있습니다. 즉, Calendar 클래스의 구현을 변경하더라도 코드 변경 없이도 프로그램이 동작할 수 있도록 합니다. 이를 업캐스팅이라고 부르며, 프로그램의 유연성과 유지 보수성을 향상시킵니다.

따라서, Calendar.getInstance()와 같은 정적 메서드를 사용하여 인스턴스를 생성하는 것은 코드의 결합도를 낮추고 유연성을 제공하는 좋은 설계 패턴입니다. 이렇게 설계함으로써 나중에 더 나은 하위 클래스로 바꿀 수도 있고, 다양한 시스템을 지원하거나 특정 기능을 확장하기도 쉬워집니다.

'언어 > Java' 카테고리의 다른 글

인터페이스 예시  (0) 2023.08.02
인터페이스(Interface)  (0) 2023.08.01
이클립스 Source로 메서드 작성하기  (0) 2023.08.01
상속과 생성자  (0) 2023.08.01
메서드 오버라이딩  (0) 2023.08.01