Java/객체지향

[객체지향][자바의 정석] - 2. 변수와 메서드

얄루몬 2021. 10. 13. 00:45

6.2 변수와 메서드

 

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

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

class Variables{//클래스 영역
	int iv; //인스턴스 변수
    static int cv; //클래스 변수(static변수, 공유변수)
	
    
    void method(){ //메서드 영역
    
    	int lv = 0; //지역변수
        
    }
}
변수의 종류 선언 위치 생성시기
클래스 변수 클래스 영역 클래스가 메모리에 올라갈 때
인스턴스 변수 인스턴스 생성시
지역 변수 메서드 영역 변수 선언문 수행시

 

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

- 인스턴스 변수

    - 각 인스턴스의 개별적인 저장공간, 인스턴스마다 다른 값 저장 가능 

    - 인스턴스 생성 후 참조변수.인스턴스변수명 으로 접근

    - 인스턴스를 생성할 때 생성되고, 참조변수가 없을 때 가비지 컬렉터에 의해서 자동 제거 된다.

- 클래스 변수

    - 같은 클래스의 모든 인스턴스들이 공유하는 변수

    - 인스턴스 생성 없이 클래스이름.클래스변수명 으로 접근

    - 클래스가 로딩될 때 생성되고 프로그램이 종료될 때 소멸된다.

- 지역 변수

    - 메서드 내에 선언되며, 메서드의 종료와 함께 소멸된다.

    - 조건문, 반복문의 블럭 {}내에 선언된 지역변수는 블럭을 벗어나면 소멸된다.

 

 

2.2 클래스 변수와 인스턴스 변수

인스턴스 변수는 인스턴스가 생성될 때마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있지만, 클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하므로 항상 공통된 값을 갖는다.

 

class{
    //인스턴스 변수
    String kind; //무늬
    int number; //숫자
	
    //클래스 변수
    static int width = 100; //폭
    static int height = 250; //높이
}

 

iv - 인스턴스 변수로 개별적으로 사용된다. (카드의 무늬, 숫자는 달라지는 것을 생각하면 됨) -> 객체를 만들때 마다 생성된다. 

cv - 클래스 변수로 공통으로 사용된다. (카드의 가로 세로는 같은 것을 생각하면 됨) -> 객체 생성 없이 사용 가능

 

Card c = new Card(); //객체 생성

//객체 사용
//iv
c.kind = "HEART";
c.number = 5;

//cv는 iv처럼 쓰는 거 비추하고 클래스명.변수명으로 써야 정석
Card.width = 200;
Card.height = 300;

 

 

Card c1 = new Cart( ); // --> 객체를 생성하는 방법
//c1 = 참조 변수 = 별명 = 대상 객체와 동일한 곳을 참조하는 역할

//cv 클래스 변수 같은 경우엔 객체 생성 없이도 사용 가능하다.

클래스의 모든 객체가 공유하는 cv

 

2.3 메서드란?

    1. 문장들을 묶어 놓은 것

        - 작업단위로 문장들을 묶어서 이름 붙인 것이 메서드이다.

        - 코드 중복을 줄일 수 있고 메서드 하나만 관리하면 되기 때문에 수월해진다.

    2. 값(입력)을 받아서 처리하고, 결과를 반환(출력)

        - 메서드는 함수와 똑같고 클래스 안에 존재해야 한다. 

메서드의 개념

 

    3. 메서드의 장점

        - 코드의 중복을 줄일 수 있다.

        - 코드의 관리가 쉽다.

        - 코드를 재사용할 수 있다.

        - 코드가 간결해서 이해하기 쉬워진다.

 

    4. 메서드의 작성

        - 반복적으로 수행되는 여러 문장을 메서드로 작성.

        - 하나의 메서드는 한 가지 기능만 수행하도록 작성 (두 개의 작업을 하나의 메서드로 묶으면 안 된다.) 

 

 

 

메서드 = 선언부 + 구현부

👉 메서드의 구현부

지역변수(lv): 메서드 내에 선언된 변수

 

👉 메서드의 호출(Call)

    -메서드이름(값1,값2,...값n); //메서드를 호출하는 방법

    - 메서드의 호출 값은 있어도 되고 없어도 된다. 

 

2.4 return문 

- 메서드가 정상적으로 종료되는 경우

    - 메서드의 블럭의 끝에 도달했을 때

    - 메서드의 블럭을 수행 도중 return문을 만났을 때

- return문

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

