다음과 같이 두개의 부모 자식관계인 Parent 와 Chile 클래스가 있습니다.
public class Parent {
public int i = 30;
public void printII() {
System.out.println(i * 2); //60
}
public void printI() {
System.out.println("Parent - I()" + i);
}
}
이 Parent라는 클래스를 작성하는 프로그래머 입장에서 당연히 printII() 메서드는 60을 출력할 것 이라고 기대하게 됩니다.
public class Child extends Parent {
public int i = 1;
@Override
public void printI() {
System.out.println("Chiled - I()" + i);
}
}
그리고 이것을 실행하기 위한 main메서드가 있는 파일
public class Main {
public static void main(String[] args) {
Parent p = new Parent();
System.out.println(p.i); //30
p.printI(); //30
System.out.println("----------------------");
Child c = new Child();
System.out.println(c.i); //1
c.printI(); // 1
System.out.println("----------------------");
Parent p2 = new Child(); //Child는 Parent의 자식이다.
System.out.println(p2.i); //30
p2.printI(); //1
p2.printII(); //60
}
}
여기서 우리가 집중해서 봐야할 곳은 System.out.println(p2.i); , p2.printI(); 부분 입니다.
대게 p2 변수는 Child 클래스의 인스턴스를 가지기 떄문에 p2.i의 값은 1일 것이라고 예상하지만,
부모의 클래스를 타입으로 갖는 p2변수는 부모 클래스의 필드 변수를 따라갑니다.
즉, 필드는 타입을 따라갑니다.
이러한 문제로 객체지향 프로그래밍에서 필드를 은닉하고 필드의 직접적인 접근을 막고, 메서드를 통해서 접근할 수 있도록 하는 은닉화는 중요한 기법입니다.
'Java > 기초' 카테고리의 다른 글
[Java] JavaIO - (4) Object IO Stream(+깊은복사, 얕은복사) (0) | 2023.10.27 |
---|---|
[Java] JavaIO - (3)Data, ByteArray, StringReaderWriter (0) | 2023.10.27 |
[Java]JavaIO - (2)FileIOStream (0) | 2023.10.25 |
[Java] JavaIO - (1) (0) | 2023.10.25 |
[Java]자바 프로그램의 실행 과정 (0) | 2023.10.21 |