- 상속
- 다른 클래스가 가지고 있는 멤버(필드, 메소드)들을 새로 작성할 클래스에서 직접 만들지 않고 상속을 받음으로써 새 클래스가 자신의 멤버처럼 사용할 수 있는 기능
- 목적
- 클래스의 재사용, 연관된 일련의 클래스들에 대한 공통적인 규약 정의
- 장점
- 보다 적은 양의 코드로 새로운 클래스 작성 가능
- 코드를 공통적으로 관리하기 때문에 코드의 추가 및 변경 용이
- 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여
- 목적
- 다른 클래스가 가지고 있는 멤버(필드, 메소드)들을 새로 작성할 클래스에서 직접 만들지 않고 상속을 받음으로써 새 클래스가 자신의 멤버처럼 사용할 수 있는 기능
- 상속의 특징
- 모든 클래스는 Object 클래스의 후손
- Object 클래스가 제공하는 메소드를 오버라이딩하여 메소드 재구현 간능
- 부모클래스의 생성자, 초기화 블록은 상속안됨
- 자식 클래스 생성 시, 부모 클래스 생성자가 먼저 실행
- 자식 클래스 생성자 안에서 부모 클래스 생성자 호출을 명시하고 싶으면 super() 활용
- 부모의 private 멤버는 상속은 되지만 직접 접근 불가
- 자식 객체 생성 시에 부모의 필드 값도 전달 받은 경우, 자식 생성자 안에서 부모의 private 필드에 직접 접근하여 대입 불가
- super() 이용하여 전달받은 부모 필드 값을 부모 생성자 쪽으로 넘겨서 생성하거나 setter, getter 메소드를 이용하여 접근
- 모든 클래스는 Object 클래스의 후손
- 상속 방법과 표현식
- 방법
- 클래스 간의 상속 시에는 extends 키워드 사용
- 표현식
- [접근제한자] class 클래스명 exxtends 클래스명{}
- 방법
- 단일 상속과 다중 상속
- 단일 상속(Single Inheritance)
- 클래스간의 관계가 다중 상속보다 명확하고 신뢰성 있는 코드 작성
- 자바에서는 다중 상속 미지원 -> 단일상속만 지원
- 다중 상속(Multiple Inheritance)
- c++에서 가능한 기능 여러 클래스로부터 상속을 받으며 복합적인 기능을 가진 클래스를 쉽게 작성 가능
- 서로 다른 클래스로부터 상속 받은 멤버 간의 이름이 같은 경우 문제 발생
- 단일 상속(Single Inheritance)
- super()와 super.
- super()
- super.
- 오버라이딩(Overriding) / 오버로딩 -> 하나의 클래스 동일 이름 메소드 여러개 만들 수 있음
- 재정의
- 상속 시 자식 클래스에서 구현
- 자식 클래스가 상속 받은 부모 메소드를 재작성 하는 것
- 부모가 제공하는 기능을 후손이 일부 고쳐 사용하겠다는 의미로 자식 객체를 통한 실행 시 후손 것이 우선권을 가짐
- 특징
- 메소드 헤드라인 위에 반드시 Annotation(골뱅이), @Override 표시
- 접근 제어자를 부모 것보다 같거나 넓은 범위로 변경 간능
- 부모 메소드의 예외처리 클래스 처리범위보다 좁은 범위로 예외처리 클래스 수정 가능
- 성립 조건
- 부모 클래스의 메소드와 자식 클래스의 메소드 비교
- 메소드 이름 동일
- 매개변수의 개수, 타입 동일
- 리턴 타입 동일
- private 메소드 오버라이딩 불가
- 부모 클래스의 메소드와 자식 클래스의 메소드 비교
- 특징
- final 예약어
- final 클래스
- 상속이 불가능한 클래스
- final 메소드
- 상속 시 오버라이딩이 불가능한 메소드
- final 클래스
- 대상에 따른 사용 가능한 제어자, 예약어
- 클래스 : public, (default), final, abstract
- 메소드 : 모든 접근 제어자, final, abstract, static
- 변수 : 모든 접근 제어자, final, static
- 지역변수 : final
* 오버라이딩 실습
package com.inherit.part02_override;
public class Run {
public static void main(String[] args) {
Book b1 = new Book("수학의 정석","이창진",100);
Book b2 = new Book("이것이 자바다","홍길동",200);
System.out.println("b1="+ b1); //자동으로 .tostring()으로 처리
System.out.println("b2="+ b2);
System.out.println(b1.equals(b2));
Book b3 = b1;
System.out.println(b1.equals(b3));
Book b4 = new Book("수학의 정석","이창진",100);
System.out.println("b1과 b4는 같은 객체? "+b1.equals(b4));
System.out.println(b1.hashCode());
System.out.println(b4.hashCode());
}
}
package com.inherit.part02_override;
public class Book {
private String title;
private String writer;
private int price;
public Book() {}
public Book(String title, String writer, int price) {
super();
this.title = title;
this.writer = writer;
this.price = price;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
@Override
public String toString() {
return title+", "+writer+", "+price;
}
@Override
public boolean equals(Object obj) {
//객체의 주소가 같으면 같은 객체
if(this == obj) {
return true;
}
//전달받은 객체가 null인 경우 무조건 다른 객체
if(obj==null) {
return false;
}
Book other = (Book)obj;
//전달받은 객체의 필드값과 비교하여 같은지 판단
if(title == null) {
if(other.title != null) {
return false;
}
}else if(!title.equals(other.title)) {
return false;
}
if(writer == null) {
if(other.writer != null) {
return false;
}
}else if(! writer.equals(other.writer)) {
return false;
}
if(price != other.price) {
return false;
}
return true;
}
@Override
public int hashCode() {
return (title+writer+price).hashCode();
}
}
'JAVA' 카테고리의 다른 글
[Java 실습 #8] 9. 다형성 (0) | 2023.03.02 |
---|---|
[JAVA #8] 9. 다형성(Polymorphism) (1) | 2023.03.02 |
[JAVA #7] 7. 객체 배열 (0) | 2023.02.28 |
[JAVA #6] 6. 객체 (0) | 2023.02.27 |
[JAVA 실습 #5] 5. 2차원 배열 (0) | 2023.02.26 |