멋쟁이사자처럼_부트캠프/Java

[상속]필드와 메서드의 차이

모건_Morgan 2024. 12. 9. 17:57

필드와 메서드의 차이

  • 필드(Field): 클래스의 속성(변수). 데이터 값을 저장함.
  • 메서드(Method): 클래스의 동작(행동). 특정 작업을 수행함.

왜 차이가 생기나?

  1. 필드 접근은 컴파일 시점에 결정됨
    • 참조 변수의 타입(왼쪽에 선언된 타입)에 따라 필드를 결정함.
    • 필드에는 오버라이딩이 없고, 숨김(Hiding)만 있음.
    • 예: Car car = new Bus();에서 car.name은 Car 클래스의 name 필드를 참조.
  2. 메서드 호출은 런타임 시점에 결정됨
    • 실제로 참조하는 객체의 타입에 따라 호출할 메서드가 결정됨.
    • 메서드는 오버라이딩이 가능하며, 부모의 메서드를 자식이 재정의할 수 있음.
    • 예: car.운전하다();는 Bus 객체의 운전하다() 메서드를 호출.

필드와 메서드의 동작 차이 요약

  필드(Field) 메서드(Method)
동작 시점 컴파일 시점 런타임 시점
오버라이딩 가능 여부 불가능 (숨김만 가능) 가능 (재정의 가능)
참조 기준 참조 변수의 타입 실제 객체의 타입

 

 

문제가 되었던 코드

class Car {
    String name ="자동차";
    public void 운전하다(){
        System.out.println("운전합니다.");
    }

}
class Bus extends Car{

    String name = "버스";
    public void 승객을_태우다(){
        System.out.println("손님 탑승");
    }

    @Override
    public void 운전하다(){
        System.out.println("버스 운전하다.");
    }
     public String getName(){
        return name;
    }

}
Car car = new Bus();
car.운전하다(); //"버스 운전하다" 출력

 

 

이해를 돕는 코드 예제

class Parent {
    String field = "부모 필드";

    public void method() {
        System.out.println("부모 메서드");
    }
}

class Child extends Parent {
    String field = "자식 필드";

    @Override
    public void method() {
        System.out.println("자식 메서드");
    }
}

public class Main {
    public static void main(String[] args) {
        Parent obj = new Child();

        // 필드 접근
        System.out.println(obj.field); // "부모 필드" 출력

        // 메서드 호출
        obj.method(); // "자식 메서드" 출력
    }
}

 

 

왜 알아야 할까?

  1. 코드의 동작 이해
    • Car car = new Bus();처럼 다형성을 사용할 때, 필드와 메서드 동작 방식이 다르다는 것을 이해해야 코드의 결과를 예측할 수 있음.
  2. 효율적인 설계
    • 필드는 숨김(Hiding)만 가능하므로, 상속 구조에서 오버라이딩된 동작을 기대하지 않도록 설계해야 함.
    • 메서드는 오버라이딩 가능하므로, 다형성을 활용한 동작 변경이 가능함.
  3. 디버깅에 도움
    • 상속을 사용할 때 예상치 못한 동작이 발생할 수 있음. 이를 올바르게 이해하면 디버깅이 쉬워짐.

 

쉽게 이해하는 요령

  • 필드는 "왼쪽(Car)"을 보고 결정한다.
  • 메서드는 "오른쪽(Bus)"을 보고 결정한다.

즉, 필드는 선언된 참조 변수 타입에 따라 결정되고, 메서드는 실제 객체의 타입에 따라 결정됨.

 

 

배열 insight 참고 : https://velog.io/@monimoni12/%EB%A9%8B%EC%82%AC-TIL-13%EA%B8%B0-day6