클래스와 인스턴스, 참조변수, 생성자

gustjtmd·2022년 1월 14일
0

Java

목록 보기
2/40
클래스 = 데이터 + 메소드 = 모든 프로그램은 다음 두 가지로 이뤄진다.
데이터 : 프로그램상에서 유지하고 관리해야 할 데이터
기능 : 데이터를 처리하고 조작하는 기능

클래스의 구성과 인스턴스화

class BankAccount{
    //인스턴스 변수
    int balance = 0;
    
    //인스턴스 메소드
    public int deposit(int amount){...}
    public int withdraw(int amount){...}
    public int checkMyBalance(){...}
}
위와 같이 클래스 내에 위치한 변수와 메소드를 가리켜 각각 다음과 같이 부른다.

인스턴스 변수 : 		'클래스 내에 선언된 변수'
인스턴스 메소드 : 		'클래스 내에 정의된 메소드'

'인스턴스 변수는 같은 클래스 내에 위치한 메소드 내에서 접근이 가능하다'

참조변수 선언과 인스턴스의 생성

"참조 변수는 인스턴스를 참조한다." 
"참조변수는 인스턴스를 가리킨다."
//참조변수 myAcnt1이 새로 생성되는 인스턴스를 가리킴
BankAccount myAcnt1 = new BankAccount(); 
//참조변수 myAcnt2이 새로 생성되는 인스턴스를 가리킴
BankAccount myAcnt2 = new BankAccount();
class BankAccount{
    int balance = 0;    //예금 잔액

    public int deposit(int amount){
        balance += amount;
        return balance;
    }
    public int withdraw(int amount){
        balance -= amount;
        return balance;
    }
    public int checkMyBalace(){
        System.out.println("잔액 : " +balance);
        return balance;
    }
}

public class BankAcountOO {
    public static void main(String[] args) {
        //두 개의 인스턴스 생성
        BankAccount yoon = new BankAccount();
        BankAccount park = new BankAccount();

        //각 인스턴스 대상으로 예금을 진행
        yoon.deposit(5000);
        park.deposit(3000);

        //각 인스턴스 대상으로 출금을 진행
        yoon.withdraw(2000);
        park.withdraw(2000);

        //각 인스턴스 대상으로 잔액을 조회
        yoon.checkMyBalace();
        park.checkMyBalace();
    }
}
----------------------------------------------------------------------
잔액 : 3000
잔액 : 1000

참조변수의 특성

변수는 저장된 값을 바꿀 수 있다. 그래서 이름이 변수이다. 마찬가지로 참조변수도 변수이다.
따라서 참조변수도 다음과 같이 참조하는 인스턴스를 바꿀수 있다.

BankAccount ref1 = new BankAccount();
BankAccount ref2 = ref1;

참조변수의 매개변수 선언

메소드를 호출할 때 값을 전달할 수 있고 이 값은 매개변수에 저장된다. 이와 유사하게
메소드를 호출하면서 인스턴스의 참조값을(주소값)을 전달하는것도 가능하다.

class BankAccount{
    int balance = 0;    //예금 잔액

    public int deposit(int amount){
        balance += amount;
        return balance;
    }
    public int withdraw(int amount){
        balance -= amount;
        return balance;
    }
    public int checkMyBalace(){
        System.out.println("잔액 : " +balance);
        return balance;
    }
}

public class BankAcountOO {
    public static void main(String[] args) {
        BankAccount ref = new BankAccount();
        ref.deposit(5000);
        ref.withdraw(2000);
        check(ref);	//참조 값(주소값)의 전달.
    }
    public static void check(BankAccount acc){
        acc.checkMyBalace();
    }
}
-----------------------------------------------------------------------
잔액 : 3000

----------------------------------------------------------------------
public static void check(BankAccount acc){
        acc.checkMyBalace();
        }
