본문 바로가기
Web

[Java] 추상, 인터페이스

by DuncanKim 2022. 6. 13.
728x90

[Java] 추상(abstract), 인터페이스(interface)

산수 추상

 

추상(abstract) 그리고 인터페이스(interface)는 

 

"~을 하겠다"라는 계획서와 같다.

 

'하겠다'라고 하면 너무 추상적이지 않은 계획서이지 않나?

그렇다. 그 부분 때문에 추상 또는 인터페이스를 쓰는 것이다.

~~을 해야 한다를 기억해 놓을 수 있기 때문에,

그 때 그 때 ~~을 상황에 맞게 해결해 나가면 되는 것처럼,

 

완벽하게 구현해놓지는 않았지만, 추상 클래스 또는 인터페이스를 상속하여

그 부분을 상세하게 클래스 안에서 구현하고 싶을 때,

추상 또는 인터페이스를 사용하는 것이다.

 

 

 

 

1. 추상(Abstract)으로 동물 클래스 만들기

 

각각의 동물의 울음소리를 각각의 클래스마다 다르게 설정해보는 것이다.

 

'울음' 이라는 것은 동물마다 다른 특성이 있기 때문에, 'crying'이라는 함수가 존재할 것이다라고

추상 클래스에 추상 메소드를 정의해놓는 것이다. 

 

아래의 Cat, Dog 클래스를 보면 추상 클래스를 extends 즉, 상속한 것을 볼 수 있는데,

이 경우 추상 클래스에 있는 함수들을 반드시 구현해야 오류가 생기지 않는다.

 

 

(1) Animal 추상 클래스

abstract class Animal {

	abstract void crying();
}

 

(2) Cat, Dog 클래스(Animal 상속)

이클립스에서는 추상 클래스의 메소드를 자동으로 만들어준다.

Cat이라는 클래스가 추상 클래스를 상속받는다고 할 경우, 이렇게 오류 표시가 뜬다.

Add unimplemented methods -> Animal 클래스의 crying() 함수가 구현되지 않았다고 한다.

이를 클릭하면...

 

(println은 내가 친 것이고)

void crying()이라는 함수가 자동으로 Override 되는 것을 볼 수 있다.

public class Cat extends Animal{

	@Override
	void crying() {
		// TODO Auto-generated method stub
		System.out.println("yaong");
	}	
}
public class Dog extends Animal{

	@Override
	void crying() {
		// TODO Auto-generated method stub
		System.out.println("wal");
	}
}

 

 

(3) Main 클래스

Cat과 Dog 두 개의 클래스 각각의 인스턴스를 만들어 crying()을 출력해보면 다음과 같이 나온다.

public class AnimalMain{

	public static void main(String[] args) {
		Cat cat = new Cat();
		Dog dog = new Dog();
		cat.crying();
		dog.crying();
	}
}
/*결과
yaong
wal
*/

 

2. 추상(Abstract)으로 뮤직 플레이어 기능 구현하기

위의 내용과 비슷하다. 추상 클래스에는 play, pause, stop 기능을 구현할 것이기 때문에

각각 추상 메소드로 대강 만들어 놓는다. play의 경우 매개변수로 노래 이름을 받을 것이기 때문에,

매개변수 자리에 String songName을 추가해둔다.

 

(1) Player 추상 클래스

abstract class Player {
	abstract void play(String songName);
	abstract void pause();
	abstract void stop();
}

위에서 설명하지 않은 중요한 것.

abstract가 메소드에 붙을 때는 그 메소드는 안에 무엇이든 구현할 수가 없다.

 

그렇지만 abstract 클래스 안에 abstract가 아닌 public 함수가 들어있다면

public 함수는 일부 구현이 가능하다.

 

 

 

 

(2) Main 클래스

 

메인 클래스 안에서 추상 메소드들을 구현해준다.

그리고 실행하면 다음과 같이 출력되는 것을 알 수 있다.

public class Main extends Player {

	public static void main(String[] args) {
		Main main = new Main();
		main.play("mighty love");
		main.pause();
		main.stop();
	}

	@Override
	void play(String songName) {
		System.out.println(songName + "곡을 재생합니다.");
	}

	@Override
	void pause() {
		System.out.println("곡을 일시정지합니다.");
	}

	@Override
	void stop() {
		System.out.println("곡을 정지합니다.");
	}
}
/*결과
might love곡을 재생합니다.
곡을 일시정지합니다.
곡을 정지합니다.
*/

 

 

 

3. 인터페이스(Interface)


위키백과 says,

인터페이스는 서로 다른 두 개의 시스템, 장치 사이에서 정보나 신호를 주고받는 경우의 접점이나 경계면이다.

즉, 사용자가 기기를 쉽게 동작시키는데 도움을 주는 시스템을 의미한다.

컴퓨팅에서 컴퓨터 시스템끼리 정보를 교환하는 공유 경계이다.


 

공유 경계니 뭐니 하는 것보다는


동일한 목적 하에 동일한 기능을 수행하게 강제하는 것이다.

개발코드의 수정을 줄이고 프로그램 유지보수성을 높이기 위한 것이다.

(다형성의 극대화)


에이 이것보다 더 간단한 설명


: 추상 클래스와 비슷한 역할이다.


 

다만, 추상과 인터페이스의 차이가 있는데,

자바의 경우 하나의 클래스는 하나의 클래스만 상속받을 수 있다.

그렇지만 인터페이스의 경우 인터페이스를 상속할 때 여러 가지를 상속할 수 있다.

 

또한 추상의 경우, 클래스 안의 추상 메소드 안에 코드를 일부 구현해놓을 수 있지만,

인터페이스의 경우 그것이 금지되어 있다. 정말 어떤 '기능'을 구현할 것이다라고만 적어놓는 것만 된다.

 

인터페이스의 목적은 '규제'이다.

엄격한 규제 속에서 그 속의 내용을 구성하는 것은 자유인 것이다.

 

+ 변수도 정의를 할 수 있다.

 

 

(1) Dog 인터페이스

 

public interface Dog {

	abstract void crying();
	
	/*
	//인터페이스는 이러한 코드를 구현하는 것이 금지되어 있다.
	//추상클래스는 이라헌 일부 구현이 가능하다.
	public void show() {
		System.out.println("hello");
	}
	*/
	
	public void show();
}

추상 클래스와 비슷한 것을 알 수 있다.

다만, 추상에서 설명한 public void show()의 경우, 추상의 경우 일부 설계를 하여 코드를 작성해놓을 수 있지만,

인터페이스에는 구현이 불가능하다. 오직 함수 선언만 해두어야 한다.

 

(중괄호를 넣기만 해도 이클립스에서 가차없이 빨간줄을 함수명 아래에 쫙 그어버린다.)

 

 

(2) Main 클래스

public class Main implements Dog{

	public static void main(String[] args) {
		Main main = new Main();
		main.crying();
		main.show();
	}

	@Override
	public void crying() {
		System.out.println("월 월");
	}

	@Override
	public void show() {
		System.out.println("hello");
	}
}

이런식으로 각각의 메소드 들을 구현할 수 있다.

728x90

댓글