자바는 기본적으로 초기화를 안하면 null 값(쓰레기 값)이 들어간다.
클래스는 설계도(not 객체, 인스턴스)
멤버 변수를 스태틱 변수로 만들면 각각의 객체에 해당 변수가 존재하지 않는다. 오직 클래스가 변수를 가진다.
int a; // 정수만 담을 수 있는 변수 a 생성, 정수 쓰레기값 0이 들어가있다.
a = 10; // a라는 변수에는 오직 정수만 들어갈 수 있다.
class Car(){ // 설계도
void run(); // 기능이 3가지
void lightOn();
void lightOff();
}
// 클래스는
/* 가짜 리모컨 */
Car aCar; // aCar라는 객체를 가리키는 레퍼런스에 null 값(쓰레기 리모컨)
// 기능이 3가지인 자동차가 있는데 그 자동차를 조종하려면 리모컨 버튼이 3개 있어야한다.
aCar.run(); // error: NullPointerException
Car aCar = new Car();
/* 자동차 설계도(클래스)로 자동차 객체를 변수 외!부!에 만든다.
자동차 객체는 자신을 조종할 수 있는 리모콘(this)를 가지고 태어난다.
즉 자동차 객체 만들 때 자동차 리모콘도 같이 만들어진다.
자동차 객체는 자신이 들고 있는 리모콘(this)를 복사해서 반환한다.
a자동차 안에 들어있던 쓰레기 리모콘이 진짜 리모콘으로 대체된다. */
extends 키워드(is로 생각하고 써라)
상속은 오직 하나만 가능하다.
객체지향은 중복코드를 없애기 위해서 존재한다. 객체지향적인 방식으로
객체지향
상속했을 때 override(재정의) 자식은 자신의 메소드가 우선순위가 높다.
자바는 다중상속을 막는다. 상속 받은 두 부모의 메소드가 겹칠때 애매한 지점이 생길 수 있기 때문이다.
double d = 1; // 자동형변환
무기 a무기 = new 칼(); // 칼 리모컨이 생기는데, 무기리모컨으로 형변환해서 들어간다. (자동형변환)
a무기.공격(); // error: 무기 클래스에 기능(메소드, 버튼)이 없음.
class 무기(){}
class 칼 extends 무기{
void 공격(){
System.out.println("칼로 공격합니다.");
}
}
// 문제 : 자동차 리모콘이 페라리 객체를 가리키게 한 후
// 해당 리모콘이 가리키고 있는 객체를 다시 페라리 리모콘으로 가리키게(참조하게) 하는 코드를 작성해주세요.
class Main {
public static void main(String[] args) {
자동차 차1 = new 페라리();
페라리 페라리차 = (페라리) 차1;
}
}
class 자동차 {
void 달리다() {}
void 서다() {}
}
class 페라리 extends 자동차 {
void 뚜껑이_열리다() {}
}