JAVA-18

이강민·2021년 10월 7일
0

JAVA 기초 1

목록 보기
18/20
post-thumbnail

캐스팅(Casting)

캐스팅이란?

up casting

  1. 부모 클래스 타입으로 자식생성자를 호출하는 것

    부모클래스명 변수명 = new 자식생성자();

부모와 자식간의 공통 요소(재정의 메소드) 만 사용 가능하며 , 자식 클래스의 추가된 것 들은 사용할 수 없다. 부모 타입으로 선언 되었기 때문에 부모의 필드만 사용가능하지만 자식 클래스에서 재정의했다면 재정의 된 메서드로 사용된다.

down casting(오류)

자식 클래스 타입으로 부모 생성자를 호출하는 것으로 오류!!!
부모의 범위가 더 크기 때문에 자식에 담을 수 없다.

instanceof

각각의 타입을 확인할때 사용하는 문법
값 instanceof 클래스타입 (값이 클래스 타입이니?)

코드로 알아보기

Car 클래스를 생성하고 superCar가 Car를 상속받아 타입을 비교하는 문법을 사용해보자.

package day18;

class Car {
	String brand;
	String color;
	int price;
	
	public Car() {}
	
	public Car(String brand, String color, int price) {
		super();
		this.brand = brand;
		this.color = color;
		this.price = price;
	}
	
	void engineStart() {
		System.out.println("열쇠로 시동 킴");
	}
	
	void engineStop() {
		System.out.println("열쇄로 시동 끔");
	}
}

//Car를 상속 받음. 자식 : SuperCar, 부모 : Car
class SuperCar extends Car{
	
	String mode;

	public SuperCar() {}
	
	public SuperCar(String brand, String color, int price, String mode) {
		super(brand, color, price);
		this.mode = mode;
	}
	
	void changeMode(String newMode) {
		this.mode = newMode; //위에서 정의된 변수도 다시 정의 할 수 있음.
		System.out.println("모드가 바뀌었습니다.");
	}
	//부모와 같은 메서드를 자식에서 재정의하여 사용됨 
	@Override
	void engineStart() {
		System.out.println("음성으로 시동 킴");
	}
	
	@Override
	void engineStop() {
		System.out.println("음성으로 시동 끔");
	}
}

public class CastingTest {
	public static void main(String[] args) {
		//업 캐스팅
		Car noOptionFerrari = new SuperCar();
		noOptionFerrari.engineStart(); 
        //부모클래스가 자식 생성자를 불러옴으로써 자식 클래스의 메소드를 사용할 수 있다. 
		
		//downCasting - 뿌리부터 잘못된 오류 강제로 형변환해도 오류남.......
		/*SuperCar brokenCar = (SuperCar)new Car();
		brokenCar.changeMode("스포츠");*/
		
		Car car = new Car(); //부모클래스에서 부모생성자. 가능
		SuperCar ferrari = new SuperCar(); //자식클래스에서 자식생성자. 가능 
		
  
        
        //car가 Car 타입 ? true
		if(car instanceof Car) {
			System.out.println("nice casting");
		}else {
			System.out.println("err: wrong casting");
		}
		
        //ferrari가 Car 타입? new SuperCar 생성자 호출되고 SuperCar는 Car를 상속받아서 true
		if(ferrari instanceof Car) {
			System.out.println("nice casting");
		}else {
			System.out.println("err: wrong casting");
		}
		
        //car가 SuperCar타입? car는 부모값 다운 캐스팅으로 false
		if(car instanceof SuperCar) {
			System.out.println("nice casting");
		}else {
			System.out.println("err: wrong casting");
		}
		
        //noOptionFerrari가 SuperCar 타입? new SuperCar 생성자 호출했고 SuperCar는 Car를 상속 받아서 true
		if(noOptionFerrari instanceof SuperCar) {
			System.out.println("nice casting");
		}else {
			System.out.println("err: wrong casting");
		}
		
	}
}

싱글톤 패턴(Singleton Pattern)

싱글톤 패턴이란?

객체가 단 1개만 존재할 때 외부에서 new를 하지 못하게 막아주고 클래스 내부에서 new를 한 후 외부에서 선언이 아닌 사용만 해준다.

싱글통 패턴 사용방법

  1. 먼저 클래스 이름과 동일하게 메소드를 private로 만들어 접근할 수 없도록 만든다.
public class IronMan{
	private IronMan(){}; // 다른 곳에서 new로 접근하지 못함.
}
  1. 그러면 어디로 접근하게 만드는가? static과 getInstance를 사용하여 접근하도록 만든다.
    아래와 같이 만들면 getInstance 메소드만을 통해서 접근이 가능해진다.
public class IronMan{
    private IronMan(){}; // 다른 곳에서 new로 접근하지 못함.
	
    public static IronMan getInstance(){
    	IronMan im = new IronMan();
        return im;
    }
}
  1. 메소드를 만들어서 확인하자. 메소드 하나는 static을, 하나는 없이 만들어 본다.
public class IronMan{
    private IronMan(){}; // 다른 곳에서 new로 접근하지 못함.
	
    public static IronMan getInstance(){
    	IronMan im = new IronMan();
        return im;
    }
    public static void fight(){
    System.out.println("빔 발사");
	}
		
    public void walk() {
    System.out.println("날아간다.");
	}
}
  1. 다른 클래스에 접근해본다.
public class Stadium {
	public static void main(String[] args) {
		IronMan i = new IronMan();
        }
   }
  1. 위 코드에서 오류가 생긴다. IronMan의 생성자에 접근할 수 없다.
    그러나 클래스 이름으로 메소드에 직접 접근할 수 있다. 이는 메소드에 static으로 메모리에 저장되어 있기 때문에 가능하다.
public class Stadium {
	public static void main(String[] args) {
		IronMan.figth(); // 빔 발사 
        }
   }
  1. walk 메소드에 접근하고 싶을때는 getInstance로 접근한다. getInstance에는 static이 있기에 접근이 가능하다. getInstance에 먼저 접근하기 위해서는 클래스명과 변수에 getInstance접근하는 코드를 저장하고 변수로 walk에 접근이 가능한데 이는 getInstance 메소드안에는 IronMan 클래스가 new로 초기화 되었고 im이라는 변수로 walk에 접근한 것과 동일하다.
    이 싱글톤 패턴에서는 재정의가 불가하다.
public class Stadium {
	public static void main(String[] args) {
		IronMan i = IronMan.getInstance();
        i.walk(); //접근가능.
        }
   }
profile
AllTimeDevelop

0개의 댓글

관련 채용 정보