본문 바로가기
개발자의 공부방/자바 기초

자바 기초] 레퍼런스 변수를 상세하게 알아보자.

by 쌈빡한 쥬니준 2019. 3. 12.

레퍼런스변수란??



강의를 듣는 중에 레퍼런스 변수라는 말이 나왔습니다.
PrintWriter out = response.getWriter();
서블릿을 공부할 때 사용하는 대표적인 예의 인스턴스인데요.
제가 듣는 중 PrintWriter out 에서 out을 레퍼런스 변수라고 지칭했습니다.
그래서 조금 더 상세하게 설명해보려고 찾아봤습니다.



클래스를 사용하기 위해서는 반드시 메모리에 생성을 해주어야 합니다.

이렇게 메모리 상에서 생성된 클래스를 클래스객체 혹은 인스턴스라 합니다.

레퍼런스 변수는 메모리상에 생성된 인스턴스를 가리키는데 사용되는 변수입니다.

모든 인스턴스는 레퍼런스 변수만을 통해서 사용이 가능한데요

레퍼런스 변수는 일반적인 데이터를 넣어두는 변수가 아니라서 인스턴스를 가리키는 값이 없습니다.

레페런스 변수는 인스턴스의 맴버변수와 메서드를 가리킬 수 있도록 되어 있지요.


인스턴스의 맴버변수나 메서드를 사용하는 방식은 다음과 같이 . ← 점을 이용합니다.


레퍼런스변수.맴버변수

레퍼런스변수.메서드()


즉, 레퍼런스 변수는 참조형 변수이며, 실제 값이 아닌 주소 값을 가리키는 변수라는 것.



다음과 같은 클래스를 예제로 설명하겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Car{
 int velocity; // 속도를 정수형으로 선언
 int wheelNum; // 바퀴의 수를 정수형으로 선언
 String carName; // 차의 이름을 String 클래스로 선언
 
 // 속도를 높인다.
 // 멤버 변수인 velocity에 1을 더해주는 동작을 한다.
 public void speedUp(){
  velocity = velocity + 1;
 }
 
 // 속도를 낮춘다.
 public void speedDown(){
  velocity = velocity - 1;
  if(velocity < 0)
   velocity =0;
 }
 
 // 멈춘다.
 public void stop(){
  while(velocity>0){
   speedDown();
  }
 }
 
 public static void main(String args []){
  Car myCar;
 
  myCar = new Car();
  myCar.speedUp();
  myCar.carName = "소나타";
  System.out.println(myCar.carName + "의 속도는 " + myCar.velocity);
 }
};
cs


인스턴스를 생성하고 사용하는 경우 레퍼런스 변수는 3군데에 걸쳐서 사용되었다.

   *레퍼런스 변수의 정의(선언)   :::                    Car myCar;

   *인스턴스(객체) 생성             :::                    myCar = new Car();

   *인스턴스 접근                    :::                    myCar.velocity = 0;

                                                                myCar.speedUp();


# 레퍼런스 변수 정의

 일반적으로 변수를 정의하는 것은       

      데이터형 변수_이름;

 의 형태를 가진다. 이점은 인스턴스 변수도 다른 일반적인 데이터와 다르지 않다. 다만, 데이터형 대신에

 클래스 이름이 들어간다는 점이 차이가 있다. 즉,

      클래스이름 변수_이름;

 의 형태가 된다. 따라서 앞의 Car 클래스의 변수를 선언하기 위해서는

      Car myCar;

 와 같은 형태의 변수 선언이 된다.

 

# 인스턴스의 생성과 레퍼런스 변수

 자바에서 인스턴스를 생성하기 위해서는 new 연산자가 필요하다. new 연산자의 사용법은 보통 다음과 같다.

      new 클래스이름();

 이렇게 인스턴스를 생성하면 메모리상에 Car 인스턴스가 생성되고, new 연산자는 생성된 인스턴스를 가리키는

 레퍼런스를 반환한다. 이 값은 "=" 연산자에 의해 myCar 레퍼런스 변수에 저장된다. 중요한 점은 레퍼런스 변수는 인스턴스 그 자체가 아니고, 단지 인스턴스를 가리키기 위한 변수라는 점이다.

 

# 레퍼런스 변수르 이용한 인스턴스의 사용

 인스턴스의 생성을 통해 레퍼런스 변수를 얻으면 해당 객체이 멤버변수와 메서드를 사용할 수 있다.

 사용법은 레퍼런스 변수명 뒤에 점(.)을 붙이고 메서드명이나 변수명을 붙이면 된다.

      레퍼런스_변수.메서드이름();

      레퍼런스_변수.멤버변수_이름;

 

# null 레퍼런스

 null 레퍼런스 상수가 의미하는 것은 해당 값을 가진 레퍼런스 변수의 경우 가리키고 있는 인스턴스가 없다는 것을 의미한다. 이렇게 null 레퍼런스로 지정된 경우에는 레퍼런스 변수를 사용해도 컴파일 에러는 발생하지 않는다. 단, 실행시에 NullPointerException이 발생한다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class RefTest{
 int velocity;
 
 void speedUp(){
  velocity += 1;
 }
 
 public static void main(String args []){
  // RefTest 클래스의 레퍼런스 변수 선언
  RefTest rt2;
  //rt2.speedUp(); // 이렇게 하면 컴파일 에러
 
  RefTest rt = null;
 
  rt.speedUp();
 }
}

cs







댓글0