JAVA 4일차.

김재현·2022년 7월 31일
0

Java

목록 보기
4/15

기본형 매개 변수

  • 메서드를 호출할 때 매개변수로 지정한 값을 메서드의 매개변수에 복사해서 넘겨준다.
    타입이 기본형(primitive type)일 때는 기본형 값이 복사되겠지만, 참조형(reference type)이면 인스턴스의 주소가 복사된다.
  • 메서드의 매개변수가 기본형 > 단순히 값만 얻음.
    참조형으로 선언 > 값이 저장된 곳의 주소를 알 수 있음. 값을 읽어오는 것은 물론 변경도 가능.

    기본형 매개변수 : 변수의 값을 읽기만 할 수 있다. (read only)
    참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다. (read & write)

  1. 클래스 Data를 생성하고 인스턴스 변수x를 멤버로 넣어줌.
    class Data {int x;}
  2. 클래스 Ex를 만들고 main메서드 선언.
  3. 참조변수 d가 Data의 인스턴스 생성. 참조변수 d는 인스턴스 x를 가리킴.
    Data d = new Data(); d = new Data();
  4. 참조변수 d가 가리키는 인스턴스 x의 값을 10으로 변경함.
    d.x = 10;
  5. 구문 출력. d.x = 10이 나옴.
  6. change 메서드에서 d.x를 호출.
    change(d.x);
  7. change(int c)에서 인스턴스 x의 값은 아직 10.
  8. 지역변수 c에 1000값을 삽입.
    c = 1000
  9. c 값을 출력하고 값은 1000이 나옴.
    change 메서드는 작업을 마쳤으니 스택에서 사라지고, change의 지역변수 c도 같이 사라짐.
  10. 다음 출력 구문이 실행됨. 지역변수 c는 사라졌으니 여전히 d.x의 값은 10.
  • 결과는 아래와 같음.

  • 위의 예시와 같이 기본형 매개변수는 객체 값의 읽기만 가능하지 값을 변경할 수는 없다.

  • 기본형 매개변수를 선언하면 지역변수로 취급된다.

참조형 매개변수

  1. 클래스 Data를 생성하고 인스턴스 변수x를 멤버로 넣어줌.
    class Data {int x;}
  2. 클래스 Ex를 만들고 main메서드 선언.
  3. 참조변수 d가 Data의 인스턴스 생성. 참조변수 d는 인스턴스 x를 가리킴.
    Data d = new Data(); d = new Data();
  4. 참조변수 d가 가리키는 인스턴스 x의 값을 10으로 변경함.
    d.x = 10;
  5. 구문 출력. d.x = 10이 나옴.
  6. change 메서드에서 d를 호출.중요
    change(d);
  7. change 메서드에 참조형 매개변수 (Data c)를 삽입.
    d가 참조하는 인스턴스 x의 주소가 Data c에 복사됨.
    Data c역시 인스턴스 x의 주소를 공유하게되고 Data C를 조작함으로써 x의 값 변경 가능.
  8. 참조변수 c를 이용해 x의 값을 1000으로 변경.
    c.x = 1000;
  9. 구문 출력. c.x = 1000
  10. change 메서드의 실행은 종료되고 스택도 사라졌지만 change메서드에서 참조변수 c를 이용해 변경한 값은 인스턴스 x에 남게 됨.
  11. 구문 출력. d.x = 1000
  • 결과는 아래와 같음
  • 참조형 매개변수를 활용하면 참조변수의 값을 읽는 것은 물론, 변경도 가능하다.
  • 기본형 매개변수와 참조형 매개변수를 사용한 것의 차이를 잘 이해하자.

참조형 반환타입

  • 매개변수 뿐 아니라 반환타입도 참조형이 될 수 있다.
  • 반환타입이 참조형이라는 것은 반환하는 값의 타입이 참조형이라는 것으로, 모든 참조형 타입의 값은 '객체의 주소'이므로 정수값이 반환될 뿐 특별하지는 않다.

  1. 클래스 Data를 생성하고 인스턴스 변수x를 멤버로 넣어줌.
    class Data {int x;}
  2. 클래스 Ex를 만들고 main메서드 선언.
  3. 참조변수 d가 Data의 인스턴스 생성. 참조변수 d는 인스턴스 x를 가리킴.
    Data d = new Data(); d = new Data();
  4. d가 참조하는 인스턴스 x의 값을 10으로 변경해 줌.
    d.x = 10
  5. 참조변수 c를 main메서드에 생성하고, c는 copy() 메서드를 실행함.
    Data c = copy(d);
  6. copy메서드에는 지역변수 e가 등록되고, 이 e는 main 메서드의 d가 복사된 것. 즉 e는 d가 참조하는 인스턴스 x와 같은 주소를 참조하고 있음.
    static ~ copy(Data e)
  7. 새로운 참조변수 tmp가 Data의 인스턴스 생성. tmp는 새로운 인스턴스 x를 형성.
    Data tmp = new Data();
  8. e가 참조하는 인스턴스x의 값 10을 tmp가 참조하는 인스턴스x의 값에 복사해줌. 둘이 가리키는 x는 다른 인스턴스.
    tmp.x = e.x
  9. 반환 타입이 참조형인 경우 인스턴스의 주소를 반환한다.
    반환타입이 참조형인 Data이니 tmp가 참조하는 인스턴스 x의 값이 출력되게 된다.
static Data copy(Data e) 
         ~~~
      return tmp;
  1. 위의 값은 copy 메서드의 결과값이고 copy메서드의 값은 Data c값이기도 하다.
    Data c = copy(d);
  2. copy 메서드가 종료되고 스택도 사라지지만, c가 e의 주소를 참조한다는 것은 남는다.
  3. 구문 출력.
  • 결과는 아래와 같음
  • copy메서드가 생성한 인스턴스 e의 주소를 main메서드에서 참조할 수 있게 된다.

static 메서드와 인스턴스 메서드

  • 메서드 앞에 static이 붙어 있다면 클래스 메서드이고, 그렇지 않다면 인스턴스 메서드이다.
  • 클래스 메서드도 클래스 변수와 같이, 객체를 생성하지 않고도 클래스이름.메서드이름(매개변수)와 같은 식으로 호출이 가능하다.
    인스턴스 메서드는 반드시 객체를 생성해야하만 호출할 수 있다.
  • 인스턴스 변수를 사용한다면 인스턴스 메서드.
    아니라면 static 메서드.

어느 경우에 static을 사용해 클래스 메서드로 정의하는가?

  • 클래스는 '데이터(변수)와 데이터에 관련된 메서드의 집합'이므로, 같은 클래스 내에 있는 메서드와 멤버변수는 아주 밀접한 관계가 있다.
  • 인스턴스 메서드 : 메서드의 작업을 수행하는데 인스턴스 변수를 필요로 하는 메서드.
    인스턴스 변수는 인스턴스(객체)를 생성해야만 만들어지므로 인스턴스 메서드 역시 인스턴스 메서드를 생성해야만 호출할 수 있다.
  • 메서드 중 인스턴스와 관계 없는 (인스턴스 변수나 인스터스 메서드를 사용하지 않는) 메서드를 클래스 메서드(static 메서드)로 정의한다.
  • 인스턴스 변수를 사용하지 않는다고해서 반드시 클래스 메서드로 정의해야하는 것은 아니지만, 일반적으로 그렇게 한다.
  • 인스턴스 변수(iv) 인스턴스 메서드(im) 둘을 합쳐 '인스턴스 멤버'라고 한다.

0개의 댓글