728x90
1️⃣클래스
1.1 상속의 정의와 장점
- 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것
- 생성자와 초기화 블럭은 상속되지 않는다. 멤버만 상속
- 자식 클래스의 멤버수 >= 부모 클래스 멤버수
상속의 장점
- 적은 양의 코드로 클래스 작성 가능
- 코드의 추가 및 변경 용이
상속의 특징
- 코드의 재사용 ↑
- 코드 중복제거
- 생산성과 유지보수에 기여
상속해 주는 클래스 = 부모 클래스
상속을 받는 클래스 = 자식 클래스
<상속계층도>
class Parent{} //부모클래스
class child extends parent{} //자식클래스
<상속 다이어그램>
class Parent{ //부모클래스
int age; //필드
public void Print(){ //메서드
System.out.prinln("나이: "+age);
}
class child extends parent{
child(int age){ //생성자
this.age=age; //parent에 필드를 상속받아 선언
}
public static void main(String[] args){
child c =new child(24);
c.Print();
}
출력결과
나이 : 24
- 부모클래스에서 필드, 메서드를 상속받아 자식클래스에 따로 선언하지 않아도 된다.
- 자식 클래스에 변화가 생겨도 부모클래스는 아무 영향을 받지 않지만 부모클래스에서 변화가 생길 경우 자식 클래스는 영향을 받는다.
Ex) 자식 클래스가 2개라면?
class Parent{}
class child extends parent{}
class child2 extends parent{}
- 부모와 자식은 상속관계에 있지만 자식과 자식 간에는 아무런 관계도 성립되지 않는다.
- 자손클래스에 인스턴스를 생성하면 부모클래스 멤버도 함께 생성되기 때문에 따로 생성하지 않아도 된다.
1.2 클래스간의 관계 - 포함관계
- 상속 이외의 클래스를 재사용하는 방법
- 한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것
- 단위 클래스별로 나뉘어있기 때문에 코드 관리 수월
class Circle{
int x; //원점의 x좌표
int y; //원점의 y좌표
int r;
}
class Point{
int x; //x좌표
int y; //y좌표
}
Point 클래스를 재사용 하여 Circle클래스를 작성
class Circle{
Point p =new Point(); //포함
int r;
}
1.3 클래스간의 관계 결정하기
- "~은 ~이다 " 상속관계
ex) 연필은 필기구이다.
부모: 필기구
자식: 연필
- "~은 ~을 가지고 있다." 포함관계
ex)원은 점을 가지고 있다.
1.4 단일 상속
- 자바에서는 오직 '단일상속'만 허용
- 클래스 간의 관계 명확
- 코드 신뢰도 증가
If) 다중상속을 할시
- 클래스의 관계가 매우 복잡해짐
- 상속받은 멤버 간의 이름이 같은 경우 구별하기 어려움
1.5 Object 클래스
- 최상위의 부모클래스
2️⃣오버라이딩
2.1 오버라이딩이란?
- 부모 클래스로부터 상속받은 메서드의 내용을 변경하는 것
2.2 오버라이딩의 조건
- 메서드의 선언부는 부모클래스의 메서드와 일치
- 접근제어자를 부모클래스보다 더 좁은 범위로 변경 불가능
- 예외는 부모 클래스의 메서드보다 적게 선언
- 인스턴스 메서드 -> static / static -> 인스턴스 메서드 변경 불가능
2.3 오버로딩 VS 오버라이딩
오버로딩 | 오버라이딩 |
기존에 없는 새로운 메서드를 정의하는 것 | 상속받은 메서드의 내용을 변경하는 것 |
class Parent{
void ParentMethod(){}
}
class Child extend Parent{
void ParentMethod(){}//오버라이딩
void ParentMethod(int i){}//오버로딩
}
2.4 super
- 자식클래스에서 부모클래스로부터 상속받은 멤버를 참조하는 데 사용되는 참조 변수
- super 대신 this 사용 가능
- static메서드에서 사용 불가능, 인스턴스 메서드에서만 사용 가능
class Test{
public static void main(String args[]){
Child c= new Child();
c.method();
}
}
class Parent{
int x=10;
}
class Child extends Parent{
int x=20;
System.out.pritnln("x = "+x);
System.out.pritnln("this.x = "+this.x); //자손클래스에 선언된 멤버변수 x
System.out.pritnln("super.x = "+super.x); //상속받은 멤버변수 x
}
출력결과
x = 20
this.x = 20
super.x = 10
this vs super
this | super |
멤버변수와 지역변수 이름이 같을 때 구별 | 상속받은 멤버와 부모 멤버를 구별 |
2.5 super() - 부모클래스의 생성자
- 부모클래스의 생성자를 호출
- 자식클래스 생성자 내부 첫 줄에 반드시 super()을 선언해주어야 함 ➡️ 자식 클래스의 멤버가 부모클래스의 멤버를 사용할 수 있도록 부모 클래스의 멤버들이 먼저 초기화 되야하기 때문
final
최종상태를 의미하며, 수정될 수 없게 하는 키워드
* final 키워드가 붙을 시 상속이 불가능하며 오버라이딩을 할 수 없다.
728x90
'자바' 카테고리의 다른 글
[자바의 정석] - 12. 지네릭스, 열거형, 애너테이션 (0) | 2023.05.22 |
---|---|
[자바의 정석] - 11. 컬렉션 프레임 (0) | 2023.05.15 |
[자바의 정석] - 8. 예외처리 (1) | 2023.05.08 |
[자바의 정석 ] - 7장. 객체지향 프로그래밍Ⅱ (0) | 2023.04.25 |
[자바의 정석] - 5. 배열 / 6. 객체지향 (0) | 2023.04.19 |