본문 바로가기

LECTURE/# java basic

[초급 JAVA]자바 interface 와 abstract 예제로 이해하기

반응형

자바 interface 와 abstract 예제로 이해하기

By Commin December 12, 2016


안녕하세요 commin 입니다. 이번 포스팅에서는 자바의 interface 와 abstract 에 대해 포스팅하겠습니다.

abstract 추상클래스 & 추상메서드



추상클래스의 조건

  • 추상클래스(abstract)일반클래스보다 조금더 추상적은 개념의 것을 정의한다.
  • 추상클래스(abstract) 추상 메서드와 그냥 메서드, 멤버필드, 생성자를 정의 할 수 있지만, 추상메서드는 내용을 정의 할 수 없다.
  • 추상클래스(abstract) 추상메서드를 정의하면 추상클래스를 상속받은 클래스에서는 반드시 추상메서드를 Override 하여 정의하여야 한다.
  • 추상클래스(abstract)abstract class [클래스명] 으로 정의한다.
  • 추상클래스(abstract) 추상메서드는 [접근제한자] abstract [return 자료형] [메서드이름]() 으로 정의한다.
  • 추상클래스(abstract)는 extends 로 상속받는다. 
  • 추상클래스(abstract)는 다중 상속이 안된다.


예제 살펴보기

ExamAbstract.java
package abstract_interface;
public class ExamAbstract {
/**
* 추상클래스 & 추상메서드 abstract 사용하기 추상클래스는
* 말그대로 약간 추상적인 의미를 가진 클래스여야 하며
* 비추상적인 클래스에서 이를 상속받아 사용합니다.
*/
public static void main(String [] ar){
Tiger tiger = new Tiger("Hodol");
tiger.cry();
tiger.behavior();
System.out.println("사자의 이름은 :" + tiger.animal_name);
Dog dog = new Dog("Mikey");
dog.cry();
dog.behavior();
System.out.println("개의 이름은 :" + dog.animal_name);
}
}
abstract class Animal {
String animal_name;
Animal(String name) {
animal_name = name;
}
public abstract void cry();
public abstract void behavior();
}
class Tiger extends Animal {
public Tiger(String name) {
super(name);
}
@Override
public void cry() {
// TODO Auto-generated method stub
System.out.println("어흥");
}
@Override
public void behavior() {
// TODO Auto-generated method stub
System.out.println("우측으로 빠르게 움직인다.");
}
}
class Dog extends Animal {
public Dog(String name) {
super(name);
}
@Override
public void cry() {
// TODO Auto-generated method stub
System.out.println("멍멍");
}
@Override
public void behavior() {
// TODO Auto-generated method stub
System.out.println("왼쪽으로 느리게 달린다");
}
}

예제를 보면 Animal 이라는 추상클래스를 정의한것이 보일것입니다. Tiger클래스나 Dog 클래스가 특정 동물을 지칭하며 구체적인것에 비해 Animal 추상클래스는 동물이라는 조금더 추상적인 개념으로 쓰였습니다. 동물을 생각하면 일단 동물의 울음소리나 행동이 생각이 나는데요. 그래서 추상클래스안에 추상메서드는 cry() 나 behavior() 같은 추상 메서드로 정의하였습니다. 이렇게 추상메서드를 정의해 놓으면, 이를 상속받은 Tiger 나 Dog 클래스는 반드시 이 메서드를 Override 하여야 합니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Tiger extends Animal {
    
    public Tiger(String name) {
        super(name);
    }
 
    @Override
    public void cry() {
        // TODO Auto-generated method stub
        System.out.println("어흥");
    }
 
    @Override
    public void behavior() {
        // TODO Auto-generated method stub
        System.out.println("우측으로 빠르게 움직인다.");
    }
 
}
cs

Tiger 클래스만 살펴 보자면, cry 메서드와 behavior 메서드를 Override 하고 여기서 재정의 하여 사용한것이 보일것입니다. 조금 특이한것이 있다면 생성자에 인자로 String name 을 받고 이것을 super(name)을 통하여 상위 클래스의 생성자로 보내는 것입니다. 이렇게 사용하면 추상클래스에서 정의했던 생성자를 이용하게되고 추상클래스의 멤버필드인 animal_name 에 String name 을 등록 할 수 있습니다. 

