1. ์์
1) ๊ฐ๋
- ๋ถ๋ชจํด๋์ค์ ๋ฉค๋ฒ ๋ณ์, ๋ฉค๋ฒ ๋ฉ์๋๋ฅผ ์์ ํด๋์ค๊ฐ ์์ ๋ฐ์ ์ฌ์ฉ
- ํด๋์ค ์ฌ์ฌ์ฉ => ์ค๋ณต ์ฝ๋ ์ค์ฌ์ ํจ์จ์ฑ ์ฆ๋
2) ํน์ง
- '์์ํด๋์ค extends ๋ถ๋ชจํด๋์ค' ํ์์ผ๋ก ์์
- ํ ๋ฒ์ ํ๋์ ๋ถ๋ชจ ํด๋์ค๋ง ์์ ๋ฐ์ ์ ์์.
=> C extends A, B (x)
=> C extends B , B extends A (o)
- private ์ ๊ทผ ์ ํ์ ๊ฐ๋ ๋ฉค๋ฒ ๋ณ์ ๋ฐ ๋ฉ์๋๋ ์ง์ ์ฌ์ฉ์ด ๋ถ๊ฐ
=> ๊ทธ๋ผ ์ด๋ป๊ฒ ์ฌ์ฉํ๋? getter, setter ์ฌ์ฉ
3) ์์ ๊ด๋ จ ํค์๋
- extends ์์ ๋ฐ์ ๋ ํด๋์ค๋ช ์์ ์ฌ์ฉ
- super ์์ ํด๋์ค์์ ๋ถ๋ชจ๋ฅผ ๋ช ์์ ์ผ๋ก ์ฌ์ฉํ๊ณ ์ ํ ๋ ์ฌ์ฉ
=> ๋ถ๋ชจ์ ์์ฑ์, ๋ฉ์๋, ๋ฉค๋ฒ ๋ณ์๋ฅผ ์ง์ ๊ฐ๋ฅ
- this ์์ ์ ํด๋์ค์ ์ ์ธ๋ ๋ฉค๋ฒ ๋ณ์, ๋ฉ์๋ ์ง์นญ
2. ์์ฑ์
1) ๊ฐ๋
- ์ธ์คํด์ค๊ฐ ํธ์ถ ๋ ๋ ๊ฐ์ฅ ๋จผ์ ํธ์ถ๋๋ ๋ฉ์๋
- ๋ฉค๋ฒ๋ณ์ ๊ฐ์ ์ด๊ธฐํ
2) ํน์ง
- ์ธ์คํด์ค ์์ฑ์ ์ด๊ธฐ๊ฐ ์ง์
- ์๋ฐ์์ ์์ฑ์๋ ํด๋์ค์ ์ด๋ฆ๊ณผ ๊ฐ๋ค
- ์์ฑ์๋ ์ธ์๋ฅผ ๋ฌ๋ฆฌํ์ฌ ์ฌ๋ฌ ๊ฐ ๊ฐ์ง ์ ์๋ค
- ์์ ๊ด๊ณ์ ์์ ๋ ์์ฑ์๋ ๋ถ๋ชจ์ ์์ฑ์ ๋จผ์ ํธ์ถ
(๋ถ๋ชจ์ ์์ฑ์๋ฅผ ๋ช ์์ ์ผ๋ก ํธ์ถํ์ง ์์ ๊ฒฝ์ฐ, ๋ฌต์์ ์ผ๋ก ๋ถ๋ชจ์ ์ธ์ ์๋ ์์ฑ์ ํธ์ถ)
- ๋ถ๋ชจ์ ์์ฑ์๋ฅผ ๋ช ์์ ์ผ๋ก ํธ์ถํ๊ธฐ ์ํด super ํค์๋ ์ฌ์ฉ.
- super.getX(), super.a
[์์์ฝ๋ 1] ์์ ๊ธฐ๋ณธ ์์
class Subject1 {
protected int a = 1000;
public int fun1() {
return a;
}
}
class Subject2 extends Subject1 {
private int b = 5;
public int fun2() {
return a/b;
}
}
class Example {
public static void main(String[] args) {
Subject2 sub = new Subject2();
System.out.println( sub.fun1() );
System.out.println( sub.fun2() );
}
}
1000
200
์ฝ๋๋ main ์์ญ์์๋ถํฐ ์ฝ๋๋ค
ํ์ฌ Subject2 ๊ฐ Subject1์ ์์๋ฐ์ ์ํฉ์ด๋ค.
main ์์ญ์์ Subject2 ํ์ ์ ์ธ์คํด์ค sub์ ์์ฑํ๊ณ Subject2์ ์์ฑ์๋ฅผ ํ์ ๋ค.
Subject2 ํด๋์ค์์๋ superํค์๋๋ฅผ ์ฐพ์ ๋ณผ ์ ์๊ธฐ ๋๋ฌธ์ ๋ถ๋ชจ์ ์์ฑ์๋ฅผ ๋ช ์์ ํธ์ถ ํ๊ณ ์์ง ์๋ค.
์ผ๋จ ๋ถ๋ชจ ํด๋์ค์ ๋จผ์ ์ฌ๋ผ๊ฐ์ ๋ฉค๋ฒ๋ณ์ a๋ฅผ ํ ๋นํ๊ณ 1000 ๊ฐ์ ๊ฐ์ง๋ค
๋ํ Subject2 ์์๋ privateํ ์ ์ ๋ณ์ b๋ฅผ ์ ์ธํ๊ณ 5๊ฐ์ ์ง์ด ๋ฃ๋๋ค
์ดํ sub ์ธ์คํด์ค๊ฐ ๊ฐ์ง fun1๋ฅผ ํธ์ถํ๋ฉด ์์์ fun1 ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์์ง ์๊ธฐ ๋๋ฌธ์
๋ถ๋ชจ ํด๋์ค์ fun1 ๋ฉ์๋๊ฐ ์ํ๋์ด ๊ทธ ๊ณต๊ฐ์ ์๋ a๊ฐ 1000์ด ๋ฆฌํด๋๊ณ ,
์ดํ ๋ด๊ฐ ๊ฐ์ง fun2 ๋ฉ์๋๋ฅผ ์ํํ๊ฒ ๋๋๋ฐ ์ด ๋ a๊ฐ์ ๋ถ๋ชจ์ ๋ฉค๋ฒ๋ณ์๋ฅผ ์ฐธ์กฐํด์ 1000/5๋ฅผ ์ํํ์ฌ 200 ๋ฆฌํด
[์์์ฝ๋ 2] ๋ณ์ ์ด๋ฆ์ด ๋์ผํ ์ํฉ (๋ณ์์ ์ ํจ ๋ฒ์)
class Parent {
public int a = 1000;
public int fun1() {
return a;
}
}
class Child extends Parent {
public int a = 500;
public int fun2() {
return a;
}
}
class Example {
public static void main(String[] args) {
Child c1 = new Child();
System.out.print( c1.fun1() + "," );
System.out.print( c1.fun2() + "," );
c1.a = 300;
System.out.print( c1.fun1() + "," );
System.out.print( c1.fun2() );
Parent p2 = new Child();
p2.a = 700;
System.out.print(p2.a + "," );
System.out.print(c1.a);
}
}
1000, 500, 1000, 3000
700, 300
Child๋ผ๋ ํด๋์ค๊ฐ Parent ํด๋์ค๋ฅผ ์์ ๋ฐ๊ณ ์๋ ์ํฉ
์ฌ๊ธฐ์ ๋ถ๋ชจ์ ๋ฉค๋ฒ๋ณ์๋ a ์ด๊ณ ์์์ ๋ฉค๋ฒ๋ณ์๋ a
์๋ก ์ด๋ฆ์ด ๋์ผํ ๋ฉค๋ฒ ๋ณ์๋ฅผ ๊ฐ์ง ๋ main ์์ญ์์ ํธ์ถ๋๋ a๊ฐ ์ด๋ค ๊ฐ์ ๊ฐ๋ฆฌํค๋์ง ์์ ๋ณด๋ ๋ฌธ์
main ์์ญ์ 2๊ฐ์ ์ธ์คํด์ค ์์ฑ
Child c1 = new Child();
๋ณ์์ ํ์ ๋ Child, ๊ฐ์ฒด์ ํด๋์ค๋ Child();
์ด ์ฝ๋๋ "Child" ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ "Child" ํ์ ์ ๋ณ์ c1 ์ ํ ๋นํ๊ฒ ๋ค๋ ๋ป
๋ฐ๋ฉด Parent ํ์ ๋ณ์ p2 => ๋ถ๋ชจ๊ฐ ๋ ๋ณ์ ํํ๋ก
"Child" ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ผ๋ "Parent" ํ์ ์ ๋ณ์ p2์ ํ ๋นํ๊ฒ ๋ค๋ ๋ป
c1 ์ด ์์ฑ๋๋ฉด ์์์ด ์์๋ฐ๊ณ ์๋ ๋ถ๋ชจ์ ํด๋์ค๋ก ๋จผ์ ์ฌ๋ผ๊ฐ ๋ถ๋ชจ์ ๋ฉค๋ฒ ๋ณ์๋ฅผ ์์ฑํด ์ค๋ค
P.a 1000
C.a 500
์ธ์คํด์ค๋ ์ด ๋๊ฐ์ ๋ณ์๋ฅผ ๊ฐ์ง๊ณ
c1. fun1() ๊ณผ fun2() ์ ๋ฉ์๋๋ฅผ ์ํํ์ฌ 1000, 500 ์ ๋ฆฌํดํ๊ฒ ๋๋ค.
์ด ๋ฌธ์ ์์ ๋ฉ์๋๋ช ์ ์๋ก ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ค๋ฒ๋ผ์ด๋ฉ์ด ๋ฌธ์ ๋์ง๋ ์๋๋ค.
๊ทธ๋ฅ ์์ํํ ์๋ ๋ฉ์๋๋ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ถ๋ชจ์๊ฒ ์ฌ๋ผ๊ฐ์ ์ํํ๋ฉด ๋๋ค.
๊ทธ๋ฆฌ๊ณ c1.a ์ 300์ ๋์ ํด์ฃผ๋๋ฐ ์ฌ๊ธฐ์ ๊ฐ๋ฆฌํค๋ a๋ ๋์ a์ด๋ค
์ด๋ป๊ฒ ์ ์ ์๋๊ฐ?
Child c1 = new Child(); ์์ ์์ ์๋ ํ์ ๋ฐ๋ผ๊ฐ๋ค.
๊ทธ๋์ Child ๊ฐ ๊ฐ์ง 500์ 300๊ฐ์ ๋ฃ์ด์ฃผ๋ ๊ฒ
๋ฐ๋ฉด p2.a = 700 ์ด๋ผ๋ ์ฝ๋๋ ๋ถ๋ชจ์ ๋ฉค๋ฒ๋ณ์ a๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
์? Parent p2 = new Child(); ๋ผ์...
์์ Parent ํ์ ์ผ๋ก ์ ์ธ๋ ๋ณ์์. ๋ค์ Child ์์ด๋ ์๋ฌด ์๋ฏธ ์๋ค.
[์์์ฝ๋ 3] ๋ถ๋ชจ, ์์์ ๋ฉ์๋๋ช ์ด ๋์ผ- ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ @Override
์ค์ ๋ก ์ฝ๋ฉ์ ํ๊ฒ ๋๋ฉด ๋ณดํต์ ์ค๋ฒ๋ผ์ด๋ ํค์๋ ๋ถ์ฌ ์ฃผ๋๋ฐ ์ฌ๊ธฐ์๋ ๊ทธ๋ฅ ์ฝ๋ ์จ ๋ณด๊ฒ ๋ค
๋ํ ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ๊ณผ ๋น๊ต๋๋ ๊ฐ๋ ์ธ ์ค๋ฒ๋ก๋ฉ, ํ์ด๋ฉ ๊ฐ๋ ์ ๋ค์ ํฌ์คํ ์์ ์์ฑํ๊ฒ ์
์๋ ์ฝ๋๋ Animal ํด๋์ค๋ฅผ ์์๋ฐ์ Cat ์์ displayInfo() ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฒฝ์ฐ
Animal, Cat ์ด ํด๋น ๋ฉ์๋๋ฅผ ๋ ๋ค ๊ฐ์ง๊ณ ์์ ๋ ๋๊ตฌ์ ๋ฉ์๋๊ฐ ์ํ๋๋๋ ํ๋ ๋ฌธ์
class Animal {
public String name = "Animal";
public int legCount = 4;
public void displayInfo() {
System.out.println("Name: " + name + ", Legs: " + legCount);
}
}
class Cat extends Animal {
public String name = "Cat";
public void displayInfo() {
System.out.println("Cat's name:" + this.name);
System.out.println("Animal's name: " + super.name + ", Legs: " + this.legCount
}
}
class Example {
public static void main(String[] args) {
Cat cat - new Cat();
cat.displayInfo();
}
}
Cat's name: Cat
Animal's name: Animal, Legs: 4
์ด ๋ฌธ์ ๋ ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ ๋ฌธ์ ์ธ๋ฐ
์๋ฒ์ง์ ๋ด๊ฐ ๋์ผํ ์ด๋ฆ๊ณผ ๋งค๊ฐ๋ณ์์ ๋ฉ์๋๋ฅผ ๊ฐ์ง ๋ ๋ฌธ์ ๋จ
์ค๋ฒ๋ผ์ด๋ฉ = ์ฌ์ ์(์ฆ ์ฌ์ ์๋ ์์์ ๋ฉ์ธ๋ ๋ฉ์๋๊ฐ ์ํ๋จ)
์ค๋ฒ๋ก๋ฉ = ์ค๋ณต์ ์(๊ธฐ๋ฅ์ ๋น์ทํ๋ฐ ๋งค๊ฐ๋ณ์ ํ์ ์ด๋ ๊ฐฏ์๋ง ๋ค๋ฅธ ๋ฉ์๋)
์๋ฒ์ง๊ฐ ๋ ๋ณ์ ํํ๋ , ์์์ด ๋ ๋ณ์ ํํ๋ ,
์ค์ํ ๊ฑด ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ์ ํ๋ฉด
์๋ฒ์ง์ฒ๋ผ ์ด๊ธฐ ์ซ์ด์!! ๋ง ๊ธฐ์ตํ๋ฉด ๋๋ค.
์ฆ, ์์์ด ๊ฐ์ง ๋ฉ์๋๊ฐ ์ํ๋๋ค
Cat a = new Cat();
Animal b = new Cat(); ์ด๋ ๋ชจ๋ ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ์ด๋ฉด ์์ ๋ฉ์๋๊ฐ ์ํ
ํด๋น ๋ฌธ์ ์์ thisํค์๋๋ ์์ ๋ณธ์ธ์ด ๊ฐ์ง name์ ๋งํจ
์์ด๋ก๋ self ๊ฐ๋ ์ผ๋ก
this.name
this = self ๋, ๋ด๊ฐ
. = . ์ ํด๋์ค๋ ์ด๋ค ๊ณต๊ฐ์ '์ ๊ทผํ์ฌ' ๋๋ ์ด๋ค ํด๋์ค๊ฐ '๊ฐ์ง' ์ด๋ผ๋ ๋ป
name = ๋ณ์๋ช
[์์์ฝ๋ 4] ์๋ฒ์ง๊ฐ ๋ ๋ณ์ ํํ์์ ์์์ ๋ฉ์๋ ์ฌ์ฉ ๋ถ๊ฐ
์๋ ์ฝ๋๋ ์๋ฒ์ง๊ฐ ๋ ๋ณ์ ํํ์์
์๋ฒ์ง์๊ฒ๋ ์๋๋ฐ ์์๋ง์ด ๊ฐ์ง ๋ฉ์๋๋ฅผ ํ์ฉํ ์ ์๋๊ฐ ๋ฌธ์
๋ต์ X
class Parent {
protected int a = 1000;
public int fun1() {
return a;
}
}
class Child extends Parent {
private int b = 5;
public int fun2() {
return a/b;
}
}
class Example {
public static void main(String[] args) {
Child c1 = new Child();
Parent p2 = new Child();
System.out.println( c1.fun1() ); // 1
System.out.println( c1.fun2() ); // 2
System.out.println( p1.fun1() ); // 3
System.out.println( p1.fun2() ); // 4
}
}
์๋ 1-4 ์ค ์ค๋ฅ ๋๋ ๊ฒ์ 4๋ฒ
์ ? Parent p1 = new Child();
์๋ฒ์ง๊ฐ ์์์ ๋ณ์๊ธฐ ๋๋ฌธ์ ์์๋ง ๊ฐ์ง๊ณ ์๋ ๋ฉ์๋๋ ์๋ฒ์ง๊ฐ ์ฌ์ฉ ๋ถ๊ฐ
๋ฐ๋๋ก ์์์ ์๋ฒ์ง์ ๋ฉ์๋, ๋์ ๋ฉ์๋ ๋ชจ๋ ์ฌ์ฉ ๊ฐ๋ฅ
์ฆ, ์์์ด ๊ฐ์ง์ง ์์ ๋ฉ์๋๋ ์๋ฒ์ง๊ฐ ๊ฐ์ก๋ค๋ฉด ์ฌ์ฉ ๊ฐ๋ฅ...
์๋ฌ๋๋ ์ด์
1. ํ์ ์ ํ
p1 ์ Parent ํด๋์คํ์ ์ ๋ณ์. ์ด ๋ณ์๋ Child์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ณ ์์ง๋ง ๋ณ์์ ํ์ ์ด Parent์ด๊ธฐ ๋๋ฌธ์ Parent ํด๋์ค์ ์ ์๋ ๊ฐ์ฒด๋ง ์ฌ์ฉ ๊ฐ๋ฅ, ๋ฐ๋ผ์ fun2()๋ Child ํด๋์ค์๋ง ์ ์๋์ด ์์ผ๋ฏ๋ก p1์ ํตํด ํธ์ถ ๋ถ๊ฐ
2. ์ปดํ์ผ ํ์ ์ฒดํฌ
์ปดํ์ผ๋ฌ๋ p1์ ํ์ ์ด Parent์ด๊ธฐ ๋๋ฌธ์ fun2() ๋ฉ์๋ ์ฐพ์ ์ ์๊ณ ๋ฐ๋ผ์ ์ค๋ฅ ๋จ
์ด๋ฌํ ๊ฒฝ์ฐ fun2()์ฌ์ฉํ๋ ค๋ฉด?
p1์ Childํ์ ์ผ๋ก ์บ์คํ ํด์ผ ํจ
Child c1 = (Child) p1;
c1.fun2();
์ด๋ ๊ฒ ํ๋ฉด ๊ฐ๋ฅ
์?
์ค์ ๋ก p1์ด Childํ์ ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ณ ์๊ธฐ ๋๋ฌธ์
ํ์ง๋ง ์บ์คํ ํ ๋๋ ํญ์ ํด๋น ๊ฐ์ฒด๊ฐ ์ค์ ๋ก Childํ์ ์ธ์ง ํ์ธํด์ผ ํจ
๊ทธ๋ ์ง ์์ผ๋ฉด? ClassCastException ๋ฐ์ํ ์ ์์.
[์์์ฝ๋ 5] ๋ถ๋ชจ์ ์ธ์ ์๋ ์์ฑ์ ํธ์ถ
class A {
int a;
A() {
this.a = 1;
}
A(int a) {
this.a = a;
}
void display() {
System.out.println("a="+a);
}
}
class B extends A {
B(int a) {
super.display();
}
}
public class Main {
public static void main(String[] args) {
B obj = new B(10);
}
}
a=1
B๋ A๋ฅผ ์์ ๋ฐ์
Main ์์ B ํ์ ๋ณ์์ B ๋ฅผ ์ฐธ์กฐํ๋ ๊ฐ์ฒด ์์ฑํ์๊ณ 10์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ
๋ถ๋ชจ์ ๋ฉค๋ฒ๋ณ์ int a ์์ฑ
์์์ ๋ฉค๋ฒ๋ณ์๋ ์์
์ด ๋ ์์์ ์์ฑ์๋ฅผ ํ์ ์ด๋ ๋ถ๋ชจ์ ์์ฑ์ ๋จผ์ ์ํํด์ผ ํจ.
๋ฌต์์ ์ผ๋ก ๋ถ๋ชจ๋ฅผ ํธ์ถ ์ ํ ๊ฒฝ์ฐ ๋ถ๋ชจ์ ์ธ์ ์๋ ์์ฑ์๋ฅผ ํธ์ถํ๋ค
ํ์ฌ B(int a) ์์ super.display() ๊ฐ ์๋ค๊ณ ํด์ ๋ถ๋ชจ์ ์์ฑ์๋ฅผ ํธ์ถํ๋ค๊ณ ์ฐฉ๊ฐํ๋ฉด ์๋จ
์ด๊ฑด ๋ถ๋ชจ์ ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฒ์ด์ง ์์ฑ์๋ฅผ ํธ์ถํ ๊ฒ ์๋
๊ทธ๋์ ๊ฒฐ๊ตญ ๋ถ๋ชจ์ ์ธ์ ์๋์์ฑ์์ธ A() ๊ฐ ํธ์ถ๋ ํ, ์์์ ์ธ์ ์๋ ์์ฑ์๊ฐ ํธ์ถ๋์ด ์ธ์๊ฐ 10์ผ๋ก ์ฐ์ฐ์ด ์ด๋ฃจ์ด์ง
์ฆ, A() ๋จผ์ ํธ์ถ๋์ด this.a์ 1์ด ๋ด๊ธด ํ, B()์ ์์ฑ์๊ฐ ํธ์ถ๋๋ฉฐ
System.out.println("a="+a);๊ฐ ์์ฑ๋จ
์ฌ๊ธฐ์์ a๋ ๋ถ๋ชจ์ a๋ฅผ ๋งํ๋ค. ๊ทธ๋์ a=1 ๊ฐ์ด ์ถ๋ ฅ๋จ.
์? ๋ถ๋ชจ์ ๋ฉ์๋๊ฐ ์ํ๋๋ ๊ณต๊ฐ์ a๋ ๋ถ๋ชจ์ a์ด๊ธฐ ๋๋ฌธ..
์์์ ์ธ์ ์๋ ์์ฑ์์ ๋งค๊ฐ๋ณ์๋ก ๋ค์ด๊ฐ a๋ฅผ ๋งํ๋๊ฒ ์๋<<<
a=10 ์ด๋ผ ์๊ฐํ๋ฉด ํ๋ฆฌ๋ ๊ฑฐ..