추상 메소드와 상수만 멤버로 가질 수 있음
DeFault 메소드
public interface Vehicle {
String getBrand();
String speedUp();
String slowDown();
default String turnAlarmOn() {
return "Turning the vehicle alarm on.";
}
default String turnAlarmOff() {
return "Turning the vehicle alarm off.";
}
}
public class Car implements Vehicle {
private String brand;
// constructors/getters
@Override
public String getBrand() {
return brand;
}
@Override
public String speedUp() {
return "The car is speeding up.";
}
@Override
public String slowDown() {
return "The car is slowing down.";
}
}
동일한 이름의 메소드를 다중 상속 받아 오버라이딩 하게 되면 누구로부터 해당 메소드를 전달 받았는지 알 수 없기 때문에 컴파일 에러 발생
Person
public class Person {
String nation = "대한민국";
protected void 가문(){
System.out.println("진인사대천명");
}
}
public class Father extends Person {
@Override
protected void 가문() {
System.out.println("가나다라마바사");
}
}
public class Mother extends Person {
@Override
protected void 가문() {
System.out.println("Hello World.");
}
}
public class Child extends Mother ,Father{
public static void main(String[] args) {
Child child = new Child();
System.out.println("내 국적은 "+child.nation+"입니다.");
child.가문();
}
}
//Person
public interface Person {
String nation = "대한민국";
void 가문();
}
//Father
public interface Father extends {
@Override
void 가문();
}
//Mother
public interface Mother extends Person {
@Override
void 가문();
}
//child
public class Child implements Father, Mother {
@Override
void 가문(){
System.out.println("Hello World.");
}
public static void main(){
Child child = new Child();
System.out.println("내 국적은 "+child.nation+"입니다.");
child.가문();
}
}
public abstract class Teacher {
public void guide() {
System.out.println("학생들을 지도한다.");
}
public abstract void teach();
}
public class MathTeacher extends Teacher {
@Override
public void teach() {
System.out.println("수학선생님");
}
}
public interface ClassTeach {
void classTeach();
void attendance();
}
public class MathTeacher extends Teacher implements ClassTeach {
@Override
public void teach() {
System.out.println("수학선생님");
}
@Override
public void classTeach() {
System.out.println("3반 담임선생님");
}
@Override
public void attendance() {
System.out.println("학생들이 등교를 했는지 출석부를 부른다.");
}
}
추상 클래스
.
자연스럽게 문장이 이어지는 것을 느낄 수 있을 것입니다. 즉, 상속은 is kind of
관계 입니다.
객체 지향의 상속은 상위 클래스의 특성을 재사용 하는 것입니다.
객체 지향의 상속은 상위 클래스의 특성을 확장하는 것입니다.
객체 지향의 상속은 is kind of 관계를 만족해야 합니다.
인터페이스
인터페이스는 클래스가 무엇을 할 수 있다라고 하는 기능을 구현하도록 강제하는 특징을 가지고 있습니다. 그래서 인터페이스는 extends
키워드가 아니라 implements
키워드를 사용하는 것을 알 수 있습니다. 조금 더 깊이 생각하면 아래와 같이도 생각할 수 있습니다.
고정된 메모리 영역을 얻으면서 한번의 new로 인스턴스를 사용하기 때문에 메모리 낭비를 방지할 수 있음또한 싱글톤으로 만들어진 클래스의 인스턴스는 전역 인스턴스이기 때문에 다른 클래스의 인스턴스들이 데이터를 공유하기 쉽다.
DBCP(DataBase Connection Pool)처럼 공통된 객체를 여러개 생성해서 사용해야하는 상황에서 많이 사용.(쓰레드풀, 캐시, 대화상자, 사용자 설정, 레지스트리 설정, 로그 기록 객체등)안드로이드 앱 같은 경우 각 액티비티나 클래스별로 주요 클래스들을 일일이 전달하기가 번거롭기 때문에 싱글톤 클래스를 만들어 어디서나 접근하도록 설계하는 것이 편하기 때문
싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우 다른 클래스의 인스턴스들 간에 결합도가 높아져 "개방-폐쇄 원칙" 을 위배하게 된다. (=객체 지향 설계 원칙에 어긋남)
따라서 수정이 어려워지고 테스트하기 어려워진다.