검수요청.png검수요청.png

"참조변수"의 두 판 사이의 차이

위키원
이동: 둘러보기, 검색
 
(사용자 2명의 중간 판 9개는 보이지 않습니다)
1번째 줄: 1번째 줄:
'''참조변수'''<!--참조 변수-->(參照變數, reference variable)란 실제 값을 가진 변수가 아니라, 값이 들어가 있는 주소를 가지고 있는 [[변수]]를 말한다.
+
'''참조변수'''(參照變數, reference variable)란 실제 값을 가진 변수가 아니라, 값이 들어가 있는 주소를 가지고 있는 [[변수]]를 말한다.
  
 
== 개요 ==
 
== 개요 ==
변수에 들어가는 값(type)에 따라서 불리는 이름이 달라진다.
+
변수에 들어가는 값(type)에 따라서 불리는 이름이 달라진다. 숫자가 들어가면 숫자변수, 문자가 들어가면 문자변수 참조값이 들어가면 참조변수라고 한다.
  
숫자가 들어가면 숫자변수, 문자가 들어가면 문자변수 참조값이 들어가면 참조변수라고 한다.
+
== 특징 ==
 +
참조형 변수는 정해져 있는 것이 아닌 사용자가 원할때 자기 자신이 원하는 필요한 변수를 만들어서 사용할 수 있다. 한 마디로 정의를 하자면 기본형 8가지를 제외한 모든 것이라고 할 수 있다. 기본적으로 알고있어야 할 참조형 변수 2가지가 있는데, 참고로 기본형 변수는 자료형(Data Type)이지만 참조형 변수는 자료형이 아닌 그냥 형태, 즉, 타입(Type)이라고 할 수 있다.<ref name="참조변수 예시"/>
 +
 
 +
참조변수는 보통 클래스들인데 일반적으로 메모리 공간이 stack 공간과 heap 공간이 존재한다. 그래서 클래스의 Myclass class=new Myclass() 라고 가정할때 class는 참조 변수로써 stack의 공간에서 주소 저장되어 4byte를 저장한다. 그리고 그 참조변수의 주소값을 따라가서 heap 공간에 있는 Myclass()를 찾아간다. Myclass의 데이터의 크기는 사용자의 만드는 크기에 따라 다르다. 즉 참조변수는 주소값을 저장한다고 볼 수 있다.
 +
 
 +
참조 타입의 종류는 배열, 열거, 클래스, 인터페이스가 있다.
 +
 
 +
int, char같은 기본 타입 변수는 스택(Stack) 영역에 직접 값을 갖고 있지만, 참조 타입 변수는 스택 영역에서 값이 아니라 힙 영역(Heap)의 주소값을 가진다.
 +
