Static
class Car {
static int maxSpeed;
}
Car c1 = new Car();
c1.maxSpeed = 100;
Car c2 = new Car();
c2.maxSpeed = 200;
Car c3 = new Car();
c3.maxSpeed = 300;
System.out.println(c1.maxSpeed);
System.out.println(c2.maxSpeed);
System.out.println(c3.maxSpeed);
maxSpeed
메서드를 static
으로 생성
Car
객체를 3개 생성하고 각 객체마다 maxSpeed
메서드를 실행시켰지만 결국 maxSpeed
메서드는 Car
클래스에서 선언한 메서드 하나만 사용한 것이다.
- 각 객체가 고유한 특성을 가진 것이 아닌 모두 공통된 값을 가지는 것은
static
을 붙여도 된다.
객체 생성 및 인스턴스 메서드 실행
class Main {
public static void main(String[] args) {
자동차 a자동차;
a자동차 = new 자동차();
a자동차.달리다();
}
}
class 자동차 {
void 달리다() {
System.out.println("자동차가 달립니다!");
}
}
자동차 a자동차;
a자동차
에는 자동차 클래스로 만든 쓰레기 리모콘이 들어가게 된다.
a자동차 = new 자동차();
- 자동차 설계도(클래스)로 자동차 객체를 만든다.
- 자동차 객체는 자신을 조종할 수 있는 리모콘(this)를 가지고 태어난다.
- a자동차 안에 들어있던 쓰레기 리모콘이 진짜 리모콘으로 대체된다.
class 자동차 ~
상속
- 객체지향은 중복코드를 없애기 위해 존재한다.
- 객체지향적인 구조를 위해서 일부로 중복코드를 허용하는 경우도 있다.
- 코드의 재사용성과 유지보수성을 높이는 데 큰 도움이 된다.
- 상속은 상황이 복잡해지면 중복을 못 없애는 경우가 발생한다.
class 무기 {}
class 칼 extends 무기 {
void 공격() {
System.out.println("칼로 공격");
}
}
class Main {
public static void main(String[] args) {
무기 a무기 = new 칼();
a무기.공격();
}
}
- 상속은 자바에서 A is B 임을 알려주는 행위이다.
무기 a무기 = new 칼();
- a무기는 무기를 조종하는 리모콘이기만 하면됨.
- 칼은 무기이므로 해당 문장은 에러가 나지 않는다.
a무기.공격();
- a무기는 공격 메서드를 가질 수 없으므로 에러가 난다.
형변환
- 자바는 안전하다고 생각하면 자동으로 형변환하여 컴파일해준다.
- 자바는 버튼을 제거하는 것은 안전하다고 판단한다.
- 자바는 버튼이 추가되는 것은 위험하다고 판단한다.
- 리모콘이 상위(추상)타입으로 변하는 경우는 버튼이 줄어들 가능성만 존재
- 리모콘이 하위(구체)타입으로 변하는 경우는 버튼이 추가될 가능성만 존재
- 강제형변환을 해도 컴파일 단계까지는 무조건 성공함, 하지만 실행 단계에서 오류(예외)가 발생함\
double d = 5.0;
int i = d;
int i = (int)d;
int k = 5;
double d = k;
생성자
class Main {
public static void main(String[] args) {
전사 a전사 = new 전사("하하");
System.out.println(a전사.이름);
System.out.println(a전사.나이);
}
}
class 전사 {
String 이름;
int 나이;
전사() {
this("NoName");
}
전사(String 이름) {
this.이름 = 이름;
나이 = 20;
}
}