μλ°μ ν΄λμ€ νμ λ³ν
ν΄λμ€ νμ λ³νμ΄λ?
ν ν΄λμ€ νμ
μ κ°μ²΄λ₯Ό λ€λ₯Έ ν΄λμ€ νμ
μΌλ‘ λ³ννλ κ³Όμ μ
λλ€.
μ μΊμ€ν (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
볡μ¬