15. 자바 기초(8)
자바의 기초 언어를 공부하자.
15. 자바 기초(8)
메서드
리턴타입 메서드명(파라미터~) ← method Signature = function prototype { - } ← method body
JVM의 클래스 실행과 스레드
스레드
실행흐름(=실타래처럼 이어져있다 =Thread(실타래))
1
2
3
4
5
6
7
8
9
10
11
12
public class Test01 {
public static void main(String[] args) {
m1(); // 메서드 호출(= call)
m1();
m1();
}
static void m1() {
System.out.println("Hello");
}
}
멀티스레드
동시에 여러 개의 스레드(실행 흐름)를 진행하는 것을 멀티 스레드 프로그래밍 이라고 함
파라미터와 아규먼트
1
2
void m1(String n, int a){ - } // String n, int a : 파라미터
m1("홍길동", 30); // "홍길동", 20 : 아규먼트
파라미터 : 메서드를 호출할 때 생성 → 호출 종료 시 제거 → JVM Stack 메모리 영역
JVM Stack
1
2
3
4
5
6
7
8
public class app {
public static void main(String[] args){
m1("홍길동", 20);
}
static void m1(String name, int age){
System.out.println("%d(%d)님 반갑습니다.", name, age);
}
}
용어 정리
재귀호출
1
2
3
4
5
6
7
8
9
10
main(){
System.out.println(sum(10));
}
int sum(int n){
if(n == 1) {
return;
}
return n + sum(n - 1);
}
call by value와 call by reference
용어 정리
- Method Area : 클래스 코드, 클래스 필드, 상수 리터럴 (우리가 코드를 짜놓은 대부분의 것들)
- Stack : 메서드가 사용할 로컬 변수 스택에 있는 로컬 변수는 메서드끼리 오가지 못한다.
- Heap : new 명령으로 생성한 인스턴스 ex. 배열 (인스턴스의 주소, 가비지 값 등을 처리) 힙에 있는 주소는 얼마든지 오갈 수 있다.
call by value
메서드 호출할 때 [값]을 넘긴다.
1 2 3 4 5 6 7 8 9
main(){ int value = 100; m1(value); println(value); } void m1(int value){ value = 200; }
값을 넘기기 때문에 main과 m1의 value는 다른 주소값을 가짐.
m1에서 value 값을 수정하는 코드는 main의 value에게 영향을 미치지 못한다.
call by reference
- 메서드를 호출할 때 [주소]를 넘긴다.
1
2
3
4
5
6
7
8
9
main(){
int[] values = new int[]{100, 110, 120};
m1(values);
println(values[0]);
}
void m1(int[] values){
values[0] = 200;
}
- 배열 레퍼런스는 생성될 때 Stack이 아닌 Heap에 생성 후 그 주소값을 변수에 담는다.
m1은 변수에 담긴 Heap 주소를 받게되고, Heap의 주소를 통해 직접 값을 변경한다.
그렇기에 main와 m1은 같은 값을 가지게 된다. - 추가사항으로… 객체 String과 call by reference의 관계에 대하여. String은 객체이지만 call by reference로 동작하지 않길래 찾아보니 String은 불변 객체이기 때문에 유일하게 call by value로 동작하게 된다.
String의 불변 객체
- String은 값이 변할 수 없는 불변 객체이다.
그럼 불변 객체가 대체 뭐길래..?
1 2
String str = "Hello "; str = str + "World!"
위의 코드가 동작된다고 생각해보자.
우리는 자연스럽게 str에 담겨있는 주소를 따라가 “Hello “에 “World”를 합쳐 값이 변경된다고 생각하지만-
사실은 “Hello “라는 주소를 냅두고 “Hello World”를 담은 주소를 새로 만들어 str에 할당해준다.
즉, 메모리에는 “Hello “라는 값을 가진 가비지 값과 “Hello World”라는 값을 가진 주소가 둘 다 존재하게된다.
이처럼 String은 값 자체를 아예 변경 못하게 만들어진 객체이기 때문에 주소 값을 통해 변경가능한 call by reference가 아닌 call by value로 동작하게된다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.