[윤성우의 열혈 Java 프로그래밍] Chapter 07 - 클래스와 인스턴스

Update:     Updated:

카테고리:

태그:

07-1. 클래스의 정의와 인스턴스의 생성

- 클래스(Class) = 데이터(Data) + 메소드(Method)

클래스: 서로 연관되어 있는 데이터와 메소드를 묶어주는 것

모든 프로그램은 다음 두 가지로 이뤄진다.

  1. 데이터: 프로그램상에서 유지하고 관리해야 할 데이터
  2. 기능: 데이터를 처리하고 조작하는 기능
class BankAccount{
    int balance = 0;    // 예금 잔액

    public int deposit(int amount){ // balance와 연관 있는 메소드
        balance += amount;
        return balance;
    }

    public int withdraw(int amount){    // balance와 연관 있는 메소드
        balance -= amount;
        return balance;
    }

    public int checkMuyBalance(){   // balance와 연관 있는 메소드
        System.out.println("잔액: " + balance);
        return balance;
    }
}

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

image

클래스 내에 위치한 변수와 메소드를 가리켜 각각 다음과 같이 부른다.
인스턴스 변수(멤버 변수, 필드): 클래스 내에 선언된 변수
인스턴스 메소드: 클래스 내에 정의된 메소드

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

- 클래스 정의의 본질

클래스의 정의는 틀(Mold)을 구성하는 것과 같다.

image

붕어빵은 클래스를 설명할 때 단골로 등장하는 소재이다.
붕어빵 틀은 먹을 수 있는 대상은 아니다. 하지만 이 틀이 있으므로 빵을 찍어낼 수 있다.
마찬가지로 클래스 또한 정의되었다고 해서 그 안에 위치한 변수나 메소드를 사용할 수 있는 것은 아니다.
틀을 이용해서 ‘인스턴스’(메모리에 올라갈 수 있는 것)라는 것을 찍어 내야 사용이 가능하다.

BankAccount myAcnt1;    // 참조변수 myAcnt1 선언
BankAccount myAcnt2;    // 참조변수 myAcnt2 선언

// 참조변수 myAcnt1이 새로 생성되는 인스턴스를 가리킴
myAcnt1 = new BankAccount();

// 참조변수 myAcnt2이 새로 생성되는 인스턴스를 가리킴
myAcnt2 = new BankAccount();

키워드 new를 통해서 인스턴스를 생성하면 생성된 인스턴스의 주솟값이 반환된다.
즉 참조변수에는 생성된 인스턴스의 주솟값이 저장되는 셈이다. 이것의 보다 일반적인 표현으로는

참조변수는 인스턴스를 참조한다.
참조변수는 인스턴스를 가리킨다.


(참고)
java에서는 ‘주소’라는 말을 안 쓴다.
인스턴스의 주소값을 직접 열어서 확인하는 법을 java에서 제공하지 않는다.

- 참조변수(Reference Variable)의 특성

1) 변수는 저장된 값을 바꿀 수 있다. 따라서, 참조변수도 다음과 같이 참조하는 인스턴스를 바꿀 수 있다.

BankAccount yoon = new BankAccount();

yoon = new BankAccount();   // yoon이 새 인스턴스를 참조한다.

2) 하나의 인스턴스를 둘 이상의 참조변수가 동시에 참조하는 것도 가능하다.

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

- 참조변수(Reference Variable)의 매개변수 선언

메소드를 호출할 때 값을 전달할 수 있고, 이 값은 매개변수에 저장된다.
마찬가지로 메소드를 호출하면서 인스턴스의 참조 값을 전달하는 것도 가능하다.

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 checkMyBalance() {
        System.out.println("잔액: " + balance);
        return balance;
    }
}

public class PassingRef {
    public static void main(String[] args) {
        BankAccount ref = new BankAccount();
        ref.deposit(3000);
        ref.withdraw(300);
        check(ref); // '참조 값'의 전달
    }

