Final, Abstract 는 Java에서 클래스 설계와 상속 관계를 효율적으로 관리하고, 재사용성과 확장성을 높이기 위한 핵심 요소입니다.
1. Final
Final은 변수, 메소드, 클래스에 적용되어 특정 동작이나 속성을 변경하지 못하도록 제한합니다.
특징
- Final 변수
- 초기화 이후 값을 변경할 수 없습니다.
- 반드시 초기화가 필요합니다(선언과 동시에 또는 생성자를 통해).
- Final 메소드
- 오버라이딩 금지를 의미합니다.
- 메소드의 구현을 고정하여 하위 클래스에서 변경하지 못하게 할 때 사용합니다.
- Final 클래스
- 상속 금지를 의미합니다.
- 해당 클래스를 그대로 사용해야 하며, 더 이상 확장하지 못합니다.
public final String nation = "대한민국"; // 초기화 완료
public final String ssn; // 생성자를 통해 초기화
2. Abstract
Abstract는 추상적인 설계를 제공하며, 추상 클래스와 추상 메소드를 통해 자식 클래스에서 구체적인 동작을 정의하도록 강제합니다.
특징
추상 클래스
- abstract 키워드를 클래스에 붙이면 추상 클래스가 됩니다.
- 추상 클래스는 추상 메소드와 일반 메소드, 멤버 변수를 모두 가질 수 있습니다.
- 단독으로 객체를 생성할 수 없으며, 반드시 상속을 통해 사용됩니다.
// 추상 클래스
public abstract class Animal {
// 공통 속성
private String name;
// 생성자
public Animal(String name) {
this.name = name;
}
// 일반 메소드
public String getName() {
return name;
}
// 추상 메소드 (자식 클래스에서 구현 필수)
public abstract void eat();
}
// 구체적인 클래스
public class Dog extends Animal {
public Dog(String name) {
super(name);
}
@Override
public void eat() {
System.out.println(getName() + "는 사료를 먹습니다.");
}
}
public class Cat extends Animal {
public Cat(String name) {
super(name);
}
@Override
public void eat() {
System.out.println(getName() + "는 생선을 먹습니다.");
}
}
// Main 클래스
public class MainClass {
public static void main(String[] args) {
// 추상 클래스는 객체 생성 불가, 자식 클래스를 통해 사용
Animal dog = new Dog("강아지");
dog.eat();
Animal cat = new Cat("고양이");
cat.eat();
}
}
추상 메소드
- 메소드 선언부만 있고, 구현부가 없는 메소드를 의미합니다.
- 상속받는 클래스에서 반드시 오버라이딩해야 합니다.
// 추상 클래스
public abstract class Shape {
// 추상 메서드 (구현부가 없음)
public abstract double calculateArea(); // 도형의 넓이 계산 메서드
public abstract double calculatePerimeter(); // 도형의 둘레 계산 메서드
}
// 구체적인 클래스
public class Circle extends Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double calculateArea() {
return Math.PI * radius * radius; // 원의 넓이 공식
}
@Override
public double calculatePerimeter() {
return 2 * Math.PI * radius; // 원의 둘레 공식
}
}
public class Rectangle extends Shape {
private double width;
private double height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
@Override
public double calculateArea() {
return width * height; // 직사각형의 넓이 공식
}
@Override
public double calculatePerimeter() {
return 2 * (width + height); // 직사각형의 둘레 공식
}
}
// Main 클래스
public class MainClass {
public static void main(String[] args) {
Shape circle = new Circle(5); // 원 객체 생성
System.out.println("원의 넓이: " + circle.calculateArea());
System.out.println("원의 둘레: " + circle.calculatePerimeter());
Shape rectangle = new Rectangle(4, 7); // 직사각형 객체 생성
System.out.println("직사각형의 넓이: " + rectangle.calculateArea());
System.out.println("직사각형의 둘레: " + rectangle.calculatePerimeter());
}
}
출력
원의 넓이: 78.54
원의 둘레: 31.42
직사각형의 넓이: 28.0
직사각형의 둘레: 22.0
결론
- 추상 클래스는 공통 속성과 동작이 있는 객체의 구조를 설계할 때 적합합니다.
'Java' 카테고리의 다른 글
[JAVA] 인터페이스 (Interface) (0) | 2025.01.11 |
---|---|
[JAVA] Static과 Singleton 패턴 (0) | 2025.01.11 |
[JAVA] 자바의 다형성(Polymorphism) 이해하기: 개념부터 예제까지 (0) | 2025.01.11 |
[JAVA] 접근제어자, 은닉 (0) | 2025.01.11 |
[JAVA] 오버라이딩(Overriding) , 오버로딩(overloading) , super 와this (0) | 2024.11.30 |