객체의 메서드 호출과 반환

문득 Java 공부를 하다가 객체지향프로그래밍 부분에 객체의 멤버요소 중 메서드를 공부하던 중이었다. 기존에 책을 2번정도 완독했었는데, 그때마다 5~10번 아니 계속 반복해서 완전히 익혀야한다는 말을 많이 들었다. 특히 객체지향에 대해서는 정말 계속 보고 또 봐야한다고 했다. 이 부분에 대해서 오늘 느껴지는게 있었던 것 같다.

 

현재 보고 있는 부분에서는 메서드를 선언하는 부분과 호출하는 부분에 대해서 나와있다. 그 중 내가 기존에 알고있던 부분에서 조금 더 깊어졌다고 해야하나? 그런 느낌을 받은 부분이 있었다. 바로 호출하는 쪽(클라이언트)에서 인자로 호출되는 쪽(서버) 매개변수에 값을 넘길 때 매개변수와 타입이 같거나 자동형변환이 가능해야하며, 호출을 마칠 때는 메서드에 정의한 반환타입과 타입이 맞거나 자동형변환이 가능해야 한다는 내용이다. 

 

이 부분이 단순 기본형이나 배열 등 직감적으로 알 수 있는 부분이라면 크게 어렵지는 않을 것이다. 

그러나 객체지향에서는 상속, 인터페이스,다형성 같은 확장에 용이하고 유연한 설계가 가능하도록 하는 부분들이 있다. 이 부분들까지 고려했을 때 오늘 메서드 부분에 대해서 생각하고 느꼈던 자동형변환 부분이 추후 인터페이스나 다형성등을 이해하는데 좋은 소스가 될 것이라 생각되서 오늘 느낀 이 느낌을 남겨놓고자 한다.

 

대략 아래와 같은 경우들을 한번 생각해봤다. 이런식으로 매개변수나 반환타입에 대한 자동형변환을 생각해봤을 때, 추후 이런 부분들에 대해서 개념을 제대로 잡고 있지 않다면 큰 어려움이 될 것이라 생각이 들었다.

class Parent{
    String name;
    
}

class Child extends Parent{
    int age;
}

class Local{
 // 1.) 매개변수 : 부모타입 / 반환 : 부모타입
    /*
    public Parent live(Parent parent){
        Child c =  new Child();
        return c;
    }
	
    2.) 매개변수 : 부모타입 / 반환 : 자식타입
    public Child live(Parent parent){
        Child c =  new Child();
        return c;
    }
    
    3.) 매개변수 : 자식타입 / 반환 : 부모타입
    public Parent live(Child parent){
        Child c =  new Child();
        return c;
    }
    
    3.) 매개변수 : 자식타입 / 반환 : 자식타입
    public Child live(Child parent){
        Child c =  new Child();
        return c;
    }
    */
}

class TestMain{
    public static void main(String[] args) {
        
        Local local = new Local();
        Parent parent = new Parent();
        Child child = new Child();
//        local.live(parent); 2.)의 경우 매개변수타입이 자식이기에 부모타입을 넘길 수 없다.
        local.live(child);
//        child = local(child); 1.) 부모타입으로 반환되기에 자식타입 참조변수로 받을 수 없다.
    }
}