2 분 소요

추상화 / 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

정의되고, staticdefault 메서드 이외의 모든 메서드가 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 인터페이스명 {
		... // 인터페이스에 정의된 모든 추상메서드 구현
}

카테고리: ,

업데이트:

댓글남기기