일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 지도학습
- regression
- GPT-4
- Machine Learning
- LG Aimers 4th
- ChatGPT
- LG
- 티스토리챌린지
- 회귀
- supervised learning
- AI
- deep learning
- 해커톤
- LG Aimers
- 딥러닝
- PCA
- 오블완
- 분류
- Classification
- LLM
- 머신러닝
- OpenAI
- gpt
Archives
- Today
- Total
SYDev
[혼자 공부하는 자바] Chapter 7. 상속 본문
1. 클래스 상속
- Java에서는 이중 상속 허용 X
public class 자식클래스 extends 부모클래스 {
}
2. 부모 생성자 호출
- 자식 객체 생성 시에, 부모 객체 생성 후에 자식 객체 생성
- 자식 생성자의 맨 첫 줄에 숨겨진 super()에 의해서 부모 생성자 호출
- super()는 컴파일 과정에서 자동 추가
- 만약 부모 클래스에 기본 생성자 X -> 자식 생성자 선언에서 컴파일 에러 발생
- 부모 클래스에 기본 생성자가 없고, 매개변수 갖는 생성자만 존재한다면 -> super(매개값, ..) 코드를 직접 추가해야 함
3. method 재정의
3.1. method overriding
- method overriding: 상속된 method를 자식 클래스에서 재정의
- 부모 메소드는 숨겨지고, 자식 메소드가 우선적으로 사용됨
- method overriding 규칙
- 부모 메소드의 선언부(return type, method name, parameters)와 동일해야 함
- 접근 제한을 더 강하게 오버라이딩할 수 없음
- 새로운 예외를 throws 불가
package sec4;
public class Airplane {
public void land() {
System.out.println("착륙합니다.");
}
public void fly() {
System.out.println("일반 비행합니다.");
}
public void takeOff() {
System.out.println("이륙합니다.");
}
}
package sec4;
public class SupersonicAirplane extends Airplane {
public static final int NORMAL = 1;
public static final int SUPERSONIC = 2;
public int flyMode = NORMAL;
@Override
public void fly() {
if(flyMode == SUPERSONIC) {
System.out.println("초음속 비행합니다.");
} else {
super.fly();
}
}
}
package sec4;
public class SupersonicAirplaneExample {
public static void main(String[] args) {
SupersonicAirplane sa = new SupersonicAirplane();
sa.takeOff();
sa.fly();
sa.flyMode = SupersonicAirplane.SUPERSONIC;
sa.fly();
sa.flyMode = SupersonicAirplane.NORMAL;
sa.fly();
sa.land();
}
}
4. final 클래스와 final 메소드
4.1. final 클래스
- 클래스 선언 시에 final을 붙이면 더이상 상속이 불가능
public final class 클래스 { ... }
4.2. final 메소드
- 메서드 선언 시에 final을 붙이면 overriding 불가능
public final 리턴타입 메소드( 매개변수, ... ) { ... }
5. protected 접근 제한자
접근 제한자 | 제한 대상 | 제한 범위 |
protected | 필드, 생성자, 메소드 | 같은 패키지이거나, 자식 객체만 사용 가능 |
6. 타입 변환
6.1. 자동 타입 변환
- 비록 변수는 자식 객체를 참조하지만, 접근 가능한 멤버는 부모 클래스 멤버로 한정
- but, 자식 클래스에서 오버라이딩된 method가 존재하면 부모 메소드 대신 overriding method 호출
부모타입 변수 = 자식타입 객체;
6.2. 강제 타입 변환
- 자동 변환으로 자식 객체를 부모 타입으로 변환한 경우, 부모 타입 필드와 메소드만 사용 가능 -> 강제 타입 변환을 통해 자식 타입으로 변환
자식타입 변수 = (자식타입) 부모타입 객체;
7. 다형성
- 다형성(polymorphism): 사용 방법은 동일하지만, 실행 결과가 다양하게 나오는 성질
- 자동 타입 변환 + 메소드 오버라이딩 -> 다형성
7.1. 필드 다형성
- 필드 다형성: 필드 타입은 동일하지만, 대입되는 객체가 달라져서 실행 결과가 달라지는 것
package ch7.sec8;
public class Tire {
public void roll() {
System.out.println("회전합니다.");
}
}
package ch7.sec8;
public class HankookTire extends Tire {
@Override
public void roll() {
System.out.println("한국 타이어가 회전합니다.");
}
}
package ch7.sec8;
public class KumhoTire extends Tire {
@Override
public void roll() {
System.out.println("금호 타이어가 회전합니다.");
}
}
package ch7.sec8;
public class Car {
public Tire tire;
public void run() {
tire.roll();
}
}
package ch7.sec8;
public class CarExample {
public static void main(String[] args) {
Car myCar = new Car();
myCar.tire = new Tire();
myCar.run();
myCar.tire = new HankookTire();
myCar.run();
myCar.tire = new KumhoTire();
myCar.run();
}
}
7.2. 매개변수 다형성
- 매개변수 다형성: 메소드가 클래스 타입의 매개변수를 가지고 있을 경우, 호출할 때 동일한 타입의 객체를 제공하는 것이 정석이지만, 자식 객체를 제공할 수도 있음
public class Driver {
public void drive(Vehicle vehicle) {
vehicle.run();
}
}
-> Vehicle vehicle = bus; 형태로 매개변수의 다형성 발생
8. 객체 타입 확인
boolean result = 객체 instanceof 타입
9. 추상 클래스
- 사전적 의미의 추상(abstract): 실체 간에 공통되는 특성을 추출한 것
- abstract class: 실체 클래스(객체 생성 가능 클래스)들의 공통적인 필드나 메소드를 추출해서 선언한 클래스
- 추상 클래스는 new 연산자를 사용해서 객체 직접 생성 불가능
public abstract class 클래스명 {
// 필드
// 생성자
// 메소드
}
9.1. 추상 메소드와 재정의
abstract 리턴타입 메소드명( 매개변수, ... );
public abstract class Animal {
abstract void sound();
}
10. 봉인된 클래스
- 기본적으로 final 클래스를 제외한 모든 클래스는 부모 클래스가 될 수 있음
- 무분별한 자식 클래스 생성을 방지하기 위해 Java15부터 봉인된(sealed) 클래스 도입
public sealed class Person permits Employee, Manager { ... }
-> Employee, Manager만 자식클래스가 될 수 있음
public final class Employee extends Person { ... }
public non-sealed class Manager extends Person { ... }
-> sealed class를 상속하는 클래스는 fianl 혹은 non-sealed 키워드로 선언하거나, sealed 키워드를 사용하여 또 다른 봉인 클래스로 선언해야 함
참고자료
'Programming Lang > Java' 카테고리의 다른 글
[이것이 자바다] Chapter 9. 중첩 선언과 익명 객체 (0) | 2025.01.30 |
---|---|
[혼자 공부하는 자바] Chapter 8. 인터페이스 (0) | 2025.01.29 |
[혼자 공부하는 자바] Chapter 6. 클래스 (0) | 2025.01.23 |
[혼자 공부하는 자바] Chapter 5. 참조 타입 (1) | 2025.01.18 |
[혼자 공부하는 자바] Chapter 4. 조건문과 반복문 (0) | 2025.01.18 |