    public static void check(BankAccount account) { // 이 메소드는 인자로 인스턴스의 참조 값을 전달받는다.
        account.checkMyBalance();
    }
}

- 참조변수에 null 대입

참조변수가 참조하는(가리키는) 인스턴스와의 관계를 끊고 아무런 인스턴스도 참조하지 않도록 만들 수도 있다.

BankAccount ref = new BankAccount();
ref = null; // ref가 참조하는 인스턴스와의 관계를 끊음



(참고)
확장자가 class인 클래스파일은 ‘정의되는 클래스의 수’만큼 생성된다.
즉 ‘정의된 클래스의 수’와 ‘생성되는 클래스 파일의 수’는 동일하다.

07-2. 생성자(Constructor)

- 인스턴스를 구분할 수 있는 유일한 정보를 갖게 하자.

각각의 인스턴스를 참조하는 참조변수들을 매번 만들 수는 없기 때문에
인스턴스 안에 각각의 인스턴스를 구분할 수 있는 정보를 포함하도록(멤버로 갖도록) class를 디자인해야한다.

class BankAccount{
    /*
    * 인스턴스를 구분할 수 있는 정보를 class에 추가해준다!
    */
    Stirng accNumber;   // 계좌번호
    String ssNumber;    // 주민번호
    
    int balance = 0;

    public int deposit(int amount) {
        balance += amount;
        return balance;
    }

    public int withdraw(int amount) {
        balance -= amount;
        return balance;
    }

    public int checkMyBalance() {
        System.out.println("잔액: " + balance);
        return balance;
    }
}

- 생성자(Constructor)

이 메소드는 다른 메소드들과 성격상 구분이 된다.

  1. 인스턴스의 초기화를 위한 메소드이다.
  2. 때문에 인스턴스 생성 시 반드시 한 번 호출해서 초기화를 진행해야 한다.


생성자가 되기 위해선 몇 가지 조건이 있다.

  1. 생성자의 이름은 클래스의 이름과 동일해야 한다.
  2. 생성자는 값을 반환하지 않고 반환형도 표시하지 않는다.

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

인스턴스 생성의 마지막 단계는 생성자 호출이다.
어떠한 이유로든 생성자 호출이 생략된 인스턴스는 인스턴스가 아니다.

- 디폴트 생성자(Default Constructor)

개발자가 생성자를 생략한 상태의 클래스를 정의하면 자바 컴파일러가 ‘디폴트 생성자’라는 것을 클래스 정의에 넣어준다.

class BankAccount{
    int balance;

    public BankAccount(){   // 컴파일러에 의해 자동 삽입되는 '디폴트 생성자'
        // empty
    }
}

다만! 컴파일러에 의해서 디폴트 생성자가 삽입이 되더라도 생성자는 직접 정의해 주는 것이 좋다.

07-3. 자바의 이름 규칙(Naming Rule)

자바 프로그램을 작성하면서 일반적으로 적용하는 ‘이름 짓는 규칙’이 있다.

- 클래스의 이름 규칙

‘Camel Case 모델’을 따른다.

  1. 클래스 이름의 첫 문자는 대문자로 시작한다.
  2. 둘 이상의 단어가 묶여서 하나의 이름을 이룰 때, 새로 시작하는 단어는 대문자로 한다.

- 메소드와 변수의 이름 규칙

클래스 이름과 구분이 되어야 코드의 가독성을 높일 수 있다.
따라서, ‘변형된 Camel Case’를 적용하는 것이 일반적이다.

  1. 메소드와 변수 이름의 첫 문자는 소문자로 시작한다.
  2. 둘 이상의 단어가 묶여서 하나의 이름을 이룰 때, 새로 시작하는 단어는 대문자로 한다.

- 상수의 이름 규칙

상수의 이름은 변수의 이름과 구분이 되도록 모든 문자를 대문자로 구성하는 것이 관례이다.
둘 이상의 단어를 연결해야 하는 경우에는 언더바로 단어와 단어 사이를 연결한다.

Java lang 카테고리 내 다른 글 보러가기

댓글 남기기