재정의 (통칭 Override)
:모든 클래스는 다 상속받고 있다. 왜냐? extends로 상속 표시를 하지 않은 클래스들은 죄다 Object Class를 상속받고 있기 때문이다. 재정의란 부모와의 상속관계에서 부모의 메서드를 그대로 자식이 받은다음 자신의 입맛에 맞게 재정의 한것을 의미한다.
조건
- 부모 클래스와 자식 클래스 사이에서만 성립됩니다.
- static 메소드는 클래스에 속하는 메소드이기 때문에 상속되지 않고 오버라이드 되지도 않습니다.
: 이 부분은 static이 객체가 생성될 때가 아니라 클래스가 생성되고 한번만 메모리에 생성된다는 개념을 숙지하셨다면 금방 이해가 갈 것입니다.- private의 접근제어자를 가진 메소드는 상속 자체가 되지 않아 오버라이드도 성립되지 않습니다.
- interface를 구현하여 오버라이드할 때는 반드시 public 접근 제어자를 사용해야 합니다.
- 오버로드와 달리 리턴 타입, 메소드 명, 매개변수 패턴이 모두 같아야 합니다.
- 부모 클래스의 메소드의 접근 제한자 범위보다 작아질 수 없고 확장은 가능합니다.
- 부모 클래스의 메소드보다 더 많은 예외를 던질 수 없습니다.
- final이 지정된 메소드는 오버라이드할 수 없습니다.
많은 조건인것 같지만 메모리의 구조가 어느정도 이해가 되고 클래스부터 가장 하위인 변수까지 이해가 어느정도 있다면 충분히 맞는 말들인것 같다.

위의 사진은 toString의 이동 경로부터 왜 재정의 되어야 하는지에 대해서 내 생각을 적어 놓은 것이다.
위 사진처럼 Override를 통한 재정의가 이루어지지 않는다면 String보다 부모인 Object 타입의 toString이 이루어진다. 즉 주소값이 찍히게 된다.
지금처럼 부모 클래스인 Unit에서 String의 값을 재정의 해줌으로써 Unit을 상속받는 Zergling,Zealot,Marine이 String타입을 출력했을때 올바른 값이 나오게 된다. 만약 위의 Override를 주석처리를 한뒤 출력을 해보면 값이 아닌 저 값들이 저장되어있는 주소값이 튀어나오게 된다.(실험결과 확인이 되었다.)

Zealot 생성자를 예시로 들었을때 Unit에서 return된 toString()메서드 값이 써져있지 않는데도 출력을 해보면 정상작동 한다. 왜 그럴까?
답은 String 타입의 변수에는 자동적으로 toString 메서드가 사용되어지기 때문에 저렇게 name과 race(열거형)을 작성해도 super를 통해 부모의 메서드를 그대로 가져오기 때문에 따로 toString을 적지 않아도 잘 작동 한다. 그렇다고 생략이 된것이지 써도 상관은 없다.

위 사진은 toString이 재정의 되지 않았을 경우 나오는 name과 race의 값이 담긴 주소값이다.

이런식으로 Marine Class에 Override된 재정의 값을 써주지 않아도 정상작동 하는것도 알 수 있었다.