JAVA-09
JAVA09
this
- 클래스 선언 시 내부적으로 선언되어 담긴다.
- 클래스는 선언 시 한번의 메소드를 선언하는데 그 메소드는 여러 객체의 공통적인 행동을 정의하고 있다. 한번의 선언으로 여러 객체를 다루어야 한다.
그렇기 때문에 메소드 내에서 필드를 사용하고자 할 때 어떤 객체의 필드인지를 구분 할 수 없다. 따라서 객체를 생성하거나 혹은 객체 . 을 찍고 필드에 접근하는 순간 그 객체를 this라는 변수가 받는다.
- 결과적으로 클래스 선언 시 this.필드명으로 접근하면 여러 객체도 하나의 메소드에서 다룰 수 있게 된다.
this : 객체 구별용 변수
- this필드에서 사용하면 객체가 접근할때 객체의 클래스를 가르킨다.
이게 자바의 클로저인가??
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+" 시동 끄기");
}
}
다형성(Polymorphism)
그렇기 때문에 메소드 내에서 필드를 사용하고자 할 때 어떤 객체의 필드인지를 구분 할 수 없다. 따라서 객체를 생성하거나 혹은 객체 . 을 찍고 필드에 접근하는 순간 그 객체를 this라는 변수가 받는다.
this : 객체 구별용 변수
- this필드에서 사용하면 객체가 접근할때 객체의 클래스를 가르킨다.
이게 자바의 클로저인가??
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+"가(이) 웁니다.");
}
}
Author And Source
이 문제에 관하여(JAVA-09), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@km2535/JAVA-09저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)