'추상클래스'에 해당되는 글 1건

안녕하세요. 이번 시간에는 클래스 중 조금 특별한 속성을 갖고 있는 추상 클래스(Abstract Class)와 자바에서 등장하는 인터페이스(Interface)에 대해서 알아보는 시간을 갖도록 하겠습니다.


추상클래스(Abstract Class)


름부터가 아주 비호감입니다. 저는 추상이라는 단어를 무척이나 싫어하거든요.


뭔가 있는 듯 없는 듯하면서도.. 만질수 있을 듯 없을 듯하면서도.. 볼수 있을듯 없을 듯한 그 거시기한 거.. 그런건데


아주아주 간단히 말해서 추상메소드가 적어도 0개 있는 클래스가 추상클래스라고 합니다.


장난하냐? 그러지 마시고 일단 추상 메소드가 무엇인지 말씀 드리고 시작하겠습니다.


추상클래스는 메소드의 선언만 되어있을 뿐 정의는 되어있지 않은 것을 말합니다. 몸통이 없다는 것이죠.


몸통이 없이 메소드의 선언만 존재하는 것이 추상 메소드이며 추상 메소드를 0개 이상 갖는다면 추상클래스이다 라고 말할 수 있겠네요. 

0개 이상이라는 말은 추상메소드를 갖지 않아도 추상 클래스가 될 수 있다는  것인데, 이렇게 되면 보통의 클래스를 의미하기 때문에 보통은 한개 이상 추상 메소드를 갖는다면 추상 클래스라고 합니다.




아래와 같이 사용합니다. 우선 추상클래스를 정의하려거든 class앞에 abstract라는 키워드를 붙여줍니다.


추상메소드 역시 마찬가지입니다. abstract 키워드를 붙이고 메소드 구현부만 없으면 됩니다. 

abstract class AbstractClass{
	int x;
	public void NormalMethod() {}
	public abstract void AbstractMethod(); 
}

보통의 클래스와의 차이점은 객체를 직접생성할 수 없다는 점입니다.


그래서 이 추상 클래스를 상속받아 그 상속받은 클래스의 객체로 생성해야합니다. 또는 다형성의 성질을 이용할 수 있지요.


사용법은 아래의 코드와 같습니다.


abstract class Animal{
	public void seeFood() {
		System.out.println("내가 음식을 봤을 때");
	}
	abstract public void cry();
}

class Dog extends Animal{

	@Override
	public void cry() {
		System.out.println("왈!! 왈왈!! 왈왈~!!! 왈월워뤙왈!!! 멍멍!");
	}
	
}

class Cat extends Animal{

	@Override
	public void cry() {
		System.out.println("야옹~~ 옹옹오오오오오옹~~~~~~ 야오우오우오우옹~~~~");
	}
	
}
public class Main {

	public static void main(String[] args) {
		Animal dog=new Dog();
		dog.seeFood();
		dog.cry();
		
		System.out.println();
		
		Animal cat=new Cat();
		cat.seeFood();
		cat.cry();
	}
}




Animal을 상속받은 클래스 Dog와 Cat은 무조건 abstract의 메소드를 오버라이딩해주어야 합니다. 그렇지 않으면 Animal클래스를 상속할 수 없습니다.

결과는 어떻게 될까 예상이 되시나요?


내가 음식을 봤을 때

왈!! 왈왈!! 왈왈~!!! 왈월워뤙왈!!! 멍멍!


내가 음식을 봤을 때

야옹~~ 옹옹오오오오오옹~~~~~~ 야오우오우오우옹~~~~



여기서 추상클래스와 비슷한 인터페이스(Interface)를 소개합니다.



인터페이스(Interface)


인터페이스는 명세라고도 불리는데요. 추상클래스의 가장 극단적인 형태라고 보면 됩니다. 

인터페이스는 전부가 추상메소드로 이루어져 있습니다.

자신의 변수도 쓸수 없고 오로지 메소드의 선언만이 있어야합니다.

아래처럼 말이죠.


interface Interface {
	public void method1();
	public void method2();
}

마치 추상클래스로 표현하자면 이렇게 표현할 수도 있겠네요.


