<상속>
자식 클래스에서 부모 클래스의 필드, 메소드 사용 가능한 것.
상속은 한개만 가능, 코드 중복 감소 효과
public class SmartPhone extends Phone
{
String field1;
void method1(){}
}
- 자식 객체를 생성하면 부모 객체 먼저 생성되고 자식 객체가 생성된다.
예시)
SmartPhone sp=new SmartPhone();
stack영역에 sp가 생성되면
Heap영역에 부모인 Phone객체 생성 후 SmartPhone객체가 생성된다.
sp가 SmartPhone 저장된 번지에 저장된다.
- 부모 객체의 생성자는 자식 생성자 맨 첫 줄 숨겨져 있는 super()로 호출된다.
부모 클래스에 매개변수 가지는 생성자만 있다면, super(매개값..)처럼 코드를 직접 넣어야 한다.
public class SmartPhone extends Phone{
public SmartPhne(String model, String color)
{
super();//숨겨져 있다. 생략해도 가능
super(model, color);//매개변수 있는 생성자만 있다면 수동으로 추가해야한다.
this.model=mode; //this를 썼을 때 현재 class에 없다면 부모 객체에 가서 찾는다.
this.color=color; //동일하게 여기서는 부모 객체의 멤버를 의미
}
}
<메소드 재정의 Overriding >
부모 class에 해당 메소드 있는지 확인하고 있으면 재정의된다.
+) 부모 메서드 선언부와 동일해야함 / 접근제한을 더 강하게 할 수 없다 / 새로운 예외를 throws할 수 없다.
class Parent
{
void method(){}
}
class Chlid extends Parent
{
@Override
void method()
{
super.method();//부모 코드 그대로 사용 가능
//원한다면 코드 추가....
}
}
<Annotation>
주석 같은 것. 붙이지 않아도 되지만, 컴파일러에게 확인해주는 개념으로 붙인다
ex) @Override
<final class, final method>
상속,재정의를 하지 못하는 메서드,class
최종적인 클래스이다. 자식 클래스를 만들 수 없다.
최종적인 메서드이다. overriding할 수 없다.
<타입 변환>
클래스 타입을 변환하는 것
상속관계의 클래스 사이에서 발생
+) 메소드 재정의 + 타입 변환 → 다형성 구현
1. 자동 타입 변환
현재 타입을 상위 타입으로 변환시키는 것은 자동 변환
BUT 상위 타입으로 변경되면 해당 클래스의 필드, 메소드만 접근 가능.
BUT 자식 클래스에 오버라이딩된 메소드가 있다면 부모 메소드 대신 해당 메소드가 호출된다.
public vlass ChildExample{
public static void main(String args[])
{
Child child=new Child();
Parent parent=child;
parent.method1();//parent의 method1이 호출됨
parent.method2();//method2를 child에서 overriding했을 경우 child의 method2가 호출됨
parent.method3();//parent의 method3이 호출됨
}
2. 강제 타입 변환
부모타입을 자식 타입으로 변환
BUT 자식 객체가 부모타입으로 자동 변환된 후, 자식 타입으로 다시 변환할 때 만 사용 가능
Parent parent=new Child(); //자동타입 변환
Child child=(Child) parent; //강제타입 변환
<다형성>
사용 방법은 같지만 다른 실행 결과 나오는 것
1. 필드 다형성
필드 타입은 동일하지만 대입되는 객체별로 다른 결과가 나올 수 있다.
package ch07.sec08.exam01;
public class CarExample
{
public static void main(String[] args)
{
Car car=new Car();
car.tire=new Tire();
car.run();
car.tire=new HankookTire();
car.run();
car.tire=new KumhoTire();
car.run();
}
}
->
타이어가 회전
한국 타이어가 회전
금호 타이어가 회전
2. 매개변수 다형성
매개변수 객체에 따라서 동작이 달라지는 것
ex) 아래의 매개변수로 Taxi, Bus, Vehicle이 들어가면
각각 Taxi.run(), Bus.run(), Vehicle.run()이 실행될 것이다.
(Taxi,Bus는 Vehicle의 자식이다)
public class Dirver
{
public void drive(Vehicle vehicle)
{ vehicle.run(); }
}
<객체 타입 확인 "instanceof">
변수가 참조하는 객체 타입을 확인하기 위해 instanceof연산자 사용
package sec09;
public class InstanceOfExample {
//instance methods
public void personInfo() {}
public static void personInfo2() {}
public static void personInfo3(Person person)
{
System.out.print(person.name);
person.walk();
if(person instanceof Student)//Instance Off!!!
{
Student s=(Student)person;
System.out.print(s.studentNo+"번 학생 " );
s.study();
}
}
public static void main(String[]args)
{
//ERROR
personInfo();//static없어서 객체가 있어야지 해당 method실행 가능
//CORRECT
InstanceOfExample i=new InstanceOfExample();
i.personInfo();
personInfo2();//static이 붙어서 바로 사용 가능
personInfo3(new Person("홍길동"));
personInfo3(new Student("김학생",10));
}
}
<추상 클래스>
공통된 특성을 추출하고 중복을 줄이는 작업.
메소드가 미완성이라 overriding으로 완성 후 사용 가능
public abstract class Animal
{
public int age;
public int weight;
public String color;
public abstract void sound();
public abstract void keepHouse();
}
class Fish extends Animal
{
@Override
public void sound(){System.out.println("...");}
@Override
public void keepHouse(){System.out.println("파닥파닥");}
}
<봉인된 클래스>
무분별한 자식 클래스 생성 방지를 위해 sealed 클래스 도입됨
permits 뒤에 상속 가능한 자식 클래스 지정 가능
허가된 자식 클래스들은 final, non-sealed, sealed 키워드 중 하나를 붙여야한다.
final = 더이상 상속 불가. 자식 클래스 만들 수 없다.
non-sealed = 봉인 해제. 자식 클래스 만들 수 있다.
sealed = 봉인. permits한 클래스들만 자식 클래스 만들 수 있다.
public sealed class Peron permits Employss,Manager {...}
public final class Employee extends Person {...}
public non-sealed class Manager extends Person {...}
'개발 > Java' 카테고리의 다른 글
[Java] java.base 모듈 (0) | 2024.12.05 |
---|---|
[Java] 자바 예외 (0) | 2024.12.05 |
[Java] Interface (0) | 2024.12.04 |
[Java] 클래스 (0) | 2024.12.03 |
[Java] 자바 기초 (0) | 2024.12.02 |