Java에서 다형성 및 여러 이점을 제공하는 고마운 친구들이 있습니다.
추상 클래스, 인터페이스, 제너릭 3인방을 공부하며 장점들을 흡수하여 코드를 작성하고자 하여 글을 작성합니다.
하나 이상의 추상 메서드를 포함한 클래스입니다.
[특징]
[예시]
abstract class Pet{
public abstract void eat();
}
[장점]
함수 선언만 되어있고 구현부가 없는 메서드입니다.
[특징]
[예시]
public abstract void eat();
다른 클래스를 작성할 때 기본이 되는 틀을 제공하며, 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스를 의미합니다. (다중 상속의 이점)
[특징]
[예시]
public interface PET {
public static final int MALE = 1;
int FEMALE = 2; // 생략 가능
public abstract void eat();
void run(); // 생략 가능
}
[장점]
인터페이스에 선언 된 구현부가 있는 일반 메서드입니다.
[특징]
[예시]
public interface PET {
public static final int MALE = 1;
int FEMALE = 2; // 생략 가능
public abstract void eat();
void run(); // 생략 가능
// 시나리오: 펫이 진화해서 기본적으로 날 수 있습니다. ㄷㄷ
default void fly() {
System.out.print("날아 오르기");
}
}
[필요성]
1. 기존에 interface 기반으로 동작하는 라이브러리의 interface에 추가해야 하는 기능이 발생
2. 기존 방식으로라면 모든 구현체들이 추가되는 메서드를 Override 해야 합니다.
3. default 메서드는 abstract가 아니므로 반드시 구현 해야 할 필요는 없습니다.
[default 메서드의 충돌] = [다이아몬드 문제]
interface에 선언된 static method 입니다.
[특징]
[예제]
interface Pet {
static void petInfo() {
System.out.println("pet을 사랑으로 돌봐주세요~~.");
}
}
public class StaticMethodTest {
public static void main(String[] args) {
Pet.petInfo(); // 인터페이스의 이름으로 메서드에 접근합니다.
}
}
클래스 또는 인터페이스 등을 선언 시 <>에 타입 파라미터 표시하는 것을 말하며, 데이터 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있도록 하는 방법입니다.
[타입 파라미터]
[와일드 카드]
[특징]
[예시]
public class Generic<T> { // T는 임의의 타입입니다.
private T something;
// 기본 생성자
public Generic() {}
public Generic(T something) {
super();
this.something = something;
}
public setSomething(T something) {
this.something = something;
}
}
// int, long, double ... 등 의 타입을 담고 싶다면??
public class NumberBox<T extends Number> {
public void addSomethings(T... ts) {
double d = 0;
for (T t : ts) {
d += t.doubleValue();
}
System.out.println("총 합: " + d);
}
}
public class GenericTest {
public static void main(String[] args) {
Generic<String> sbox = new Generic<>();
sbox.setSomething("Hello"); // compile 시점에 타입에 대한 체크가 발생합니다!! (런타임이 아니라 ㄷㄷ)
NumberBox<Number> numBox = new NumberBox<>();
numBox.addSomethings(1.5, 2, 3L);
}
}
[장점]
Java에서는 유지보수성이 높은 코드 작성을 위한 많은 도구들이 있습니다.
결국, 개발자는 이런 좋은 도구들을 잘 활용하여 최적의 코드를 작성하면됩니다.😎