본문 바로가기
IT/자바

자바 추상클래스 abstract

by 독서실총무J 2017. 5. 7.
반응형

다들 안녕하신가? 

독서실 저녁총무이다


일주일째 얼굴에 뭐가 나서 면도를 못하고 있다

난 원래 털이 엄청 많이 나는 편이라

일주일이면 거의 산적이 된다 

얼굴도 마른편이고 하얀편이라

정말 볼품없게 변해버리는데

빨리 피부가 낫았으면 좋겠다


피부과를 가보니 

곰팡이균 때문에 그렇다고 하는데

아무리 생각해도 곰팡이가 있는곳에서

생활한적이 없는데 왜그런걸까?


의사가 약 잘 바르고 일주일 뒤에 오라고 하더라

일주일 뒤에 안나으면 진짜 꼴보기 

싫은 얼굴이 될것 같은데 

그전에 낫겠지?


면도를 해도 보기 좋은 얼굴은 아니다만

뭐 이얘기는 여기까지 하고 

오늘도 신나게 시작해보자


이번에 다룰 주제는 추상클래스 이다

요놈을 정의하자면 추상메소드를 가지고 있는 존재다

추상메소드를 또 정의하자면

Body가 없는 메소드라고 생각하면 된다

몸통이 없다는거다


추상클래스는 객체를 생성할수 없는 놈이다

우리가 어제 배운 상속 계층에서 

사용하기 위해 만들어졌다고 보면 된다


설명 길게 해봤자 못알아먹을거 안다

예제를 보도록 하자


class A { public void print() { System.out.println(this); } @Override public String toString() { return "this is a A class"; } }


우리가 알고 있는 전형적인 클래스이다

포스팅을 길게 하기 위해 언급하는 것도 있지만

몸통을 모르는 사람이 있을까봐 적어보았다


몸통이 없다는건 scope가 없다는것인데

print메소드 안에 실행문이 있는건 일반적인 메소드이다

추상메소드는 몸통 없이 

public void print(); 로 인식하면 된다

단, 여기서 abstract를 제일 앞에 붙여줘야 한다


abstract class Some {
	/*
		복잡한 클래스임.
	*/
	abstract public void todo();
}
class Other extends Some {
	@Override
	public void todo() {
		System.out.println("오버라이드 완료");
	}
}
class UseOther {
	public static void main(String[] args) {
		Other o = new Other();
		o.todo();
	}
}


이제 추상클래스로 작성된 문장을 보도록하자

todo가 아까 말한 추상메소드이다


그럼 대체 왜 이걸 사용할까?

추상클래스는 상속을 위해 있는 놈이다

객체도 생성할수 없다


상속을 받는 자식 클래스들이

메소드 재정의를 통해서 사용하려고

존재할 뿐이라는거다


더군다나 자식클래스를 정의하고자 할때

추상메소드는 반드시 구현해주어야 한다


한마디로 강요를 하는것이다

내 아래쪽에 있으려면 무조건 이건해야해!

이런 느낌이랄까?


다음 소스는 우리가 봐왔던 것들 중에

가장 긴 것이다 마음의 준비를 하시고 보자!

모바일로 들어온사람은

데스크탑으로 바꿔보는걸 추천한다


abstract class Shape {	
	abstract public int getArea();

	public void printArea() {
		System.out.println(this.getArea());
	}

	public void print() {
		System.out.println(this);
	}	
}
class Circle extends Shape {
	private int radius;

	public Circle(int radius) {
		setRadius(radius);
	}

	public int getRadius() {
		return radius;
	}
	public void setRadius(int radius) {
		this.radius = radius;
	}
	@Override
	public int getArea() {
		return (int)(radius * radius * 3.14);
	}
	@Override
	public String toString() {
		String info = "- Circle Information -\n";
		info += "radius : " + radius + "\n";
		info += "area : " + getArea();

		return info;
	}
}
abstract class AbstractShape extends Shape {
	private int width;
	private int height;

	public AbstractShape(int width, int height) {
		setWidth(width);
		setHeight(height);
	}
	public int getWidth() {
		return width;
	}
	public void setWidth(int width) {
		this.width = width;
	}
	public int getHeight() {
		return height;
	}
	public void setHeight(int height) {
		this.height = height;
	}
	@Override
	public String toString() {
		String info = "width : " + width + "\n";
		info += "height : " + height + "\n";
		info += "area : " + getArea();

		return info;
	}
}
class Triangle extends AbstractShape {	
	public Triangle(int width, int height) {
		super(width, height);
	}	
	@Override
	public int getArea() {
		return (getWidth() * getHeight()) / 2;
	}	
	@Override
	public String toString() {
		String info = "- Triangle Information - \n";
		info += super.toString();

		return info;
	}
}
class Rectangle extends AbstractShape {	
	public Rectangle(int width, int height) {
		super(width, height);
	}
	@Override
	public int getArea() {
		return getWidth() * getHeight();
	}	
	@Override
	public String toString() {
		String info = "- Rectangle Information - \n";
		info += super.toString();

		return info;
	}
}
class ShapeEx {
	public static void main(String[] args) {
		Circle c = new Circle(10);
		c.printArea();
		System.out.println(new Triangle(5, 10));
		System.out.println(new Rectangle(10, 10));
	}
}


106줄 코드이다

무식하게 그냥 올리니 아주 길어보이긴 한데,

class별로 쪼개 보면 별로 길지도 않다


내 블로그에 나와있는 모든 코드들은

복사 붙혀넣기가 가능하니

보기 불편한 사람은 

EditPlus나 이클립스에

복붙해서 보면 된다


소스에 상속 구도가 보이는가?

최상위에는 Shape 

그아래 Circle과 AbstractShape가 있다

AbstractShape 아래로는 Triangle과 Rectangle이 

상속을 받고 있는 모양새이다


Circle에서는 Shape에 추상메소드 getArea를

재정의 해서 사용하고 있고,

Triangle과 Rectangle도 마찬가지이다


그렇게 하여 도형마다 각각의

넓이를 구하는 식으로 구할수 있게 된다


길이는 조금 길지만 

거기에 비하면 조금은 간단한 기능이 내재되어있다


잘 모르겠으면 따라 쳐보고 실행해 보자

몇번 하다보면 금방 이해할수 있을것이다



오늘 복습한 추상클래스는 다음에 할

다형성을 이해하는데 꽤 중요하니

꼭 제대로 알아두는것이 좋다


그림도 하나없는 긴글이었는데

끝까지 본 사람이 있다면

정말 감사하다 오늘은 여기까지 하고 끝!



반응형

댓글