JAVA 기초(6-2)- 객체지향개념

이정민·2021년 10월 14일
0
post-thumbnail

1. 선언위치에 따른 변수의 종류

변수의 선언위치가 변수의 종류와 범위(scope) 를 결정한다.

class Variables
{
  int iv;		//인스턴스변수
  static int cv;	//클래스변수(static변수, 공유변수)
  
  void method()
  {
     int lv =0;		//지역변수
  }
}

인스턴스변수, 클래스변수 == 클래스에서 맴버변수

변수의 종류선언위치생성시기
클래스 변수클래스 영역클래스가 메모리에 올라갈 때
인스턴스 변수클래스 영역인스턴스 생성시
지역 변수매서드 영역변수 선언문 수행시


  • 인스턴스 변수 (instance variable)

    인스턴스를 생성하면 만들어진다.
    각 인스턴스의 개별적인 저장공간.
    인스턴스 생성 후, '참조변수.인스턴스변수명' 으로 접근
    참조변수가 없을 때 가비지컬렉터에 의해 자동제거됨
    (바로 제거되지는 않음)


  • 클래스 변수 (class variable)

    인스턴스를 생성하지 않고 사용 가능 '클래스이름.클래스변수명' 으로 접근
    같은 클래스의 모든 인스턴스들이 공유하는 변수
    클래스가 로딩될 때 생성되고 프로그램이 종료될 때 소멸


  • 지역 변수 (local variable)

    메서드 내에 선언되며, 메서드의 종료와 함께 소멸
    조건문, 반복문의 블럭{ } 내에 선언된 지역변수는 블럭을 벗어나면 소멸



(카드의 폭과 높이는 각각의 인스턴스들이 똑같아야 되기 때문에 / 자바의정석 영상)



2. return 문

현재 실행 중인 메서드를 종료하고 호출한 메서드로 되돌아간다.

  1. 반환값이 없는 경우 - return문만 써주면 된다. ( return ; )
  2. 반환값이 있는 경우 - return문 뒤에 반환값을 지정해 주어야 한다.( return 반환값 ; )
    .
    .
int max(int a, int b){
    if(a > b)
        return a;
    else
        return b;
}

-----------------------
// return문의 개수는 최소화하는 것이 좋다.

int max(int a, int b){
    int result = 0;
    if(a > b)
         result = a;
    else
         result = b;
    return result;
}

int ---- result ;    [타입이 일치해야한다.]



3. 메서드 호출

클래스 메서드는 참조변수를 이용해서 호출이 가능하지만
참조변수 대신 클래스name을 사용해서 호출하는 것이 코드를 이해하는데 편하다.

3-1. JVM의 메모리 구조 - 호출스택



4. 메서드 호출 과정(스택)

//ParameterTest.java

class Data ( int x; )
class ParamerterTest {
    public static void main(String[] args) {
     
        Data d = new data();
        d.x = 10;
        System.out.println("main() : x =" + d.x);
     
        change(d.x);
        System.out.println("After change(d.x)");
        System.out.println("main() : x = " + d.x);
    }
    
    static void change(int x) {
        x = 1000;
        System.out.println("change() : x = " + x);
    }
}

javac ParameterTest.java (컴파일)
java ParameterTest (실행)

  1. ParameterTest 클레스가 메모리에 로드 된다.(Method Area에 호출)
  2. java.exe가 ParameterTest의 메인 메서드를 호출하면서 프로그램이 실행된다.(Call Stack[호출스택]에 작업공간이 만들어진다.)

메모리 구조

Data d = mew Data( ) ; (인스턴스 생성)

  1. Data 클레스가 메모리에 로드 된다.
  2. Heep에 Data인스턴스 생성 된다. (d에는 생성된 인스턴스 주소값이 들어간다.)

d.x = 10 ;

  1. 인스턴스 x값이 초기화되서 0이 된 값에서 10으로 바뀐다.

.
.
.

이런식으로 메모리를 받는다.


기본형 매개변수와 참조형 매개변수의 차이점 알기

기본형 매개변수는 그냥 값만 주기 때문에 인스턴스 자체의 값을 바꿀수 없지만
참조형 매개변수는 주소자체를 주기 때문에 인스턴스 자체의 값을 바꿀수 있다.



재귀호출(recursive call)

  1. 메서드 내에서 자기자신을 반복적으로 호출하는 것
  2. 재귀호출은 반복문으로 바꿀 수 있으며 반복문보다 성능이 나쁨
  3. 이해하기 쉽고 간결한 코드를 작성할 수 있다.(그럼에도 사용하는 이유)
  • 재귀호출의 예
    팩토리얼, 제곱, 트리운행, 폴더목록표시 등

클래스 메서드(static)와 인스턴스 메서드

class MyMath2 {
    long a, b;
    
    long add() {     // 인스턴스 메서드
         return a + b;
    }
    
    static long add(long a, long b) { //클래스 메서드(static메서드)
         return a + b;
    }
}

class MyMathTest2 {
     public static void main(String args[]) {
          System.out.println(MyMath2.add(200L, 100L); //클래스 메서드 호출
          MyMath2 mm = new MyMath2(); //인스턴스 생성
          mm.a = 200L;
          mm.b = 100L;
          System.out.println(mm.add()); // 인스턴스 메서드 호출
     }
}
profile
안녕하세요.

0개의 댓글