< ์ด์ ์ ๋ฆฌ ๊ธ - ์์ฃผ ํจ๊ป ์ฐ์ด๋ static๊ณผ final >
Java ๊ธฐ๋ณธ ์ฉ์ด ์ ๋ฆฌ - ๐ง ์์ฃผ ํจ๊ป ์ฐ์ด๋ static๊ณผ final
๊ธฐ๋ณธ ์ฉ์ด ์ ๋ฆฌ - ๐ง ์ธ์คํด์ค, ์์ฑ์ ๊ทธ๋ฆฌ๊ณ ๋งค๊ฐ๋ณ์(Parameter)์ ์ธ์(Argument)์ ์ฐจ์ด๊ธฐ๋ณธ ์ฉ์ด ์ ๋ฆฌ - ๐ง ๋ณ์๋?๐ชฝ"ํ๋ฆฐ ๋ด์ฉ์ด ์์ ์ ์์ต๋๋ค." โบ ๋ณ์๋ณ์๋, ํ๋ก๊ทธ๋๋ฐ์์ ๊ฐ
post-this.tistory.com
< ์๋ฐ ์์ ์ ๋ณต_ 10์ฅ ํด๋์ค์ ์์๊ณผ ๋คํฅ์ฑ >
[Java] ์๋ฐ ์์ ์ ๋ณต_ 10์ฅ ํด๋์ค์ ์์๊ณผ ๋คํ์ฑ (2)
๐ ์ฑ ์๊ฐํ๊ธฐ๋ด๊ฐ ์ฌ์ฉํ ์๋ฐ์์ ์ ๋ณต ์ฑ ๋งํฌ!ใด ๊น๋ํ ์ง์, ์ด์ง์คํผ๋ธ๋ฆฌ์ฑ ์ด ์ฑ ์ ๊ณ ๋ฅด๊ฒ ๋ ์ด์ ๋ ์น๊ตฌ์ ์ถ์ฒ์ด์๋ค. ๊ต์ฅํ ๊ผผ๊ผผํ๊ฒ ์ ํ์์ด ์ดํดํ๊ธฐ ์ฝ๋ค๋ ์ด์ ๋ก
post-this.tistory.com
๐ชฝ
"ํ๋ฆฐ ๋ด์ฉ์ด ์์ ์ ์์ต๋๋ค."
1. ๊ธฐ๋ณธ์ ์ธ ์ค๋ฒ๋ผ์ด๋ฉ
class A {
void print() {
System.out.println("A ํด๋์ค")
}
}
class B extends A {
@Override
void print() {
System.out.println("B ํด๋์ค")
}
}
public class MethodOverrideing_1 {
public static void main(String[] args) {
A aa = new A();
aa.print();
B bb = new B();
bb.print();
A ab = new B();
ab.print();
}
}
์ด ์ฝ๋๋ '์๋ฐ ์์ ์ ๋ณต'์ ์ฝ๋๋ค. ์ ์ ๋ฐฐ์ ๋๊ฑธ ๋ณต์ตํด๋ณด์๋ฉด, A aa = new A( );๋ A ํด๋์ค์ ์์ฑ์์ด์ A ํ์ ์ด๋ค. aa.print( )๋ฅผ ์คํํ๋ฉด A ํด๋์ค์ ์๋ print ๋ฉ์๋๊ฐ ์คํ๋๋ค.
๊ทธ ๋ค์ A ๊ฐ์ฒด๊ฐ ์์ฑ๋ ํ B bb = new B( );๊ฐ ์์ฑ๋๋ ๋ฉ์๋ ์์ญ์ ์ ์ฅ๋ A์ print ๋ฉ์๋๋ฅผ ๋ฎ๊ณ B์ print ๋ฉ์๋๊ฐ ์ฌ๋ผํ๊ฒ ๋๋ค. ๊ทธ๋ฌ๋ bb.print( )๊ฐ ์คํ๋๋ฉด "B ํด๋์ค"๊ฐ ์ถ๋ ฅ๋๋ค.
์ด์ A ab = new B( );๋ฅผ ์ดํด๋ณด์. ํด๋น ์ฝ๋๋ A ํ์ ์ ์ฐธ์กฐ ๋ณ์ ํ์ ์ ๊ฐ์ง๊ณ ์๋ค. ๊ทธ๋ ๋ค๋ ๋ง์ ab.print( )๋ "A ํด๋์ค"๊ฐ ์ถ๋ ฅ๋์ผํ๋ค๋ ๊ฒ์ด๋ค. ํ์ง๋ง ์๊น ์์ ์ฝ๋์์ ์ด๋ฏธ B bb = new B( );๋ก A ๊ฐ์ฒด๊ฐ ๊ฐ๋ฆฌํค๋ print ๋ฉ์๋๊ฐ B ํด๋์ค์ print( ) ๋ฉ์๋๋ก ์ค๋ฒ๋ผ์ด๋ฉ์ด ๋์๋ค. A ab = new B( );๋ B์ print( )๊ฐ ์คํ๋๊ณ "B ํด๋์ค"๊ฐ ์ถ๋ ฅ๋๋ค.
2. ์ ์บ์คํ ๊ณผ ๋ค์ด์บ์คํ
class A {
void print() {
System.out.println("A ํด๋์ค");
}
}
class B extends A {
@Override
void print() {
System.out.println("B ํด๋์ค");
}
void printB() {
System.out.println("B์๋ง ์๋ ๋ฉ์๋");
}
}
public class MethodOverrideing_1 {
public static void main(String[] args) {
A aa = new A();
B bb = new B();
A ab = new B();
ab.print();
// ab.printB();
B b2 = (B) ab;
b2.printB();
}
}
์ ์บ์คํ ์ ์๊น ๊ธฐ๋ณธ ์ค๋ฒ๋ผ์ด๋ฉ์์ ํ๋ค. A ab = new B( );๊ฐ ์ ์บ์คํ ํ ์ผ์ด์ค๋ค. ์ ์บ์คํ ์ด๋, ์์ ํด๋์ค(B ํด๋์ค)๊ฐ ๋ถ๋ชจ ํด๋์ค(A ํด๋์ค) ํ์ ์ผ๋ก ์ฐธ์กฐํ๋ ๊ฒ์ ์๋ฏธํ๋ค. ์ฝ๊ฒ ์ค๋ช ํ์๋ฉด, B ํด๋์ค๋ฅผ ์ธ์คํด์ค๋ก ๊ฐ์ ธ๋ B ํด๋์ค์ ์๋ ๋ชจ๋ ๋ฉ์๋์ ํ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋๋ผ ๊ฒฐ๊ตญ ํ์ ์ A์ด๊ธฐ์ A ํด๋์ค์ ์๋ ๋ฉ์๋์ ํ๋๋ง ์ฌ์ฉํ ์ ์๋ค๊ณ ์ดํดํ๋ฉด ๋๋ค.
๊ทธ๋ฌ๋ฉด printB( ) ๋ฉ์๋๋ B ํด๋์ค์๋ง ์๊ณ A ํด๋์ค์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ ์ ์๋ค. ์ด๋ฐ ๊ฒฝ์ฐ printB๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด, ์ฐธ์กฐ ํ์ ๋ ์ค์ฒด ๊ฐ์ฒด๋ B์ธ B bb = new B( );๋ฅผ ํตํด ์ฌ์ฉํ๊ฑฐ๋ ab๋ฅผ ๋ค์ด ์บ์คํ ํ๋ฉด ๋๋ค.
๋ค์ด ์บ์คํ ์ ํ์ ์ ๋ค์ B b2 = (B) ab๋ก ๋ฐ๊ฟ์ฃผ๋ฉด ๋๋ค. ์ด๊ฒ์ ํ๋ณํ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
3. super( ), this( )
class A {
A() {
this(3);
System.out.println("A ์์ฑ์1")
}
A(int a) {
System.out.println("A ์์ฑ์2")
}
}
class B extends A {
B() {
this(3);
System.out.println("B ์์ฑ์1")
}
B(int a) {
System.out.println("B ์์ฑ์2")
}
}
A aa1 = new A();
A aa2 = new A(3);
B bb1 = new B();
B bb2 = new B(3);
ํด๋์ค์ ์ด๋ฆ๊ณผ ๋๊ฐ์ ๋ฉ์๋๊ฐ ์๋ค๋ฉด ๊ทธ๊ฒ์ ์์ฑ์์ด๋ค. ๊ทธ๋ฌ๋ฉด A aa1 = new A( ); ์ด๊ฒ์ ์์ฑ์ ํธ์ถ ์ฝ๋์ด๋ค. super์ this๋ ์์ฑ์ ์์์ ์ฌ์ฉ๋๋ค. super๋ ๋ถ๋ชจ ํด๋์ค ์์ฑ์๋ฅผ ํธ์ถ์ํค๋ฉฐ, ๋ง์ผ ์์ฑ์์ super๋ this๊ฐ ์๋ค๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ์๋์ผ๋ก super๋ฅผ ํฌํจ์์ผ์ค๋ค. ๊ทธ๋ฆฌ๊ณ this๋ ๊ฐ์ ํด๋์ค ๋ด๋ถ์ ์๋ ๋ค๋ฅธ ์์ฑ์๋ฅผ ํธ์ถ์ํจ๋ค.(์์ฑ์๊ฐ 2๊ฐ ์ด์ ์์ด์ผ ์ฌ์ฉ๊ฐ๋ฅํ๋ค.) ์ฆ this๋ ๋ถ๋ชจ ํด๋์ค์ ์๋ ์์ฑ์๋ก ๊ฐ์ง ์๊ฒ ํด์ค๋ค.
B bb1 = new B( );๋ฅผ ์ดํด๋ณด์.
1) this(3)์ผ๋ก ์ธํด ๊ฐ์ ํด๋์ค ์์ ์์ผ๋ฉด์, 3์ด๋ผ๋ ์ธ์๋ฅผ ๋ฐ์ ์ ์๋ B(int a)๊ฐ ์คํ๋๋ค.
2) ๊ทธ๋ฐ๋ฐ B(int a) ์์ฑ์๋ this๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ๋ฌ๊ฐ ์๋์ ์ผ๋ก super๋ฅผ ๋ฃ์ด์ค ๊ฒ์ด๋ค.
3) super๋ก ์ธํด ๋ถ๋ชจํด๋์ค์ ์๋ ๊ธฐ๋ณธ ์์ฑ์(A)๋ก ๊ฐ๊ฒ ๋๋ค.
4) A ํด๋์ค์ ๊ธฐ๋ณธ ์์ฑ์ A์ this(3)์ด ์์ผ๋, intํ ์ธ์ ํ๋๋ฅผ ๋ฐ๋ A ์์ฑ์๊ฐ ์คํ๋ ๊ฒ์ด๋ค.
5) A(int a)๊ฐ ์คํ๋์ด ๋๋์ด! "A ์์ฑ์2"๊ฐ ์ถ๋ ฅ๋ ๊ฒ์ด๋ค.
6) ๊ทธ๋ฌ๋ฉด ๋ค์ A ํด๋์ค์ ๊ธฐ๋ณธ ์์ฑ์ A๋ก ๋์์ "A ์์ฑ์ 1"์ด ์ถ๋ ฅ๋๋ค.
7) ๋ ์ ์ผ๋ก ๋์๊ฐ B ํด๋์ค์ B(int a)์ "B ์์ฑ์ 2"๊ฐ ํธ์ถ๋๊ณ
8) ๋ง์ง๋ง์ผ๋ก ๊ฐ์ฅ ์ฒ์ ํธ์ถ๋์๋ B ํด๋์ค์ ๊ธฐ๋ณธ ์์ฑ์ B์ "B ์์ฑ์ 1"์ด ํธ์ถ๋๋ค.
๋ง์ฝ์ A ab = new B( ); ์ฝ๋๋ฅผ ๋ฃ์ด๋ณธ๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น? ๊ฒฐ๊ตญ ์์ ํด๋์ค B์ B( )๊ฐ ์คํ๋๊ธฐ ๋๋ฌธ์ ํธ์ถ๊ณผ์ ๋ถํฐ ๋ต๊น์ง ๋ชจ๋ ๊ฐ๋ค.
4. ๋ฌธ์
- ์์ ๋น ์ ๋ณด์ฒ๋ฆฌ๊ธฐ์ฌ 2023 ์ฑ ๋ฌธ์ ๋ฐ์ท
class Parent {
public Parent() {
System.out.print("A");
}
public void fn() {
System.out.print("B");
}
public void fnA() {
System.out.print("C");
}
}
class Child extends Parent {
public Child() {
System.out.print("D");
}
public void fn() {
System.out.print("E");
}
public void fnB() {
System.out.print("F");
}
}
Child c = new Child( );
c.fn( );
c.fnA( );
1) Child c = new Child( );๋ก Child ์์ฑ์๊ฐ ํธ์ถ๋์์ผ๋ Child( )๊ฐ ํธ์ถ๋ ๊ฒ์ด๋ค.
2) ๊ทธ๋ฐ๋ฐ Child( ) ๋ด๋ถ์ this๊ฐ ์๋ค. (๋ฌผ๋ก this๋ฅผ ์ธ ์ ์๋ค, ์์ฑ์๊ฐ 1๊ฐ๋ผ์)
3) ์ปดํ์ผ๋ฌ๊ฐ ์๋์ ์ผ๋ก super๋ฅผ ๋ฃ์ด ๋ถ๋ชจ ํด๋์ค Parent์ ์์ฑ์๋ฅผ ํธ์ถํ๋ค.
4) Parent ์์ฑ์๊ฐ ํธ์ถ๋์ด "A"๊ฐ ์ถ๋ ฅ๋๋ค.
5) ๋ค์ Child ์์ฑ์๋ก ๋์์์ "B"๊ฐ ์ถ๋ ฅ๋๋ค.
6) c.fn( );์ Child ํด๋์ค์ fn ๋ฉ์๋๊ฐ ์์ผ๋ "E"๊ฐ ์ถ๋ ฅ๋๋ค.
7) c.fnA( );์ fnA๊ฐ Parent ํด๋์ค์ ์์ง๋ง Child๊ฐ Parent ํด๋์ค๋ฅผ ๋ถ๋ชจ ํด๋์ค๋ก ๋ฐ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ์์ด Parent ํด๋์ค์ fnA๊ฐ ์คํ๋์ด "C"๊ฐ ์ถ๋ ฅ๋๋ค.
1.
Parent cp = new Child();
cp.fn();
cp.fnA();
2.
Child pc = new Parent():
cp.fn();
cp.fnA():
3.
Parent p = new Parent();
cp.fnB();
์์ ๊ฒฝ์ฐ๋ ์ด๋จ๊น?
1๋ฒ์ ๊ฒฝ์ฐ ๋ฌธ์ ์์ด ๋ค ์คํ์ด ๋๋ค.
๊ทธ๋ฐ๋ฐ 2๋ฒ์ ๊ฒฝ์ฐ Child pc = new Parent( );์์ ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. ์ฐธ์กฐ ๋ณ์๋ ํ์ ํด๋์ค์ธ Child์ธ๋ฐ ํ์ ํด๋์ค์ธ ์ฐธ์กฐ ํ์ ์์ ์์ ํด๋์ค์ธ Parent ๊ฐ์ฒด๋ฅผ ๋ฃ์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
3๋ฒ๋ ์คํ๋ ์ ์๋ค. Parent๋ ๋ถ๋ชจ ํด๋์ค๋ก ํ์ ํด๋์ค์ธ Child์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๊ทธ ์ด์ ๋ ๋ค์ํ์ง๋ง, ์ฝ๋์ ์์ ์ฑ์ ์ํจ์ด ์๋ค. ๋ฉ์๋ ํธ์ถ์ ์ฐธ์กฐ๋ณ์ ํ์ ์ ๊ธฐ์ค์ผ๋ก ์ ๊ทผํ๊ฒ ํ๋ค๋ ๊ฒ์ ์์๋๋ฉด ์ข์ ๋ฏ ํ๋ค.