[JAVA] 추상화, 인터페이스

쥬니·2022년 9월 20일
1

공부

목록 보기
3/11
post-thumbnail

❗ 개인적으로 공부했던 내용을 복습하고 정리하기 위한 글입니다! 따라서 내용이 정확하지 않을 수 있습니다!

추상화

추상화(abstraction)는 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것을 말한다.
추상적이다.

위키백과의 추상화(컴퓨터)의 설명은 다음과 같다. 자료, 모듈, 시스템... 어려운 단어는 다 뒤로 미루고, 우리는 핵심적인 개념 또는 기능을 간추려 내는 것, 이라는 문장에 집중해야 한다.


추상적이다.

추상메소드, 추상클래스

자바에서 추상화는 추상메소드와, 추상클래스를 통해 구현한다.

추상메소드 선언

method body가 존재하지 않는 미완성 메소드

추상 메소드는abstract키워드를 써서 정의해야 한다.

public abstract void abstractMethod();

접근제한자 abstract 반환형 메소드이름();
이때 유의할 점은 클래스 안에서 메소드를 정의하려 할 때 중괄호를 쓰고, 그 안에 메소드를 구현하지만, 추상메소드의 경우에는 메소드 이름을 적고 세미콜론으로 바로 마무리한다.
또한 일반클래스에서 추상메소드 정의하려면 다음과 같은 오류 발생한다.
The abstract method abstractMethod in type Parent can only be defined by an abstract class

추상클래스 선언

위의 오류를 해결하는 방법은 추상메소드를 선언한 클래스를 추상클래스로 만드는 듯이다. 하나라도 추상메소드를 포함하고 있는 클래스는 반드시 추상클래스가 되어야 한다. 추상 클래스를 만드는 방법은 클래스 이름 앞에 abstract 키워드를 붙이면 된다.

public abstract class Parent(){}

또한 추상클래스를 상속받으면 자식클래스는 반드시 미완성 된 추상메소드를 구현해 주어야 하거나 자식클래스도 추상클래스로 만들어 주어야 한다. 오버라이딩의 강제성이 생긴다는 이야기이다. 이 경우에는 부모클래스와 마찬가지로 접근지정자 뒤에abstract 키워드를 사용하면 된다.

마지막으로 추상클래스로는 객체 생성이 불가능하다. 클래스가 미완성 되어서 메모리에 올릴 수 없기 때문이다. 그러나 참조형 변수로는 사용 가능하다.

Parent p = new Parent(); // 오류가 발생한다.

추상화는 왜, 그리고 언제 쓸까?

표준화 된 틀을 만들 수 있기 때문에 통일성이 생긴다. 또한 꼭 필요한 기능을 추상메소드로 선언하면, 반드시 자식클래스에서 구현해 주어야 하기 때문에 놓치지 않고 구현이 가능하다.
추상화는 기술적으로 개발자가 판단했을 때 이 클래스는 객체 생성이 불가능해야한다 라고 생각이 들면 추상클래스로 가능하게 하고, 개념적으로 개발자가 판단했을 때 해당 클래스가 아직 구체적으로 덜 구현된 상태인 것 같을 때 추상클래스나 추상메소드로 구현하여 나중에 구현하도록 한다.

인터페이스

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

장치 사이에서 정보나 신호를 주고 받는다, 라는 게 아마 자바에서의 인터페이스가 아닐까 싶다. 정확히는 상수필드와 추상메소드만으로 이루어진 추상클레스의 변형체라고 한다.
이 말을 쉽게 풀어쓰면, 인터페이스의 필드는 묵시적으로 상수필드public static final 이고, 인터페이스의 메소드는 묵시적으로 public abstract 이다. 인터페이스에서는 무조건 상수필드와 추상메소드밖에 정의가 불가능하므로 접근제한자가 생략 가능하다.

인터페이스의 선언은 다음과 같다.
접근제한자 interface 인터페이스이름{}

public interface InterfaceClass {
	
	int num = 10; 
    
	public void method1();
	public void method2();
	
}

또한 인터페이스의 구현을 위해선 implememts 키워드를 사용하여 구현하면 된다.

public class Child implements {
 
	public void method1() {
    	// method1() 구현
    }
    
    public void method2() {
    	// method2() 구현
    }
}

인터페이스는 왜 쓸까?

결론적으로 다중상속을 위함이다. 자바에서는 다중상속을 제한하고 있는데, 인터페이스로 선언한 클래스를 다른 클래스에서 구현할 때, 여러개의 인터페이스를 구현할 수 있다. 그러나 여러개를 상속받으면 다이아몬드 상속 문제가 생길 수 있기 때문에 인터페이스를 사용하여 다중 상속을 구현한다.

마치며...

추상화, 인터페이스 모두 다형성의 한 종류라고 생각한다. 하나를 선언해두고, 필요에 따라서 개발자가 입맛에 따라 커스텀하여 사용하면, 이름은 같지만 기능이 전혀 다를 수 있다. 학교 다닐 때는 이런 추상화나 인터페이스를 사용해본 경험이 많지 않았지만, 실무에서 특히 인터페이스를 통해 구현을 자주 했던 기억이 남아 정리해 보았다.
끝!😉

0개의 댓글