포스트

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);
	}
}

JVM Stack

용어 정리
  • 프레임(Frame) 메모리 : main( - )이나 m1( - )이 실행되는 동안 사용 되는 로컬 변수들의 묶음
  • String 인스턴스 인스턴스
    • 레퍼런스 : String 객체(=인스턴스)를 가르키고 있는 name.
    • 인스턴스 : “홍길동” 문자열 이라는 값을 및 여러 필드를 포함하고 있는 String 객체

재귀호출

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

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

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 라이센스를 따릅니다.