날아라김지원

 

- JAVA Call by value

class Updater {
    void update(int count) {
        count++;
    }
}

class Counter {
    int count = 0;  // 객체변수
}

public class Sample {
    public static void main(String[] args) {
        Counter myCounter = new Counter();
        System.out.println("before update:"+myCounter.count);
        Updater myUpdater = new Updater();
        myUpdater.update(myCounter.count);
        System.out.println("after update:"+myCounter.count);
    }
}

위와같은 코드에서결과는 둘다 0이 나온다. 하지만

class Updater {
    void update(Counter counter) {
        counter.count++;
    }
}

class Counter {
    int count = 0;  // 객체변수
}

public class Sample {
    public static void main(String[] args) {
        Counter myCounter = new Counter();
        System.out.println("before update:"+myCounter.count);
        Updater myUpdater = new Updater();
        myUpdater.update(myCounter);
        System.out.println("after update:"+myCounter.count);
    }
}

위의 코드처럼 '객체'를 전달하게되면 메서드가 입력받는 '객체'를 그대로 사용하기 때문에 0과 1이 나오게 된다.

 

객체변수를 메소드에 전달받아도 그저 '값'을 전달받을 뿐이고 객체 전체를 넣으면 그대로 사용하기 때문이다.

 

애초에 자바는 메모리값을 철저히 숨겨 call by reference방식을 쓸 수 없다고 한다. C언어 같은경우 포인터를 써서

 

주소전달로 함수에서 Swap도가능하지만 JAVA는 객체를 통째로 전달해서 값을 변화시켜야한다.

 

 

 

- 클래스 상속(Inheritance)

자식 클래스가 부모클래스의 기능을 그대로 물려받을 수 있다. extends라는 키워드를 사용한다.

 

아래코드는 Dog라는 클래스가 Animal이라는 클래스의 기능을 상속받고 기능을 추가한 코드이다.

class Animal {
    String name;

    void setName(String name) {
        this.name = name;
    }
}

class Dog extends Animal {
    void sleep() {
        System.out.println(this.name+" zzz");
    }
}

public class Sample {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.setName("poppy");
        System.out.println(dog.name);
        dog.sleep();
    }
}
Animal dog = new Dog();  // Dog is a Animal (O)

그리고 바로 위의 코드의경우 Animal자료형으로 dog를 만들고 Dog객체를 선언하는건데

 

자식 클래스로 자료형을 선언하고 부모 객체를 선언하는것은 불가능하다.

 

Object animal = new Animal();  // Animal is a Object
Object dog = new Dog();  // Dog is a Object

또한 모든 클래스는 Object클래스 자료형으로 선언이 가능하다. 모든 클래스는 Object클래스를 상속받기 때문이다.

 

 

- 메서드 오버라이딩 (method overriding)

아래의 코드의 경우 HouseDog는 Dog클래스를 상속받았고 원래 sleep method를 오버라이딩 했다.

 

HouseDog로 만든 객체의 경우 sleep()메소드를 호출할 시 Dog의 sleep()메소드가 아닌 오버라이딩 된

 

메소드를 호출한다.

class Animal {
    String name;

    void setName(String name) {
        this.name = name;
    }
}

class Dog extends Animal {
    void sleep() {
        System.out.println(this.name + " zzz");
    }
}

class HouseDog extends Dog {
    void sleep() {
        System.out.println(this.name + " zzz in house");
    }

    void sleep(int hour) {
        System.out.println(this.name + " zzz in house for " + hour + " hours");
    }
}

public class Sample {
    public static void main(String[] args) {
        HouseDog houseDog = new HouseDog();
        houseDog.setName("happy");
        houseDog.sleep();  // happy zzz in house 출력
        houseDog.sleep(3);  // happy zzz in house for 3 hours 출력
    }
}

- 메소드 오버로딩

그리고 위 함수에서 2가지 sleep메소드를 볼 수 있는데 입력값이 다를 때 알아서 다른 함수를 실행한다.

 

이를 메소드 오버 로딩이라고 한다.

 

- 다중상속

자바는 다중상속을 지원하지 않는다!

 

 

 

 

 

 

-참고

https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%9E%90%EB%B0%94%EB%8A%94-Call-by-reference-%EA%B0%9C%EB%85%90%EC%9D%B4-%EC%97%86%EB%8B%A4-%E2%9D%93

 

☕ 자바는 Call by reference 개념이 없다 ❓

자바의 Call by Value / Call by Reference 프로그래밍을 하다보면 반드시 마주치는 것이 바로 call by value / call by reference 개념이다. 함수의 매개변수에서 값을 복사하느냐 주소값을 참조하느냐에 따라 반

inpa.tistory.com

https://wikidocs.net/265

https://wikidocs.net/280

https://edu.goorm.io/learn/lecture/201/%ED%95%9C-%EB%88%88%EC%97%90-%EB%81%9D%EB%82%B4%EB%8A%94-c%EC%96%B8%EC%96%B4-%EA%B8%B0%EC%B4%88/lesson/1271949/call-by-value-call-by-reference

profile

날아라김지원

@flykimjiwon

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!