Tiny Bunny [JAVA] 객체지향언어의 특징_추상화 - 솜님의 블로그
솜님의 블로그
카테고리
작성일
2024. 7. 16. 18:23
작성자
겨울솜사탕

객체지향언어의 4가지 특징

1. 캡슐화

2. 추상화

3. 상속

4. 다형성

 

 

추상화란?

abstarct을 붙인 클래스를 추상 클래스

abstarct을 붙인 메서드를 추상 메서드라고 한다.

 

추상 클래스는 객체화 x 클래스들의 틀을 의미한다.

추상 메서드는 기능구현 x 오버라이딩을 강제하는 역할이다.

 

추상메서드가 1개 이상 존재하려면,

해당 클래스가 반드시 추상클래스여야만 한다.

 

추상화의 역사

새로운 클래스를 만들려면..?

1. 카피하기 위해서 기존의 것들을 살펴본다.

2. 내가 만들려는 클래스가 기존 클래스들의 하위가 아니라, 기존 클래스 급이다..!!

3. 복사해도 되지만 사실 안됨!! 

     --> 만약 멤버변수가 어마어마하게 많다면?  다 할 수 있는가? : No / 따라서 복사 X

4. 다른 클래스들을 살펴보니 모두 공통점이 있음 >> 기존 클래스들의 상위 개념이 있구나!

5. 형체 없이, 기존 클래스들의 공통점을 뽑아냄

     == 추상 클래스 (기존 클래스들의 상위 클래스)

     --> 형체가 없기 때문에 객체화할 수 없다.

     --> 클래스들을 정의하는 데에 활용한다.

 

클래스들의 틀 (추상 클래스) → 클래스 → 객체 뽑아내려고

 

ex) 

1. 포켓몬 클래스

          피카츄 클래스에서 피카츄 여러 마리 생성 가능

          메타몽 여러마리 생성 가능

2. 동물 클래스

          강아지, 고양이, 나비,....  생성 가능

그렇지만 포켓몬 포켓몬 = new 포켓몬(); 이라던가, 동물 동물 = new 동물();  은 xxxxx

위 예시의 포켓몬 포켓몬, 동물과 같은 것들이 abstract 추상클래스이다.

 

 

abstract class Shape{
	private String name;
	protected double area; // 자식클래스한테는 열어줘~~ (protected)
	Shape(String name){
		this.name=name;
		this.area=0.0;
	}
	
	abstract public void draw();

	public String getNaem() {
		return name;
	}
	public void setNaem(String naem) {
		this.name = naem;
	}
	public double getArea() {
		return area;
	}
	public void setArea(double area) {
		this.area = area;
	}

	@Override
	public String toString() {
		return this.name+"의 넓이 : "+this.area;
	}
}


class Circle extends Shape{
	private int radius;
	static final double PI=3.14;
	Circle(int radius){
		super("원");
		this.radius=radius;
		this.area=this.radius*this.radius*Circle.PI;
	}
	
	public int getRadius() {
		return radius;
	}
	public void setRadius(int radius) {
		this.radius = radius;
	}

	@Override
	public void draw() {
		System.out.println("동그라미 그리기");
		// 클래스 이름에 오류가 떠서 오버라이딩 추가!
	}

}


public class Test01 {
	public static void main(String[] args) {
		
		Circle c=new Circle(10);
		System.out.println(c);

	}

}

 

  • abstract이 붙은 메서드를 "추상 메서드"라고 하고, 오버라이딩을 강제하는 역할을 한다.
    역할 자체가 오버라이딩 강제를 위한 것이어서, 기능에 대한 내용이 필요하지 않다.
    따라서 중괄호 {} (메서드 바디)가 필요하지 않다.
  • 이로 인해 하위 클래스에서 오버라이딩 하지 않는 경우, 클래스 이름에 오류가 발생된다. (강제이므로)
    따라서 개발자가 실수로라도 오버라이딩을 빼먹는 일 없이 구현이 가능하다!

 

  • 메서드는 사용하라고 만드는 거라서 public 공개정책을 사용한다.

 

  • 위에서도 작성했듯 추상클래스로는 객체화(인스턴스화) 할 수 없다.
    추상 클래스는 객체를 생성하려고 존재하는 것이 아니라, 클래스들을 정의하려고 존재하기 때문이다.
    (== 클래스들의 틀!)

 

'JAVA > java' 카테고리의 다른 글

[JAVA] 컬렉션 (배열리스트와 맵)  (0) 2024.07.17
[JAVA] 인터페이스  (0) 2024.07.17
[JAVA] 객체지향언어의 특징_캡슐화  (0) 2024.07.16
[JAVA] 객체지향언어의 특징_다형성  (2) 2024.07.16
[JAVA] 오버라이딩  (2) 2024.07.12