Java - 객체지향 (객체의 생성과 사용,기본형 매개변수,참조형 매개변수,참조형 반환타입)

춤추는개발자·2022년 11월 19일
0

Java 정리

목록 보기
1/59

객체의 생성과 사용

  • 하나의 인스턴스를 여러 개의 참조변수가 가리키는 경우는 가능 합니다.
  • 하나의 참조변수가 여러개의 인스턴스를 가리키는 경우는 불가능 합니다.

기본형 매개변수, 참조형 매개변수

기본형 매개변수는 당연하다고 생각해서 어렵지 않았다. 하지만 참조형 매개변수는 메서드의 입력에 우리가 아는 기본형 변수를 입력하지 않고 참조형 변수를 입력하니까 보자마자 어렵다고 생각하며 거부감이 들었다. 언제까지 거부감과 두려움을 가지고 살 수 없기 때문에 공부하며 정리해 보았다.

기본형 매개변수

기본형 매개변수는 변수의 값을 읽기만 가능하다.
java 코드로 살펴보자.

class Data1 {
    int x;
}

public class JavaExercise_25 { // 객체지향 실습, 기본형 매개변수는 변수의 값을 읽기만 가능하다. change 메서드의 x는 main 메서드에서
    public static void main(String[] args) { // data1이 가리키는 x의 값과 다르다. 
       Data1 data1 = new Data1();
       data1.x = 10;
       System.out.println("main 메서드에서 data1가 가리키는 x의 값은 "+data1.x);
       change(data1.x);
       System.out.println("main 메서드에서 data1가 가리키는 x의 값은 "+data1.x);

    }
    static void change(int x){
        x = 1000;
        System.out.println("change 메서드의 x는 "+x);
    }
}
// 출력 결과: 
main 메서드에서 data1가 가리키는 x의 값은 10
change 메서드의 x는 1000
main 메서드에서 data1가 가리키는 x의 값은 10

위에 코드에 주석을 달아두기 했지만 다시 정리해 보자면 main 메서드에서 생성한 data1의 객체가 가리키는 x의 값은 10이다. 이때 change 메서드는 입력 매개변수가 기본형 매개변수이기 때문에 int 값을 입력으로 받는다.
그럼 data1이 가리키는 x의 값 10을 change 메서드에 입력하고 change 메서드에서 입력받은 x의 값을 1000으로 저장하고 change 메서드가 종료되고 println 메서드가 호출돼서 data1.x의 값을 출력해 보면 data1이 가리키는 x의 값이 1000이 출력 될까?
그렇지 않다. 코드의 출력에서 볼 수 있듯이 값은 바뀌지 않는 것을 확인할 수 있다.

결론 : 기본형 매개변수로 객체의 인스턴스 변수값을 입력받아 값을 변경하여도 객체의 참조 변수가 가리키는 인스턴스 변수의 값은 바뀌지 않는다.

참조형 매개변수

참조형 매개변수는 변수의 값을 읽고 변경할 수 있다. 자 무슨 말인지 바로 java 코드로 확인 해보자.

class Data2{
    int x;
}

public class JavaExercise_26 { // 객체지향 실습, 참조형 매개변수는 변수의 값을 읽고 변경할 수 있다. main 메서드에서 data2 가 가리키는 x와 change 메서드에서 data2가 가리키는 x가
    public static void main(String[] args) { // 같다. 그 이유는 change 메서드의 입력 매개변수에 참조형 변수를 전달하면서
       Data2 data2 = new Data2();            // 참조형 변수를 change 메서드에서 카피하여 같은 x를 가리키기 때문이다.
       data2.x = 10;
       System.out.println("main 메서드에서 data2가 가리키는 x는 "+data2.x);
       change(data2);
       System.out.println("main 메서드에서 data2가 가리키는 x는 "+data2.x);

    }

    static void change(Data2 data2){
        data2.x = 1000;
        System.out.println("change 메서드의 x는 "+data2.x);
    }
}
// 출력 결과:
main 메서드에서 data2가 가리키는 x는 10
change 메서드의 x는 1000
main 메서드에서 data2가 가리키는 x는 1000

위의 코드에 주석으로 달아둔 내용을 정리해 보자면 기본형 매개변수를 다룰 때 코드와 사실상 유사하다. 다른 점은 change 메서드의 입력 매개변수가 참조형 변수를 받는다는 것이다. 이렇게 되면 main 메서드에서 data2가 가리키는 x와 change 메서드에서 data2가 가리키는 x가 같아지면서 x에 저장되는 값이 1000으로 변경되는 것이다.
이렇게 될 수 있는 이유는 change 메서드의 입력 매개변수에 참조형 변수를 전달하면서 참조형 변수를 change 메서드에서 카피하여 같은 x를 가리켜 x의 값을 변경할 수 있게 된 것이다.

결론 : 메서드 입력 매개변수에 참조형 변수를 받으면 객체 참조 변수가 가리키는 인스턴스 변수가 같아지기 때문에 메서드 안에서도 인스턴스 변수의 값을 변경할 수 있다.

참조형 반환타입

반환 타입을 참조형으로 지정하여 참조형 변수를 반환한다. java 코드로 살펴보자.

class Data3{
    int x;
}

public class JavaExercise_27 { // 객체지향 실습, 참조형 반환타입
    public static void main(String[] args) {
       Data3 data3 = new Data3();
       data3.x = 10;
       System.out.println("main 메서드에서 data3가 가리키는 x는 "+data3.x);

       Data3 d2 = copy(data3); // t 참조변수를 d2에 저장
       System.out.println("data3 = "+data3.x);
       System.out.println("d2 = "+d2.x); // t와 d2는 같은 참조변수를 가지기 때문에 d2가 가리키는 x의 값은 data3.x의 값이 복사된 t.x의 값과 같은 값을 가리킨다.

    }

    static Data3 copy(Data3 data3){ // Data3 타입으로 반환
       Data3 t = new Data3(); // 새로운 객체 t를 생성
       t.x = data3.x; // t.x에 data3.x의 값을 복사
       return t; // 참조 변수를 반환
    }
}
// 출력 결과:
main 메서드에서 data3가 가리키는 x는 10
data3 = 10
d2 = 10

위의 코드에서 주석을 달아둔 것을 다시 설명하면 지금까지 우리는 메서드가 실행되고 결과값을 반환하지 않거나 (void) 기본형 반환 타입(int,string,boolean 등)을 반환하는 메서드를 사용하였습니다.
요번에는 참조형 변수를 매개변수로 입력받고 참조형 변수를 반환하는 메서드입니다. data3 객체가 가리키는 x는 10이고 d2에 copy 메서드가 호출되어 copy 메서드에서 새로운 객체 t를 생성 후 t가 가리키는 x에 data3가 가리키는 x의 값 10을 복사합니다. 그 후 t를 반환해 주면서 d2에 t가 저장됩니다. copy의 메서드는 호출이 끝나고 d2는 t가 가리키는 x의 값을 가리키며
data3 와 d2가 가리키는 x의 값이 같아지는 것을 확인할 수 있습니다.

결론 : 참조형 반환 타입을 사용하면 참조형 변수를 반환받을 수 있습니다.

0개의 댓글