Programming/Java

[Java 기초] 형변환과 오버라이딩 메서드 / 다형성

주죵 2021. 4. 28. 23:48
728x90
반응형

손으로 똥을싸본적이 있으신가요? 저는 있습니다. 갑작스럽게 개발자가 되고난 이후부터이죠 허허.

제손으로 큰똥을싸고 관제에 울리는 알람을 보면 식은땀이 존나나요 진짜~ㅋㅋㅋ

 

아무튼 잡소리 치우고 어찌보면 당연한건데 생각하면 헷갈리는것들 (지극히 주관적) 인거 적어보자

 

형변환시에 오버라이딩 메서드 호출

Person라는 클래스를 상속받은 Child라는 클래스가 있다고 가정해보자. Person는 haveLunch() 라는 메서드를 가지고 있고 child는 이 메서드를 오버라이딩한다.

자 그럼 여기서 문제!

Person person1 = new Child();

person1.haveLunch();

위처럼 instance는 Child로 생성되지만 Person으로 형변환된 객체 person1의 haveLunch 메서드를 실행하면 누구 어떤 메서드가 호출될까?

 

정답은 Child의 오버라이딩된 메서드이다! person1의 타입은 Person이어도 자바에선 항상 인스턴스의 메서드가 호출된다.

Java에선 모든 메서드가 가상메서드(Virtual Method)이기 때문!

 

가상메서드?

자바에서 메서드가 호출되는 원리를 먼저 알아보자. 

변수는 지역변수의 경우 stack영역, 인스턴스는 heap영역에 잡힌다. 

똑같은 Person이라는 인스턴스에서 나온 person1과 person2는 stack영역, heap메모리에 각각 독립적으로 존재할것이다. 그러나 person1과 person2가  쓰는 메서드는의 로직 자체는 동일하다.(차이는 그 동일한 로직의 메서드 안에서 사용되는 변수가 다름. 각각 독립적이기 때문에)

따라서 이러한 기능적 부분(instruction)은 다르지 않기 때문에 이러한 instruction set은 Code영역(메서드영역)에 잡힌다.

메서드가 호출, 실행되는 원리는 다음과 같다.

  • 메서드의 이름은 주소값을 나타낸다.
  • 프로그램 로드되면 메서드 영역에 명령어 set(instruction set)이 로드된다
  • 해당 메서드가 호출되면 그 명령어 set이 있는 주소에서 해당 명령 실행!
  • 메서드에서 사용하는 변수는 stack메모리에 위치함
    • 다른 인스턴스라도 같은 메서드의 주소값으로 같은 메서드 호출
    • 인스턴스 생성시에 변수는 heap에 로드되지만 메서드의 명령어 set은 메서드영역에 한번만 로드

각설이 길었고 그래서 가상메서드라는건 실제로 메서드 실행시에 함수 이름 자체가 호출되는게 아니라, 가상 메서드 테이블에 등록되어있는 해당 메서드의 address를 호출한다는 것이다

Person의 haveLunch 0x00123
Person의 haveDinner 0x00124
Child의 haveLunch(오버라이딩된 메서드) 0x00125
Child의 haveDinner(오버라이딩 안됨) 0x00123

이런식으로 생성된 인스턴스의 가상메서드 테이블에 등록되어 있는 메서드 주소값을 호출한다. 따라서 오버라이딩이 된경우 인스턴스는 새로운 주소값을 가르키므로 형변환을 하는것과 상관없이 인스턴스의 가상메서드 테이블이 가르키는 오버라이딩된 주소값을 호출한다.

 

뭐가 이리 복잡한가 싶지만 그냥 인스턴스(클래스)마다 매핑된 메서드의 주소값대로 호출하고, 오버라이딩 된애들은 그 주소값도 새롭게 재정의되므로 형변환 상관없이 그쪽을 호출한다!

 

다형성

하나의 코드가 여러 자료형으로 구현되어 실행될 수 있는것. 즉 같은 코드에서 여러 다른 결과를 나타낼 수 있는것이 다형성이다. 

다형성과 상속, 오버라이딩등을 통해 확장성있는 프로그램을 구현할 수 있다. 

상위클래스는 공통적인 부분을 제공하고 하위 클래스에서 각각의 개성을 갖는 기능을 구현한다. 동시에 이 클래스를 상위클래스의 하나의 타입으로 처리할 수 있다.

 

728x90

'Programming > Java' 카테고리의 다른 글

[Java기초] 상속에서 클래스 생성 과정과 형변환  (0) 2021.04.25
[Java SSAP 기초] Array vs ArrayList  (0) 2021.02.02
18. JAVA 네트워크  (0) 2021.01.17
17. JAVA 그래픽  (0) 2021.01.17
16. 스레드(Thread)  (0) 2021.01.16