νμ΅ ν λ΄μ©λ€
- μλ° μμμ νΉμ§
- super ν€μλ
- λ©μλ μ€λ²λΌμ΄λ©
- λ€μ΄λλ―Ή λ©μλ λμ€ν¨μΉ (Dynamic Method Dispatch)
- μΆμ ν΄λμ€
- final ν€μλ
- Object ν΄λμ€
μλ° μμμ νΉμ§
μμμ λ§€μ° μΉλͺ μ μΈ μ€ν΄ :
"μμμ μ½λμ μ¬νμ©μ μν λ¬Έλ²μ λλ€." (X)
"μ°κ΄λ μΌλ ¨μ ν΄λμ€λ€μ λν΄ κ³΅ν΅μ μΈ κ·μ½μ μ μν μ μμ΅λλ€." (O)
μμμ κ°μ₯ κΈ°λ³Έμ μΈ νΉμ±
- λΆλͺ¨ν΄λμ€μ νλ, λ©μλλ§ μμλλ©°, μμ±μμ μ΄κΈ°ν λΈλ‘μ μμλμ§ μλλ€.
- λΆλͺ¨ ν΄λμ€μ private, defaultλ‘ μ€μ λ λ©€λ²λ μμ ν΄λμ€μμ μμ λ°μ§λ§ μ κ·Όν μλ μλ€.
Animal ν΄λμ€
public class Animal {
String name;
String bark;
public void bark() {
System.out.println(name + ": " + bark);
}
}
Dog ν΄λμ€
public class Dog extends Animal {
// μμ ν΄λμ€μ λ³μ name, barkingμ΄ μ‘΄μ¬
// String name;
// String bark;
// μμ ν΄λμ€μ bark() λ©μλ μ‘΄μ¬
// public void bark() { ... }
public Dog(String name, String bark) {
super(); // μλ° μ»΄νμΌλ¬κ° μλμΌλ‘ μμν΄λμ€μ μμ±μλ₯Ό νΈμΆ!
this.name = name;
this.bark = bark;
}
}
μλ° μ»΄νμΌλ¬μ μν΄ λΆλͺ¨ ν΄λμ€μ μμ±μκ° νΈμΆ λκ² λλ€!
// Main
public static void main(String[] args){
Dog dog1 = new Dog("μ°μμ½κΈ°" , "λ©λ©");
dog1.bark();
}
μ€ν κ²°κ³Ό
μ°μμ½κΈ°: λ©λ©
IS - A κ΄κ³
Dogν΄λμ€λ Animalν΄λμ€λ₯Ό μμλ°μλ€. μ¦, Dogλ Animalμ νμ κ°λ μ΄λΌκ³ ν μ μκ² λ€.
κ°λ λλ¬Όμ΄λ€. (O)
Animal dog = new Dog();
λλ¬Όμ κ°λ€. (X)
Dog dog = new Animal(); // compile error
super ν€μλ
super ν€μλλ λΆλͺ¨ ν΄λμ€λ‘λΆν° μμλ°μ νλλ λ©μλλ₯Ό μμ ν΄λμ€μμ μ°Έμ‘°νλλ° μ¬μ©νλ μ°Έμ‘° λ³μμ΄λ€.
μΈμ€ν΄μ€ λ³μμ μ΄λ¦κ³Ό μ§μ λ³μ μ΄λ¦μ΄ κ°μ κ²½μ° this ν€μλλ‘ κ΅¬λΆν μ μμλλ°,
μ΄μ λ§μ°¬κ°μ§λ‘ λΆλͺ¨ ν΄λμ€μ λ©€λ²μ μμ ν΄λμ€μ λ©€λ² μ΄λ¦μ΄ κ°μ κ²½μ° super ν€μλλ‘ κ΅¬λ³ν μ μλ€.
class Parent{
int a = 10;
}
class Child extends Parent {
int a = 20;
void display() {
System.out.println(a); // Child's a
System.out.println(this.a); // Child's a
System.out.println(super.a); // Parent's a
}
}
public class Main{
public static void main(String[] args){
Child child = new Child();
child.display();
}
}
μ€ν κ²°κ³Ό
20
20
10
super() ν€μλ
class Parent {
int a;
public Parent() {
a = 10;
}
public Parent(int a) {
this.a = a;
}
}
class Child extend Parent {
int b;
public Child() {
// super(); 무쑰건 λΆλͺ¨ν΄λμ€μ κΈ°λ³Έμμ±μκ° νΈμΆλ¨
b = 20;
}
void display() {
System.out.println(a);
System.out.println(b);
}
}
public class Main{
public static void main(String[] args) {
Child child = new Child();
child.display();
}
}
μ€ν κ²°κ³Ό
10
20
κ·Έλ λ€λ©΄ μμ±μκ° λκ°μΈ κ²½μ°μλ μ΄λμ νΈμΆλ κΉ?
public class MyTest {
public class Parent {
public Parent() {
this(10);
System.out.println("parent()");
}
public Parent(int a) {
System.out.println("parent(int)");
}
}
public class Child extends Parent {
public Child() {
this(20);
System.out.println("child()");
}
public Child(int a) {
System.out.println("child(int)");
}
public Child(String a) {
this();
System.out.println("child(string)");
}
}
@Test
void test1() {
Child child1 = new Child();
}
@Test
void test2() {
Child child2 = new Child(10);
}
@Test
void test3() {
Child child3 = new Child("10");
}
}
μ ν μ€νΈμμ test1()λ₯Ό μ€ννμ λ, μΆλ ₯ κ²°κ³Όλ₯Ό νλ² μκ°ν΄λ³΄μ.
μ λ΅μ..
parent(int)
parent()
child(int)
child()
μ΄λ€.
λΆλͺ¨ ν΄λμ€μ μμ±μλ νμ λ§μ§λ§ μμ μμ±μμμ νΈμΆνκ² λλ€.
test1()μ κ²½μ°μλ child(int a) μμ±μμ μλ νλ¦°νΈλ₯Ό μ°κΈ° μ μ super()λ₯Ό νΈμΆν κ²μ΄λ€. μ΄κ²μ μλ°μμ μλμΌλ‘ μΆκ°ν΄μ£Όλ κ²μ΄λ―λ‘ μ°λ¦¬κ° μ΄λ»κ² 컨νΈλ‘€ν μ μλ€.
μ κ·ΈλΌ test2()μ test3()μ μΆλ ₯ κ²°κ³Όλ νλ² μκ°ν΄λ³΄λλ‘ νμ.
test2() κ²°κ³Όλ μλ λ보기 ν΄λ¦
test2() κ²°κ³Ό
parent(int)
parent()
child(int)
test3() κ²°κ³Όλ μλ λ보기 ν΄λ¦
test3() κ²°κ³Ό
parent(int)
parent()
child(int)
child()
child(string)
λ©μλ μ€λ²λΌμ΄λ©
μ€λ² λ‘λ©(overloading)μ΄λ μλ‘ λ€λ₯Έ μκ·Έλμ²λ₯Ό κ°λ μ¬λ¬ λ©μλλ₯Ό κ°μ μ΄λ¦μΌλ‘ μ μνλ κ².
μ€λ² λΌμ΄λ©(overriding)μ΄λ μμ κ΄κ³μ μλ λΆλͺ¨ ν΄λμ€μμ μ΄λ―Έ μ μλ λ©μλλ₯Ό μμ ν΄λμ€μμ κ°μ μκ·Έλμ³λ₯Ό κ°λ λ©μλλ‘ λ€μ μ μνλ κ².
μ€λ²λΌμ΄λ©μ 쑰건
1. μ€λ²λΌμ΄λ©μ΄λ λ©μλμ λμλ§μ μ¬μ μνλ κ²μ΄λ―λ‘, λ©μλμ μ μΈλΆλ κΈ°μ‘΄ λ©μλμ μμ ν κ°μμΌ ν©λλ€.
νμ§λ§ λ©μλμ λ°ν νμ μ λΆλͺ¨ ν΄λμ€μ λ°ν νμ μΌλ‘ νμ λ³νν μ μλ νμ μ΄λΌλ©΄ λ³κ²½ν μ μμ΅λλ€.
2. λΆλͺ¨ ν΄λμ€μ λ©μλλ³΄λ€ μ κ·Ό μ μ΄μλ₯Ό λ μ’μ λ²μλ‘ λ³κ²½ν μ μμ΅λλ€.
3. λΆλͺ¨ ν΄λμ€μ λ©μλλ³΄λ€ λ ν° λ²μμ μμΈλ₯Ό μ μΈν μ μμ΅λλ€.
class Parent {
void display() { System.out.println("λΆλͺ¨ ν΄λμ€μ display() λ©μλμ
λλ€."); }
}
class Child extends Parent {
void display() { System.out.println("μμ ν΄λμ€μ display() λ©μλμ
λλ€."); }
}
public class Inheritance05 {
public static void main(String[] args) {
Parent pa = new Parent();
pa.display();
Child ch = new Child();
ch.display();
Parent pc = new Child();
pc.display(); // = child.display();
}
}
μ€ν κ²°κ³Ό
λΆλͺ¨ ν΄λμ€μ display() λ©μλμ
λλ€.
μμ ν΄λμ€μ display() λ©μλμ
λλ€.
μμ ν΄λμ€μ display() λ©μλμ
λλ€.
λ§μ½ λΆλͺ¨ ν΄λμ€μ λ©μλλ₯Ό μ€λ²λΌμ΄λ© νμ§ μμΌλ©΄ μ΄λ»κ² λ κΉ?
public class MyTest {
public class Parent {
int a = 100;
public Parent() {
this.a = 300;
}
public int getA() {
return a;
}
}
public class Child extends Parent {
int a = 1000;
public Child() {
this.a = 3000;
}
}
@Test
void test() {
Child child = new Child();
System.out.println(child.getA());
}
}
μ ν μ€νΈμ μ€νκ²°κ³Όλ₯Ό νλ² μκ°ν΄λ³΄μ.
μ λ΅μ λ°λ‘..
300
μ μ΄λ° κ²°κ³Όκ° λμμκΉ? λλ μ¬μ€ 3000μ΄λΌκ³ μκ°νμλ€. ν¬ν‘μ£Όλͺ©ν΄μΌν μ μ getA() λ©μλ μ΄λ€. κΈ°λ³Έμ μΌλ‘ λΆλͺ¨ ν΄λμ€μ λ©μλλ₯Ό μ€λ²λΌμ΄λ©νμ§ μλλ€λ©΄ λΆλͺ¨ ν΄λμ€μ λ©μλλ₯Ό νΈμΆνλ κ²κ³Ό κ°λ€.
μ€νκ²°κ³Όλ₯Ό νλ¦μΌλ‘ λνλ΄λ©΄ λ€μκ³Ό κ°λ€.
new Child() νΈμΆ -> super() μμ±μ νΈμΆ! -> parent.a = 300 μ£Όμ
! -> λ€μ childλ‘ λμμμ child.a = 3000 μ£Όμ
!
child.getA() νΈμΆ -> μμ ν΄λμ€μ getA()κ° μμΌλ―λ‘ super.getA() νΈμΆ! -> childμ aκ° μλ, parentμ aλ₯Ό 리ν΄! -> parent.aλ₯Ό μΆλ ₯!
μ΄λ κΈ° λλ¬Έμ 300μ΄λΌλ κ²°κ³Όκ° λμ¨ κ²μ΄λ€.
κ·Έλ λ€λ©΄ 3000 μ΄λΌλ κ²°κ³Όκ° λμ€κ³ μΆμΌλ©΄ μ΄λ»κ² νλ©΄ λ κΉ?
λ€μκ³Ό κ°μ΄ 2κ°μ§ λ°©λ²μ΄ μλ€.
1. getA() μ€λ²λΌμ΄λ©
μμ ν΄λμ€μμ getA()λ₯Ό μ€λ²λΌμ΄λ©νλ κ²μ΄λ€.
2. super() μμ±μ νΈμΆ μ½λ μμ
μμ μμ±μμμ λΆλͺ¨ μμ±μλ₯Ό νΈμΆν λ aμ μ΄κΈ°ν κ°μ ν¨κ» λμ Έμ£Όλ κ²μ΄λ€. κ·Έλ κ² λλ©΄ λΆλͺ¨μ aκ°μλ μ°λ¦¬κ° μνλ 3000μ΄ μ μ₯λ κ²μ΄κ³ , getA()λ₯Ό ν΄λ 3000μ΄ μ°ν κ²μ΄λ€.
λ€μ΄λλ―Ή λ©μλ λμ€ν¨μΉ (Dynamic Method Dispatch)
dispatch
- static dispatch
- dynamic dispatch
staticμ ꡬνν΄λμ€λ₯Ό μ΄μ©ν΄ μ»΄νμΌνμμμλΆν° μ΄λ€ λ©μλκ° νΈμΆλ μ§ μ ν΄μ Έμλκ²μ΄κ³ ,
dynamicμ μΈν°νμ΄μ€λ₯Ό μ΄μ©ν΄ μ°Έμ‘°ν¨μΌλ‘μ νΈμΆλλ λ©μλκ° λμ μΌλ‘ μ ν΄μ§λκ±Έ λ§νλ€.
Static Dispatch
μλ°μμ κ°μ²΄ μμ±μ λ°νμμμ νΈμΆλλ€. μ¦ μ»΄νμΌνμμ μμμλ건 νμ μ λν μ 보μ΄λ€. νμ μμ²΄κ° DispatchλΌλ ꡬνν΄λμ€μ΄κΈ°λλ¬Έμ ν΄λΉ λ©μλλ₯Ό νΈμΆνλ©΄ μ΄λ€ λ©μλκ° νΈμΆλ μ§ μ μ μΌλ‘ μ ν΄μ§λ€. μ΄μλν μ 보λ μ»΄νμΌμ΄ μ’ λ£λ ν λ°μ΄νΈμ½λμλ λλ¬λκ²λλ€.
public class Test {
public static void main(String[] arg) {
Dispatch dispatch = new Dispatch();
System.out.println(dispatch.method());
}
}
class Dispatch{
public String method(){
return "hello dispatch";
}
}
Dynamic Dispatch
μΈν°νμ΄μ€λ₯Ό νμ μΌλ‘ λ©μλλ₯Ό νΈμΆνλ€. μ»΄νμΌλ¬λ νμ μ λν μ 보λ₯Ό μκ³ μμΌλ―λ‘ λ°νμμμ νΈμΆ κ°μ²΄λ₯Ό νμΈν΄ ν΄λΉ κ°μ²΄μ λ©μλλ₯Ό νΈμΆνλ€. λ°νμμμ νΈμΆ κ°μ²΄λ₯Ό μ μ μμΌλ―λ‘ λ°μ΄νΈμ½λμλ μ΄λ€ κ°μ²΄μ λ©μλλ₯Ό νΈμΆν΄μΌνλμ§ λλ¬λμ§ μλλ€.
μμ μ½λμμ method() λ©μλλ μΈμκ° μλ λ©μλμ΄μ§λ§ μλ°λ 묡μμ μΌλ‘ νμ νΈμΆ κ°μ²΄λ₯Ό μΈμλ‘ λ³΄λ΄κ²λλ€. νΈμΆ κ°μ²΄λ₯Ό μΈμλ‘ λ³΄λ΄κΈ°λλ¬Έμ thisλ₯Ό μ΄μ©ν΄ λ©μλ λ΄λΆμμ νΈμΆκ°μ²΄λ₯Ό μ°Έμ‘°ν μ μλ κ²μ΄λ€. λν μ΄κ²μ΄ dynamic dispatchμ κ·Όκ±°κ° λκ²λλ€.
public class Test {
public static void main(String[] arg) {
Dispatchable dispatch = new Dispatch();
System.out.println(dispatch.method());
}
}
class Dispatch implements Dispatchable {
public String method(){
return "hello dispatch";
}
}
interface Dispatchable{
String method();
}
μΆμ ν΄λμ€
μΆμ λ©μλ(abstract method)λ μμ ν΄λμ€μμ λ°λμ μ€λ²λΌμ΄λ©ν΄μΌλ§ μ¬μ©ν μ μλ λ©μλλ₯Ό μλ―Έν©λλ€.
곡ν΅μ μΈ λΆλΆμ 미리 λ€ λ§λ€μ΄λκ³ , κ·Έ λΆλΆμ μ¬μ μν¨μΌλ‘μ¨ μμ°μ± ν₯μλλ μ₯μ μ΄ μμ΅λλ€.
μ΄λ¬ν μΆμ λ©μλλ μ μΈλΆλ§ μ‘΄μ¬νλ©°, ꡬνλΆλ μμ±λμ΄ μμ§ μλ€.
abstract λ°ννμ
λ©μλμ΄λ¦(); // μ μΈλΆλ§ μκ³ , ꡬνλΆλ μλ€λ μλ―Έλ‘ μΈλ―Έμ½λ‘ (;)
νλ μ΄μμ μΆμ λ©μλλ₯Ό ν¬ν¨νλ ν΄λμ€λ₯Ό μΆμ ν΄λμ€λΌκ³ νλ€.
abstract class Animal{
abstract void cry();
}
class Dog extends Animal {
void cry() {
System.out.println("λ©λ©");
}
}
class Cat extends Animal {
void cry() {
System.out.println("λμΉ");
}
}
public clas Main {
public static void main(String[] args){
Animal ani = new Animal(); // μΆμ ν΄λμ€λ μΈμ€ν΄μ€ μμ± X
Dog dog = new Dog();
Cat cat = new Cat();
dog.cry();
cat.cry();
}
}
λ©λ©
λμΉ
final ν€μλ
μλ°μμ final ν€μλλ μ¬λ¬ 컨ν μ€νΈμμ λ¨ νλ²λ§ ν λΉλ μ μλ entityλ₯Ό μ μν λ μ¬μ© λ©λλ€.
μμ νμ
public class Test_Final {
final int x = 1;
x = 3; // λ³κ²½ν μ μλ μμκ°μ΄ λλ€.
}
κ°μ²΄ νμ
public class Main{
final Member member = new Member();
member = new Member(); // λ€λ₯Έ κ°μ²΄λ‘ λ³κ²½ λΆκ°!
member.setName("another name"); // νλ λ³κ²½μ κ°λ₯
}
λ©μλ μΈμ
public class Main {
public void setName(final String name){
name = "another name"; // final μΈμλ λ©μλ λ΄μμ λ³κ²½ λΆκ°
}
}
Final λ©μλ
final ν€μλλ‘ μ μΈλ λ©μλλ μ€λ²λΌμ΄λ© λΆκ°!
class Animal {
final void bark() {
}
}
class Dog extends Animal {
void bark() {
// finalλ‘ μ μΈλ λ©μλλ overriding λΆκ°!
}
}
Final ν΄λμ€
public final class Animal { }
// final ν΄λμ€λ μμν μ μλ€!
class Dog extends Animal { }
Object ν΄λμ€
μλ°μμ Object ν΄λμ€λ λͺ¨λ ν΄λμ€μ λΆλͺ¨ ν΄λμ€κ° λλ ν΄λμ€μ λλ€.
λ°λΌμ μλ°μ λͺ¨λ ν΄λμ€λ μλμΌλ‘ Object ν΄λμ€μ λͺ¨λ νλμ λ©μλλ₯Ό μμλ°κ² λ©λλ€.
μ¦, μλ°μ λͺ¨λ ν΄λμ€λ λ³λλ‘ extends ν€μλλ₯Ό μ¬μ©νμ¬ Object ν΄λμ€μ μμμ λͺ μνμ§ μμλ Object ν΄λμ€μ λͺ¨λ λ©€λ²λ₯Ό μμ λ‘κ² μ¬μ©ν μ μμ΅λλ€.
μλ°μ λͺ¨λ κ°μ²΄μμ toString()μ΄λ clone()κ³Ό κ°μ λ©μλλ₯Ό λ°λ‘ μ¬μ©ν μ μλ μ΄μ κ° ν΄λΉ λ©μλλ€μ΄ Object ν΄λμ€μ λ©μλμ΄κΈ° λλ¬Έμ λλ€.
toString() λ©μλ
toString() λ©μλλ ν΄λΉ μΈμ€ν΄μ€μ λν μ 보λ₯Ό λ¬Έμμ΄λ‘ λ°νν©λλ€.
μ΄λ λ°νλλ λ¬Έμμ΄μ ν΄λμ€ μ΄λ¦κ³Ό ν¨κ» ꡬλΆμλ‘ '@'κ° μ¬μ©λλ©°, κ·Έ λ€λ‘ 16μ§μ ν΄μ μ½λ(hash code)κ° μΆκ°λ©λλ€.
16μ§μ ν΄μ μ½λ κ°μ μΈμ€ν΄μ€μ μ£Όμλ₯Ό κ°λ¦¬ν€λ κ°μΌλ‘, μΈμ€ν΄μ€λ§λ€ λͺ¨λ λ€λ₯΄κ² λ°νλ©λλ€.
class Member {
}
public class Main {
Member member = new Member();
Member member2 = new Member();
System.out.println(member);
System.out.println(member2);
}
Member@15db9742
Member@6d06d69c
Object λ©μλ
λ©μλ | μ€λͺ |
protected Object clone() | ν΄λΉ κ°μ²΄μ 볡μ λ³Έμ μμ±νμ¬ λ°νν¨. |
boolean equals(Object obj) | ν΄λΉ κ°μ²΄μ μ λ¬λ°μ κ°μ²΄κ° κ°μμ§ μ¬λΆλ₯Ό λ°νν¨. |
protected void finalize() | ν΄λΉ κ°μ²΄λ₯Ό λλ μ무λ μ°Έμ‘°νμ§ μμ κ°λΉμ§ 컬λ ν°κ° κ°μ²΄μ 리μμ€λ₯Ό μ 리νκΈ° μν΄ νΈμΆν¨. |
Class<T> getClass() | ν΄λΉ κ°μ²΄μ ν΄λμ€ νμ μ λ°νν¨. |
int hashCode() | ν΄λΉ κ°μ²΄μ ν΄μ μ½λκ°μ λ°νν¨. |
void notify() | ν΄λΉ κ°μ²΄μ λκΈ°(wait)νκ³ μλ νλμ μ€λ λλ₯Ό λ€μ μ€νν λ νΈμΆν¨. |
void notifyAll() | ν΄λΉ κ°μ²΄μ λκΈ°(wait)νκ³ μλ λͺ¨λ μ€λ λλ₯Ό λ€μ μ€νν λ νΈμΆν¨. |
String toString() | ν΄λΉ κ°μ²΄μ μ 보λ₯Ό λ¬Έμμ΄λ‘ λ°νν¨. |
void wait() | ν΄λΉ κ°μ²΄μ λ€λ₯Έ μ€λ λκ° notify()λ notifyAll() λ©μλλ₯Ό μ€νν λκΉμ§ νμ¬ μ€λ λλ₯Ό μΌμμ μΌλ‘ λκΈ°(wait)μν¬ λ νΈμΆν¨. |
void wait(long timeout) | ν΄λΉ κ°μ²΄μ λ€λ₯Έ μ€λ λκ° notify()λ notifyAll() λ©μλλ₯Ό μ€ννκ±°λ μ λ¬λ°μ μκ°μ΄ μ§λ λκΉμ§ νμ¬ μ€λ λλ₯Ό μΌμμ μΌλ‘ λκΈ°(wait)μν¬ λ νΈμΆν¨. |
void wait(long timeout, int nanos) | ν΄λΉ κ°μ²΄μ λ€λ₯Έ μ€λ λκ° notify()λ notifyAll() λ©μλλ₯Ό μ€ννκ±°λ μ λ¬λ°μ μκ°μ΄ μ§λκ±°λ λ€λ₯Έ μ€λ λκ° νμ¬ μ€λ λλ₯Ό μΈν°λ½νΈ(interrupt) ν λκΉμ§ νμ¬ μ€λ λλ₯Ό μΌμμ μΌλ‘ λκΈ°(wait)μν¬ λ νΈμΆν¨. |
REFERENCES
https://multifrontgarden.tistory.com/133
www.tcpschool.com/java/java_inheritance_super