Day 20

ChangWoo·2023년 4월 24일
1

자바의 정석

목록 보기
20/71

ch 6-23 기본형 매개변수

기본형 매개변수

기본형 매개변수 - 변수의 값을 읽기만 할 수 있다.(read only)

  • Data 타입 d가 Data객체를 생성한다. (멤버가 하나이기 때문에 x가 만들어지고 x의 주소값이 d의 주소값에 저장되고 참조변수가 객체의 값을 가지게 된다.)
  • 참조변수 d가 가지는 x의 값이 10이된다.
  • printnln으로 d가 가지는 x의 값을 출력한다.
  • change 메서드로 지역변수 x의 값을 변경한다. (main 메서드 위로 change 메서드가 실행된다.)
  • change 메서드가 자신이 할 일을 마친 뒤 사라진다.(지역변수 x의 값을 10에서 1000으로 한 번 바꾼 뒤 작업이 끝이나게 된다.)
  • 그리고 다시 위로 올라가서 println 메서드가 "After change(d.x)"를 출력한다.
  • 출력한 println은 사라진 뒤 그 밑의 println 메서드가 d.x의 값을 출력하면서 d.x의 값인 10이 출력된다.
  • main 메서드도 자신이 할 일을 마치고 스택에서 완전히 사라지게 된다.

ch 6-24,25 참조형 매개변수, 참조형 반환타입

참조형 매개변수

참조형 매개변수 - 변수의 값을 읽고 변경할 수 있다.(read & write)

  • main 메서드를 생성한다.
  • Data2타입의 d가 생성된다.
  • d가 가리키는 x의 값에 10을 저장한다.
  • println 메서드가 실행되고 main 메서드가 대기 상태가 된다.
  • println 메서드가 종료되고 main 메서드가 다시 실행된다.
  • change 메서드를 호출해서 실행하고 참조형 매개변수 d로 주소값이 복사된다. (=참조변수도 같은 주소값을 가지므로 객체의 값이 변경된다.)
  • change 메서드가 자신이 할 일을 마치고 사라진 뒤 다시 main 메서드를 실행한다.
  • "After change(d)"를 출력하는 println 메서드를 실행한다.
  • println 메서드가 종료된 후 d.x의 값을 호출하는 println 메서드를 실행한다.
  • println 메서드와 main 메서드가 자신이 할 일을 마치고 스택에서 완전히 사라지게 된다.
  • main 메서드에 있는 d의 값을 change에 있는 d의 값으로 복사(대입)해 주었다. (객체를 다루는 주소값을 아예 주었기 때문에 위의 기본형 매개변수와 다른 값을 가지게 되는 것이다.)
    객체의 주소값을 가지게 되므로 읽고 쓰는 것이 가능해진 것이다.

참조형 반환타입

  • main 메서드가 스택에 올라가며 프로그램이 시작된다.
  • 참조변수 d가 만들어지며 객체에 Data3이 생성된다.
  • 주소값이 d에 저장되고 객체 x에 값이 저장된다.
  • d2라는 copy 메서드가 생성되고 main 메서드는 대기 상태가 된다.
  • copy(d)는 main 메서드의 지역변수이며, Data3 d 는 copy 메서드의 지역변수다.
  • copy 메서드도 같은 주소값을 가지게 되고, 참조변수도 같은 객체를 가지게 된다.
  • 변수 tmp가 생성되고, 또 다른 주소값을 갖는 지역변수 x가 생성되고 참조변수 tmp가 이 주소값을 가지게 된다.
  • d가 가리키는 x의 값이 tmp가 가리키는 x의 값에 저장된다.
  • tmp의 주소값을 반환한다.(= copy(d)로 대입된다. = main메서드의 지역변수인 d2에 값이 대입된다. = d2가 tmp의 x객체의 값을 가지게 된다.)
    메서드의 반환타입이 참조형이므로 객체의 주소(객체)를 반환한다.
  • copy 메서드가 종료되고 main 메서드로 돌아온다.
  • main 메서드가 println 메서드를 실행해서 d.x의 값을 출력한다.
  • 위의 println 메서드가 종료되면 밑의 println 메서드를 실행해서 d2.x의 값을 출력한다.
    변수와 반환타입이 일치해야 한다.
  • copy 메서드 = 새로운 객체를 만들어서 값을 복사하고 생성된 객체의 주소(=정수)를 반환해서 main 메서드에서 사용가능하게 한다.
  • static 메서드 = 같은 클래스 안에 있으며, 참조변수가 없다. / 객체 생성 없이 호출 가능하다.

