저번주 주말이 크리스마스였는데 어느새 일주일이 가고 신년이 코앞이다. 내년부터는 만나이로 한다고하니 떡국 몇 그릇 정도는 먹어도 되지않나 싶다.
오늘부터 객체지향 프로그래밍의 상속성, 캡슐화, 다형성, 추상화를 공부해보자...!
자바 언어에서 상속이란 기존 클래스를 재활용하여 새로운 클래스를 작성하는 자바의 문법적 요소이다.
간단하게 말하자면 두 클래스를 상위 클래스와 하위 클래스로 나누어 상위 클래스의 멤버를 하위 클래스와 공유하는 것이다. 이때 이 두 클래스가 상속관계에 있다 말하고, 하위 클래스는 상위클래스의 모든 멤버를 상속받아 사용할 수 있다.
따라서, 하위 클래스의 멤버는 언제나 상위 클래스의 멤버 수와 같거나 많다.
위의 그림에서 총 4개의 클래스가 정의되어있다.
아래의 3개의 클래스를 먼저 살펴보면 Programmer, Dancerm, Singer
의 속성과 기능이 정의되어있다. 그 중 name, age, walk
등과 같이 3개의 클래스가 중복으로 가지고 있는 속성과 기능들이 보일 것이다.
Programmer, Dancerm, Singer
은 사람이다. 그리고 사람이라면 가져야할 공통점이 존재한다. 이 그림은 그 공통점을 하나로 모아 Person
이라는 클래스에 정의한 것이고, 하위의 3개 클래스는 이 Person을 상속받아 공통의 멤버들을 사용할 수 있다.
상속을 통해 클래스의 공통점을 모아 작성하게 되면 코드를 재사용하여 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있어 코드의 중복을 제거할 수 있게된다. 또한 나중에 배울 다형성과도 연관되어 있으니 기억해두도록 하자.
각 클래스의 공통점을 하나로 묶은 클래스 Person
을 생성하였다. 이제 우리는 Person을 사용하여 중복 코드를 줄이고 하위 클래스의 기능은 그대로 사용하고자 한다.
extends
는 상위 클래스의 멤버를 사용할 수 있게 만드는 상속 키워드 이다.
class 클래스명 extends 싱위클래스명 {
...생략...
}
이로서 우리는 코드를 재사용하여 하위 클래스들의 속성과 기능은 유지하고 중복을 줄일 수 있었다.
아래는 위 그림의 코드 예시이다!
class Person {
String name;
int age;
void learn(){
System.out.println("공부를 합니다.");
};
void walk(){
System.out.println("걷습니다.");
};
void eat(){
System.out.println("밥을 먹습니다.");
};
}
class Programmer extends Person { // Person 클래스로부터 상속. extends 키워드 사용
String companyName;
void coding(){
System.out.println("코딩을 합니다.");
};
}
class Dancer extends Person { // Person 클래스로부터 상속
String groupName;
void dancing(){
System.out.println("춤을 춥니다.");
};
}
class Singer extends Person { // Person 클래스로부터 상속
String bandName;
void singing(){
System.out.println("노래합니다.");
};
void playGuitar(){
System.out.println("기타를 칩니다.");
};
}
public class Main {
public static void main(String[] args){
//Person 객체 생성
Person p = new Person();
p.name = "홍길동";
p.age = 24;
p.learn();
p.eat();
p.walk();
System.out.println(p.name);
//Programmer 객체 생성
Programmer pg = new Programmer();
pg.name = "박혁거세";
pg.age = 26;
pg.learn(); // Persons 클래스에서 상속받아 사용 가능
pg.coding(); // Programmer의 개별 기능
System.out.println(pg.name);
//// 출력결과
공부를 합니다.
밥을 먹습니다.
걷습니다.
홍길동
공부를 합니다.
코딩을 합니다.
박혁거세
}
}
메서드 오버라이딩은 오버로딩과 비슷하면서 다른 자바의 문법이다. 오버라이딩은 상위 클래스로 부터 상속받은 메서드와 동일한 이름의 메서드를 재정의 하는 것입니다.
또한 메서드 오버라이딩을 사용하려면 세 가지 조건을 만족 시켜야합니다. (오버로딩은 2가지였죠?)
//의사코드
class 상위클래스 {
void 밥먹기(){
System.out.println("밥을 냠냠 먹습니다.");
}
}
class 하위클래스 {
void 밥먹기(){
System.out.println("밥을 허겁지겁 먹습니다");
}
}
public class Main {
public static void main(String[] args){
하위클래스 lower = new 하위클래스();
System.out.println(lower.밥먹기);
}
}
/// 출력
밥을 허겁지겁 먹습니다.
자바 객체지향 프로그래밍의 4가지 기둥 상속성, 캡슐화, 다형성, 추상화 중 상속을 알아보았다. 공부하면 공부할수록 이 4가지의 특성은 서로 연관되어있는게 느껴져서 굉장히 재밌다.
당장 공통점을 모아서 상위를 만드는 것도 추상화인 인터페이스나 추상클래스로 바꿔서 사용할 수도 있는 노릇이니 말이다. 어느 상황에 어느것이 더 사용하기 용이하고 효율적인지는 직접 코드를 짜보고 느껴봐야 알 것 같다!