Java 객체지향 프로그래밍
1. Java 객체지향 프로그래밍 - 상속 (Inheritance)
2. Java 객체지향 프로그래밍 - 메서드 오버라이딩 (Overriding)
3. Java 객체지향 프로그래밍 - 은닉화(Encapsulation) 와 접근 제한자 (modifier)
4. Java 객체지향 프로그래밍 - 싱글톤 패턴 (Singleton)
5. Java 객체지향 프로그래밍 - 다형성 (Polymorphism)
객체지향 프로그래밍
주요 특징
OOP IS A PIE
1. Polymorphism (다형성)
2. Inheritance (상속)
3. Encapsulation (은닉화)
상속 (Inheritance)
개요
기존 클래스의 멤버 변수나 함수를 자식 클래스가 물려받아 재사용하는 것.
기존 코드를 물려받기 때문에 재사용성이 용이하고 이로 인해 유지보수성이 향상됩니다.
상속은 extends 키워드를 사용하며
부모 클래스는 슈퍼 클래스, 상위 클래스, 부모 클래스 라고 부르기도 합니다.
자식 클래스는 서브 클래스, 하위 클래스, 자식 클래스 라고 부르기도 합니다.
참고로 모든 자바의 클래스는 Object 클래스를 상속 받습니다.
보통 java api 문서에 가보면 제일 위에 java.lang.Object 가 있는 것을 확인할 수 있습니다.
이처럼요. 이는 바로 java.lang.Object 를 상속받고 있는 것을 이릅니다.
어떤 클래스를 만들던 자동으로 해당 클래스가 상속이 됩니다.
곁다리로 이처럼 자바에서 자동으로 설정해주는 3가지가 있는데 이는 다음과 같습니다.
자바 자동 생성 3가지
1. 다른 생성자가 없을 때 기본 생성자 생성
2. java.lang.Object 클래스 자동 상속
3. java.lang 패키기 자동 import
이들은 자동으로 생성해주는 것이기 때문에 생략되어 있습니다.
예시
package first.subject.m07.inheritance;
public class ParentsClass {
protected String lastName = "김";
protected String eyeColor = "갈색";
protected String hairColor = "검정색";
public void printLastName() {
System.out.println("내 성은 " + lastName + " 입니다.");
}
}
package first.subject.m07.inheritance;
public class ChildClass extends ParentsClass {
public static void main(String[] args) {
ChildClass c = new ChildClass();
System.out.println(c.eyeColor);
System.out.println(c.hairColor);
c.printLastName();
}
}
분명 ChildClass 에서 멤버변수와 메서드를 선언하지 않았음에도 불구하고
이런식으로 멤버변수와 메서드를 상속받아 사용할 수 있습니다. 만약 오버라이딩을 하지 않는다면 부모의 내용이 출력됩니다.
인스턴스를 만들어보고 메서드나 멤버변수를 사용하고자하면 저렇게 내용들이 뜹니다.
저렇게 뜨는 것들은 사용할 수가 있습니다.
이렇게 보면 clone(), equals() 같이 자동으로 뜨는 메서드들이 있는데 이는 제일 상위 클래스인 Object 를 상속받기 때문입니다.
상속의 관계
상속은 IS A 관계이다.
(서브클래스) IS A (슈퍼클래스)
예를 들면 이와 같습니다.
만약 비둘기가 새라는 클래스를 상속받는다고 봅시다.
그렇다면 비둘기는 새 입니다. "비둘기 IS A 새" 라는 공식이 만들어집니다.
이렇게 구성이 된다면 상속의 관계로 설계를 하는 것입니다.
UML 에서 슈퍼 클래스 방향으로 향하는 화살표를 사용합니다.
또한, 알아둘 것 한가지는 자바는 단일 상속을 사용한다는 것입니다.
왜냐하면 다중 상속을 사용한다면 여러 클래스의 기능을 물려받으니, 어떤 것을 사용해야하는지 헷갈리기 때문입니다.
따라서 interface 를 이용하여 포함 관계 (HAS A) 로 단점을 극복합니다.
포함은 HAS A 관계이다.
상속 이외의 클래스를 재활용할 때 사용
UML에서는 실선을 사용합니다.
예를 들어, 직원이라는 클래스가 부서를 설정하기 위해서 회사라는 클래스가 필요하다고 봅시다.
그렇다면 직원 클래스 내에서 회사 클래스를 선언하면 되는 것입니다.
"직원 HAS A 부서 of 회사" 라는 공식이 만들어집니다.
따라서 설계를 할 때, 상속관계를 가지는지 포함관계를 가지는 지를 따져보며 클래스 설계를 해야합니다.
High Cohesion & Low Coupling
여기서 추가적으로 알아두면 좋을 것은, 해당 메세지에 관한 것입니다.
소프트웨어공학에 있어 응집도(Cohesion) 이 높을수록, 결합도(Coupling) 가 낮을수록 이상적인 모듈화로 취급합니다.
하지만 상속을 받으면 두 클래스 간의 결합도가 무척 높아지기 때문에 설계를 할 때 상속은 가장 마지막에 선택하는 것을 권장합니다.
왜냐하면 처음부터 무턱대로 이리저리 상속을 남발하여 결합도를 높이게 되면
나중에 해당 의사결정이 틀렸을 때 문제를 원상 복구 시키는데에 있어 어려움을 겪게 됩니다.
예전과 다르게 요즘은 경제 논리에 의해 서비스가 쉽게 확확 바뀌기 때문에 프로젝트 변경의 주기가 잦습니다.
따라서 설계를 할 때 이러한 점을 고려하여, 상속을 최대한 줄이도록 합시다.
# java 상속 # java is a has a # 자바 상속 # 자바 oop
'🧑💻 𝗣𝗿𝗼𝗴𝗿𝗮𝗺𝗺𝗶𝗻𝗴 > Java' 카테고리의 다른 글
Java 객체지향 프로그래밍 - 은닉화(Encapsulation) 와 접근 제한자 (modifier) (0) | 2022.07.31 |
---|---|
Java 객체지향 프로그래밍 - 메서드 오버라이딩 (Overriding) (0) | 2022.07.31 |
Java 기본 클래스를 찾거나 로드할 수 없습니다 + java.lang.UnsupportedClassVersionError 오류 해결 (0) | 2022.07.25 |
Java Eclipse 프로젝트 빨간 느낌표 뜨는 오류 해결 (0) | 2022.07.25 |
Java BufferedReader로 입력받기 + System.setIn(), StringTokenizer (0) | 2022.07.24 |