개발새발
상속 본문
객체 지향 프로그램에서 부모 클래스의 멤버를 자식 클래스에게 물려줄 수 있다
상속(Inheritance)
이미 개발된 클래스를 재사용하여 새로운 클래스를 만들기에 중복되는 코드를 줄임
부모 클래스의 한번의 수정으로 모든 자식 클래스까지 수정되는 효과가 있어 유지보수 시간이 줄어듬
클래스 재사용과 확장을 통한 소프트웨어의 생산성 향상
클래스 상속
자식 클래스 선언 시 부모 클래스 선택
extends 뒤에 부모 클래스 기술
여러 개의 부모 클래스 상속할 수 없음.(다중상속이 안 됨)
부모 클래스에서 private 접근 제한자를 갖는 필드와 메소드는 상속 대상에서 제외
부모와 자식 클래스가 다른 패키지에 존재할 경우 default 접근 제한된 필드와 메소드 역시 제외
클래스와 인터페이스 및 이들이 가진 멤버의 접근 제한
public 접근 제한자
외부 클래스가 자유롭게 사용할 수 있도록 함
protected 접근 제한자
같은 패키지 또는 자식 클래스에서 사용할 수 있도록 함
default 접근 제한
같은 패키지에 소속된 클래스에서만 사용할 수 있도록 함
private 접근 제한자
오직 클래스 내부에서만 접근할 수 있음
Getter와 Setter 메소드
외부에서 객체에 마음대로 접근할 경우 객체의 무결성 깨질 수 있음
Getter 메소드: 외부로 필드값을 전달하는 것이 목적 필드값을 가공해서 외부로 전달할 수도 있음 선언 예 : getXXX(), isXXX()
Setter 메소드: 외부의 값을 받아 필드의 값을 변경하는 것이 목적, 매개값 검증하여 유효한 값만 필드로 저장할 수 있음 선언 예 : setXXX()
클래스 상속
1. 부모 클래스 Point는 (x, y) 좌표를 표현.
2. 자식 클래스 ColorPoint는 상속받아 추가로 점의 색상을 표현.
// 부모 클래스
public class Point {
private int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public void showPoint() {
System.out.println("(" + x + ", " + y + ")");
}
}
// 자식 클래스
public class ColorPoint extends Point {
private String color;
public ColorPoint(int x, int y, String color) {
super(x, y); // 부모 클래스 생성자 호출
this.color = color;
}
@Override
public void showPoint() {
System.out.println(color + " color at ");
super.showPoint(); // 부모 메소드 호출
}
}
// 실행 클래스
public class Main {
public static void main(String[] args) {
ColorPoint cp = new ColorPoint(5, 10, "red");
cp.showPoint();
}
}
Q1: 자식 클래스의 객체가 생성될 때, 자식 클래스의 생성자와 부모 클래스의 생성자는 모두 실행되는가? 아니면 자식 클래스의 생성자만 실행되는가?
A1:
- 부모 클래스의 생성자와 자식 클래스의 생성자 모두 실행된다.
- 자식 클래스 객체를 생성할 때, 부모 클래스의 생성자가 먼저 실행된 후 자식 클래스의 생성자가 실행 된다. 이는 부모 클래스의 상태를 초기화하고, 자식 클래스의 상태를 추가적으로 초기화하기 위한 과정이다.
- 자식 클래스 생성자의 첫 번째 줄에서 묵시적으로 부모 클래스의 기본 생성자가 호출 된다. 이를 명시적으로 호출하고 싶다면 super()를 사용하면 된다.
Q2: 자식 클래스의 생성자와 부모 클래스의 생성자 중 누가 먼저 실행되는가?
A2:
- 부모 클래스의 생성자가 먼저 실행된다.
- 자식 클래스 객체를 생성할 때, 컴파일러는 자동으로 부모 클래스의 생성자를 호출하여 부모 클래스의 초기화를 먼저 진행합니다. 이후 자식 클래스의 생성자가 호출되어 자식 클래스의 초기화가 진행돤다.
상속과 생성자
- 생성자 호출 순서:
- 자식 클래스 객체 생성 시, 부모 클래스의 생성자가 먼저 호출되고 자식 클래스의 생성자가 호출됨.
- 부모 생성자는 자식 생성자의 첫 번째 줄에서 묵시적으로 호출되며, 명시적으로 호출할 경우 super()를 사용.
public class Parent {
public Parent() {
System.out.println("Parent constructor");
}
}
public class Child extends Parent {
public Child() {
super(); // 부모 생성자 호출
System.out.println("Child constructor");
}
}
public class Main {
public static void main(String[] args) {
Child child = new Child();
}
}
// 출력:
// Parent constructor
// Child constructor
메소드 오버라이딩(Overriding)
- 정의: 부모 클래스의 메소드를 자식 클래스에서 수정하여 사용하는 것.
- 규칙:
- 메소드 이름, 매개변수, 반환형이 동일해야 함.
- 접근 제한자는 부모보다 더 강하게 변경할 수 없음.
- super 키워드:
- 자식 클래스에서 부모 클래스의 메소드를 호출할 때 사용.
public class Calculator {
public double getCircleArea(double radius) {
return Math.PI * radius * radius;
}
}
public class Computer extends Calculator {
@Override
public double getCircleArea(double radius) {
System.out.println("Overridden method in Computer");
return super.getCircleArea(radius); // 부모 메소드 호출
}
}
'WEB-STUDY' 카테고리의 다른 글
패키지와 예외 처리 (0) | 2025.01.06 |
---|---|
추상 클래스와 인터페이스 (1) | 2025.01.03 |
클래스와 객체 Ⅱ (0) | 2024.12.31 |
클래스와 객체 Ⅰ (1) | 2024.12.27 |
교환학생 중고거래 서비스 최종 발표 (1) | 2024.12.13 |