<ref name="참조변수란"><[https://kwaksh2319.tistory.com/107 참조변수란?]>, <<티스토리>>, 2020-01-20</ref>
 +
 
 +
[[파일:참조변수 예시.png|썸네일|300픽셀|'''참조변수''' 예시]]
 +
 
 +
=== 타입 ===
 +
* String
 +
기본적으로 자바에서는 문자열을 처리할 수 있는 자료형이 존재하지 않는다. 기본형 8가지 중에서 '문자'를 처리하는 char만 있지 문자열을 처리할 수 있는 것이 없다. 그렇기 때문에 String은 문자열을 처리하는데 사용하는 변수이다.
 +
 
 +
* Scanner
 +
Scanner는 사용자의 입력을 받아야할 때 사용하는 참조형 변수이다. Scanner는 입력을 위한 참조 변수지만 반대로 출력하는데 사용되는 참조변수도 있으니 유의해야 한다.
  
== 역사 ==
+
=== 선언 방법 ===
 +
String str = new String("자바");
  
== 특징 ==
+
이 코드는 문자열을 처리하는 String 타입의 참조변수를 선언하고 이름이 str이라는 변수를 메모리 Stack 영역에 4byte 크기의 저장공간을 생성한 후, new 라는 생성자를 이용해 String 참조 변수(객체)를 생성하여 ( ) 안에 있는 문자열 "자바"라는 값을 메모리 Heap영역에 저장한 후 그 저장공간의 주소 값을 Stack 영역에 생성된 이름이 str이라는 공간에 저장하는 것이다.
 +
 
 +
Scanner scanner = new Scanner();
 +
 
 +
Scanner도 마찬가지로 new라는 생성자를 사용해 Scanner 참조 변수를 생성한다.<ref name="참조변수 예시"><[https://colossus-java-practice.tistory.com/8 참조변수 선언 방법]><<tistory>>,2019-05-12</ref>
  
 
== 활용 ==
 
== 활용 ==
 +
=== 참조 데이터 형과 매개 변수 ===
 +
 +
package org.opentutorials.javatutorials.reference;
 +
 +
public class ReferenceParameterDemo {
 +
     
 +
    static void _value(int b){
 +
        b = 2;
 +
    }
 +
     
 +
    public static void runValue(){
 +
        int a = 1;
 +
        _value(a);
 +
        System.out.println("runValue, "+a);
 +
    }
 +
     
 +
    static void _reference1(A b){
 +
        b = new A(2);
 +
    }
 +
     
 +
    public static void runReference1(){
 +
        A a = new A(1);
 +
        _reference1(a);
 +
        System.out.println("runReference1, "+a.id);   
 +
    }
 +
     
 +
    static void _reference2(A b){
 +
        b.id = 2;
 +
    }
 +
 
 +
    public static void runReference2(){
 +
        A a = new A(1);
 +
        _reference2(a);
 +
        System.out.println("runReference2, "+a.id);   
 +
    }
 +
   
 +
    public static void main(String[] args) {
 +
        runValue(); // runValue, 1
 +
        runReference1(); // runReference1, 1
 +
        runReference2(); // runReference2, 2
 +
    }
 +
}
 +
// 결과
 +
runValue, 1
 +
runReference1, 1
 +
runReference2, 2
 +
 +
첫번째는 int형 데이터가 복제되어 전달되므로 호출된 메소드의 작업이 호출한 메소드에 영향을 미치지 않고 있다.
 +
 +
두번째 코드에서는 _reference1의 매개변수로 참조 데이터 타입을 전달하고 있다.
 +
 +
'''runReference1();'''<br>
 +
메소드 _reference1 안에서 매개변수 b의 값을 다른 객체로 변경하고 있다. 이것은 지역변수인 b의 데이터를 교체한 것일 뿐이기 때문에 runReference1의 결과에는 영향을 미치지 않는다.
 +
 +
세번째 코드는 호출된 메소드의 작업이 호출한 메소드의 변수에 영향을 미친다.
 +
 +
'''runReference2();'''<br>
 +
매개변수 b의 값을 다른 객체로 교체한 것이 아니라 매개변수 b의 인스턴스 변수 id 값을 2로 변경하고 있다. 이러한 맥락에서 _reference2의 변수 b는 runReference2의 변수 a와 참조 관계로 연결되어 있는 것이기 때문에 a와 b는 모두 같은 객체를 참조하고 있는 변수다.<ref name="참조"><[https://www.opentutorials.org/module/2495/14152 참조(reference)]><<Opentutorials.org>>,2016-11-22</ref>
  
 
{{각주}}
 
{{각주}}
  
 
== 참고자료 ==
 
== 참고자료 ==
 +
* <[https://colossus-java-practice.tistory.com/8 참조형 변수 선언방법]>, <<티스토리>>, 2019-05-12
 +
* <[https://kwaksh2319.tistory.com/107 참조변수란?]>, <<티스토리>>, 2020-01-20
 +
* <[https://www.opentutorials.org/module/2495/14152 참조(reference]>, <<Opentutorials.org>>, 2016-11-22
  
 
== 같이 보기 ==
 
== 같이 보기 ==
 
* [[변수]]
 
* [[변수]]
 +
* [[기본형 변수]]
 +
* [[자료형]]
 +
* [[객체지향 프로그래밍]]
  
{{프로그래밍|토막글}}
+
{{프로그래밍|검토 필요}}

2020년 8월 13일 (목) 17:52 기준 최신판

참조변수(參照變數, reference variable)란 실제 값을 가진 변수가 아니라, 값이 들어가 있는 주소를 가지고 있는 변수를 말한다.

개요[편집]

변수에 들어가는 값(type)에 따라서 불리는 이름이 달라진다. 숫자가 들어가면 숫자변수, 문자가 들어가면 문자변수 참조값이 들어가면 참조변수라고 한다.

특징[편집]

참조형 변수는 정해져 있는 것이 아닌 사용자가 원할때 자기 자신이 원하는 필요한 변수를 만들어서 사용할 수 있다. 한 마디로 정의를 하자면 기본형 8가지를 제외한 모든 것이라고 할 수 있다. 기본적으로 알고있어야 할 참조형 변수 2가지가 있는데, 참고로 기본형 변수는 자료형(Data Type)이지만 참조형 변수는 자료형이 아닌 그냥 형태, 즉, 타입(Type)이라고 할 수 있다.[1]

참조변수는 보통 클래스들인데 일반적으로 메모리 공간이 stack 공간과 heap 공간이 존재한다. 그래서 클래스의 Myclass class=new Myclass() 라고 가정할때 class는 참조 변수로써 stack의 공간에서 주소 저장되어 4byte를 저장한다. 그리고 그 참조변수의 주소값을 따라가서 heap 공간에 있는 Myclass()를 찾아간다. Myclass의 데이터의 크기는 사용자의 만드는 크기에 따라 다르다. 즉 참조변수는 주소값을 저장한다고 볼 수 있다.

참조 타입의 종류는 배열, 열거, 클래스, 인터페이스가 있다.

int, char같은 기본 타입 변수는 스택(Stack) 영역에 직접 값을 갖고 있지만, 참조 타입 변수는 스택 영역에서 값이 아니라 힙 영역(Heap)의 주소값을 가진다. [2]

참조변수 예시

타입[편집]

  • String

기본적으로 자바에서는 문자열을 처리할 수 있는 자료형이 존재하지 않는다. 기본형 8가지 중에서 '문자'를 처리하는 char만 있지 문자열을 처리할 수 있는 것이 없다. 그렇기 때문에 String은 문자열을 처리하는데 사용하는 변수이다.

  • Scanner

Scanner는 사용자의 입력을 받아야할 때 사용하는 참조형 변수이다. Scanner는 입력을 위한 참조 변수지만 반대로 출력하는데 사용되는 참조변수도 있으니 유의해야 한다.

선언 방법[편집]

String str = new String("자바");

이 코드는 문자열을 처리하는 String 타입의 참조변수를 선언하고 이름이 str이라는 변수를 메모리 Stack 영역에 4byte 크기의 저장공간을 생성한 후, new 라는 생성자를 이용해 String 참조 변수(객체)를 생성하여 ( ) 안에 있는 문자열 "자바"라는 값을 메모리 Heap영역에 저장한 후 그 저장공간의 주소 값을 Stack 영역에 생성된 이름이 str이라는 공간에 저장하는 것이다.

Scanner scanner = new Scanner();

Scanner도 마찬가지로 new라는 생성자를 사용해 Scanner 참조 변수를 생성한다.[1]

활용[편집]

참조 데이터 형과 매개 변수[편집]

package org.opentutorials.javatutorials.reference;

public class ReferenceParameterDemo {
     
    static void _value(int b){
        b = 2;
    }
     
    public static void runValue(){
        int a = 1;
        _value(a);
        System.out.println("runValue, "+a);
    }
     
    static void _reference1(A b){
        b = new A(2);
    }
     
    public static void runReference1(){
        A a = new A(1);
        _reference1(a);
        System.out.println("runReference1, "+a.id);     
    }
     
    static void _reference2(A b){
        b.id = 2;
    }
 
    public static void runReference2(){
        A a = new A(1);
        _reference2(a);
        System.out.println("runReference2, "+a.id);     
    }
    
    public static void main(String[] args) {
        runValue(); // runValue, 1
        runReference1(); // runReference1, 1
        runReference2(); // runReference2, 2
    }
}
// 결과
runValue, 1
runReference1, 1
runReference2, 2

첫번째는 int형 데이터가 복제되어 전달되므로 호출된 메소드의 작업이 호출한 메소드에 영향을 미치지 않고 있다.

두번째 코드에서는 _reference1의 매개변수로 참조 데이터 타입을 전달하고 있다.

runReference1();
메소드 _reference1 안에서 매개변수 b의 값을 다른 객체로 변경하고 있다. 이것은 지역변수인 b의 데이터를 교체한 것일 뿐이기 때문에 runReference1의 결과에는 영향을 미치지 않는다.

세번째 코드는 호출된 메소드의 작업이 호출한 메소드의 변수에 영향을 미친다.

runReference2();
매개변수 b의 값을 다른 객체로 교체한 것이 아니라 매개변수 b의 인스턴스 변수 id 값을 2로 변경하고 있다. 이러한 맥락에서 _reference2의 변수 b는 runReference2의 변수 a와 참조 관계로 연결되어 있는 것이기 때문에 a와 b는 모두 같은 객체를 참조하고 있는 변수다.[3]

각주[편집]

  1. 1.0 1.1 <참조변수 선언 방법><<tistory>>,2019-05-12
  2. <참조변수란?>, <<티스토리>>, 2020-01-20
  3. <참조(reference)><<Opentutorials.org>>,2016-11-22

참고자료[편집]

같이 보기[편집]


  검수요청.png검수요청.png 이 참조변수 문서는 프로그래밍에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.