Search

클래슀 νƒ€μž… λ³€ν™˜

μžλ°”μ˜ 클래슀 νƒ€μž… λ³€ν™˜

클래슀 νƒ€μž… λ³€ν™˜μ΄λž€?

ν•œ 클래슀 νƒ€μž…μ˜ 객체λ₯Ό λ‹€λ₯Έ 클래슀 νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜λŠ” κ³Όμ •μž…λ‹ˆλ‹€.
μžλ°”μ—μ„œλŠ” 상속 관계에 μžˆλŠ” 클래슀 간에 νƒ€μž… λ³€ν™˜μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.

μ—…μΊμŠ€νŒ… (Upcasting)

μ—…μΊμŠ€νŒ…μ€ μžμ‹ 클래슀의 객체λ₯Ό λΆ€λͺ¨ 클래슀 νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.
// μ—…μΊμŠ€νŒ… μ˜ˆμ‹œ class Parent { } class Child extends Parent { } Child child = new Child(); Parent parent = child; // μ—…μΊμŠ€νŒ… (μžλ™ λ³€ν™˜)
Java
볡사
μ—…μΊμŠ€νŒ…μ˜ νŠΉμ§•:
β€’
μžλ™μœΌλ‘œ νƒ€μž… λ³€ν™˜μ΄ μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.
β€’
λΆ€λͺ¨ 클래슀의 λ©€λ²„λ§Œ μ ‘κ·Ό κ°€λŠ₯ν•©λ‹ˆλ‹€.
β€’
λ‹€ν˜•μ„±μ„ κ΅¬ν˜„ν•˜λŠ” κΈ°λ³Έ λ©”μ»€λ‹ˆμ¦˜μž…λ‹ˆλ‹€.

λ‹€μš΄μΊμŠ€νŒ… (Downcasting)

λ‹€μš΄μΊμŠ€νŒ…μ€ λΆ€λͺ¨ 클래슀 νƒ€μž…μ„ μžμ‹ 클래슀 νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.
// λ‹€μš΄μΊμŠ€νŒ… μ˜ˆμ‹œ Parent parent = new Child(); // λ¨Όμ € μ—…μΊμŠ€νŒ… Child child = (Child) parent; // λ‹€μš΄μΊμŠ€νŒ… (λͺ…μ‹œμ  λ³€ν™˜)
Java
볡사
λ‹€μš΄μΊμŠ€νŒ…μ˜ νŠΉμ§•:
β€’
λͺ…μ‹œμ μœΌλ‘œ νƒ€μž…μ„ 지정해야 ν•©λ‹ˆλ‹€.
β€’
μ‹€μ œ 객체가 λ³€ν™˜ν•˜λ €λŠ” νƒ€μž…κ³Ό μΌμΉ˜ν•˜μ§€ μ•ŠμœΌλ©΄ ClassCastException이 λ°œμƒν•©λ‹ˆλ‹€.
β€’
instanceof μ—°μ‚°μžλ‘œ νƒ€μž… 확인 ν›„ λ³€ν™˜ν•˜λŠ” 것이 μ•ˆμ „ν•©λ‹ˆλ‹€.

문법 사항

νƒ€μž… λ³€ν™˜ μ‹œ μ£Όμ˜ν•  점:
β€’
μ—…μΊμŠ€νŒ…μ€ μžλ™μœΌλ‘œ μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€: Parent p = child;
β€’
λ‹€μš΄μΊμŠ€νŒ…μ€ λͺ…μ‹œμ μœΌλ‘œ νƒ€μž…μ„ 지정해야 ν•©λ‹ˆλ‹€: Child c = (Child) parent;
β€’
νƒ€μž… 검사λ₯Ό μœ„ν•΄ instanceof μ—°μ‚°μž μ‚¬μš©: if (parent instanceof Child) { ... }
β€’
Java 16λΆ€ν„°λŠ” νŒ¨ν„΄ 맀칭을 ν†΅ν•œ ν–₯μƒλœ instanceof μ‚¬μš© κ°€λŠ₯:
// Java 16 μ΄μƒμ˜ νŒ¨ν„΄ 맀칭 if (parent instanceof Child child) { // child λ³€μˆ˜λ₯Ό λ°”λ‘œ μ‚¬μš© κ°€λŠ₯ child.childMethod(); }
Java
볡사

바인딩(Binding)

