객체지향의 가장 중요한 목적은 유지보수성 즉 재사용성일 것이다. 상속은 객체지향의 재활용성을 극대화시킨 기법이라고 할 수 있다. 상속은 기존의 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는 것을 의미하는데 캡슐화, 추상화, 다형성과 더불어 객체지향 프로그래밍의 주요 특징 중 하나이다.
상속이란 말 그대로 물려준다는 의미이다. 부모 클래스와 자식 클래스가 있어 부모의 멤버를 자식이 상속받아 그대로 쓸 수 있는 기능이다. 따라서 하나의 부모 클래스가 있고 여러개의 자식 클래스가 있을때 자식클래스에서 사용할 공통기능들을 부모클래스에 추가한다면 그 기능들을 자식클래스들에서 따로 구현하지 않고도 사용할 수 있는 것이다. 즉 코드의 재상용성, 확장성이 용이해지고 코드도 간결해진다는 이점을 얻을 수 있다.
간단한 코드로 예시를 살펴보자면,
Class Parent {
String name;
int age;
}
Class Child extends Parent {
Child (String name, int age) {
this.name = name;
this.age = age;
}
}
public Class Main {
public static void main(String[] args) {
Child child = new Child("자식", 20);
System.out.println("이름: " + child.name + ", 나이: " + child.age);
구현결과 - 이름: 자식, 나이: 20
Child
클래스에는 name
과 age
변수가 없지만 Parent
클래스의 name
과 age
변수를 상속받아 사용이 가능한 모습이다.
만약 Parent
클래스를 상속받는 클래스가 더 있다면 그 모든 클래스가 name
과 age
변수를 따로 생성하지 않아도 Parent
클래스에서 상속받아 사용할 수 있다는 것이다.
어떻게 보면 상속이라는 기능을 사용하기 위해 지켜야 하는 규칙, 변칙들을 익혀야 하는 어려움때문에 언어를 배우고 프로그래밍하는데 있어서 난이도가 더 올라갈 수도 있지만 결국 모든 기능들의 궁극적인 목표는 개발자의 편의성, 효율성이기 때문에 배우는 과정에서 힘들고 어렵더라도 익숙해지기만 한다면 어차피 이득을 보게 되는건 우리, 개발자들일 것이다.
앞서 보았듯이 상속은 프로그래밍에 있어서 굉장한 이점을 가져다주는 아주 강력한 기능이다.
하지만 상속에도 단점이 있는데 바로 다중상속이 불가능하다는 것이다. 인터페이스는 이러한 상속의 단점을 보완해줄 수 있다.
인터페이스란 일종의 추상클래스이다. 하지만 본래의 추상클래스보다 추상화 정도가 높기 때문에 완성된 몸통을 지니고 있는 일반 메서드 또는 멤버변수를 가질 수 없다. 따라서 추상메서드와 상수만을 멤버로 가질 수 있다.
인터페이스는 이처럼 불완전한 것이기 때문에 다른 클래스의 구현을 통해 사용된다.
인터페이스는 인터페이스로부터만 상속받을 수 있는데 클래스와 달리 여러개의 인터페이스로부터 상속 받는 것이 가능하다. 따라서 클래스를 통한 상속의 단점을 보완해 줄 수 있는 것이다.
클래스의 상속과 마찬가지로 자손 인터페이스는 부모 인터페이스의 멤버를 모두 상속받는다.
interface Father {
void walk();
}
interface Mother {
void run();
}
interface Child extends Father, Mother {
}
Child
인터페이스에는 정의된 메서드가 하나도 없지만 부모 인터페이스로부터 상속받은 두개의 메서드를 멤버로 가질 수 있게된다.
인터페이스도 추상클래스와 마찬가지로 인스턴스를 자체로 생성할 수 없다. 따라서 인터페이스에 정의된 추상메서드를 완성해주는 구현 클래스를 작성해야 한다. 인터페이스를 구현하는 클래스를 작성할 때는 implements
를 붙혀 구현한다는 의미를 나타낸다.
interface Fightable {
void fight();
}
class Fighter implements Fightable {
@Override
public void fight() {}
}
인터페이스는 어떤 기능을 하는데 필요한 메서드를 구현클래스에 제공한다는 의미를 지니고 있다. 따라서 인터페이스의 이름은 '~을 할 수 있는'의 의미인 able
로 끝나는 경우가 많다.
어느덧 항해를 시작한지 4주가 되었다. 이제 본격적으로 주특기인 스프링에 들어가는데 아직 자바실력이 부족해 걱정이 많다. 특히 객체지향이 아직 익숙하지 않아서 코드 작성에 서툴다. 커리큘럼 따라가면서 틈틈이 자바 공부도 해야겠다. 확실히 공부한지 어느정도 지나다보니 앞으로 공부해야될 것들, 알아야할 것들이 보이기 시작했다. 수료날까지 완벽히 공부하는 것은 불가능하겠지만 최대한 열심히, 많이 해서 수료하고 바로 취업했으면 좋겠다.