✔ 클래스의 정의와 인스턴스의 생성
클래스?
- 프로그램은 데이터와 기능으로 이루어짐
- 데이터(변수)는 프로그램상에서 유지하고 관리해야 할 '데이터'로 변수의 선언을 통해 유지 및 관리됨
- 변수에 저장된 데이터는 메소드의 호출을 통해 처리됨
- 기능(메소드)은 데이터를 처리하고 조작하는 '기능'
- 메소드와 변수는 뗄 수 없는 관계이며, 이렇듯 연관 있는 변수와 메소드를 묶기 위해 클래스가 존재
- 클래스는 인스턴스 변수와 인스턴스 메소드의 묶음
- 인스턴스 변수는 클래스 내에 선언된 변수로 같은 클래스 내에 위치한 메소드 내에서 접근이 가능
- 인스턴스 메소드는 클래스 내에 정의된 메소드
class BankAccount {
int balance = 0;
public int deposit(int amount) { ... }
public int withdraw(int amount) { ... }
public int checkMyBalance() { ... }
}
- 클래스의 정의는 틀을 구성하는 것과 같으며, 그 안에 위치한 변수나 메소드를 사용하기 위해서는 인스턴스가 필요
인스턴스?
- 키워드 new를 이용하면 클래스에 정의된 변수와 메소드를 담고 있는 인스턴스가 만들어짐
new BankAccount();
- 만들어진 인스턴스는 실제 메모리 공간에 존재하게 되며 인스턴스를 참조할 수 있는 참조변수가 필요
- 인스턴스를 생성하면 생성된 인스턴스의 주솟값이 반환되며 참조 변수는 이를 저장하게 됨
- 그러므로 참조변수는 인스턴스를 참조하며, 인스턴스를 가리킴
- 그리고 참조변수를 통해서 해당 인스턴스의 메소드를 호출할 수 있음
- 참조변수는 참조하는 인스턴스를 바꿀 수 있으며, 하나의 인스턴스를 둘 이상의 참조변수가 동시에 참조하는 것도 가능
- 또한 메소드를 호출하면서 인스턴스의 참조 값을 전달하는 것도 가능함
- 참조변수가 참조하는 인스턴스와의 관계를 끊고 아무런 인스턴스도 참조하지 않도록 하기 위해서는 null을 대입
BankAccount myAcnt = new BankAccount();
myAcnt.deposit(1000);
...
myAct = null;
✔ 생성자와 String 클래스
String 클래스?
- 문자열 처리를 위해서는 큰따옴표로 묶어서 표현할 수 있음
- 그런데 이러한 문자열은 String형 참조변수를 선언해서 참조할 수도 있음
- String형 참조 변수를 이용하면 문자열이 인스턴스화 되고,
String class의 인스턴스로 메모리 공간에 저장된 후 그 인스턴스의 주소값이 반환되게 됨
- 이를 통해 문자열을 메소드의 인자로 전달할 수 있음
- 또한 매개변수로 String형 참고변수를 선언하여 문자열을 인자로 전달받을 수 있게 됨
class FirstStringIntro {
public static void main(String[] args) {
String str1 = "Happy";
printString(str1);
}
public static void printString(String str) {
System.out.println(str);
}
}
- 이러한 String 클래스를 활용하여 인스턴스를 구분할 수 있는 정보를 초기화하는 메소드를 만드는데 사용할 수 있음
class BankAccount {
String accNumber;
String ssNumber;
int balance = 0;
public void initAccount(String acc, String ss, int bal) {
accNumber = acc;
ssNumber = ss;
balance = bal;
}
}
class BankAccountUnitID {
public static void main(String[] args) {
BankAccount yoon = new BankAccount();
yoon.initAccount("12-34-89", "990990-9090990", 10000);
}
}
생성자?
- 위와 같이 메소드를 직접 정의하지 않고 생성자를 정의해서 인스턴스의 초기화를 진행할 수도 있음
- 생성자는 인스턴스 생성 과정에서 초기화를 위해 자동으로 호출되는 일종의 메소드를 뜻함
- 생성자의 이름은 클래스의 이름과 동일해야 함
- 생성자는 값을 반환하지 않고 반환형도 표시하지 않음
- 위 두 가지 조건을 모두 만족하면 자바 컴파일러에 의해서 생성자로 인식되게 되며
인스턴스 생성 시 마지막 단계에 자동으로 호출되어 인스턴스를 초기화하게 됨
- 어떠한 이유로든 생성자 호출이 생략된 인스턴스는 인스턴스가 아니라고 할 수 있음
class BankAccount {
String accNumber;
String ssNumber;
int balance = 0;
public BankAccount(String acc, String ss, int bal) {
accNumber = acc;
ssNumber = ss;
balance = bal;
}
}
class BankAccountUnitID {
public static void main(String[] args) {
BankAccount yoon = new BankAccount("12-34-89", "990990-9090990", 10000);
}
}
- 만약 생성자를 생략한 상태의 클래스를 정의하면 자바 컴파일러가 디폴트 생성자라는 것을 클래스의 정의에 넣어주게 됨
- 디폴트 생성자는 인자를 전달받지 않는 형태로 정의되어 삽입되게 됨
- 그런데 컴파일러에 의해서 디폴트 생성자가 삽입이 되더라도
좋은 클래스가 되기 위해서는 가급적 직접 생산자를 정의하는 것이 의미가 있음
class BankAccount {
String accNumber;
String ssNumber;
int balance = 0;
public BankAccount() {
// empty
}
}
class BankAccountUnitID {
public static void main(String[] args) {
BankAccount yoon = new BankAccount();
}
}
✔ 자바의 이름 규칙
클래스의 이름 규칙
- 클래스의 이름을 지을 때 가장 보편적으로 선택하는 규칙을 Camel Case 모델이라고 함
- 클래스 이름의 첫 문자는 대문자로 시작함
- 둘 이상의 단어가 묶여서 하나의 이름을 이룰 때, 새로 시작하는 단어를 대문자로 함
class CirclePoint {
....
}
메소드와 변수의 이름 규칙
- 메소드와 변수의 이름은 클래스의 이름과 구분이 되어야 코드의 가독성을 높일 수 있음
- 그러므로 변형된 Camel Case 모델을 적용하는 것이 일반적
- 메소드와 변수의 첫 문자는 소문자로 시작함
- 둘 이상의 단어가 묶여서 하나의 이름을 이룰 때, 새로 시작하는 단어를 대문자로 함
int yourAge = 20;
상수의 이름 규칙
- 상수의 이름은 변수의 이름과 구분이 되도록 모든 문자를 대문자로 구성
- 단, 둘 이상의 단어를 연결해야 하는 경우에는 언더바로 단어와 단어 사이를 연결함
final int COLOR_RAINBOW = 7;