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 |