위 메솓의 매개변수로 BankAccount의 참조변수가 선언되었다. 즉 이 메소드는 인자로 
인스턴스의 참조값(주소값)을 전달받는다. 따라서 메소드 내에서는 전달된 참조 값의 인스턴스
대상으로 메소드를 호출할 수 있다.

참조변수에 null 대입

때로는 참조변수가 참조하는(가리키는) 인스턴스와의 관계를 끊고 아무런 인스턴스도 참조하지
않도록 할 필요가 있다. 그리고 이때는 참조변수에 null을 대입하면 된다.
-----------------------------------------------------------------------
BankAccount ref = new BankAccount();
...
ref = null;	//ref가 참조하는 인스턴스와의 관계를 끊음.
----------------------------------------------------------------------
그리고 참조변수에 null 저장 유무를 다음과 같이 확인할 수 있어서 유용하다.

if(ref == null)	//ref가 참조하는 인스턴스가 없다면.

생성자

생성자는 메소드와 모습이 같다. 따라서 생성자를 '생성자 메소드'로 표현하는 경우도 있다.
그러나 생성자는 다음과 같은 부분에서 메소드와 차이가 있다.
1.'생성자의 이름은 클래스의 이름과 동일해야 한다.'
2.'생성자는 값을 반환하지 않고 반환형도 표시하지 않는다.'

위의 조건을 만족하면 자바 컴파일러에 의해서 생성자로 인식된다.
따라서 인스턴스 생성시 자동으로 호출되어 인스턴스를 초기화하게 된다.

-----------------------------------------------------------------------
class BankAccount{
    String accNumber;   //계좌번호
    String ssNumber;    //주민번호
    int balance = 0;    //예금 잔액

    public BankAccount(String acc, String ss, int bal){	//생성자
        accNumber = acc;
        ssNumber = ss;
        balance = bal;
    }

    public int deposit(int amount){
        balance += amount;
        return balance;
    }
    public int withdraw(int amount){
        balance -= amount;
        return balance;
    }
    public int checkMyBalace(){
        System.out.println("계좌 번호 : " +accNumber);
        System.out.println("주민번호 : "+ ssNumber);
        System.out.println("잔액 : " +balance);
        return balance;
    }
}

public class BankAcountOO {
    public static void main(String[] args) {
        BankAccount yoon = new BankAccount("11-11-11","999999-9999999",10000);
        BankAccount park = new BankAccount("22-22-22","999999-9999991",10000);
        yoon.deposit(5000);
        park.deposit(3000);
        yoon.withdraw(2000);
        park.withdraw(2000);
        check(yoon);
        check(park);
    }
    public static void check(BankAccount acc){
        acc.checkMyBalace();
    }
}
-----------------------------------------------------------------------
계좌 번호 : 11-11-11
주민번호 : 999999-9999999
잔액 : 13000
계좌 번호 : 22-22-22
주민번호 : 999999-9999991
잔액 : 11000

--------------------------------------------------------------------
yoon = new BankAccount("11-11-11","999999-999999",10000);
소괄호 안에 값을 전달하고 있는데 이 값들은 생성자가 호출될때 생성자의 매개변수로 전달이 된다.
즉 위와 같이 문장을 구성하면'인스턴스 생성 마지막 단계'에서 다음으 생성자가 호출되면서
값들이 전달된다. 그리고 이 값들로 인스턴스 변수가 초기화된다.

public BankAccount(String acc, String ss, int bal){	//생성자
        accNumber = acc;	//변수 accNumber 초기화
        ssNumber = ss;		//변수 ssNumber 초기화
        balance = bal;		//변수 balance 초기화
    }
생성자와 관련해서 다음 사실을 반드시 기억해야 한다.
'인스턴스 생성의 마지막 단계는 생성자 호출이다'
'어떠한 이유로든 생성자 호출이 생략된 인스턴스는 인스턴스가 아니다'
출처 : 윤성우의 열혈 Java 프로그래밍
profile
반갑습니다

0개의 댓글