번호, 이름, 나이, 키, 기혼여부에 대한 객체를 생성할 시,
자료형이 다양해서 자바에서 기본으로 제공해주는 클래스로 사용할 수없음 -> 클래스 직접 만듦
- 객체를 만들 수 있음
- 객체를 조종할 수 있는 리모콘을 만들 수 있음
- 객체 리모콘을 담을 변수도 만들 수 있음
class GameCharacter {
int no;
int age;
int height;
}
GameCharacter person1 = new GameCharacter(); // 객체, 인스턴스가 생긴다.
person1.no = 1; // 사람 1의 번호, 인스턴스 변수
person1.age = 20; // 사람 1의 나이, 인스턴스 변수
person1.height = 170; // 사람 1의 키, 인스턴스 변수
GameCharacter person2 = new GameCharacter();
person2.no = 2; // 사람 2의 번호, 인스턴스 변수
person2.age = 30; // 사람 2의 나이, 인스턴스 변수
person2.height = 180; // 사람 2의 키, 인스턴스 변수
변수에는 오직 값 1개만 넣을 수 있다.
프로그래밍을 하다보면 변수에 값을 여러 개 넣을 필요가 있을 때가 있다.
그래서 고안된 것이 객체이다.
각 인스턴스들이 공통적으로 같은 값이 유지되어야하는 경우 사용
class Main {
public static void main(String[] args) {
자동차 a자동차 = new 자동차();
a자동차.달리다();
}
}
class 자동차{
void 달리다(){}
}
=> static이 없을 경우 객체를 생성하여 사용
class Main {
public static void main(String[] args) {
자동차.달리다();
}
}
class 자동차{
static void 달리다(){}
}
=> static이 있을 경우 객체 생성없이 바로 사용
class Person {
static int maxSpeed;
}
Person p1 = new Person();
p1.maxSpeed = 100; // 이 코드는 실질적으로 `Person.maxSpeed = 100;` 으로 처리된다. 왜냐하면 p1 객체에는 maxSpeed 변수가 없고, maxSpeed 변수는 클래스에 1개만 존재하기 때문이다.
Person p2 = new Person();
p2.maxSpeed = 200;
Person p3 = new Person();
p3.maxSpeed = 300;
System.out.println(p1.maxSpeed); // 300 // 이 코드는 실질적으로 System.out.println(Person.maxSpeed); 와 같다.
System.out.println(p2.maxSpeed); // 300
System.out.println(p3.maxSpeed); // 300
=> static이 있는데도 객체를 생성했을 경우, 객체가 여러개 생성되도 static 변수는 딱 하나만 있음. static 변수에 대해 값이 통일 되어 출력됨
class Main {
public static void main(String[] args) {
// 오직 자동차 리모콘만 저장 할 수 있는 변수 `a자동차`를 만든다.
// `a자동차` 에는 자동차 클래스로 만든 리모콘(쓰레기 리모콘)이 들어가게 된다.
자동차 a자동차;
// 자동차 설계도(클래스)로 자동차 객체를 변수 외!부!에 만든다.
// 자동차 객체는 자신을 조종할 수 있는 리모콘(this)를 가지고 태어난다. 즉 자동차 객체 만들 때 자동차 리모콘도 같이 만들어진다.
// 자동차 객체는 자신이 들고 있는 리모콘(this)를 복사해서 반환한다.
// a자동차 안에 들어있던 쓰레기 리모콘이 진짜 리모콘으로 대체된다.
a자동차 = new 자동차();
// `a자동차` 변수에 안에 있는 리모콘의 `달리다` 버튼을 누른다.
// 해당 신호가 리모콘과 연결되어 있는 자동차 객체에 전달되어 `달리다` 기능이 실행된다.
a자동차.달리다();
// 모든 객체들은 서로를 평생 볼 수 없다.
// 모든 객체들은 서로를 원격조종한다.
}
}
// 자동차 설계도
class 자동차 {
// 이 메서드(함수)의 2가지 용도
// - 객체 만들때 : 실제 기능
// - 리모콘 만들때 : 리모콘 버튼
void 달리다() {
System.out.println("자동차가 달립니다.");
}
}
A is B임을 알려주는 행위
장점 - 중복된 코드가 사라짐
단점 - 자바에서 다중 상속 불가. (메소드가 겹칠 수 있기 때문에)
->복잡한 구조일 때는 중복 코드를 완전히 해결 못함 -> '구성' 사용
class 고양이 {
void 숨쉬다() { }
void 야옹() { }
void 뛰어넘다() { }
}
class 검은고양이 extends 고양이 { //검은 고양이 is 고양이
void 미래를_예지하다() { }
}
class 흰고양이 extends 고양이 { //흰고양이 is 고양이
void 목숨을_늘린다() { }
}
class 점박이고양이 extends 고양이 { //점박이고양이 is 고양이
void 춤춘다() { }
}
흰고양이 a = new 흰고양이();
a.숨쉬다();
a.야옹();
a.미래를_예지하다();
검은고양이 b = new 검은고양이();
b.숨쉬다();
b.야옹();
b.목숨을_늘린다();
점박이고양이 c = new 점박이고양이();
c.숨쉬다();
c.야옹();
=> 검은, 흰, 점박이 클래스에 void 숨쉬다(){}
void 야옹(){}
을 각각 안넣고, 고양이라는 부모 클래스에 한 번만 넣어 중복 코드를 최소화
자바는 안전하지 않으면 자동형변환을 해주지 않음
자동형변환
int a = 1;
double b = a; //b=1.0
=> 아무리 a의 값이 커도 int의 범위가 double의 범위보다 작기 때문에 컴파일러가 안전하다고 생각해서 자동형변환시킴
무기 a무기 = new 칼();
class 무기{}
class 칼 extends 무기{}
=> 칼리모콘이 무기리모콘으로 변환하는 것은 안전하다고 생각하여 자동형변환시킴
수동형변환
double a = 1.0;
int b = (int)a;
=> 컴파일러는 1.0이 1과 같다고 인식을 못하기 때문에 정수로 바꿀 수 있다는 생각을 못해서 수동으로 형변환시켜야함
자동차 a자동차 = new 페라리();
페라리 a페라리 = (페라리)a자동차;class 자동차 {}
class 페라리 extends 자동차{}
class 스파크 extends 자동차{}
=> 자동차리모콘이 페라리리모콘으로 자동변환하는 것은 안전하지 않음. 스파크로도 변환될 수 있기 때문에
DVD방에 각각의 다른 TV가 있을 경우
각각의 TV에 대한 리모콘들을 모두 가져야하지만, 상위타입을 사용하면 통합리모콘에 기능을 다 담을 수 있어서 편리함 (단, 통합리모콘에 모든 기능이 들어있지는 않음. 자주 쓰는 특정 기능만 모아서 사용)
TV aTv1 = new LGTv(); TV aTv2 = new 샤오미Tv(); TV aTv3 = new 삼성Tv(); TV aTv4 = new 독일Tv(); TV[] tvs = new TV[4]; tvs[0] = aTv1; tvs[1] = aTv2; tvs[2] = aTv3; tvs[3] = aTv4; for(TV tv : tvs){ tv.끄기(); }```
컴파일 - 실행을 위한 중간 과정(소스코드를 실행파일로 만드는 과정 : 1초~10시간). 컴파일러는 예측할 수 있는 기능이 없음
런타임 - 실행했을 때 나오는 시간