일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- spring
- java I/O
- 로그인/로그아웃
- JWT
- Java
- 프레젠테이션 계층
- RESTfull API
- ./gradlew docker
- 스프링부트
- 스프링 부트 테스트
- http
- 스프링부트 계층구조
- @temproal
- 스프링부트 구조
- 작업명중복
- 토큰기반 인증
- MSA
- ./gr
- 동기
- formmatted
- JPA
- 로그인 인증 흐름
- 세션기반 인증
- 비즈니스 계층
- IPC
- 퍼시스턴스 계층
- 어노테이션
- ORM
- 비동기
- 스프링
- Today
- Total
[DEV] J-Jay
상속(Inheritance) 본문
상속(Inheritance)
자바에서 상속이란 기존의 클래스를 재활용하여 새로운 클래스를 작성하는 자바의 문법 요소이다.
상속은 상위 클래스와 하위 클래스로 나누어 상위 클래스의 멤버(필드, 메서드, 이너 클래스)를 하위 클래스와 공유하는 것
부모와 자식으로 생각하면, 자식은 부모의 유전자를 물려받듯, 하위 클래스는 상위 클래스의 모든 멤버를 상속받게 된다.
하지만, 모든 멤버를 상속받더라도 항상 직접적으로 접근할 수 있는 것은 아니다.
상위 클래스의 필드나 메서드의 접근 제한자가 private이면, 같은 패키지일 지라도 하위 클래스는 해당 필드나 메서드에 직접적으로 접근하지 못한다.
상위 클래스의 필드나 메서드의 접근 제한자가 default이면, 상위 클래스와 하위 클래스가 다른 패키지일 때 하위 클래스는 해당 필드나 메서드에 직접적으로 접근하지 못한다.
이럴 경우, getter와 setter를 이용해 간접적으로 접근해야 한다.
자바에서의 상속은 상위 클래스는 여러 하위 클래스를 가질 수 있지만, 하위 클래스는 여러 상위 클래스를 가질 수 없다. 즉, 단일 상속만을 허용한다.
상속을 받기 위해서는 extends 키워드를 사용한다.
상속의 종류와 사용법
1. Single : A ← B 상속
class Parents {
}
class Child extends Parents {
}
2. Multilevel : A ← B ← C, … 형태의 상속
class Grandparents {
}
class Parents extends Grandparents {
}
class Child extends Parents {
}
3. Hierarchical : A ← B, A ← C, … 형태의 상속
class Parents {
}
class Child1 extends Parents {
}
class Child2 extends Parents {
}
만약, Child 클래스가 Parents 클래스로부터 상속을 받았다면, Child는 다른 상위 클래스에게 중복하여 상속받을 수는 없다.
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 {
void coding() {
System.out.println("코딩하기");
}
}
먼저, Person 클래스를 생성하여 사람의 공통적으로 가질 수 있는 속성과 행위를 정의한 후,
Programmer라는 직업을 가진 사람이 Person 클래스로부터 상속받아 coding 메서드를 추가로 정의했다.
이를 실행하면 다음과 같이 programmer라는 객체를 Programmer 클래스에서 생성하고, Person 클래스의 속성과 행위를 실행할 수 있다.
또한, 추가적으로 작성한 coding() 메서드를 통해 Person보다 확장된 기능을 실행할 수 있다.
public class PersonEx {
public static void main(String[] args) {
Person p = new Person();
p.name = "홍길동";
p.age = 20;
System.out.println("이름: " + p.name);
System.out.println("나이: " + p.age);
p.eat();
p.learn();
p.walk();
Programmer programmer = new Programmer();
programmer.name = "머스크";
programmer.age = 25;
System.out.println("이름: " + programmer.name);
System.out.println("나이: " + programmer.age);
programmer.eat();
programmer.learn();
programmer.walk();
programmer.coding();
}
}
포함 관계 (Composite)
자바에서 포함(Composite)은 상속과 비슷하게 클래스를 재사용할 수 있는 방법이다. 클래스의 멤버로 다른 클래스 타입의 참조 변수를 선언하는 것이다. 즉, 클래스의 속성 값에 다른 클래스를 선언하여 사용하는 것이다.
// Address 클래스를 속성으로 가지고 사용하고 있다.
public class CompositeEx {
int number;
Address address;
public CompositeEx(int number, Address address){
this.number = number;
this.address = address;
}
void printInfo() {
System.out.println(number + ": " + address.city + ", " + address.country);
}
public static void main(String[] args) {
Address address1 = new Address("서울", "대한민국");
Address address2 = new Address("부산", "대한민국");
CompositeEx result1 = new CompositeEx(1, address1);
CompositeEx result2 = new CompositeEx(2, address2);
result1.printInfo();
result2.printInfo();
}
}
class Address {
String city;
String country;
public Address(String city, String country) {
this.city = city;
this.country = country;
}
}
'Back-end > Java' 카테고리의 다른 글
내부 클래스(Inner Class) (0) | 2024.06.01 |
---|---|
다형성(Polymorphism) (0) | 2024.05.19 |
Java 17 주요변화 (0) | 2023.08.31 |
Java I/O - 2 (0) | 2023.05.02 |
Java I/O - 1 (0) | 2023.05.01 |