코딩.zip
[Java] 추상화 본문
🚨 추상화
: 불필요한 정보 숨기고 중요한 정보만 나타내는 것
추상 클래스 & 추상 메서드
선언 방법 : abstract 키워드
✏️ 추상 메서드는 자식 클래스에서 구현된다. ➡️ 부모 클래스는 메서드명만 가지고 있고 자식 클래스가 해당 메서드명을 사용하는 것
추상 클래스는 추상 메서드 있어도 없어도 되지만(일반 메서드만 있어도 된다.) 있다면 반드시 추상 클래스로 선언해야 한다.
- 추상 클래스에서 일반 메서드를 포함할 수 있는 이유 : 추상 클래스는 인터페이스보다 더 많은 유연성을 제공하기 때문에 공통된 구현을 상속받는 클래스들이 반복해서 구현할 필요성을 줄인다.
- 클래스의 사용자가 특정 동작을 반드시 구현해야 할 때 사용 : 추상 클래스는 하위 클래스에서 반드시 구현해야 하는 메서드를 강제로 지정해 클래스의 일부 기능을 제한할 수 있다.
ex. 추상 클래스인 Animal 클래스를 직접 인스턴스화 시켰을 때 문제
package chap09;
// 추상 클래스
public abstract class Animal {
// 추상 메서드
public abstract void printSound();
// 일반 메서드
public void displayInfo() {
System.out.println("나는 동물이다.");
}
}
public class Example01 {
public static void main(String[] args) {
Animal myObj = new Animal(); // 에러 발생
}
}
- 해결 방법 : Animal 클래스를 상속받은 하위 클래스를 정의하고, 해당 하위 클래스를 이용하여 객체를 생성
public class Dog extends Animal {
public void printSound() {
System.out.println("멍멍");
}
}
public class Example01 {
public static void main(String[] args) {
Animal myObj = new Dog();
myObj.printSound(); // 출력: 멍멍
myObj.displayInfo(); // 출력: 나는 동물이다.
}
}
추상 메서드를 선언하면 자식 클래스에서 해당 메서드를 재정의 해야한다. -> ⚠️ 추상 메서드는 반드시 오버라이딩 필수
추상 클래스는 객체로 선언할 수 없다. 하지만 추상 클래스를 참조하는 객체는 가질 수 있다.
ex. 추상 클래스(Shape)의 추상 메서드 사용하기
package chap09;
public abstract class Shape {
String color;
// 추상 메서드
abstract double area();
public abstract String toString();
// 생성자
public Shape(String color) {
System.out.println("Shape 클래스 생성자 호출");
this.color = color;
}
// 메서드
public String getColor() {return color;}
}
- 자식클래스에서 추상 메서드 오버라이딩
package chap09;
public class Circle extends Shape{
double radius;
// 생성자
public Circle(String color, double radius) {
super(color);
System.out.println("Circle 클래스 생성자 호출");
this.radius = radius;
}
@Override
double area() {
return radius * radius * 3.14;
}
@Override
public String toString() {
return "원 색상은 " + super.getColor() + "그리고 면적은 : " + area();
}
}
package chap09;
public class Rectangle extends Shape{
double length;
double width;
// 생성자
public Rectangle(String color, double length, double width) {
super(color);
System.out.println("Rectangle 클래스 생성자 호출");
this.length = length;
this.width = width;
}
@Override
double area() {return length * width; }
@Override
public String toString() {
return "사각형 색상은 " + super.getColor() + " 그리고 면적은 " + area();
}
}
package chap09;
public class AbstractClass01 {
public static void main(String[] args) {
Shape s1 = new Circle("빨간색", 2.2);
Shape s2 = new Rectangle("노란색", 2, 4);
System.out.println(s1.toString());
System.out.println(s2.toString());
}
}
멤버 변수에 접근 제한자를 지정하지 않은 경우, 기본적으로 "package-private" 접근 제한이 적용되어 해당 클래스가 속한 패키지 내에서만 접근할 수 있도록 제한한다.
🚦 인터페이스
: 완전한 추상화를 구현
선언 방법 : interface 키워드
인터페이스 메서드
- 인터페이스는 변수를 포함할 수 있으나 변수를 선언하지 않는 것이 좋다.
- 다중 상속 가능하다.
- 추상 메서드만 만들 수 있다.
기본적으로 public과 abstract이므로 명시적으로 선언하지 않아도 된다.
인터페이스도 인스턴스를 만들 수 없기 때문에 상속을 사용 -> 인터페이스를 구현하는 클래스(상속받는)는 반드시 인터페이스 내에 선언된 모든 메서드 구현해야한다.
ex. 인터페이스 다중 상속 구현
package chap09;
public interface Fly {
public void fly();
}
package chap09;
public interface Walk {
public void walk();
}
package chap09;
public class Bird implements Fly {
@Override
public void fly() {
System.out.println("새는 날 수 있다.");
}
}
- 인터페이스 다중 상속 ➡️ interface를 상속 받기 위해서는 implements 사용
package chap09;
public class Chicken implements Fly, Walk {
@Override
public void fly() {
System.out.println("닭은 날 수 있다.");
}
@Override
public void walk() {
System.out.println("닭은 걸을 수 있다.");
}
}
⏰ 추상 클래스 vs 인터페이스 비교
추상 클래스 | 인터페이스 | |
객체 | 생성 불가 | |
오버라이딩 | 추상 메서드 재정의 필수 | |
다중 상속 | 불가능 | 가능 |
목적 | 상속을 통한 기능 확장 | 동일한 실행 기능 구현 |
메서드 | 추상 메서드와 구체적인 메서드를 모두 가짐 | 추상 메서드만 가짐 |
선언 키워드 | abstract | implements |
접근제한자 | 접근제한자 protected, public 선언된 추상 메서드를 가질 수 있음 | 접근제한자 public이 선언된 추상 메서드 가질 수 있음 |
멤버 변수 | static, final, static final 변수 사용 가능 | static final 상수만 사용 가능 |
클래스 | O | X |
추상 클래스와 인터페이스는 각각 언제 사용해야 할까❓
- 추상 클래스: 클래스 간에 공통된 기능 공유, 이러한 기능을 재사용하고 확장하고자 할 때 사용, 클래스의 일부 구현을 공유하면서도 다양한 형태로 확장 가능
- 인터페이스: 클래스 간에 공통된 행동을 정의하고, 이러한 행동을 보장하고자 할 때 사용, 다른 클래스들이 특정한 동작을 보장하기 위해 사용되는 규약이며, 다형성을 구현하는데 중요한 역할
'프로그래밍 > Java' 카테고리의 다른 글
[Java] Object class - toString(), equals() 메서드 (0) | 2024.06.01 |
---|---|
스프링 MVC STS3, STS4 설치 (0) | 2024.05.13 |
[Java] 컬렉션 프레임워크 (0) | 2024.05.02 |
[Java] 파일 입출력 (2) | 2024.04.17 |
[Java] 클래스(Class) (0) | 2024.04.15 |