: 폴더 상에서 어디까지 접근을 허용할 것이냐
public: 접근 제한 X
protected: 같은 패키지 내에서, 다른 패키지의 자손 클래스에서 접근 가능
default: 같은 패키지 내에서만 접근 가능
private: 같은 클래스 내에서만 접근 가능
private 필드를 어떻게 읽어오거나 저장할까??
public String getModel() {
return model;
}
public String getColor() {
return color;
}
public double getPrice() {
return price;
}
public void setModel(String model) {
this.model = model;
}
public void setColor(String color) {
this.color = color;
}
public void setPrice(double price) {
this.price = price;
}
상속 -> 오버라이딩
public class 자식클래스 extends 부모클래스 {
}
1. 부모 클래스에서 새로운 필드와 메서드가 추가되면 자식 클래스는 이를 상속받아 사용 가능
2. 자식 클래스에 새로운 필드와 메서드가 추가되어서 부모 클래스는 영향 X
3. 자식 클래스의 멤버 개수는 부모 클래스보다 항상 같거나 많다.
java는 다중상속 불가!
부모 클래스 final로 선언해놓으면 자식 못바꿈
public class Car {
public final void horn() {
System.out.println("빵빵");
}
}
...
public class SportsCar extends Car{
public void horn() { // 오류 발생!
super.horn();
}
}
부모 클래스로부터 상속 받은 메서드를 자식 클래스에서 재정의
부모 클래스의 멤버를 참조할 수 있는 키워드
public void setCarInfo(String model, String color, double price) {
super.model = model; // model은 부모 필드에 set
super.color = color; // color는 부모 필드에 set
this.price = price; // price는 자식 필드에 set
}
부모 클래스의 생성자를 호출할 수 있는 키워드
// 부모 클래스 Car 생성자
public Car(String model, String color, double price) {
this.model = model;
this.color = color;
this.price = price;
}
// 자식 클래스 SportsCar 생성자
public SportsCar(String model, String color, double price, String engine) {
// this.engine = engine; // 오류 발생
super(model, color, price);
this.engine = engine;
}
부모 타입 변수 = 자식 타입 객체;
-> 자동으로 부모 타입으로 변환 일어남
자식 타입 변수 = (자식 타입) 부모 타입 객체;
// 자식타입객체가 자동 타입변환된 부모타입의 변수
Mammal mammal = new Whale();
mammal.feeding();
// 자식객체 고래의 수영 기능을 사용하고 싶다면
// 다시 자식타입으로 강제 타입변환을 하면된다.
Whale whale = (Whale) mammal;
whale.swimming();
여러 가지 형태를 가질 수 있는 능력
부모 타이어 변수 = 자식 타이어 객체;
-> 각각의 자식 타이어 객체에 재정의 된 메서드를 통해 다양한 승차감을 가진 자동차 생성
Tire tire = new HankookTire("HANKOOK");
Tire tire = new KiaTire("KIA");
public Car(Tire tire) {
this.tire = tire;
}
...
Car car1 = new Car(new KiaTire("KIA"));
Car car2 = new Car(new HankookTire("HANKOOK"));
부모는 완성시키지 않은 method -> 자식이 상속받아서 완성
public abstract class 추상클래스명 {
}
public class 클래스명 extends 추상클래스명 {
@Override
public 리턴타입 메서드이름(매개변수, ...) {
// 실행문
}
}
상속받은 클래스에서 추상클래스의 추상메서드는 반드시 오버라이딩 되어야 한다!
두 객체를 연결해 주는 다리 역할
public interface 인터페이스명 {
}
public interface 인터페이스명 {
public static final char A = 'A';
static char B = 'B';
final char C = 'C';
char D = 'D';
void turnOn(); // public abstract void turnOn();
}
public class 클래스명 implements 인터페이스명 {
// 추상 메서드 오버라이딩
@Override
public 리턴타입 메서드이름(매개변수, ...) {
// 실행문
}
}
public class Main implements C {
@Override
public void a() {
System.out.println("A");
}
@Override
public void b() {
System.out.println("B");
}
}
interface A {
void a();
}
interface B {
void b();
}
interface C extends A, B { }
public class Main implements A {
@Override
public void a() {
System.out.println("A");
}
public static void main(String[] args) {
Main main = new Main();
main.a();
// 디폴트 메서드 재정의 없이 바로 사용가능합니다.
main.aa();
}
}
interface A {
void a();
default void aa() {
System.out.println("AA");
}
}
public class Main implements A {
@Override
public void a() {
System.out.println("A");
}
public static void main(String[] args) {
Main main = new Main();
main.a();
main.aa();
System.out.println();
// static 메서드 aaa() 호출
A.aaa();
}
}
interface A {
void a();
default void aa() {
System.out.println("AA");
}
static void aaa() {
System.out.println("static method");
}
}
인터페이스 변수 = 구현객체;
public class Main {
public static void main(String[] args) {
// A 인터페이스에 구현체 B 대입
A a1 = new B();
// A 인터페이스에 구편체 B를 상속받은 C 대입
A a2 = new C();
}
}
interface A { }
class B implements A {}
class C extends B {}
구현 객체 타입 변수 = (구현 객체 타입) 인터페이스 변수;
// LG TV 구현체를 조작
MultiRemoteController mrc = new LgTv("LG");
mrc.turnOnOff();
mrc.volumeUp();
// 조작 대상을 Samsung TV로 교체
mrc = new SamsungTv("Samsung");
mrc.turnOnOff();
mrc.channelUp();
난이도가 갑자기 확 뛴 느낌이랄까...
여유롭게 들을려고 했는데 갑자기 진도가 막혔다.
솔직히 완벽하게 이해했다고 못하겠다.
직접 코드 짜보고 응용하면서 개념을 익혀야겠다.