코딩.zip

[Java] 추상화 본문

프로그래밍/Java

[Java] 추상화

김주짱 2024. 4. 15. 17:07

🚨 추상화 

: 불필요한 정보 숨기고 중요한 정보만 나타내는 것

추상 클래스  &  추상 메서드

선언 방법 : 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