1
2
3
4
Tiger tiger = new Tiger("Hodol");
System.out.println("사자의 이름은 :" + tiger.animal_name);
cs

이것은 추상클래스만의 성격은 아닙니다. 일반 클래스를 상속받아서 같은 방법으로 사용하여도 같은 결과를 가집니다. 이것을 보여드린 이유는 바로 이어서 설명할 인터페이스(Interface) 와 추상클래스(abstract) 의 차이를 설명드리기 위함이니 잘 기억하고 계세요.




인터페이스(Interface)



인터페이스(interface)의 조건

  • 인터페이스(interface)는 추상클래스보다 훨씬 극단적이고 제한적인 성격을 가집니다.
  • 인터페이스(interface)는 멤버필드와 추상메서드만 정의 할 수 있습니다.
  • 인터페이스(interface)를 상속받을려면 extends를 사용하면 안되고 implements 를 사용하여야 합니다.
  • 인터페이스(interface)는 다중상속이 가능합니다.
  • 인터페이스(interface)의 추상메서드는 일반클래스의 메서드 형식과 같지만 몸통을 가질 수 없습니다.
  • 인터페이스(interface)의 선언은 interface [이름]으로 합니다.


예제 살펴보기

 
ExamInterface.java
package abstract_interface;
public class ExamInterface {
/**
* 인터페이스는 추상클래스의 일종이지만 보다 더 극단적인경우입니다.
* 추상메서드로만 구성되며 abstract와다르게 메서드만 정의가 가능합니다.
* 공동 작업을 할때 메서드의 표준화를 시키기 위하여 많이 사용되며,
* 서로 다른 클래스를 연결할 때도 사용됩니다.
*/
public static void main(String[] ar) {
Door door = new Door();
door.open();
door.close();
door.Red();
door.Blue();
Bottle bottle = new Bottle();
bottle.open();
bottle.close();
}
}
interface OpenCloseIf {
public void open();
public void close();
}
interface PaintIf {
public void Red();
public void Blue();
}
/**
* Interface 는 implements 로 상속받으며
* extends 상속과는 다르게 다중 상속이 가능합니다.
*/
class Door implements OpenCloseIf , PaintIf {
@Override
public void open() {
// TODO Auto-generated method stub
System.out.println("Door Open");
}
@Override
public void close() {
// TODO Auto-generated method stub
System.out.println("Door Close");
}
@Override
public void Red() {
// TODO Auto-generated method stub
System.out.println("Paint the door red");
}
@Override
public void Blue() {
// TODO Auto-generated method stub
System.out.println("Paint the door blue");
}
}
class Bottle implements OpenCloseIf {
@Override
public void open() {
// TODO Auto-generated method stub
System.out.println("Bottle Open");
}
@Override
public void close() {
// TODO Auto-generated method stub
System.out.println("Bottle Close");
}
}

방금전 말씀드린 추상클래스(abstract)의 생성자를 기억해 보세요. 여기서 인터페이스와 큰 차이점은 abstract는 조금더 class 의 성격을 가지고 있고 interface는  그와 다르게 메서드나 멤버변수만을 정의하여 다른 클래스에서 그것을 사용하도록 강제하는 역할에만 충실하다는 것 입니다. 또 다른점은 인터페이스는 implements라는 키워드로 상속을 받기때문에 여러개의 인터페이스를 하나의 클래스에서 같이 사용하는 다중 상속이 가능하지만 abstract는 클래스의 성격이 강하기때문에 extends 로 상속하여 하나의 클래스에서 하나의 abstract만을 상속 할 수 있습니다. 
인터페이스 예제에는 그렇게 어려운점이 없으므로 한번씩 따라 코딩하시길 바라며, 이만 포스팅을 마치도록 하겠습니다.
abstract와 interface의 형식의 차이, 쓰임의 차이 등을 유념하면서 예제를 통하여 학습하시길 바랍니다. ^^






반응형