package day09;
public class ClassTest {
public static void main(String[] args) {
Car mycar = new Car("Ferrari","Red",65000);
Car momcar = new Car("K8", "White", 4000);
System.out.println(mycar.brand);
System.out.println(momcar.brand);
// mycar의 this는 mycar의 class 주소값
mycar.engineStart();
//momcar의 this는 momcar의 class주소값이다.
momcar.engineStart();
}
}
class Car{
String brand;
String color;
int price;
//Alt + Shift + S > O : 필드를 이용해서 생성자 만들기
public Car(String brand, String color, int price) {
// this는 클래스를 가르킨다. 즉, 클래스의 brand는 전역변수를 가르킨다.
this.brand = brand;
this.color = color;
this.price = price;
}
void engineStart() {
System.out.println(this.brand+" 시동 켜기");
}
void engineStop() {
System.out.println(brand+" 시동 끄기");
}
}
다형성의 종류 중 하나인 오버로딩에 대해서 알아보자
Overloading
같은 이름의 메소드를 넘쳐서(여러개) 불러오는 (선언)기법
매개변수의 갯수 혹은 타입이 다르면 같은 이름의 메소드로 여러개 선언할 수 있다.
이름이 아닌 매개변수로 구별하기 때문이다.
오버로딩된 메솓드 사용 시 전달된 값의 타입 혹은 갯수로 구분하여 알맞은 메소드가 자동으로 호출된다.
package day09;
public class ClassTest {
public static void main(String[] args) {
Car mycar = new Car("Ferrari","Red",65000);
Car momcar = new Car("K8", "White", 4000);
// 매개변수를 1개만 사용했더니 거기에 알맞은 메소드를 불러온다.
Car dadcar = new Car(31000);
// 기본 생성자를 사용하면 기존방식으로 선언이 가능하다.
Car sistercar = new Car();
System.out.println(mycar.brand);
System.out.println(momcar.brand);
mycar.engineStart();
momcar.engineStart();
dadcar.engineStart();
}
}
class Car{
String brand;
String color;
int price;
//생성자 오버로딩
//클래스이름 + 자동완성 : 기본 생성자 만들기
public Car() {}
//Alt + Shift + S > O : 필드를 이용해서 생성자 만들기
public Car(String brand, String color, int price) {
// this는 클래스를 가르킨다. 즉, 클래스의 brand는 전역변수를 가르킨다.
this.brand = brand;
this.color = color;
this.price = price;
}
// 같은 이름의 메소드에 매개변수를 달리하여 사용할 수 있다.
public Car(int price) {
this.price = price;
}
void engineStart() {
System.out.println(this.brand+" 시동 켜기");
}
void engineStop() {
System.out.println(brand+" 시동 끄기");
}
}
객체를 여러개 선언해야 하는 경우 배열 타입으로 한번에 선언 후 사용
각 객체에는 규칙성이 없기 때문에 규칙성을 부여하기 위해서 사용한다.
방법1.
클래스명 [] 배열명 = {
new 생성자(),
new 생성자(),
...
}
Car [] arcar = {
new Car("Ferrari","Red",65000),
new Car("K8", "White", 4000),
new Car(31000)
}
방법2.
클래스[] 배열명 = new 클래스명[칸수];
방법2 처럼 선언 가능하지만 공간만 선언하였고 주소값의 기본값은 null이 들어간다.
따라서 위처럼 선언 시에는 별도로 초기화 하여야 한다.
별도로 초기화 하지 않으면 NullPointerException 에러를 발생 시킨다.
배열명[idx] 방이 객체를 의미하게 된다.
배열명[idx].변수
배열명[idx].메소드();
package day09;
public class ClassArrayTest {
public static void main(String[] args) {
//클래스 배열로 선언하였다.
Square[] arSquare = {
new Square("가나", 20, 8),
new Square("미니맵", 40, 40),
new Square("돈", 100, 25)
};
//이제 클래스 객체들을 반복을 통해 접근이 가능해졌다.
for (int i = 0; i < arSquare.length; i++) {
System.out.println(arSquare[i].getArea());
}
}
}
class Square{
String name;
double height;
double width;
public Square(String name, double height, double width) {
this.name = name;
this.height = height;
this.width = width;
}
double getArea() {
return height*width;
}
}
동물원 클래스를 만들고 세마리의 동물을 객체화 시키는 것이다.
추가적으로 외부에서 걸음수를 입력 받고 해당 동물이 걸음 수 만큼 수치가 증가되어 보이는 것을 구현하였다.
동물이 걸어가는 값을 수치의 증가에 따라 구현하기 쉽기 때문에 수치를 제어한 것이다.
package day09My;
import java.util.Scanner;
public class Zoo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Animal [] arAnimal = {
new Animal("검붉은 코끼리 땃쥐",4,1),
new Animal("마게이",10,30),
new Animal("마눌(Manul)",10,50)
};
for (int i = 0; i < arAnimal.length; i++) {
arAnimal[i].cry();
}
System.out.println("마게아가 몇 만큼 움직이게 하겠습니까?");
int step = sc.nextInt();
for (int i = 1; i <= step; i++) {
arAnimal[1].move();
}
System.out.println(arAnimal[1].name+"가(이) "+arAnimal[1].step+"만큼 움직였습니다.");
}
}
class Animal{
String name;
int age;
int weight;
int step;
public Animal(String name, int age, int weight) {
this.name = name;
this.age = age;
this.weight = weight;
}
void eat() {
System.out.println(this.name+"가(이) 먹습니다.");
}
void sleep() {
System.out.println(this.name+"가(이) 잡니다.");
}
void move() {
this.step++;
//System.out.println(this.name+"가(이) 움직입니다.");
//System.out.println(this.name+"가(이) "+this.step+"만큼 움직였습니다.");
}
void cry() {
System.out.println(this.name+"가(이) 웁니다.");
}
}