기본형/참조형 매개변수

배지원·2022년 9월 25일
0

JAVA

목록 보기
11/32

1. 기본형 매개변수

  • 변수의 값을 읽기만 할 수 있다.

    public class PrimitiveParamEx {
       public static void main(String[] args) {
           Data d = new Data();
           d.x = 10;
           System.out.println("main() : x="+d.x);
    
           change(d.x);				// 객체 값 입력
           System.out.println("After change(d.x)");
           System.out.println("main() : x="+d.x);
       }
       static void change(int x){          // 기본형 매개변수
           x = 1000;
           System.out.println("change() : x="+x);
       }
    }
    ---- 결과 ----
    main() : x = 10
    change() : x = 1000
    After change(d,x)
    main() : x = 10

    (1) change메서드가 호출되면서 'd.x'가 change메서드의 매개변수 x에 복사됨
    (2) change메서드에서 x의 값을 1000으로 변경
    (3) change메서드가 종료되면서 매개변수 x는 스택에서 제거됨

2. 참조형 매개변수

  • 변수의 값을 읽고 변경할 수 있다.

    public class ReferenceParamEx {
       public static void main(String[] args) {
           Data2 d = new Data2();
           d.x = 10;
           System.out.println("main() : x="+d.x);
    
           change(d);			// 객체 주소 전달
           System.out.println("After change(d)");
           System.out.println("main() : x="+d.x);
       }
       static void change(Data2 d){          // 참조형 매개변수
           d.x = 1000;
           System.out.println("change() : x="+d.x);
       }
    }
    class Data2{
       int x;
    }

    (1) change메서드가 호출되면서 참조변수 d의 값(주소)이 매개변수 d에 복사됨.
    (2) change메서드에서 매개변수 d로 x의 값을 1000으로 변경
    (3) change메서드가 종료되면서 매개변수 d는 스택에서 제거됨

(예시1) 클래스, 생성자를 통한 좌표 찍기(참조형 매개변수 사용전)

import java.util.InputMismatchException;
import java.util.Scanner;

class Arrays{
    int[][] arrays = new int[5][5];         // 2차원 배열 초기화
    int row ;        // 행(가로)
    int column;  // 열(세로)

    public Arrays(int row,int column){          // 생성자 생성
        this.row = row;
        this.column = column;
    }

    public void info(){
        for(int i =0; i<5; i++) {               // 행 번호 설정
            System.out.print(" " + i);
        }
        System.out.println(" ");
        for(int i =0; i<5; i++){                // 열 번호 설정
            System.out.print(i);
            for(int j=1;j<6;j++){               // 좌표 설정 ex) (1,5)
                    System.out.print("  ");     // 사용자가 입력한 값 이외의 자리 공백 출력
                    if(row==j && column==i){    // 사용자가 입력한 값일때
                        System.out.print("X");  // X 문자 출력
                    }
            }
            System.out.println("");
        }
    }
}

public class ArraysTest {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int row;
        int column;
        while(true) {
            try {                                                  // try-catch문을 통해 예외처리
                System.out.print("행 인덱스 입력 >>");                
                row = scan.nextInt();                              // 행 입력
                if(0>row || row>4){                                // 0~4사이의 값이 아닐때 예외처리
                    System.out.println("0~4사이의 값을 입력하세요");
                    continue;                                      // 다시 while문 돌아가서 반복
                }
            } catch (InputMismatchException e) {                   // 숫자외의 값을 입력시
                System.out.println("숫자만 입력해주세요");
                scan.nextLine();                                   // (중요!!) 버퍼의 입력값 제거 (제거하지 않으면 무한반복됨)
                continue;                                          // while문으로 돌아가서 반복
            }
            break;                                                 // 정상작동시 반복문 빠져나옴
        }

        while(true) {
            try {
                System.out.print("열 인덱스 입력 >>");
                column = scan.nextInt();
                if(0>column || column>4){
                    System.out.println("0~4사이의 값을 입력하세요");
                    continue;
                }
            } catch (InputMismatchException e) {
                System.out.println("숫자만 입력해주세요");
                scan.nextLine();
                continue;
            }
            break;
        }
        Arrays arr = new Arrays(row,column);    // 객체 생성 초기화
        arr.info();                             // 출력문 호출
    }

}

(예시2) 클래스, 참조형 매개변수를 통한 좌표 찍기

import java.util.InputMismatchException;
import java.util.Scanner;

class arrtest{
    int[][] arrays = new int[5][5];         // 2차원 배열 초기화
    static int row ;        // 행(가로)
    static int column;  // 열(세로)

    public void info(){
        for(int i =0; i<5; i++) {               // 행 번호 설정
            System.out.print(" " + i);
        }
        System.out.println(" ");
        for(int i =0; i<5; i++){                // 열 번호 설정
            System.out.print(i);
            for(int j=1;j<6;j++){               // 좌표 설정 ex) (1,5)
                System.out.print("  ");     // 사용자가 입력한 값 이외의 자리 공백 출력
                if(row==j && column==i){    // 사용자가 입력한 값일때
                    System.out.print("X");  // X 문자 출력
                }
            }
            System.out.println("");
        }
    }
}

public class test {
    public static void main(String[] args) {
        arrtest arr = new arrtest();
        input(arr);
        arr.info();                             // 출력문 호출
    }

    static void input(arrtest arr){             // 참조형 매개변수
        Scanner scan = new Scanner(System.in);
        int num;

        for(int i=0; i<2; i++) {
            try {                                                  // try-catch문을 통해 예외처리
                if(i == 0)
                    System.out.print("행값 입력 >>");
                else
                    System.out.print("열값 입력 >>");

                num = scan.nextInt();                              // 행 입력
                if (0 > num || num > 4) {                                // 0~4사이의 값이 아닐때 예외처리
                    System.out.println("0~4사이의 값을 입력하세요");
                    i--;
                    continue;                                      // 다시 while문 돌아가서 반복
                }
            } catch (InputMismatchException e) {                   // 숫자외의 값을 입력시
                System.out.println("숫자만 입력해주세요");
                scan.nextLine();                                   // (중요!!) 버퍼의 입력값 제거 (제거하지 않으면 무한반복됨)
                i--;
                continue;                                          // while문으로 돌아가서 반복
            }
            if(i == 0) {                                           // arrtest 클래스에 행/열 구분해서 값을 보내주기 위한 비교
                arr.row = num;
            }else {
                arr.column = num;
                break;
            }
        }
    }
}
  • 객체 생성시 값을 초기화하여 생성자를 통해 클래스로 보내는 방식이 있지만, 코드의 중복이 발생하고 복잡해진다
  • 따라서 코드의 중복을 방지하기 위해 메서드를 사용하고 따로 생성자를 구현하지 않고 메서드 안에서 클래스의 변수값을 초기화 할 수 있도록 참조형 매개변수를 사용하여 구혀한다.

3. 참조형 반환타입

public class ReferenceReturnEx {
        public static void main(String[] args) {
            Data3 d = new Data3();
            d.x = 10;

            Data3 d2 = copy(d); // d2와 d는 서로 다른 객체 주소이다
            System.out.println("d.x = "+d.x);
            System.out.println("d2.x="+d2.x);
        }
        static Data3 copy(Data3 d){
            Data3 temp = new Data3();   // temp와 d는 서로 다른 객체 주소
            temp.x = d.x;       // 주소값은 다르고 멤버변수 값만 저장
            return temp;        // temp 객체 주소 반환
        }
    }
class Data3{
        int x;
}
profile
Web Developer

0개의 댓글