변수나 반환값의 데이터 타입을 다른 타입으로 변환하는 과정
프로그램에서 명시적으로 캐스팅 연산자를 사용하지 않아도 자바 컴파일러가 자동으로 타입을 변환해주는 경우를 말한다. 보통은 작은 크기의 데이터 타입에서 큰 크기의 데이터 타입으로 변환할 때 사용한다.
// 예를 들어, 'int'에서 'long'으로, 'float'에서 'double'로 변환할 때 사용한다.
int I = 100;
long L = I; //int에서 long으로 자동캐스팅
double D = L; // long에서 double로 자동캐스팅
사용자가 직접 캐스팅 연산자를 사용해서 명시적으로 타입을 변환하는 경우를 말한다. 보통 큰 크기의 데이터 타입에서 작은 크기의 데이터 타입으로 변환할 때 사용한다.
double D = 9.0;
int I = (int)D; //double에서 int로 강제 캐스팅
자식 클래스 타입의 객체를 부모 클래스 타입으로 참조 변환하는 것을 말한다.
부모 클래스 타입의 객체를 자식 클래스 타입으로 참조 변환하는 것을 말한다.
package javaplus.casting;
public class CastingEx {
public static void main(String[] args) {
Animal animal = new Dog(); // 업캐스팅: Dog 객체를 Animal 타입으로 참조
animal.eat();
//다운캐스팅 전에 instanceof를 사용하여 안전하게 확인
if(animal instanceof Dog){
Dog dog = (Dog) animal; //다운캐스팅: Animal 타입을 Dog 타입으로 명시적 변환
dog.bark();
}
}
}
class Animal{
public void eat(){
System.out.println("이 동물이 음식을 먹습니다.");
}
}
class Dog extends Animal{
public void bark(){
System.out.println("개가 짖습니다.");
}
}
자바에서 객체의 타입을 검사하는 데 사용되는 연산자이다. 이 연산자는 주어진 객체가 특정 클래스나 인터페이스의 인스턴스인지, 자식 클래스의 인스턴스인지 확인할 때 사용한다.
'instanceof'연산자의 사용은 객체 지향 프로그래밍에서 타입 안전성을 보장하고, 클래스 캐스팅 예외를 방지하는 데 사용한다.
object instanceof Name
이 코드에서 'object'는 검사하고자 하는 객체를 말하고, 'Name'은 해당 객체가 속할 수 있는 클래스 or 인터페이스의 이름을 나타낸다. 연산의 결과는 'boolean'값으로 나타낸다.
package javaplus.casting;
public class InstanceofEx {
public static void main(String[] args) {
People p = new People();
Me m = new Me();
People p2 = new Me();
System.out.println(p instanceof People);//true
System.out.println(m instanceof Me);//true
System.out.println(m instanceof People);//true, Me는 People의 자식 클래스이다.
System.out.println(p instanceof Me);//false, People 인스턴스는 Me의 인스턴스가 아니다.
System.out.println(p2 instanceof Me);//true, p2는 Me의 인스턴스롤 참조한다.
}
}
class People{}
class Me extends People{}
인스턴스가 나온김에 다시 한번 짚고 넘어가자.
인스턴스(instance)는 객체 지향 프로그래밍에서 클래스(class)로부터 생성된 객체(object)를 의미한다.
여기서 클래스는 붕어빵(객체)을 만들기 위한 붕어빵 기계라고 볼 수 있고, 인스턴스는 이 붕아빵 기계를 바탕으로 실제로 생성된 것이다.
더 나은 이해를 위해 집 설계를 예로 들어보면, 집을 설계하기 위해서는 설계도가 필요하다. 이 설계도에는 집을 구성하는 방의 개수, 문, 창문의 개수, 위치 등 집을 지을 때 필요한 구체적인 정보가 들어가 있다.
여기서 설계도는 '집'이라는 클래스에 해당하고, 이 설계도를 사용하여 실제로 지어진 각각의 집들이 인스턴스에 해당된다.
package javaplus.casting;
public class InstanceEx {
public static void main(String[] args) {
//Game 인스턴스 생성
Game mygame = new Game("fifa","lol");
Game yourgame = new Game("overwatch","suddenattack");
//생성된 인스턴스를 사용해서 정보 출력
mygame.displayInfo();
yourgame.displayInfo();
}
}
class Game{
//Game 클래스의 속성(필드)
String game1;
String game2;
//Game 클래스의 생성자
Game(String game1, String game2){
this.game1 = game1;
this.game2 = game2;
}
//자동차 정보를 출력하는 메서드
void displayInfo(){
System.out.println("게임 1: " + game1 + " 게임 2: " + game2);
}
}
즉, 인스턴스는 클래스에 정의된 속성과 기능을 실제로 가지고 있는 구체적인 객체를 말한다.