📌 메서드 처리 방식
📚 메서드 호출 메커니즘
- 각 인수의 표현식은 메서드가 호출되기 전에 먼저 계산됩니다.
계산된 결과값은 임시 변수에 저장됩니다. - 계산된 각 인수값은 해당되는 형식 매개변수에 위치 순서대로 복사됩니다.
매개변수의 타입으로 인수를 타입변환(캐스팅)할 수 있습니다. - 메서드 본체의 문장은 마지막 문장이나 return 문이 나오기 전까지 수행됩니다.
- return 문의 표현식이 계산됩니다.
계산의 결과값은 마찬가지로 임시변수에 저장되고 임시 변수의 값을 호출측으로 반환합니다. - 메서드 호출측은 메서드 호출문 자리에 return 문으로 넘겨받은 결과값을 대입합니다.
📚 메서드 인자 전달 방식
인수가 매개변수로 전달되는 방식에 대한 관점은 두 가지가 있습니다. 인수가 매개변수로 복사되는 것은 모두 동일합니다. 인수 값 자체가 복사되는 값 호출(call by value) 방식과 참조 변수의 값이 복사되는 참조 호출(call by reference) 방식이 있습니니다. 이 두 방식은 매개변수의 자료형에 따라 나뉩니다.
📃 값 호출 (call by value)
- 기본 자료형을 메서드로 호출할 때
- 실인수의 값이 매개변수로 복사되어 전달
📃 참조 호출 (call by reference)
- 메서드 호출에서 참조 자료형을 실인수로 사용할 때
- 객체의 값 대신 참조 변수가 가진 객체에 대한 참조값을 매개변수로 전달
- 매개변수를 통해 실인수 영역을 직접 참조하여 값을 공유할 수 있음
📚 값에 의한 인수 전달
class Point {
int x, y;
}
public class Swap1 {
static void swap(int n1, int n2) {
int tmp;
tmp = n1;
n1 = n2;
n2 = tmp;
}
public static void main(String[] a){
Point p = new Point(); // Point 타입의 객체 생성
p.x = 20; // p의 멤버 변수 초기화
p.y = 50;
swap(p.x, p.y); //값 변환을 위한 함수 호출
System.out.println(p.x + "," + p.y);
}
}
다음과 같이 기본 자료형으로 매개변수를 받아 Point의 두 점의 좌표값을 바꾸려는 프로그램이 있다고 생각해봅시다. 이 프로그램을 간단히 중요한 코드만 적어 흐름을 나타내면 다음 그림과 같습니다.
- 메모리 영역에 x, y 값을 저장하는 Point 객체 p를 생성합니다.
객체의 각 메모리 값에는 . 연산자로 접근합니다. - main( ) 함수 영역에서 swap( ) 함수를 호출합니다.
main( ) 함수에서 swap( ) 함수로 제어 흐름이 넘어갑니다. - swap( ) 함수는 인수로 객체의 각 값을 복사 받아, 매개변수로 복사합니다.
- swap( ) 함수는 반환값이 없기 때문에 변화되는 깂이 없습니다.
swap( ) 함수가 종료되고 호출측으로 돌아갈 때 함수 안에서 선언된 메모리는 사라지기 때문에 값은 변하지 않습니다.
📚 참조에 의한 인수 전달
class Point {
int x, y;
}
public class Swap1 {
static void swap(Point swp) {
int tmp;
tmp = swp.x;
swp.x = swp.y;
swp.y = tmp;
}
public static void main(String[] a){
Point p = new Point(); // Point 타입의 객체 생성
p.x = 20; // p의 멤버 변수 초기화
p.y = 50;
swap(p); //값 변환을 위한 함수 호출
System.out.println(p.x + "," + p.y);
}
}
이번에는 참조 자료형으로 매개변수를 받아 Point의 두 점의 좌표값을 바꾸려는 프로그램이 있습니다. 이 프로그램의 간단한 코드와 흐름은 다음과 같습니다.
- 메모리 영역에 x, y 값을 저장하는 Point 객체 p를 생성합니다.
객체의 각 메모리 값에는 .연산자로 접근합니다. - main( ) 함수 영역에서 swap( ) 함수를 호출합니다.
main( ) 함수에서 swap( ) 함수로 제어 흐름이 넘어갑니다. - swap( ) 함수는 인수로 참조변수의 값을 받아 실인수 값을 참조할 수 있게 합니다.
- swap( ) 함수로 실인수 영역을 직접 접근했기에 return 값이 없어도 실제 값이 바뀝니다.
📚 메서드 오버로딩(Overloading)
- 하나의 클래스 내에서 같은 이름을 가진 메서드가 여러개 정의
- 비슷한 동작을 하는 다양한 메서드들을 일관되게 조작
- 함수 호출문을 만나면 함수의 이름, 인수 목록, 인수 타입으로 함수 호출을 구분
- 같은 클래스 내에서 같은 이름을 가지는 메서드들만을 의미, 다른 클래스는 관계 없음
📌 this 참조 변수
📚 this 참조 변수
- 메서드 호출 시 메서드 자신을 호출한 객체에 대한 참조값을 받는 변수, 즉 객체 자신에 대한 레퍼런스
- 메서드 안에서 자신의 다른 멤버들을 조작하고자할 때 사용
- 함수 내부적으로 전달되는 참조값으로 자동적으로 컴파일러에 의해 기입됨
- 명시적으로 사용해 데이터 멤버와 매개 변수의 구분을 함
📚 실제 this의 사용
this 참조 변수는 다음과 같이 매개변수와 멤버 변수의 이름이 같을 때 사용합니다. this.radius = radius;의 왼쪽 this.radius는 멤버 변수 radius를 오른쪽의 radius는 매개변수를 의미합니다. 결국 하나의 메서드를 많은 인스턴스 객체가 공유하게 된다면 메서드 안에서 식별하는 속성값에 명료하게 접근하기 위한 것이 this 참조변수입니다.
📌 정적 멤버
📚 멤버 필드
[접근 제한] [static] <자료형> <식별자>;
멤버필드의 static 영역은 "값을 공유한다"는 것이 중요한 역할입니다.
📃 instance 멤버 필드
- 각 객체 생성시 별도의 메모리가 할당
- 객체 소멸시 메모리가 자동 할당 해제
- 멤버 변수의 경우 각 객체마다 고유의 속성값을 저장 가능
📃 static 멤버 필드
- 프로그램 시작시 메모리 할당
- 생성된 객체의 수와 상관없이 단 하나만 생성되어 모든 객체들이 이 영역을 공유
- 객체를 생성하지 않고도 사용 가능
- static 이 적히지 않으면 일반적으로 instance 멤버가 생기므로 [static] 키워드로 만들 수 있음
📚 static 멤버 필드의 사용 예
static으로 선언된 멤버 변수는 클래스 내에서 공통적으로 사용되도록 모든 멤버에게 "공유"됩니다. 변수도 static으로 선언할 수 있지만 모든 값에서 참조되기에 상수를 선언하는 것이 더 좋습니다. 또한 각 객체 참조 변수로 접근하기 보다는 클래스 이름으로 접근하는 것이 좋습니다.
📚 메서드의 종류
메서드의 static 영역은 "객체를 생성하지 않고 행위를 할 수 있다"는 것이 주요한 역할입니다.
📃 instance 메서드
- 객체가 수행하는 일반적인 행위
- 자신의 모든 멤버를 직접 참조 가능
📃 static 메서드
- 객체를 생성하지 않고 행위를 수행
- 객체 외부에서 접근되지 않도록 static 멤버 필드의 안전한 접근 제공을 위한 메서드
- 객체 생성과 관련없는 일반적 기능의 간편한 사용 제공
- static이 아닌 멤버 (instance 멤버)는 직접 참조 불가
- this 참조 변수는 객체가 만들어져야 사용 가능하므로 사용 불가
'코딩언어 > JAVA' 카테고리의 다른 글
[JAVA] 07-1 자바의 패키지와 모듈 (0) | 2022.10.18 |
---|---|
[JAVA] 06. 캡슐화와 정보 은닉 (2) | 2022.10.14 |
[JAVA] 04. 클래스와 객체 (0) | 2022.10.12 |
[JAVA] # 포인터 VS 참조 자료형 (0) | 2022.10.10 |
[JAVA] 03. 자바 프로그램의 자료형 (4) | 2022.10.10 |