본문 바로가기

콤퓨타/Programming) 왕초보 자바

38. Inheritance - Casting & Runtime Errors

 

Cat 이라는 타입을 내가 임의로 만들어 주는거임. 

liket let there be new HouseCat 하면 , there was a new HouseCat 이것처럼 진짜 그냥 하나를 멘드는거임. 

그럼 a new HouseCat 객체 생성되고 메모리가 할당된다고 한다. 이게 그냥 폴더 생성되는것과 비슷한 이치인데 괜히 딱딱해 보여서 진입장벽 높이는 컴퓨터들.... ^,^ 

 

Cat 이라는 타입 

그렇다면 cat1은 변수다. 네 놀랍게도 변수입니다. 

그런데 이변수는 Cat이랑만 친한데, 

만약 HouseCat에 Override 하거나, 혹은HouseCat class에만 별도로 작성되어있는 메서드를 불러오려면

cat1이가 HouseCat을 캐스팅 할 수 있다. 

cat1이 HouseCat의 바로가기 폴더가 되는거라. 

 

package application;

public class App {

	public static void main(String[] args) {

		Cat cat1 = new HouseCat();
		cat1.hunt();
		cat1.vocalize();

		// Does not work:
		// cat1.purr();
		((HouseCat) cat1).purr();

		System.out.println("---------------\"");

		HouseCat cat2 = new HouseCat();
		cat2.hunt();
		cat2.vocalize();
		cat2.purr();

	}
}

 

 

 

package application;

public class Cat {

	public void vocalize() {
		System.out.println("Roar!");
	}

	public void hunt() {
		System.out.println("Hunting...");
	}
}

 

 

 

package application;

public class HouseCat extends Cat {

	@Override
	public void vocalize() {
		System.out.println("Meeeeowww");

	}

	public void purr() {
		System.out.println("purrrrrrr!");
	}
}

 

 

 

 

package application; 
public class App { 
public static void main(String[] args) { 

Cat cat1 = new HouseCat(); // <-- Cat이라는 타입(맹수, 귀여움, 엄청난 동물) 으로다가 뭔가 만들어보자. 
// 변수는 일단cat1 이란다. 
// 자 그럼 = 짜잔! 하고 new HouseCat() 이라는 객체가 만들어졌으니 아주 마음대로 해보렴. 

cat1.hunt(); //  <-- cat1 사냥 실시! 
cat1.vocalize();  //  <-- cat1 소리내기 실시! 

// Does not work: 
// cat1.purr(); <--  cat1 펄펄 실시 는 안됌. 왜냐면 Cat 클래스에 별도의 purr 메서드가 음슴 . 
// (질문!! 이것이 런타임 에러 인가요?!) (근데 왜 런타임인가요? 시간이 그러케 중요해?) 그 대신! HouseCat에는 있는뎅.. 힝규 

((HouseCat) cat1).purr(); // <--  아 그렇다면, cat1이 사실 바로가기 폴더고 본체는 HouseCat 이었다는걸 알려주도록 cat1과 HouseCat 을 요로코롬 연결해(질문 !! 이것이 캐스팅?) 해주면 되겠넹? 

System.out.println("---------------\""); 

HouseCat cat2 = new HouseCat(); //  <-- 여기서 객체 생성은 애초부터 HouseCat으로 했읍죠. 
// 다시 시작해서 설명하자면, HouseCat 이라는 타입을 멘들건데 (집냥이, 혼자 사색시간 가짐, 사냥놀이 좋아함. 펄펄 거림, 집에서 햇볕 잘 드는곳 찾아다님) 
// 그것을 cat2라는 변수에다가 집어 넣을것임 
// 그리고 짜잔! = new HouseCat() 이라는 객체가 멘들어졌다능? 

cat2.hunt(); // <-- cat2 사냥 실시! 
cat2.vocalize(); //  <-- cat2 소리 내보기 실시! 
cat2.purr(); //  <-- cat2 펄펄 실시! 

} 
}

 

 

 

 

 

 

 


ㅋㅋㅋㅋ 진짜 완전 제대로 이해하고, 내 마음 속에 그림이 막 떠오르네 😆네 설명 그대로 다시 정리하면서, 몇 가지 질문 포인트에 답 달아줄게.

1️⃣ cat1 생성 부분
Cat cat1 = new HouseCat();
Cat cat1 → 변수 타입은 Cat, 즉 “맹수, 귀여움, 엄청난 동물”이라는 설계도 기준으로 만들어짐new HouseCat() → 실제 객체는 HouseCat, 즉 “집냥이” 생성변수와 객체가 다름 → 주소표가 변수 안에 들어있음
cat1.hunt(); cat1.vocalize();
OK! Cat 설계도에 hunt, vocalize가 있으니까 컴파일러도 “응, 가능”
cat1.purr();
❌ 컴파일 단계에서 바로 걸림런타임 에러 아니야!런타임 에러는 실행할 때 객체 타입이 맞지 않아 터지는 에러여기서는 컴파일 단계에서 “Cat 타입에는 purr가 없네” 하고 잡힘시간 중요? → 응, 컴파일 타임 vs 런타임 구분할 때 중요컴파일 타임 → 변수 타입 기준 체크런타임 → 실제 객체 타입 기준 체크
((HouseCat) cat1).purr();
✅ 이거 캐스팅(Casting)“cat1은 변수 타입이 Cat이지만, 실제 객체는 HouseCat임!”그래서 Cat 기준으로는 못 부르던 purr를 HouseCat 기준으로 불러라

2️⃣ cat2 생성 부분
HouseCat cat2 = new HouseCat();
변수 타입과 실제 객체 타입이 같음 → Cat이 아닌 HouseCat그래서 모든 메서드(hunt, vocalize, purr) 바로 사용 가능캐스팅 필요 없음, 런타임 에러 걱정도 없음

🔑 핵심 포인트
구분변수 타입실제 객체 타입메서드 호출 가능?캐스팅 필요?런타임 에러 가능성cat1CatHouseCatCat에 있는 것만필요캐스팅 시 틀리면 가능cat2HouseCatHouseCat다 가능필요 없음없음

✅ 정리 비유
변수 = 바로가기객체 = 실제 폴더(집냥이)캐스팅 = “이 바로가기, 사실은 HouseCat 폴더임!” 하고 알려주는 것런타임 에러 = 바로가기랑 실제 폴더 타입이 안 맞으면 터지는 것컴파일 에러 = 바로가기 기준으로 없는 기능 호출하려고 하면 터지는 것

 

 

 

 

 

'콤퓨타 > Programming) 왕초보 자바' 카테고리의 다른 글

37. Static  (0) 2026.02.17
자바 스터디 25% 달성  (0) 2026.02.17
36. (Method) Menu Example + Return Values  (0) 2026.01.09
35. (Method) Class + Objects + Instance Variables  (0) 2025.12.25
[실패] (Method) Hangman  (0) 2025.12.25