상속
다른 클래스가 가지고 있는데 멤버변수, 메소드 들을 새로 작성할 클래스에서 직접 만들지 않고
상속을 받음으로써 새 클래스가 자신의 멤버처럼 사용할 수 있는 기능
너무좋음 ..
상속의 목적
클래스의 재사용, 연관된 일련의 클래스들에 대한 공통적인 규약
그냥 코드 줄이기위해 사용하는것같다 ..
상속의장점
1. 보다 적은 양의 코드로 새로운 클래스 작성 가능
2. 코드를 공통적으로 관리가능해서 코드 추가 변경 편리함 ..(굿잡)
3. 코드의 중복 제거 (제일좋은거같음 ..)
상속의 특징
1. 모든 클래스는 Object클래스의 후손
Object클래스가 제공하는 메소드를 오버라이딩 하여 메소드 재구현가능하다.
대표적으로 equals(), toString()
아래코드는 그냥 그렇다하고 일단 넘어가야한다 .
// 모든 클래스는 Object 를 상속하고있다.
// Student 클래스를 생성하였다고하자
class Student {} // 이런식으로 생성하였으면
// JVM(컴파일러)가 자동으로 Object 객체를 상속해준다.
class Student extends Object{}
2. 부모 클래스의 생성자, 초기화 블록은 상속 안됨
자식 클래스 생성 시, 부모 클래스 생성자가 먼저 실행
자식 클래스 생성자 안에서 부모 클래스 생성자 호출을 하고싶으면 super() 메소드활용
class Student{
// 아래 명시한 3가지의 블럭은 상속안되고 자식이 호출해서 사용해야함
// 생성자
public Student(){}
// 초기화 블럭
{
// 인스턴트 초기화코드
}
static {
// static 초기화 코드
}
}
3. 부모의 private 멤버는 상속은 되지만 직접 접근 불가
private은 같은 클래스에서만 직접 접근이 가능하다.
당연히 부모 클래스와 자식클래스는 클래스가 달라서 직접 접근은불가능하지만
생성자 이용하여 접근하거나, getXXX(), setXXX() 메소드 이용하여 접근가능
상속 사용법
방법
클래스 간의 상속 시에는 extends 키워드 사용
extends 클래스명 <<안에 작성한 클래스가 부모클래스가 되는것이다.
간단하게 자식이 부모를 선택한다고 생각하면될것같다.
표현식
/*
[ 접근제한자 ] class 클래스명 extends 상속할 클래스명{}
*
public class SmartTv extends Product{
}
다중상속 ?? 단일상속?
다른언어는 다중상속 된다고했는데 ...
extends Student1, Student2 <<이런식으로 ?
근데 자바는 다중상속은 안돼고 단일 상속만가능하다고한다
쉽게 하나만 상속 가능하다고 생각하자..
Super(), super.
Super()
super 메소드는 상속한 부모 클래스 생성자를 호출할때 사용한다.
Product.class
// 부모 클래스
public Product{
// 필드(멤버 변수)
private String pName; // 제품명
private String pId; // 제품코드
private int price; // 가격
// 생성자
public Product(){} //기본 생성자
// 매개변수 있는 생성자
public Product(String pName, String pId, int price){
this.pName = pName;
this.pId = pId;
this.price = price;
// 객체 생성할때 멤버 변수 초기화하고 생성한다.
}
}
Tv.class
//Tv 클래스의 부모는 Product 클래스이다.
public class Tv extends Product{
// 이렇게 상속한 부모 클래스의 멤버 변수(pName, pId, price) 사용가능하다.
private int inch;
// 이로써 Tv 클래스는 멤버변수는 총 4개이다 부모 클래스 변수((pName, pId, price)) + 자신변수(inch)
// 기본생성자
public Tv(){}
// 매개변수 있는 생성자
public Tv(String pName, String pId, int price, int inch){
// 원래는 this.pName = pName 으로 접근하는데 private 직접 접근불가능하니깐
// 부모의 생성자를 이용하여 접근해야한다.
// 반드시 첫줄작성해야함!
super(pName, pId, price);
// 위에 super 는 그전에 작성하였던 매개변수 3개있는 생성자를 호출하는것이다.
/*
public Product(String pName, String pId, int price){
this.pName = pName;
this.pId = pId;
this.price = price;
}
*/
this.inch = inch;
}
}
super.
상속을 통해 자식클래스 정의 시 해당 자식 클래스의 부모 객체를 가리키는 참조변수이다.
자식 클래스 내에서 부모클래스 객체에 접근하여 플드나 메소드 호출할때 사용!!
Product.class
// 부모 클래스
public Product{
// 필드(멤버 변수)
private String pName; // 제품명
private String pId; // 제품코드
private int price; // 가격
protected int test; // super 클래스 테스트할 멤버변수
// 생성자
public Product(){} //기본 생성자
// 매개변수 있는 생성자
public Product(String pName, String pId, int price){
this.pName = pName;
this.pId = pId;
this.price = price;
// 객체 생성할때 멤버 변수 초기화하고 생성한다.
}
}
Tv.class
//Tv 클래스의 부모는 Product 클래스이다.
public class Tv extends Product{
private int inch;
// 기본생성자
public Tv(){}
// 메소드
public void method1(){
//부모 클래스의 test 멤버변수 초기화하거나 값받아오기
super.test = 100;
int i = super.test;
}
}
오버 라이딩
자식 클래스가 상속 받은 부모 메소드를 재작성 하는 것
부모가 제공하는 기능을 후손이 일부 고쳐 사용하겠다는 의미
자식 객체를 통한 실행 시 후손 것이 우선권 가짐
특징
오버라이드 작성시 헤드라인에 애너테이션 @Override 명시하여야함
@Override
public void method1(){
System.out.println("override");
}
성립 조건
1. 메소드 이름 동일
2. 매개변수의 개수, 타입 동일
3. 리턴 타입 동일
4. private 메소드 오버라이딩 불가
한마디로 { } 안에 블록의내용만 수정가능하다는이야기
예제
Product.class
// 부모클래스
public class Product{
private int price;
public Product(){}
public Product(int price){
this.price = price;
}
public void information(){
System.out.println(price + "원입니다.");
}
}
Tv.class
// 자식클래스
public class Tv extends Product{
@Override
public void information(){
System.out.println("오버라이드 테스트중입니다");
}
}
Phone.class
// 자식클래스
public class Phone extends Product{
@Override
public void information(){
System.out.println("핸드폰 이지롱~");
}
}
계속작성중입니다....
'프로그래밍 > JAVA' 카테고리의 다른 글
JAVA - String 클래스 (0) | 2021.05.31 |
---|---|
JAVA - 객체(toString(), equals(), hashCode()) (0) | 2021.05.27 |
JAVA - 객체 배열 (0) | 2021.05.25 |
JAVA - 객체(4편) (0) | 2021.05.25 |
JAVA - 객체(3편) (0) | 2021.05.24 |