ν”„λ‘œκ·Έλž¨μ—μ„œ μ‚¬μš©λ˜λŠ” μš”μ†Œμ— μ‹€μ œ 값을 κ²°μ •μ§“λŠ” ν–‰μœ„λ₯Ό λ§ν•©λ‹ˆλ‹€.
바인딩은 크게 정적 바인딩과 동적 λ°”μΈλ”©μœΌλ‘œ λ‚˜λ‰©λ‹ˆλ‹€:
ꡬ뢄
정적 바인딩(Static Binding)
동적 바인딩(Dynamic Binding)
κ²°μ • μ‹œμ 
컴파일 μ‹œκ°„
μ‹€ν–‰ μ‹œκ°„
λŒ€μƒ
λ³€μˆ˜, λ©”μ„œλ“œ(μ˜€λ²„λ‘œλ”©), 정적 λ©”μ„œλ“œ
μ˜€λ²„λΌμ΄λ”©λœ λ©”μ„œλ“œ
νŠΉμ§•
μ‹€ν–‰ 전에 κ²°μ •λ˜μ–΄ μ„±λŠ₯이 μ’‹μŒ
μ‹€μ œ 객체 νƒ€μž…μ— 따라 결정됨
μ˜ˆμ‹œ
λ³€μˆ˜ μ ‘κ·Ό, private λ©”μ„œλ“œ, 정적 λ©”μ„œλ“œ 호좜
μ˜€λ²„λΌμ΄λ”©λœ λ©”μ„œλ“œ 호좜(λ‹€ν˜•μ„±)
클래슀 νƒ€μž… λ³€ν™˜κ³Ό κ΄€λ ¨ν•΄μ„œ 동적 바인딩이 μ€‘μš”ν•œ 역할을 ν•©λ‹ˆλ‹€. μ—…μΊμŠ€νŒ… μ‹œ 객체의 μ°Έμ‘° λ³€μˆ˜λŠ” λΆ€λͺ¨ νƒ€μž…μ΄μ§€λ§Œ, λ©”μ„œλ“œ ν˜ΈμΆœμ€ μ‹€μ œ 객체 νƒ€μž…(μžμ‹)의 λ©”μ„œλ“œκ°€ μ‹€ν–‰λ©λ‹ˆλ‹€.

λ°”μΈλ”©μ˜ μ’…λ₯˜

정적 바인딩 (Static Binding)

정적 바인딩은 컴파일 μ‹œμ μ— κ²°μ •λ˜λŠ” λ°”μΈλ”©μž…λ‹ˆλ‹€. λ‹€μŒκ³Ό 같은 νŠΉμ§•μ΄ μžˆμŠ΅λ‹ˆλ‹€:
β€’
컴파일 μ‹œκ°„μ— νƒ€μž…μ΄ κ²°μ •λ©λ‹ˆλ‹€.
β€’
λ©”μ„œλ“œ μ˜€λ²„λ‘œλ”©, 정적 λ©”μ„œλ“œ(static method), private λ©”μ„œλ“œλŠ” 정적 λ°”μΈλ”©μœΌλ‘œ μ²˜λ¦¬λ©λ‹ˆλ‹€.
β€’
μ‹€ν–‰ 속도가 λΉ λ₯΄λ‹€λŠ” μž₯점이 μžˆμŠ΅λ‹ˆλ‹€.
// 정적 바인딩 μ˜ˆμ‹œ class Example { private void privateMethod() { System.out.println("Private method"); } public static void staticMethod() { System.out.println("Static method"); } } Example example = new Example(); Example.staticMethod(); // 정적 바인딩
Java
볡사

동적 바인딩 (Dynamic Binding)

동적 바인딩은 μ‹€ν–‰ μ‹œμ (λŸ°νƒ€μž„)에 κ²°μ •λ˜λŠ” λ°”μΈλ”©μž…λ‹ˆλ‹€. λ‹€μŒκ³Ό 같은 νŠΉμ§•μ΄ μžˆμŠ΅λ‹ˆλ‹€:
β€’
μ‹€ν–‰ μ‹œκ°„μ— νƒ€μž…μ΄ κ²°μ •λ©λ‹ˆλ‹€.
β€’
λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”©μ΄ 적용된 λ©”μ„œλ“œλŠ” 동적 λ°”μΈλ”©μœΌλ‘œ μ²˜λ¦¬λ©λ‹ˆλ‹€.
β€’
λ‹€ν˜•μ„±μ„ κ΅¬ν˜„ν•˜λŠ” 핡심 λ©”μ»€λ‹ˆμ¦˜μž…λ‹ˆλ‹€.
// 동적 바인딩 μ˜ˆμ‹œ class Parent { public void display() { System.out.println("Parent's display"); } } class Child extends Parent { @Override public void display() { System.out.println("Child's display"); } } Parent p = new Child(); p.display(); // 동적 바인딩 - "Child's display" 좜λ ₯
Java
볡사

μ˜ˆμ‹œμ½”λ“œ

