다라다라V
article thumbnail
Published 2022. 10. 13. 01:04
[JAVA] 05. 클래스의 멤버 코딩언어/JAVA
728x90
반응형

물건을 직접 배달해주는 것과 물건이 저장된 장소를 알려주는 것은 차이가 있습니다. 함수에게 인자를 전달해주는 방식도 이와 같이 나뉩니다.

 


📌 메서드 처리 방식

📚 메서드 호출 메커니즘

  1. 각 인수의 표현식은 메서드가 호출되기 전에 먼저 계산됩니다.
    계산된 결과값은 임시 변수에 저장됩니다.
  2. 계산된 각 인수값은 해당되는 형식 매개변수에 위치 순서대로 복사됩니다.
    매개변수의 타입으로 인수를 타입변환(캐스팅)할 수 있습니다.
  3. 메서드 본체의 문장은 마지막 문장이나 return 문이 나오기 전까지 수행됩니다.
  4. return 문의 표현식이 계산됩니다.
    계산의 결과값은 마찬가지로 임시변수에 저장되고 임시 변수의 값을 호출측으로 반환합니다.
  5. 메서드 호출측은 메서드 호출문 자리에 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의 두 점의 좌표값을 바꾸려는 프로그램이 있다고 생각해봅시다. 이 프로그램을 간단히 중요한 코드만 적어 흐름을 나타내면 다음 그림과 같습니다.

 

 

  1. 메모리 영역에 x, y 값을 저장하는 Point 객체 p를 생성합니다. 
    객체의 각 메모리 값에는 . 연산자로 접근합니다.

  2. main( ) 함수 영역에서 swap( ) 함수를 호출합니다. 
    main( ) 함수에서 swap( ) 함수로 제어 흐름이 넘어갑니다.

  3. swap( ) 함수는 인수로 객체의 각 값을 복사 받아, 매개변수로 복사합니다.

  4. 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의 두 점의 좌표값을 바꾸려는 프로그램이 있습니다. 이 프로그램의 간단한 코드와 흐름은 다음과 같습니다.

 

 

  1. 메모리 영역에 x, y 값을 저장하는 Point 객체 p를 생성합니다. 
    객체의 각 메모리 값에는 .연산자로 접근합니다.

  2. main( ) 함수 영역에서 swap( ) 함수를 호출합니다. 
    main( ) 함수에서 swap( ) 함수로 제어 흐름이 넘어갑니다.

  3. swap( ) 함수는 인수로 참조변수의 값을 받아 실인수 값을 참조할 수 있게 합니다.

  4. 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 참조 변수는 객체가 만들어져야 사용 가능하므로 사용 불가
반응형
profile

다라다라V

@DaraDaraV

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!