[Java] 추상화
추상화 / final / 인터페이스
abstract 제어자
주로 클래스와 메서드를 형용하는 키워드로 사용됨
메서드 앞에 붙은 경우 추상 메서드, 클래스 앞에 붙은 경우 추상 클래스라 부름
abstract class AbstractExample { // 추상 메서드가 최소 하나 이상 포함돼있는 추상 클래스
abstract void start(); // 메서드 바디가 없는 추상메서드
}
추상 메서드는 구체화되지 않은 미완성 메서드 이며,
미완성 메서드를 포함하는 클래스는 미완성 클래스를 의미하는 추상 클래스가 됨.
AbstractExample abstractExample = new AbstractExample(); // 에러발생
추상 클래스
상속 관계에 있어 새로운 클래스를 작성하는데 매우 유용함
abstract class Animal {
public String kind;
public abstract void sound();
}
class Dog extends Animal { // Animal 클래스로부터 상속
public Dog() {
this.kind = "포유류";
}
public void sound() { // 메서드 오버라이딩 -> 구현부 완성
System.out.println("멍멍");
}
}
class Cat extends Animal { // Animal 클래스로부터 상속
public Cat() {
this.kind = "포유류";
}
public void sound() { // 메서드 오버라이딩 -> 구현부 완성
System.out.println("야옹");
}
}
class DogExample {
public static void main(String[] args) throws Exception {
Animal dog = new Dog();
dog.sound();
Cat cat = new Cat();
cat.sound();
}
}
// 출력값
// 멍멍
// 야옹
sound() = 추상 메서드
Animal 클래스 = 추상 클래스
추상 클래스 Animal을 상속받은 Dog 클래스와 Cat 클래스 안에 추상 메서드 sound()를 각각
오버라이딩하여 각 객체에 맞는 구현부를 완성.
final 키워드
final 제어자가 추가되면 해당 대상은 더 이상 변경이 불가하거나 확장되지 않는 성질을 지니게 됨.
필드, 지역 변수, 클래스 앞에 위치할 수 있으며 그 위치에 따라 그 의미가 조금씩 달라짐.
위치 | 의미 |
---|---|
클래스 | 변경 또는 확장 불가능한 클래스, 상속 불가 |
메서드 | 오버라이딩 불가 |
변수 | 값 변경이 불가한 상수 |
final class FinalEx { // 확장/상속 불가능한 클래스
final int x = 1; // 변경되지 않는 상수
final int getNum() { // 오버라이딩 불가한 메서드
final int localVar = x; // 상수
return x;
}
}
Interface 인터페이스
타 클래스를 작성할 때 기본 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할까지
담당하는 일종의 추상 클래스.
인터페이스 특징
- 추상 메서드와 상수만을 멤버로 가질 수 있음(추상 클래스에 비해 추상화 정도가 더 높음)
- 다중 상속 가능
- 생성자 사용 불가
- 메서드 오버라이딩 필수
인터페이스 기본 구조
class
키워드 대신 interface
키워드를 사용하며, 내부의 모든 필드가 public static final
로
정의되고, static
과 default
메서드 이외의 모든 메서드가 public abstract
로 정의된다.
public interface InterfaceEx {
public static final int rock = 1; // 인터페이스 인스턴스 변수 정의
final int scissors = 2; // public static 생략
static int paper = 3; // public & final 생략
public abstract String getPlayingNum();
void call() //public abstract 생략
}
class 클래스명 implements 인터페이스명 {
... // 인터페이스에 정의된 모든 추상메서드 구현
}
댓글남기기