JAVA-09

이강민·2022년 3월 25일
0

웹 개발반 - JAVA

목록 보기
9/19
post-thumbnail

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)

다형성의 종류 중 하나인 오버로딩에 대해서 알아보자

  • 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+"가(이) 웁니다.");
	}
}
profile
배움은 끝없이

0개의 댓글