///////
Search

[220927] 추상클래스와 인터페이스_김예진

날짜
2022/09/27
텍스트

추상 클래스

추상 클래스는 자식 클래스들의 비슷한 필드와 메소드를 묶어놓은 형태의 클래스라고 볼 수 있다.
완전한 상태의 클래스가 아니어서 abstract 키워드를 붙여서 추상 클래스를 만들어 준다.
추상 클래스는 추상 메소드를 가져야 하는데, 추상 메소드도 abstract키워드를 붙여서 만들어 주는데, 구현부 내용이 없는 메소드로 만들어야 한다. (구현부 내용이 있는 메소드도 존재 가능)
메소드의 구현부분이 없는 불완전한 클래스라서 객체를 생성할 수 없다.
abstract키워드를 붙여서 먼든 추상 메소드는 추상 클래스 안에 꼭 있어야 한다.
<코드로 추상 클래스 이해해보기>
abstract class Animal { protected int legs; public abstract void move(); // 함수 바디를 구현하지 X. } class Lion extends Animal { @Override public void move() { legs = 4; System.out.println(legs + "개의 다리, 사자의 move."); } } class Chicken extends Animal { @Override public void move() { legs = 2; System.out.println(legs +"개의 다리, 닭의 move."); } }
Java
복사
위의 코드로 추상 클래스를 설명해보자면 동물 객체를 만들 때, 다리의 갯수나 유무에 대해 값과 움직임 여부를 나타낼 필드를 공통적으로 하여금 만들고 싶다면
1.
Animal이라는 추상 클래스를 만든다.
2.
추상 클래스 필드에 다리와 움직임 필드내용을 만들어 준다 (추상 메소드를 포함해서)
3.
Animal 추상 클래스를 상속하는 사자 클래스와 닭 클래스를 만들어 준다.
추상 메소드를 만든 이유는 동물 마다 다리의 개수와 움직임의 유무의 디테일이 다르므로 Animal에서 move 함수의 동작을 정해두지 않고 추상 메소드로 만들어 각자의 자식 클래스에서 작동을 하도록 하기 위해서 !!
abstract 키워드로 자식 클래스에서 move 함수를 필수로 오버라이딩해서 메소드를 만들 수 있도록 했다.
추상 클래스는 자식 클래스의 공통적인 부분을 묶어놓은 클래스로, 상속관계다 ! 불완전한 클래스여서 객체를 생성할 수 없다! 추상 클래스로 자식 클래스 간의 동일한 부분을 통일을 할 수 있다 !

인터페이스

인터페이스는 상속관계가 아닌 클래스 간의 유사성을 활용한 것으로 클래스의 가이드라인이라고 생각할 수 있다.
협업(외주)에서의 개발코드 수정을 줄이고 프로그램 유지보수성을 높이기 위해서 사용된다.
또 여러개의 인터페이스로 자바에서 불가능한 다중상속의 효과를 낼 수도 있다.
interface키워드를 통해 선언하고 implements 키워드로 일반 클래스에서 인터페이스를 구현할 수 있다.
그리고 인터페이스에는 추상 메소드와 상수만 올 수 있다. ( + 자바 1.8 이상에서는 가능)
<코드로 인터페이스 이해해보기>
interface Shape { final double PI = 3.14; // 상수 void draw(); // 도형을 그리는 추상 메소드 double getArea(); // 도형의 면적을 리턴하는 추상 메소드 } class Circle implements Shape { private int radius; public Circle(int radius) { this.radius = radius; } @Override public void draw() { // TODO Auto-generated method stub System.out.println("반지름 " + radius + "의 원을 그립니다."); } @Override public double getArea() { // TODO Auto-generated method stub return radius * radius * PI; } } class Rectangle implements Shape { private int hieght; private int width; public Rectangle (int hieght, int width) { this.hieght = hieght; this.width = width; } @Override public void draw() { // TODO Auto-generated method stub System.out.println("높이 " + hieght + "너비 " + width +"의 사각형을 그립니다."); } @Override public double getArea() { // TODO Auto-generated method stub return height * width; } }
Java
복사
위의 코드를 보면 Shape 인터페이스에 상수 PI와 추상 메소드 draw()와 getArea()가 있다.
그렇다면 Shape 인터페이스를 implements하는 Circle과 Rectangle은 필수로 추상 메소드인 draw()와 getArea()를 오버라이딩을 통해 완성해주어야 한다.
각자의 상수인 radius, height, width을 가질 수 있다.
인터페이스는 코드상에서 클래스 자리에 오는 키워드다. 메소드에 내용이 없는 추상함수만 가질 수 있다. 인터페이스 자체 객체 생성은 불가능하지만 참조 변수에 선언은 가능하다. 추상 메소드가 있으니 implements해서 구현해야한다.
인터페이스로 다중 상속