ch 6-26~29 static 메서드와 인스턴스 메서드

static 메서드

메서드 앞에 staic이 붙은 것.

  • static 메서드는 클래스 메서드라고도 하며 메서드 앞에 static이 붙은 것을 의미한다.
  • 인스턴스 메서드는 static이 붙지 않은 것이다.
  • 객체생성없이 '클래스이름.메서드이름()'으로 호출
  • 인스턴스멤버(iv,im)와 관련없는 작업을 하는 메서드 (im = 인스턴스 메서드)
  • 메서드 내에서 인스턴스 변수(iv) 사용불가
    Ex) Math.random() / Math.round 와 같이 객체생성하지 않는 것들(=참조변수x, 클래스이름 붙임)

인스턴스 메서드

메서드 앞에 아무것도 붙지 않는 것.

  • 인스턴스 생성 후, '참조변수.메서드이름()'으로 호출
  • 인스턴스 멤버(iv,im)와 관련된 작업을 하는 메서드
  • 메서드 내에서 인스턴스 변수(iv) 사용가능

static 메서드와 인스턴스 메서드의 차이점 : 인스턴스 변수(iv) 사용여부

  • 둘의 차이는 매개변수의 여부이다.
  • 인스턴스 메서드의 long a,b는 인스턴스 변수로 클래스 전체에서 사용가능하다.
  • static 메서드의 long a, long b는 지역변수로 해당 메서드가 종료될 때까지만 사용가능하다.
  • 위의 return 값은 인스턴스 변수고 아래의 return 값은 지역변수로 static은 iv를 사용하지 않는다.
  • 클래스 메서드 : 클래스이름.메서드 이름 (객체 생성 없이 호출 가능)
  • 인스턴스 메서드 : 객체 생성 후 호출

static을 언제 붙여야 할까?

속성(멤버 변수) 중에서 공통 속성에 static을 붙인다.

인스턴스 멤버(iv,im)을 사용하지 않는 메서드에 static을 붙인다.

  • 메서드 = 명령문 집합

메서드 간의 호출과 참조

static 메서드는 인스턴스변수(iv)를 사용할 수 없다.

  • iv는 객체 생성 후 사용 가능하다.
  • cv는 언제나 사용 가능하다.
  • 인스턴스 메서드 = iv와 cv를 모두 사용 가능 / 객체 생성 후 호출 가능
  • static 메서드 = iv 사용 불가능(객체 생성 없이 호출 가능) / cv는 언제나 사용 가능
  • static 메서드는 인스턴스 메서드(im)를 호출할 수 없다.
  • static 메서드 = 항상 호출 가능
  • 인스턴스 메서드 = 객체를 생성해야 호출 할 수 있는 메서드
  • static 메서드는 인스턴스 메서드를 호출 할 수 없지만, 인스턴스 메서드는 static 메서드를 호출 할 수 있다.

Q&A

Q&A
Q1. static 메서드는 static 메서드 호출가능?
A. 네
Q2. static 메서드는 인스턴스 변수 사용가능?
A. 아니요 (인스턴스 변수는 객체 생성해야 사용 가능하므로)
Q3. staic 메서드는 인스턴스 메서드 호출가능?
A. 아니요 (인스턴스 메서드는 iv를 사용해야하므로)
Q4. 왜 static 메서드는 인스턴스 멤버를 쓸 수 없나요?
A. static메서드 호출시 객체(iv묶음)가 없을 수도 있어서

profile
한 걸음 한 걸음 나아가는 개발자

0개의 댓글