β€’
Person.java
β€’
Student.java
β€’
UpCasting.java
β€’
DownCasting.java

Person.java

package Day09.Ex02_ClassCasting; public class Person { String name; int age; // μƒμ„±μž public Person() { this("μ΄λ¦„μ—†μŒ", 1); } public Person(String name, int age) { this.name = name; this.age = age; } // λ©”μ†Œλ“œ public String work() { return "일을 ν•©λ‹ˆλ‹€."; } // getter, setter public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } // toString @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } }
Java
볡사

Student.java

package Day09.Ex02_ClassCasting; public class Student extends Person { int grade; String major; public Student() { this("μ΄λ¦„μ—†μŒ", 1, 1, "μ—†μŒ"); } public Student(String name, int age, int grade, String major) { super(name, age); this.grade = grade; this.major = major; } // λ©”μ†Œλ“œ μ˜€λ²„λΌμ΄λ”© @Override public String work() { return "곡뢀λ₯Ό ν•©λ‹ˆλ‹€"; } // getter, setter public int getGrade() { return grade; } public void setGrade(int grade) { this.grade = grade; } public String getMajor() { return major; } public void setMajor(String major) { this.major = major; } // toString() @Override public String toString() { return "Student [grade=" + grade + ", major=" + major + "]"; } }
Java
볡사

UpCasting.java

package Day09.Ex02_ClassCasting; public class UpCasting { public static void main(String[] args) { // * μ—…μΊμŠ€νŒ… (μžλ™ νƒ€μž… λ³€ν™˜) // (λΆ€λͺ¨ 클래슀) = (μžμ‹ 클래슀) // : μžμ‹ 객체λ₯Ό λΆ€λͺ¨ ν΄λž˜μŠ€νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜λŠ” 것 Person person = new Student("김쑰은", 20, 1, "κ²Œμž„λ―Έλ””μ–΄ν•™κ³Ό"); // Person : name, age // Student : name, age, grade, major System.out.println("name : " + person.name); System.out.println("age : " + person.age); // Person κ°μ²΄μ—μ„œλŠ” grade, major λ³€μˆ˜λ₯Ό μ ‘κ·Όν•  수 μ—†λ‹€. // System.out.println("grade : " + person.grade); // System.out.println("major : " + person.major); // 클래슀λ₯Ό μ—…μΊμŠ€νŒ… ν•˜λ©΄, // λ³€μˆ˜λŠ” λΆ€λͺ¨ ν΄λž˜μŠ€μ— μžˆλŠ” λ³€μˆ˜λ§Œ μ ‘κ·Ό κ°€λŠ₯ν•˜κ³ , // λ©”μ†Œλ“œλŠ” μžμ‹ 클래슀의 λ©”μ†Œλ“œκ°€ μš°μ„ ν•˜μ—¬ μ‹€ν–‰λœλ‹€. System.out.println( person ); System.out.println( person.work() ); // 바인딩 (Binding) // : ν”„λ‘œκ·Έλž¨μ—μ„œ μ‚¬μš©λ˜λŠ” μš”μ†Œμ— μ‹€μ œ 값을 κ²°μ •μ§“λŠ” ν–‰μœ„ // - 정적 바인딩 // : 컴파일 μ‹œκ°„μ— κ²°μ • // λ³€μˆ˜ λ“± // - 동적 바인딩 // : μ‹€ν–‰ μ‹œκ°„μ— κ²°μ • // μ˜€λ²„λΌμ΄λ”© λ“± } }
Java
볡사

DownCasting.java

package Day09.Ex02_ClassCasting; public class DownCasting { public static void main(String[] args) { // λ‹€μš΄ μΊμŠ€νŒ… (κ°•μ œ ν˜• λ³€ν™˜) // * μ „μ œ 쑰건 : μ—… μΊμŠ€νŒ… // - λ‹€μš΄ μΊμŠ€νŒ…μ€ μ—… μΊμŠ€νŒ…λœ λΆ€λͺ¨ 객체λ₯Ό μžμ‹ 객체둜 λ³€ν™˜ν•˜λŠ” 것 // - μ—… μΊμŠ€νŒ… : (λΆ€λͺ¨) <- (μžμ‹) // - λ‹€μš΄ μΊμŠ€νŒ… : (μžμ‹) <- (λΆ€λͺ¨) // μ—…μΊμŠ€νŒ… Person person = new Student("김쑰은", 20, 1, "컴퓨터곡학과"); System.out.println( person ); System.out.println( person.work() ); // λ‹€μš΄ μΊμŠ€νŒ… Student student = (Student) person; System.out.println( student ); System.out.println( student.work() ); System.out.println("grade : " + student.grade); System.out.println("major : " + student.major); } }
Java
볡사