재밌고 어려운 IT를 이해해보자~!
상속 본문
상속이란말은 일상에서 쓰이는 상속과 같은 개념이다!
부모가 자식에게 상속하는 것 처럼 부모클래스가 자식클래스에게 상속을 해준다.
상속받은 자식클래스는 부모의 매개변수 혹은 기능을 그대로 쓸 수 있다.
부모가 자식에게 물려주는것들
기능,속성, 타입 -> 유전자
자바는 다형성이란 특징을 가지굈는것이 있다.
다향한 형태의 성질....
상속을 통해서 가질 수 있다.
N차상속 가능 부모 expends 조상
조상 expends 조상 2
모든걸 물려봤는다.
부모클래스의 생성자가 선언되지 않거나 파라미터가 없다면 자식생성자에 super();를 안해줘도된다
사실 기본적으로 super()이 들어가 있지만 숨어있다.
하지만 부모클래스의 생성자가 파라미터를 이용해 선언된다면 꼭 자식클래스쪽에 super():를 붙여줘야 한다.
super() 부모의 생성자가 숨어있으며 이 라인에 작성하면 안된다
생성자는 항상 제일처음 호출!!!
super()라는 자동호출되는 메서드를 통해서 부모클래스의 기본생성자가 호출해
부모 객체를 생성한 후에 부모 객체를 감싸고 자식 객체를 생성한다.
즉 자식 객체안에는 부모객체가 포함되어있다.
부모 생성자를 수동으로 선언해야할때가 있다.
부모 클래스의 생성자가 기본생성자( 파라미터가 없는 ) 가 아닐때 !!!
오버라이드를할때..?
@Override 가 숨어져있다 Anootation 이라고 함.
Annotation 이란
메서드의 역할,상태,기능들을 부여하는 키워드.
메서드 오버라이딩-
메서드 오버라이딩이란!
상속관계에서 상위클래스가 상속해준 메서드의 내용을 다시 정의하여
메서드를 구현하는 기술
단 메서드의 이름,리턴타입은 동일하게 지정해야한다.
*패키지나 폴더가 다르면 import 해줘야한다.
접근제한자 4가지
public 제한없이 모든 클래스,패키지 접근가능
protected 같은패키지안에서 접근가능, 다른패키지라도 자식클래스면 접근가능
defualt 같은 패키지 내에서만 접근 가능
private 같은 클래스 내에서만 접근 가능
final이란-
final -> 변수, 클래스, 메서드에 모두 붙일 수 있다.
final int a = 3; 이라고 선언 한 이후에
a=4; 는 할수없다 final은 고정 및 마지막
선언시에 초기값을 부여해야한다 .
지역 final 변수의 경우, 선언과 동시에 값 초기화를 할 필요 없다.
메서드의 final을 붙일경우 오버라이드 불가
객체 (클래스)에 final 붙이면 상속을 시킬 수 없다 -> 이 객체가 부모클래스가 될 수 없다.
형변환!!
int, double 형변환처럼
클래스끼리도 형변환이 가능하다.
package exam09.exam.type;
public class TypeTestMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
Bus b = new Bus("버스");
Taxi t1 = new Taxi("택시");
//형변환
car car = t1; // t1을 car 타입으로 바꿈 부모타입으로 변경하면 부모타입은 자식의 기능을 사용 못한다.
b.getInfo();
t1.getInfo();
//부모타입으로 형변환되면 자식클래스가 가진 기능이나 속성을 사용할 수없다.
//클래스 타입형변환은 잘 안한다.
//car.getInfo();
//클래스 형변환
//1. 형변환 강제, 자동 가능!
//2. 상속관계가 있을 떄 가능
//3. 1차상속이 아니어도 가능
//4. 자식->부모 형변환만가능
//5. 부모타입으로 변경할경우 class인경우에 자식의 속성이나 기능 사용 불가.
//강제형변환
Taxi t2 = (Taxi)car;
t2.getInfo();
}
}
위 코드에서 클래스 상속은 다음과같다.
Car -> Bus -> Taxi
부모->자식
부모 ->자식 이다.
t1은 택시 객체이지만 부모타입인 car로 형변환이 가능하다. 하지만 이렇게 형변환을 하면
taxi클래스에 있는 getinfo를 사용하지 못한다. 부모타입이 되었기 때문이다.
car car = t1을 보면 car는 자식을 받아서 맏들어졌는데 이떄 이 car는 부모타입으로 변경됐지만 택시인 자식타입을 가지고있다. 따라서 강제형변환을 통해서 다시 택시타입으로 돌릴 수 있다.
Taxi t2 = (taxi)car -> car를 다시 taxi 타입으로 형변환!
자바는 다중상속을 지원하지 않는대신 implements 이 있다!
Implements 와 expands의 차이점..............
간단 정리
extends는 일반 클래스와 abstract 클래스 상속에 사용되고, implement는 interface 상속에 사용된다.
class가 class를 상속받을 땐 extends를 사용하고, interface가 interface를 상속 받을 땐 extends를 사용한다.
class가 interface를 사용할 땐 implements를 써야하고
interface가 class를 사용할 땐 implements를 쓸수 없다.
extends는 클래스 한 개만 상속 받을 수 있다.
extends 자신 클래스는 부모 클래스의 기능을 사용한다.
implements는 여러개 사용 가능하다.
implements는 설계 목적으로 구현 가능하다.
implements한 클래스는 implements의 내용을 다 사용해야 한다.
extends는 클래스를 확장하는 거고 implements는 인터페이스를 구현하는 것이다.
인터페이스와 보통 클래스의 차이는 인터페이스는 정의한 메소드를 구현하지 않아도 된다.
인터페이스를 상속받는 클래스에서 인터페이스에 정의된 메소드를 구현하면 된다.
라고한다..이부분에 대해서는 공부가 많이 필요해보인다