abstract class Interface{
	public abstract void method1(); 
	public abstract void method2(); 
}


인터페이스의 사용 예제는 아래와 같습니다.


interface Animal {
	public void cry();
	public void sleep();
}

class Dog implements Animal{

	@Override
	public void cry() {
		System.out.println("왈!! 왈왈!! 왈왈~!!! 왈월워뤙왈!!! 멍멍!");
	}
	@Override
	public void sleep() {
		System.out.println("자신의 집에서 잠을 잡니다.");
	}
	
}

class Cat implements Animal{

	@Override
	public void cry() {
		System.out.println("야옹~~ 옹옹오오오오오옹~~~~~~ 야오우오우오우옹~~~~");
	}
	@Override
	public void sleep() {
		System.out.println("집사 얼굴 위에서 잠을 잡니다.");
	}
	
}
public class Main {

	public static void main(String[] args) {
		Animal dog=new Dog();
		dog.cry();
		dog.sleep();
		
		System.out.println();
		
		Animal cat=new Cat();
		cat.cry();
		cat.sleep();
	}
}

Dog와 Cat은 Animal 인터페이스를 implements하고 있습니다. 근데, 이제까지 봐왔던 extends가 아니군요. 그 이유는 아래에서 설명하도록 하겠습니다.


결과는 이렇게 됩니다.


왈!! 왈왈!! 왈왈~!!! 왈월워뤙왈!!! 멍멍!

자신의 집에서 잠을 잡니다.


야옹~~ 옹옹오오오오오옹~~~~~~ 야오우오우오우옹~~~~

집사 얼굴 위에서 잠을 잡니다.




추상클래스 VS 인터페이스


한가지 중요한건 이 둘의 차이에 대해서 알아야합니다.


추상클래스는 역시 클래스입니다. 단독으로 객체를 생성할 수만 없지 나머지는 보통의 클래스처럼 생성자, 변수, 메소드를 갖고 있을 수 있습니다. 그렇기 때문에 자식 클래스에서는 변수나 구현된 메소드를 물려받기 때문에 상속(extends)받을 수 있는 것이죠.


인터페이스 역시 직접 객체를 생성할 수 없습니다. 구현되어야 할 메소드만 명시해 놓고 인터페이스를 받는 클래스는 그 인터페이스에 맞는 메소드를 구현해야합니다. 그렇기 때문에 implements(구현하다)라는 키워드로 인터페이스를 전달받을 수 있지요.


클래스와는 다르게 여러개의 인터페이스를 클래스가 구현할 수 있습니다. 클래스로 따지자면 다중상속과 비슷한 개념입니다.

자바는 다중상속을 지원하지 않지만 다중 인터페이스를 통한 상속은 지원하지요.




아주 간단한 예를 들어보도록 하지요.

개발시에 동료에게 아래와 같은 Operator의 인터페이스를 구현하는 클래스를 만들기를 부탁했다고 한다면 여러분의 착한 동료는 그렇게 하겠죠? 


interface Calculator{
	public int sum(int a,int b);
	public int subtraction(int a,int b);
}



그래서 구현해야하는 sum과 subtraction을 호출하는 부분에 대해서만 신경써서 개발하고 sum과 subtraction 내부는 생각하지 않아도 됩니다


단, 동료에게 어떤 기능을 하는 메소드이니 이런 메소드 형식으로 만들어 달라라고 이야기 해주어야 겠죠?


여기서 여러분은 동료에게 이런 기능을 하는 멤버 메소드를 만들어라라고 명시한 겁니다.


여기 Calculator 명세를 너에게 줄건데 너는 꼭 int형 매개변수 2개를 받고, int 반환형을 갖는 sum을 구현하고

마찬가지로 int형 매개변수 2개를 받고, int 반환형을 갖는 subtraction이라는 메소드를 구현하라고 명세를 만들어 준 거에요.




이제 왜 인터페이스는 implements를 써서 받고, 추상클래스는 extends를 써어 받는 지 차이점을 알겠죠?



반응형
블로그 이미지

REAKWON

와나진짜

,