🖥️ 설계라는 것은 클래스를 여러개를 사용해서 개발을 진행됩니다.
클래스를 설계(상속)
각 클래스들이 아무 관계가 없이 만들어지는 것이 아니라 클래스들끼리 연결을 시켜서 프로그램이 개발되는데 그 시작이 상속에서부터 시작됩니다.
❓ Java에서 상속이란 ? 클래스를 계층화 하는 것
상속은 한 클래스가 다른 클래스의 특성과 동작을 상속받아 사용할 수 있도록 해줍니다.
상속 관계에서는 두 개의 클래스가 있습니다: 부모 클래스(상위 클래스 또는 슈퍼 클래스)와 자식 클래스(하위 클래스 또는 서브 클래스)입니다.
부모 클래스는 자식 클래스에게 공통된 속성과 메서드를 상속해줍니다. 자식 클래스는 부모 클래스의 특성을 확장하거나 변경하여 새로운 속성과 메서드를 추가할 수 있습니다.
Java에서 클래스 간의 상속 관계를 구현하기 위해서는 extends 키워드를 사용합니다.
자식 클래스가 부모 클래스를 상속받으려면 클래스 선언 시에 extends 키워드를 사용하고, 부모 클래스의 이름을 지정합니다.
이렇게 하면 자식 클래스는 부모 클래스의 멤버(필드와 메서드)를 상속받습니다.
🎈 상속 관계 설정 문법 - class Child extends Parent
class Animal { // 부모 클래스
protected String name;
public void eat() {
System.out.println("Animal is eating.");
}
}
class Dog extends Animal { // 자식 클래스
public void bark() {
System.out.println("Dog is barking.");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.name = "Tom";
dog.eat(); // 부모 클래스의 메서드 호출
dog.bark(); // 자식 클래스의 메서드 호출
}
}
//출력 : Animal is eating. Dog is barking.
위 예시에서 Animal 클래스는 부모 클래스로, Dog 클래스는 자식 클래스입니다. Dog 클래스는 extends 키워드를 사용하여 Animal 클래스를 상속받습니다. 따라서 Dog 클래스는 name 필드와 eat() 메서드를 상속받아 사용할 수 있습니다. Dog 클래스는 또한 bark()라는 자신만의 메서드를 추가로 가지고 있습니다.
상속을 통해 부모 클래스의 속성과 메서드를 재사용하고, 자식 클래스에서 새로운 기능을 추가하거나 기존 기능을 재정의할 수 있습니다.
이를 통해 코드의 재사용성과 확장성을 높일 수 있습니다.
🎈 클래스의 수평적 구조 vs 수직적 구조
Dog와 Cat의 클래스를 수평적으로 설계하게 된다면 생성된 클래스들의 연계되었기보다는 독립적으로 생성되어지며, 코드의 중복이 발생하는 단점이 발생합니다.
그로인해 새로운 요구사항이 발생했을 때, 반영이 어려워 유지보수가 어려워집니다. 유지보수가 어렵다보니 그에 따르는 확장성이 떨어지게 됩니다.
💡 클래스의 수직적 구조 = 계층화 = 상속(Inheritance) = 클래스와 클래스의 관계 설계
클래스들이 공통으로 가지게 되는 기능이 담긴 별도의 Animal클래스로 생성하여, 제일 상단에 위치하였습니다.
여기서 Aniaml 클래스가 부모 클래스가 되며 상속(extends : 확장) 을통해 하단의 Dog, Cat클래스는 자손 클래스가 됩니다.
✔ “is a kind of” - 상속관계
"is a kind of"은 객체 지향 프로그래밍에서 클래스 간의 관계를 표현하는 개념입니다.
이 개념은 상속 관계를 나타내는 것을 의미합니다.
상위 클래스에는 공통적인 특징과 동작을 구현하고, 하위 클래스는 상위 클래스의 특성을 상속받으면서 자신만의 추가적인 특성을 정의할 수 있습니다.
객체를 수직적인 구조로 설계하면 코드의 중복을 최소화하고, 새로운 요구사항 발생 시 반영이 쉽다는 장점이 있습니다.
그로 인해 확장성은 좋아질 수 있으나, 코드의 복잡성은 증가하게 됩니다.
java에서는 둘 이상의 클래스로부터 상속을 받을 수 없도록 단일 상속만을 허용한다. 단일상속은 하나의 부모클래스만을 가질 수 있기 때문에
다중상속에 비해 불편하지만, 클래스간의 관계가 보다 명확해지고 코드를 더욱 신뢰할 수 있게 만들어 준다는 점에서 다중상속보다 유리합니다.
🎈 메모리를 통한 상속(extends)의 이해 (상태정보 재활용)
상속 : UML (Unified Modeling Laguage)
상속을 다이어그램으로 표현할 때, UML - 객체 지향 모델링 언어로 표현할 수 있습니다.
그림으로 표현할 수 있는 언어이며, 그림으로 표현하는 다이어그램으로 설계를 한 후 의사소통을 하는 것이 효율적입니다.
설계는 다이어그램을 보고 코드로 작성이 진행되게 됩니다. ** UML은 프트웨어 시스템을 시각적으로 모델링하고 설계하기 위해 사용되는 표준화된 그래픽 언어입니다.
UML은 시스템의 구성 요소, 클래스와 객체, 관계, 동작, 상태 등을 시각적으로 표현할 수 있습니다.
public class Employee {
protected String name;
-> protected : 상속관계에서 하위 클래스가 상위 클래스의 접근을 허용하는 접근 권한
protected String phone;
protected String phone;
protected String empDate;
protected String dept;
public Employee() {
super();
}
public class RempVO() extends Employee {
public RempVO() {
super();
}
}
상속관계에서 상태변수(멤버변수)를 private로 접근제어를 작성한다면, 자식클래스가 부모에 있는 상태변수에 접근할 수 없기 때문에
protected 접근제어자를 사용합니다. (자식 클래스만 작성 가능하도록 해야하기 때문에 public이 아니라 protected로 작성합니다.)
protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서 접근이 가능합니다.
🎈 super() 메서드 : super()는 상위클래스의 생성자를 호출하는 역할
상속관계의 클래스를 작성한 후 생성자를 만들게 되면 { } 중괄호 안에 아무것도 작성되어 있지 않아도, 자동으로 super(); 키워드가 입력되게됩니다.
❓ Q. 상속관계가 된 후 객체 생성을 진행한다면 ?
RempVo vo = new RempVO(); → RempVO가 상속 관계 있을 때, 객체를 생성하게 될 때 RempVO 객체라는 건 부모 클래스인 Employee() 객체가 존재하기 때문에 존재할 수 있습니다.
상속 관계에서는 자식 클래스의 객체가 존재하기 위해서는 부모의 객체가 먼저 생성이 되어야지만 자식 클래스에서의 객체 생성이 가능합니다.
자식 생성자 안에서 부모 생성자를 호출할 수 있는 방법이 필요한데 그 때 super(); 메서드를 사용하여 호출합니다.
super()는 자식 클래스 내부에서 부모 클래스의 생성자를 호출할 때 사용되며, 자식 클래스의 생성자 첫 줄에서 호출(=first statement)되어야 합니다.
super();가 아래에서 초기화가 된다면, 부모클래스가 먼저 만들어지지 않고 객체가 생성되기 때문에 반드시 생성자의 첫번째 문장에 사용해야 합니다.
예를 들어, **super()**를 사용하여 부모 클래스의 기본 생성자를 호출하면 부모 클래스의 필드를 초기화하고
부모 클래스의 생성자에서 수행되는 작업을 수행할 수 있습니다 (객체가 생성되려면 생성자가 호출되어야 생성이 가능)
생성자의 첫 문장에는 super();가 기본적으로 생략된채로 만들어집니다. -> .상속 관계에서 객체 생성은 부모 클래스에서부터 생성되어 자식 클래스들로 전달되는데 이를 상속 체이닝이라고 합니다
참조변수는 객체를 가리키는 변수입니다. 자바에서 객체는 클래스의 인스턴스를 의미하며, 객체를 생성하면 해당 객체를 가리키기 위한 참조변수가 필요합니다. 참조변수는 객체의 주소를 저장하고, 해당 주소를 통해 객체에 접근하여 필드를 읽거나 메서드를 호출할 수 있습니다.
따라서 super()는 부모 클래스의 생성자를 호출하는 특수한 구문이며, 참조변수는 객체를 가리키는 변수를 의미합니다.
'[ BACKEND] > JAVA_객체지향' 카테고리의 다른 글
[JAVA] 다형성 (Polymorphism)과 활용 (0) | 2023.06.19 |
---|---|
[JAVA] 상속 관계에서의 객체 생성 및 Override (0) | 2023.06.18 |
[JAVA] 객체 생성 & Static 과의 관계 (0) | 2023.06.16 |
[JAVA] static과 JVM의 메모리 모델 (0) | 2023.06.15 |
[JAVA] VO클래스 설계 시 중요사항 (정보은닉 , Getter&Setter, 생성자 메서드, 오버로딩) (0) | 2023.06.14 |