** 자기 공부용 및 암기용으로 포스팅하는 글 입니다.
** 정확한 정보는 보장 할 수 없으니, 참고용으로만 봐주시면 감사하겠습니다.
** 제 개인적인 생각 및 자기 암시목적으로 작성되기에 이점 양해 부탁드립니다.
들어가기에 앞서..
객체지향 프로그래밍 설계를 지탱하는 핵심적인 4가지의 기둥이 존재한다.
그것은 상속/캡슐화/추상화/다형성 이다.
그 중에 첫번째인 상속에 관하여 배워 보도록하자.
★ 알아볼 내용
1. 상속 관계 & 포함 관계
2. 메서드 오버라이딩
3. super VS super()
4. 클래스의 정점, Object 클래스
내용 설명
1. 상속 관계 & 포함 관계
1) 상속 관계
우선 상속의 개념이란 기존의 클래스를 재활용하여 새로운 클래스를 작성하는 자바의 문법 요소이다.
하위 클래스는 상위 클래스가 가진 모든 맴버를 상속받아 사용할 수 있다.
정확하게 클래스 관계를 설명할 때는 상속받았다 보다는 확장되었다 라고 표현하는게 맞으며, 상속 관계를 성립하기 위해서 사용하는 키워드가 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 HelloJava {
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) 포함 관계
포함 관계는 상속처럼 클래스를 재사용할 수 있는 방법이지만 사용 방식이 상속과는 다르다.
클래스의 맴버로 다른 클래스 타입의 참조변수를 서선언하는 것이다.
즉 new를 통해서 새로운 객체를 heap단에 올릴 때 사용하는 생성자의 매개변수안에 클래스를 넣는 것이다.
아래 소스 예제를 보면 어떠한 방식으로 적용되는지 알 수 있다.
public class Employee {
int id;
String name;
Address address;
public Employee(int id, String name, Address address) {
this.id = id;
this.name = name;
this.address = address;
}
void showInfo() {
System.out.println(id + " " + name);
System.out.println(address.city+ " " + address.country);
}
public static void main(String[] args) {
Address address1 = new Address("서울", "한국");
Address address2 = new Address("도쿄", "일본");
Employee e = new Employee(1, "김코딩", address1);
Employee e2 = new Employee(2, "박해커", address2);
e.showInfo();
e2.showInfo();
}
}
class Address {
String city, country;
public Address(String city, String country) {
this.city = city;
this.country = country;
}
}
// 출력값
1 김코딩
서울 한국
2 박해커
도쿄 일본
이렇게 상속 관계와 포함 관계는 얼추보면 의미 자체는 비슷해 보이지만 다른 개념이다.
소스코딩을 진행할 때 이것이 상속 관계인지 포함 관계인지 갈피가 잡히지 않는다면 아래의 문장을 대입해 보면 쉽게 접근할 수 있다.
"~은 ~이다(IS-A)" 관계라면은 상속 관계, "~은 ~을/를 가지고 있다(HAS-A) 관계라면은 포함 관계이다.
2. 메서드 오버라이딩
Override의 사전적 의미는 "~위에 덮어쓰다"이다.
즉 메서드 오버라이딩은 상위 클래스로부터 상속받은 메서드와 동일한 이름의 메서드를 재정의 하는 것을 의미한다.
메서드 오버라이딩을 진행할려면 세 가지의 조건이 만족되어야 한다.
1) 메서드의 선언부가 상위 클래스의 해당 메서드 선언부과 완전히 일치해야 한다.
2) 접근 제어자의 벙뮈가 상위 클래스의 메서드보다 같거나 넓어야 한다.
3) 예외는 상위 클래스의 메서드보다 많이 선언할 수 없다.
public class Main {
public static void main(String[] args) {
Bike bike = new Bike();
Car car = new Car();
MotorBike motorBike = new MotorBike();
bike.run();
car.run();
motorBike.run();
}
}
class Vehicle {
void run() {
System.out.println("Vehicle is running");
}
}
class Bike extends Vehicle {
void run() {
System.out.println("Bike is running");
}
}
class Car extends Vehicle {
void run() {
System.out.println("Car is running");
}
}
class MotorBike extends Vehicle {
void run() {
System.out.println("MotorBike is running");
}
}
// 출력값
Bike is running
Car is running
MotorBike is running
StringBuilder의 객체를 생성한 후에 append()를 통하여 문자열들을 넣는다.
또한 문자열을 출력할 때 해당 String형의 변수에다가 .toString()를 통해 형변환을 시켜서 넣는작업을 진행한다.
3. super VS super()
super 키워드는 상위 클래스의 객체를 호출하는 것.
super()는 상위 클래스의 생성자를 호출하는 것을 의미.
모두 상위 클래스의 존재를 상정하며 상속 관계가 전제로 되어 있어야만 사용이 가능하다.
간혹 상위클래스의 변수명과 하위 클래스의 변수명이 동일한 경우가 존재한다.
이럴때는 super 키워드를 통하여 해당 변수 명 앞에 super 키워드가 붙어 있다면, 상위 클래스의 변수 명을 언급하는 것을 알 수 있게 된다.
또한 super() 메서드 또한 작성 제약 조건이 있는데 이는 this()와 동일하게 적용 되는 항목이다.
1) 생성자 안에서만 사용 가능하다
2) 반드시 첫 줄에 와야한다.
4. 클래스의 정점, Object 클래스
Object 클래스는 자바의 클래스 상속계층도에서 최상위에 위치한 상위클래스이다. 고로 모든 클래스들은 Object로 부터 확장되는 클래스라는 뜻이다.
고로 우리는 모든 클래스에서 Object에서 사용하는 메서드를 사용할 수 있다.
ex) toString(), equals(Object obj)
'JAVA 지식 및 공부' 카테고리의 다른 글
[JAVA] 객체지향 프로그래밍 : 추상화 (0) | 2024.06.10 |
---|---|
[JAVA] 객체지향 프로그래밍 : 캡슐화 (0) | 2024.06.09 |
[JAVA] StringTokenizer & StringBuilder & StringBuffer (0) | 2024.06.06 |
[JAVA] Collection - 열거형(Enum) 정리 (0) | 2024.05.29 |
[JAVA] Collection - List 개념 & 메서드 정리 (0) | 2024.05.06 |