멋쟁이사자처럼_부트캠프/Java
[상속]필드와 메서드의 차이
모건_Morgan
2024. 12. 9. 17:57
필드와 메서드의 차이
- 필드(Field): 클래스의 속성(변수). 데이터 값을 저장함.
- 메서드(Method): 클래스의 동작(행동). 특정 작업을 수행함.
왜 차이가 생기나?
- 필드 접근은 컴파일 시점에 결정됨
- 참조 변수의 타입(왼쪽에 선언된 타입)에 따라 필드를 결정함.
- 필드에는 오버라이딩이 없고, 숨김(Hiding)만 있음.
- 예: Car car = new Bus();에서 car.name은 Car 클래스의 name 필드를 참조.
- 메서드 호출은 런타임 시점에 결정됨
- 실제로 참조하는 객체의 타입에 따라 호출할 메서드가 결정됨.
- 메서드는 오버라이딩이 가능하며, 부모의 메서드를 자식이 재정의할 수 있음.
- 예: 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(); // "자식 메서드" 출력
}
}
왜 알아야 할까?
- 코드의 동작 이해
- Car car = new Bus();처럼 다형성을 사용할 때, 필드와 메서드 동작 방식이 다르다는 것을 이해해야 코드의 결과를 예측할 수 있음.
- 효율적인 설계
- 필드는 숨김(Hiding)만 가능하므로, 상속 구조에서 오버라이딩된 동작을 기대하지 않도록 설계해야 함.
- 메서드는 오버라이딩 가능하므로, 다형성을 활용한 동작 변경이 가능함.
- 디버깅에 도움
- 상속을 사용할 때 예상치 못한 동작이 발생할 수 있음. 이를 올바르게 이해하면 디버깅이 쉬워짐.
쉽게 이해하는 요령
- 필드는 "왼쪽(Car)"을 보고 결정한다.
- 메서드는 "오른쪽(Bus)"을 보고 결정한다.
즉, 필드는 선언된 참조 변수 타입에 따라 결정되고, 메서드는 실제 객체의 타입에 따라 결정됨.
배열 insight 참고 : https://velog.io/@monimoni12/%EB%A9%8B%EC%82%AC-TIL-13%EA%B8%B0-day6