클래스
무엇인가를 정의하기 위한 큰 틀
구현해내고 싶은게 있다면 클래스 안에 속성과 기능을 만들어 놓고, 메인메소드에 객체를 생성하여 사용함
멤버변수(인스턴스 변수)
객체 생성시 실행되고 소멸시 GC의 소관
생성자
객체 초기화를 위하여 사용
클래스 생성시 생성되고 new 표현식을 통한 객체의 생성과 함께 실행됨
객체 생성시에만 호출됨
메서드
기능정의부분
래퍼런스(reference) 형 변환
래퍼런스 타입간의 형 변환을 의미
클래스 간 상속관계에 있거나 인터페이스를 구현하는 부모-자식 관계에 있는 경우에만 형 변환이 가능함
업캐스팅(up casting)
서브 크래스에서 슈퍼 클래스로 형변환하는 것을 의미
부모의 객체로 자식 객체의 멤버를 사용할 수 있음
단, 부모가 갖고 있는 멤버에 한해서만 참조 가능
자동으로 형변환(묵시적 형변환)이 되며 바로 위의 부모가 아니더라도 상속 관계의 상위에 있다면 업캐스팅 가능
>
자식타입 자식객체명 = new 자식타입();
부모타입 부모객체명 = (부모타입) 자식객체명; //부모타입 생략 가능
class Animal { // 슈퍼 클래스
String name;
public void name() {
name = "동물";
System.out.println("Animal = " + name);
}
}
class Cat extends Animal { // Animal 클래스 상속
public void name() { // 오버라이딩
name = "고양이";
System.out.println("Cat = " + name);
}
public void dMethod() { // Cat 메소드
System.out.println("반려동물");
}
}
class Elephant extends Animal { // Animal 클래스 상속
public void name() { // 오버라이딩
name = "코끼리";
System.out.println("Elephant= " + name);
}
}
class KoreanSorthair extends Dog { // Cat 클래스 상속
public void name() { // 오버라이딩
name = "코리안숏헤어";
System.out.println("KoreanSorthair = " + name);
}
}
public class RefCasting {
public static void main(String[] args) {
Cat c1 = new Cat();
Animal a1 = (Animal) c1; // 업캐스팅 / 부모타입 생략 가능
a1.name(); // 출력 : 고양이
// a1.dMethod(); // 자식 클래스에만 있는 메소드로 부모 객체로 호출 불가
Elephant e1 = new Elephant();
Animal a2 = e1; // 업캐스팅
a2.name(); // 출력 : 코끼리
Animal a3 = new KoreanSorthair(); // 업캐스팅
a3.name(); // 출력 : 코리안숏헤어
}
}
다운캐스팅(down casting)
부모 타입을 자식타입으로 변환하는 것
자식 타입 멤버의 사용이 필요한 경우 다운 캐스팅이 필요
모든 부모 타입을 자식 타입으로 형변환 할 수 있는 것은 아님(일반적으로 다운캐스팅 불가)
성립조건은 부모 타입으로 업캐스팅을 선행한 후 다시 자식 타입으로 변환 할 때 사용 가능
또한 자동 형변환이 되지 않기 때문에 자료형을 생략 할 수 없음(명시적 형변환 필요)
>
부모타입 부모객체명 = new 자식타입(); //업캐스팅
자식타입 자식객체명 = (자식타입) 부모객체명 //다운캐스팅
class SmartPhone { // 슈퍼 클래스
public void name(){
System.out.println("스마트폰");
}
}
class Apple extends SmartPhone { // 서브 클래스
public void name() { // 오버라이딩
System.out.println("회사명 : 애플");
}
public void iPhone(){
System.out.println("모델 : 아이폰");
}
}
class Samsung extends SmartPhone{ // 서브 클래스
public void name() { // 오버라이딩
System.out.println("회사명 : 삼성");
}
public void galaxy(){
System.out.println("모델 : 갤럭시");
}
}
public class RefCastingEx02 {
public static void main(String[] args) {
Apple a1 = new Apple();
SmartPhone sp1 = a1; // 업캐스팅
sp1.name();
// sp1.iPhone(); // 자식 메소드 사용 불가
a1 = (Apple)sp1; // 다운 캐스팅
a1.iPhone();
SmartPhone sp2 = new Samsung(); // 업캐스팅
sp2.name();
// sp2.galaxy(); // 자식 메소드 사용 불가
Samsung s1 = (Samsung)sp2; // 다운 캐스팅
s1.galaxy();
Apple a2 = (Apple) new SmartPhone(); // 다운 캐스팅
a2.name(); // 예외 발생(다운 캐스팅을 하기 위해서는 업 캐스팅이 선행 되어야 함)
}
}
instanceof
참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 사용
주로 조건문에 사용되며 연산의 결과로 true, false 중 하나를 반환함
instanceof를 이용한 연산결과가 true이면 참조변수가 검사한 타입으로 형변환이 가능하다는 의미
참고) 값이 null인 참조변수에 대해 instanceof 연산을 수행하면 false를 반환
'프로그래밍 > JAVA' 카테고리의 다른 글
04.10(error 알아보기) (0) | 2020.04.11 |
---|---|
04.09(calendar 출력해보기) (0) | 2020.04.09 |
04.07(&&, ||, ++, --연산자와 반복문의 특징, 오버로딩과 오버라이딩) (0) | 2020.04.07 |
04.06(객체 지향언어의 특징과 변수에 따른 소멸시기) (0) | 2020.04.06 |
04.03(접근제한자, 메소드, 추상클래스, super, 오버라이딩, 클래스 형변환) (0) | 2020.04.04 |