[Java] Chapter 07. 클래스와 인스턴스

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

✅클래스, 인스턴스, 참조변수

프로그램은 기본적으로 데이터와 기능으로 이루어져 있다. 단순히 데이터와 기능이 따로 존재하는 것이 아니라 데이터와 그에 종속적인 기능으로 존재한다. 이들을 하나로 묶어 사용하기 위해 클래스라는 것이 등장했다.

클래스는 "틀"이기 때문에 실제 기능을 가지지 않는다. 클래스를 사용하기 위해서는 사본을 찍어내야 한다. 이때, 이 사본은 인스턴스, 객체, 오브젝트 등등으로 불린다. 또한, 클래스라는 틀을 통해서 여러 개의 동일한 인스턴스를 만들어 낼 수 있다.

class BankAccount {
    int balance = 0;
    public int deposit(int amount) {...}
    public int withdraw(int amount) {...}
    public int checkMyBalance() {...}
}

이처럼 balance와 그와 관련된 기능들을 클래스로 묶을 수 있고 이를 통해서 여러 명의 은행 계좌를 만들어 낼 수도 있다.

new BankAccount();

이와 같이 인스턴스를 생성할 수 있다.

또한, 여러 개의 인스턴스를 만들었을 때, 인스턴스를 구분하고 가리키기 위한 변수가 필요한데 이 변수가 참조변수이다.

BankAccount myAcnt1;

참조변수의 선언은 이와 같이 할 수 있다. 참조변수가 인스턴스를 가리키기 위해서는 다음과 같이 작성한다.

myAcnt1 = new BankAccount();

myAcnt1은 새로 생성되는 인스턴스를 가리키는데 이때, 이 인스턴스의 주소값myAcnt1에 들어가게 된다.

✅참조변수의 특성

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

참조변수는 인스턴스의 주소값을 가지고 있기 때문에 이와 같이 실행되면 ref1ref2는 같은 인스턴스를 가리키게 된다.

....
    BankAccount ref = new BankAccount();
    check(ref);
}
public static void check(BankAccount acc) {
....

check 메소드의 매개 변수로 BankAccount의 참조변수를 받기 때문에 인스턴스의 주소값이 들어가게 된다.
따라서 refacc는 같은 인스턴스를 가리키게 된다.

참조변수에는 null 값도 대입할 수 있다.

BankAccount ref = new BankAccount();
ref = null;

마지막 문장을 통해서 ref가 참조하던 인스턴스와의 관계를 끊게 된다.

이를 응용해서 ref가 참조하는 인스턴스가 있는지 없는지 검사도 할 수 있다.

if(ref == null)

📌07-2. 생성자와 String 클래스의 소개

✅String 클래스

"Hello" 와 같은 문자열도 자바에서는 인스턴스로 인식하고 저장한다. JVM 에서는 문자열을 보면 String 클래스의 인스턴스를 생성하고 해당 문자열을 넣어준다. 그 후, 그 인스턴스의 주소값을 반환한다.

실제로 System.out.println(" ")에서도 문자열의 인스턴스가 만들어지고 그 인스턴스의 주소값이 println( ) 안에 들어가게 된다.

✅클래스 정의 모델

인스턴스의 수가 많아질 때, 인스턴스마다 참조변수를 선언하는 것은 매우 힘든 일이다. 이를 위해서 인스턴스 안에 각각의 인스턴스를 구분하기 위한 고유한 정보를 가지게 하자.
예를 들어 위의 은행 계좌의 경우, 계좌번호, 주민번호 등의 정보를 넣자.

인스턴스 변수들은 인스턴스 생성 후에 반드시 초기화를 통해 원하는 값으로 저장해야 한다.

public void initAccount(String acc, String ss, int bal) {
    accNumber = acc;
    ssNumber = ss;
    balance = bal;
}

이처럼 초기화를 위한 메소드가 필요하다. 그리고 이러한 메소드는 인스턴스 생성시에 딱 한번만 호출되어야 한다.
자바에서는 생성자를 통해서 이러한 과정을 꼭 거치게끔 명세화 했다. 우리가 호출하지 않아도 자동으로 호출된다.

public BankAccount(....) {
    ....
}

생성자에는 두가지 규칙이 있다.

  1. 생성자의 이름은 클래스의 이름과 동일해야 한다.
  2. 생성자는 값을 반환하지 않고 반환형도 표시하지 않는다.
BankAccount yoon = new BankAccount("12-34-56", "12-345-7890", 10000);

이렇게 생성자를 이용해서 인스턴스의 초기화가 가능하다.

생성자를 만들지 않으면 자바 컴파일러가 다음과 같은 디폴트 생성자를 자동으로 만든다.

public BankAccount() {
    // empty
}

좋은 클래스를 위해서 우리가 직접 생성자를 만들어야 한다. 우리는 멤버 변수의 값을 우리가 원하는 값으로 초기화 해줄 필요가 있기 때문이다.

📌07-3. 자바의 이름 규칙

✅클래스의 이름 규칙

클래스 이름의 첫 문자는 대문자로 시작한다.
둘 이상의 단어가 묶여서 하나의 이름을 이룰 때에는 새로 시작하는 단어는 대문자로 시작한다. (camelCase 모델)

ex) Circle + Point = CirclePoint

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

메소드와 변수 이름의 첫 문자는 소문자로 시작한다.
둘 이상의 단어가 묶여서 하나의 이름을 이룰 때에는 새로 시작하는 단어는 대문자로 시작한다. (변형된 camelCase 모델)

ex) Circle + Point = circlePoint

✅상수의 이름 규칙

상수의 이름은 모든 문자를 대문자로 구성한다.
둘 이상의 단어가 묶여서 하나의 이름을 이룰 때에는 단어 사이를 언더바로 연결한다.

ex) Circle + Point = CIRCLE_POINT

🔗강의 및 자료 출처

네이버 카페 || 윤성우의 프로그래밍 스터디그룹

좋은 웹페이지 즐겨찾기