1. 반환값이 없는 경우 - return문만 써주면 된다.
		return;
        
2. 반환값이 있는 경우 - return문 두에 반환값을 지정해 주어야 한다.
		return 반환값;
        
//이때 리턴문과 타입이 일치해야 한다.

inf add(int a, int b){ //int의 타입이 일치해야 한다. 
	int result - a+b;
    return result; //리턴문과
}

- return문 - 주의사항 

    - 반환값이 있는 메서드는 모든 경우에 return문이 있어야 한다.

int max(int a, int b){
	if(a>b):
        return a;
}

int max(int a, int b){
	if(a>b):
        return a;
    else:
    	return b;
}

    - return문을 적절히 사용하면 코드가 간결해진다. 

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

int max(int a, int b){
	if(a>b):
        return a;
	return b;
}

 

 

2.5 메서드의 호출

- 메서드의 호출 방법

참초변수.메서드 이름( );                             // 메서드에 선언된 매개변수가 없는 경우
참조변수.메서드 이름(값1,값2,값3,....);           // 메서드에 선언된 매개변수가 있는 경우

 

2.6 JVM의 메모리 구조

- 호출스택의 특징

    - 메서드가 호출되면 수행에 필요한 메모리를 스택에 할당 받는다. 

    - 메서드가 수행을 마치면 사용했던 메모리를 반환한다.

    - 호출스택의 제일 위에 있는 메서드가 현재 실행중인 메서드이다.

    - 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드이다.

2.7 기본형 매개변수와 참조형 매개변수

- 기본형 매개변수: 변수의 값을 읽기만 할 수 있다. (Read Only)

- 참조형 매개변수: 변수의 값을 읽고 변경할 수 있다. (Read & write)

 

2.8 재귀호출(recursive call)

- 재귀호출이란?

    - 메서드 내에서 자기자신을 반복적으로 호출하는 것

    - 재귀호출은 반복문으로 바꿀 수 있으며 반복문보다 성능이 나쁘다

    - 이해하기 쉽고 간결한 코드를 작성할 수 있다

- 재귀호출의 예

    - 팩토리얼, 제곱, 트리운행, 폴더목록표시 등

 

 

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

- 인스턴스메서드

    - 인스턴스 생성 후, 참조변수.메소드이름( )으로 호출

    - 인스턴스변수나 인스턴스메서드와 관련된 작업을 하는 메서드

    - 메서드 내에서 인스턴스변수 사용가능

-클래스메서드(static메서드)

    - 객체생성없이 클래스이름.메서드이름( )으로 호출

    - 인스턴스변수나 인스턴스메서드와 관련없는 작업을 하는 메서드

    - 메서드 내에서 인스턴스변수 사용불가

    - 메서드 내에서 인스턴스변수를 사용하지 않는다면 static을 붙이는 것을 고려한다.

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

 

2.10 멤버간의 참조와 호출 - 메서드의 호출

같은 클래스의 멤버간에는 객체 생성이나 참조변수 없이 참조할 수 있다. 그러나 static 멤버들은 인스턴스멤버들을 참조할 수 없다. 

class TestClass{
	void instanceMothod() {} //인스턴스 메소드
    static void staticMethod() {} //클래스 메소드
	
    void instanceMothod2(){ //인스턴스 메소드
    	instanceMethod(); //다른 인스턴스메서드를 호출한다.
        staticMethod(); //stati메서드를 호출한다.
    }
    static void staticMethod2(){ //static메서드
    	instanceMethod(); //에러 발생 인스턴스메서드를 static메서드에서 호출할 수 없다.
        staticMethod(); //static메서드는 호출 할 수 있다.
    }
}

 

2.10 멤버간의 참조와 호출 - 변수의 접근

같은 클래스의 멤버간에는 객체생성이나 참조변수 없이 참조할 수 있다. 그러나 static멤버들은 인스턴스멤버들을 참좔 수 없다.

class TestClass2{
	int iv;
    static int cv;
    
    void instanceMothod(){ //인스턴스메서드에서 인스턴스변수, 클래스변수를 사용할 수 있다. 
    	System.out.println(iv);
        System.out.println(cv);
    }
    static void staticMethod(){
    	System.out.println(iv); //에러 발생 인스턴스변수를 스태틱메서드에서 사용할 수 없다.
        System.out.println(cv);
    }
}

☞ 본 블로그 게시물의 작성은 자바의 정석 기초편 요약본을 보고 작성하였습니다.